解説:教えて那々子先生
| 週初の日付 | 週番号(10進数) | 週番号(2進数) |
|---|---|---|
1980/01/06 |
0 |
0000000000 |
1980/01/13 |
1 |
0000000001 |
1980/01/20 |
2 |
0000000010 |
| 略 | ||
1999/08/08 |
1022 |
1111111110 |
1999/08/15 |
1023 |
1111111111 |
1999/08/22 |
0 |
0000000000 |
| 略 | ||
2019/03/31 |
1023 |
1111111111 |
2019/04/07 |
0 |
0000000000 |
| 略 | ||
2038/11/14 |
1023 |
1111111111 |
2038/11/21 |
0 |
0000000000 |
| 略 | ||
2058/06/30 |
1023 |
1111111111 |
2058/07/07 |
0 |
0000000000 |
| 略 | ||
2078/02/13 |
1023 |
1111111111 |
2078/02/20 |
0 |
0000000000 |
GPSの仕組みは、簡単に言うと4機以上のGPS衛星から受信したデータから現在位置を算出することによって実現されています。
GPS受信機がGPS衛星に電波を発信して、衛星が位置を特定しているというイメージを抱く人も多いようですが、それは誤解です。
しかし、衛星から一方的に受信したデータだけを用いて、どのように位置情報を算出するのでしょうか。
その算出に用いられるのが、GPS衛星が発信するデータに含まれる以下の情報です。
- 衛星の軌道上の位置
- 発信時刻
その中でも、発信時刻は、電波伝播時間からGPS衛星との距離を求めるために用いられるのです。
参考文献
したがって、位置情報を算出することだけを考えるなら、週の最終日の23時59分59秒と翌週初日の0時0分0秒の境界さえ正しく判定すれば良いということになります。極端な話、それを実現するためには、1ビットの情報(奇数週目か、偶数数目か)で充分です。毎週ロールオーバーの処理を行なえば機能上問題ないからです。
しかし、現在の日付を知るためには、やはり週番号が必要となります。そして、その週番号はロールオーバー後、約20年間は増え続けます。
そのため、週番号がいつまでも増え続けるという前提で組まれてしまっているソフトウェアが存在します。そのような実装では、週番号が0に戻るケースを正常に処理できません。その結果として、位置情報を正常に取得できなくなったり日付がおかしくなったりするのです。最悪の場合、データが壊れたり、人命に関わる誤動作を引き起こすリスクも想定されます。したがって、これは情報セキュリティや物理的なセキュリティ・セーフティにも関わる問題ともいえるのです。
対策としては、まず、位置情報の算出の際にはロールオーバーを正しく検出するように実装することです。また、日付に関しては、製造年月日の週番号を記録しておき、それ未満の週番号の場合は、1024を足して処理するという方法が考えられます。そうすることで、製造年月日から最大1023週間は正常に動作できます。
――2294年01月07日
