C# DateTime.ticksの謎

C#のDateTime.ticksを使ったプログラム部分のコード解析をしていたところ、「そもそもticksってなんぞや。」と。

簡単にいうと、0001/01/01 00:00:00からの経過時間(単位が100ns)

私の得意言語は相変わらずPHPなので、動作確認コードをPHPで書こうとしたらticksなんてものはない。google先生に尋ねてみると、「timestamp(unix timestamp)621355968000000000を加減算しろ。」というブログを発見。
こんなマジックナンバー理解せずに使うなんてできるわけなく調べました。

もちろんこんなものは、C#のソースコードを読めば一発解決!
https://referencesource.microsoft.com/#mscorlib/system/datetime.cs,48acb2f2333c0fac,references

// Number of days in a non-leap year
private const int DaysPerYear = 365;
// Number of days in 4 years
private const int DaysPer4Years = DaysPerYear * 4 + 1;       // 1461
// Number of days in 100 years
private const int DaysPer100Years = DaysPer4Years * 25 - 1;  // 36524
// Number of days in 400 years
private const int DaysPer400Years = DaysPer100Years * 4 + 1; // 146097
 
// Number of days from 1/1/0001 to 12/31/1600
private const int DaysTo1601 = DaysPer400Years * 4;          // 584388
// Number of days from 1/1/0001 to 12/30/1899
private const int DaysTo1899 = DaysPer400Years * 4 + DaysPer100Years * 3 - 367;
// Number of days from 1/1/0001 to 12/31/1969
internal const int DaysTo1970 = DaysPer400Years * 4 + DaysPer100Years * 3 + DaysPer4Years * 17 + DaysPerYear; // 719,162
// Number of days from 1/1/0001 to 12/31/9999
private const int DaysTo10000 = DaysPer400Years * 25 - 366;  // 3652059
 
internal const long MinTicks = 0;
internal const long MaxTicks = DaysTo10000 * TicksPerDay - 1;

載ってますね。
timestamp(1970/01/01 00:00:00)からの経過時間は

internal const int DaysTo1970 = DaysPer400Years * 4 + DaysPer100Years * 3 + DaysPer4Years * 17 + DaysPerYear; // 719,162

この辺りです。
ですが 719,162日1970 * 365=719,050日と一致しない・・・。
それは当然で閏年です。

閏年は、4年に1度、さらに100の倍数時は閏年は存在しないが、400の倍数時には閏年とする。
というルールがあり結果、

719,162(days) * 24(hour) * 60(min) * 60(sec) = 62135596800(sec)

となる。

これで、マジックナンバーだった数字の説明もついたので、安心して使うことができますね!ここまでで納得できた方は以下は関係ないので読まなくても問題ありません。

私はさらに疑問に感じ「そもそも、閏年は、4年に1度、さらに100の倍数時は閏年は存在しないが、400の倍数時には閏年とする。こんな規定ちゃんとあるの?」と。

はい、調べました。(google先生さまさまです)

日本では「置閏法(閏年を算出する法則)」にのっとり閏年を制定しているそうです。ただ、この置閏法も世界に合わせて変わっていっている感じ。(※Wikipedia調べ)
紀元前より、ユリウス暦では1年365.25日とされていたため、閏年の扱いは4年に1度2月29日を追加するだけでした。
ですが、この計算も間違っていることがわかりより精度を高くするため、1582年よりグレゴリオ暦(現在採用されている計算方法)が制定され施行、1582年10月4日の翌日を1582年10月15日と調整することで紀元前からのずれを調整し、さらに、4年に1度の2月29日の追加に加え西暦の100の倍数、すなわち西暦100年、200年、300年・・・1900年・・・は閏年はない365日の年(平年という)とし、さらにさらに、西暦の400の倍数、すなわち西暦400年、800年・・・2000年、2400年・・・は閏年として扱う。となりました。(※人様のブログ調べ)

結果

・1582年までは4年に1度2/29(1日)追加する
・1582年は10日少ない
・1583年以降は4年に1度2/29(1日)追加するが、
 西暦が100の倍数は追加しないが、
 西暦が400の倍数は追加する

という対応が必要だとわかりました。

ここまでこれば、プログラムに書くだけなので!簡単!簡単!!

<?php
// ユリウス暦からグレゴリオ暦までの計算
$days = ((1582 – 1) * 365) + floor(1582 / 4) – 10; // (日)
// グレゴリオ歴では100年に1度閏年をカウントしないかつ400年に1度はカウントすることで調整している
$days+= (1970 – 1582) * 365 + floor((1970 – 1582) / 4) – (floor(1970 / 100) – floor(1582 / 100)) – 1; // (日)
echo “days:=” . $days . “\n”;
?>

これで、マジックナンバーも使わずに正しいticksを計算できました!!

[朝の思考] 自動車の近接センサー

車のメーカー・車種によってマチマチではあるのですが、近接センサーで思うところがあるとです。

・無駄に反応が良すぎる!(反応しなさすぎ!)
・近接センサーの表示/色/表示場所
・実際どうなの・・・?

まずは「無駄に反応が良すぎる!(反応しなさすぎ!)」からですが、メーカー・車種でだいぶことなりますが、主にバイクですり抜け時(本当はしちゃダメよ?)の私の印象を。

 ・TOYOTA アルファード/ヴェルファイア 等
  →めちゃくちゃ離れてるのにもう光ってる!
 ・SUBARU レヴォーグ(他見てない)
  →光らなさすぎ!
 ・DAIHATSU (車種忘れた・・・)
  →無難
 ・おベンツ様
  →無難(これは別に難あり 下記に記述)

アルファード、ヴェルファイアの異常なまでの感度の良すぎること。(気持ちでは)10mぐらい後方から追い越しかけているのに、すでにミラーが光ってる・・・。
早すぎる表示は運転者からするとどうなのだろう?常に反応している状況に感じてしまい警告としての機能をはたせないのではないだろうか?と感じる。

レヴォーグ、これはかなり問題だと感じた。真後ろに張り付いてる(2,3m)から横に出て追い越しする際、すでにバイクの前輪からタンクぐらいまで車の後方に近づいているのに光らない!結局、そのまま離れながら横まで来きてようやく警告がでるという感じ。これはこれで、警告としての意味どころかこれを信じて走ると完全に事故だと感じる。。

DAIHATSU、おベンツ様は、可もなく不可もなくなので、無難にいいのではという勝手な印象。

次は「近接センサーの表示/色/表示場所」について、ここで一番言いたいのがおベンツ様!サイドミラーに二十三角の赤色表示!もうね、追い抜き最中に赤色見えるととっさにブレーキをかけてしまう。。(危険回避の習慣・・・)
ほんとおベンツ様、大きさ、色、マジで考え直してください。。。

最後に「実際どうなの?」ですが、見てるとわりと新しいレクサス乗ってる人や、クラウンなど、さらにはスカイライン、CIVIC(これは別か?)でも、つけていない車の方が多く感じる。
勝手な私の考えですが、きっとディーラー購入時に近接センサーの値段をみて、メリットを見出せず「いらないから外して安くしといて!」となってしまっているのではないかと。確かに、自分で新車買う時がきたら(来るのか?)、きっと値段安くなるなら外すと思います・・・。
ないと全く意味がないので、この手の近接センサーは「視認性が落ちるところの補助」がメインなわけですから、大型車(トラックや、バスなど)が最も有用だと思います。

すでに各メーカーから新車では出ていると思いますが、皆新車を買えるわけではないので、後付けを安くできるようなものがあるといいなぁ。と考えながら会社に着きました。

後々調べると商品なくはないですね。

http://www.amazon.co.jp/dp/B07KZGQRWG

ホイール・タイヤ インチアップに向けてまとめ

インプレッサの夏用タイヤの溝がなくなってきたので、タイヤ交換ついでにホイールインチアップもやっちゃおう!ということでまずは下調べ!

現在のタイヤサイズは205/50R17

ホイールインチアップで注意しないとならないのが、外径が純正値から+6%、マイナス-22.5%以内にしないと車速計に狂いが生じてしまうので車検が通らなくなります。なので外径が大きく変わらないように今のサイズは638mm

他にはツライチを目指すわけではありませんが、フェンダからの飛び出しが前方30度、後方50度の範囲が飛び出し禁止範囲。この点を注意しなければならず、不用意にリム(タイヤの幅)を大きくできません。さらにオフセット(最近はインセットとオフセットを使い分けるよう)も気に留めなければなりません。

まだまだ気をつけない点があります。ハブ径P.C.D穴数

穴数は聞いての通り、ホイールを止める数です。ちなみに今回は5穴。他の車だと4穴や、ボックス車になってくると6穴、トラックになるとそれ以上とあります。

P.C.Dは上記穴数のピッチのこと。今回は100です。100以外でよくあるのは114.3。100と近いから着く!と絶対に思っちゃダメです。つきませんからwその他には、90台も115以上もいっぱいあるが一般車で100か114.3以外をあまりみないのでいいでしょう。。

ハブ径は、ホイールのセンター部分(車体とくっつける部分をハブという)の径です。今回は56mm。これもいろいろあるので合うホイールを探すか、ハブリングと言われるサイズを変更するリングをかまさないとなりません。ハブリングは小さいのから大きものへ変更するものなので、車体のハブ径が以上のホイールじゃないといけません。

さて、ここまでをまとめ、インプレッサ GH8 のタイヤ、ホイールは

インチ17インチ
穴数5穴
P.C.D100mm
ハブ径56mm
オフセット+55mm
タイヤ幅205mm
扁平率50%
外径638mm

となります。希望と並べてみると。

項目現在希望
インチ17インチ18インチ
穴数5穴変更なし
P.C.D100mm変更なし
ハブ径56mm選ぶホイール次第
オフセット+55mm選ぶホイール次第
タイヤ幅205mm(外径変えないために)
225mm
扁平率50%(外径変えないために)
40%
外径638mm638mm

外径は上でも書いた通り、多少の誤差は認められているので、

18インチならば、205/45R18(外径642mm)や、215/40(45)R18(629mm(651mm))、235/40R18(645mm)なども履くことが可能。

17インチでも、205/50R17はもちろん、215/45(50)R17(625mm(647mm))、225/45R17(634mm)、235/45R17(643mm)なども履くことが可能。

ということで早速「安くて」「好みの」ホイールを探さねば!!