この間Kaspersky Internet Security 2009(以降KIS9)のライセンスが切れてしまったのでKaspersky Internet Security 2010(以降KIS10)を購入して使っているのですが不便な点が2つ。
不便な点その1は、勝手に始まるルートキットスキャン。
バックグラウンドで細々とスキャンしているようですが、突然重くなることもあります。困ったことに 1日に何度も「勝手に」起動し、キャンセル不可能、起動しない設定にすらできません。これはナンセンスです。
不便な点その2は、劣化したユーザインタフェース。特に「アプリケーションコントロールウインドウ」と「ファイアーウォールウインドウ」の2つ。
「アプリケーションコントロールウインドウ」はリストアイテムの複数選択ができなくなりました。は?それだけ?と思うかもしれませんが、使わないルールを削除するときにかなりイライラします。元々KIS9ではできていただけに残念です。
ファイアーウォールウインドウ、「文字化け」やら「不明」な設定がちらほら
「ファイアーウォールウインドウ」は複数選択は出来るものの、トップアイテムであるアプリケーションルールが削除できません(子アイテムである個別のネットワークルールは一部だけ削除可)。
実はKIS9から引き継いだルールが1/3くらい文字化けしてしまい、今も削除できずに残ったままなのです。上記をクリックして拡大していただくと分かります。これはあまりにもかっこ悪いです。
その1のルートキットスキャンについては、レジストリをいじって止める方法を使って強制的に停止させています。
無理矢理スキャンを止めているので他の機能に影響が出るかもしれません。自己責任でどうぞ。
私の環境ではスキャンを止めてもGamepot rootkit(ラテールのゲームクライアント)を起動すると、隠しオブジェクトがある!と警告してきますので、恐らくリアルタイム保護は働いているであろうと推測して、そのまま使っています。
その2についてはどうしようもないですね…。Kasperskyは細々した設定を便利にできるところが良かったのに、その点KIS10はかなり残念になってしまいました。
何を細かいことをグダグダと…そんなに嫌なら買わなきゃ良いのに?というのもごもっともですが、Kasperskyは細かい設定を気にする人に需要があることを忘れて欲しくないです。
とにかく動けばいいと言う人、設定なんか全く見ない、全部デフォルトで放置しても何も気にならない人が、Kasperskyをわざわざ買って、インストールするはずがない。だってKIS10って、ウイルスバスター2010の2倍するんだよ?物好きしか買わないんだよ。
社会人になってすっかり忘れていたのですが、子供の頃、ラジコンが欲しかったのです。特に車タイプと空飛ぶタイプが欲しかったのです。
車タイプは大学生の時に買いました。部屋の中でも遊べるくらいの小さいやつを買ったのですが、モーター音があまりにうるさくて近所迷惑だったのですぐ止めました…。
今日、ヘリコプターのラジコンを、しかも「室内用」と書いてあるラジコンを見つけたので思わず買ってしまいました。単三電池がたくさん必要と書いてあったので、充電式エボルタ8本と一緒にまとめ買いです。
いざ寮の廊下で飛ばしてみると、結構楽しいのですが、やはりモーター音がうるさくて、かなり近所迷惑な音がします。
寮の部屋でもやってみましたが、やはりうるさいのと、狭すぎてすぐに事故って全然楽しくありません。いったんぶつかると吹っ飛んで、ピンボールのようにあちこちにぶつかっります。今にも壊れそうです。
飛行機もヘリコプターも、ものすごい音たてて飛んでいます。エンジン近くでは会話が不可能なほどの爆音です。
空を自由に飛ぶと言えば、ドラえもんに登場するタケコプターですが、作中では人間一人を軽々と持ち上げ、それでもかなりの加速力を発揮しています。
飛行機やヘリの騒音から想像するに、タケコプターの騒音も相当なもので、飛行中の会話なんて不可能ではないでしょうか?
でもドラえもんやのび太はタケコプターで飛行中でも、地上に居るときと同じように会話しています。未来の道具はとても静かなのでしょう、羨ましいですね…。
同期の誕生祝いに焼き肉屋に行きました。
同期で誕生祝いをするときはケーキを買って行って、食事の最後に出すのですが、今回は焼き肉とケーキというヘビーすぎる組み合わせになりました。
店のチョイスからしておかしくね?というツッコミはその通りな気がしますが、こまけぇこたぁいいんだよ。みんな食ってたからいいんです。
前回(2009年11月18日の日記参照)は経過日から年の計算を行いました。今回はそのテストを行います。
そもそもこの問題を解き始めた動機は、年月日から経過日への変換関数はあるけど、逆はないよね?でした。要するに世の中には年月日から経過日を計算する、信頼できる関数があるってことです。
テストの方法は下記の通り、
経過日 --(今回作成の関数)-> 年月日 --(実績ある関数)-> 経過日
として、同じ経過日が出てきたらOK、違っていたらNGです。
年月日から経過日(修正ユリウス日)への変換関数にはフリーゲルの公式を選択しました。
(Wikipediaユリウス通日の項から引用)
グレゴリオ暦y年m月d日午前0時の修正ユリウス日は、x以下で最大の整数をfloor(x)で表すと、
floor(365.25 * y) + floor(y / 400) - floor(y / 100) + floor(30.59 * (m - 2)) + d - 678912
実装する関数の仕様は下記の通りです。
この処理をC言語で書くと下記のようになります。floatへのキャストがかなりウザいですが、気にしないでください…。
int cal_to_mjd(int year, int month, int day, int *mjd)
{
int chk[] = {
31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
};
int u, d;
if (month < 1 || 12 < month ||
day < 1 || 31 < day) {
return -1;
}
if (year % 400 == 0) {
u = 1;
} else if (year % 100 == 0) {
u = 0;
} else if (year % 4 == 0) {
u = 1;
} else {
u = 0;
}
if (chk[month - 1] + u < day) {
return -1;
}
if (month == 1 || month == 2) {
year -= 1;
month += 12;
}
if (year < 1) {
return -1;
}
d = (int)(
floor(365.25 * (float)year) +
floor((float)year / 400.0) +
- floor((float)year / 100.0) +
floor(30.59 * ((float)month - 2.0)) +
(float)day - 678912.0 );
if (mjd) {
*mjd = d;
}
return 0;
}
テストを行う前に、私の作った関数とフリーゲルの公式が取る「引数の差」について考える必要があります。
引数 | 私の作った関数 | フリーゲルの公式 |
---|---|---|
経過日 | 400で割り切れる年(基準年とする) の3月1日を0日とする経過日 |
修正ユリウス日 (1858年11月27日を0日とする経過日) |
年 | 基準年からの経過年 | 西暦(グレゴリオ歴) |
月 | 月(3月〜14月) | 月(1月〜12月、グレゴリオ歴) |
日 | 日(1日〜31日、グレゴリオ歴) | 日(1日〜31日、グレゴリオ歴) |
以上から、私の作った関数とフリーゲルの公式の引数では、経過日、年、月の3つが異なっています。まずはこの差を埋める補助関数を作ります。
経過日については、修正ユリウス日から適当な値(でたらめという意味ではありません)を引いて、3月1日を0とするような日に直してあげます。
基準とする日は400年で割り切れる年ならどこでも良いです。しかしグレゴリオ暦の採用年が1582年以降であることを考えると、そこ付近のグレゴリオ暦にはあまり意味がありません。1600年あたりを開始日とするのが妥当でしょう。
経過日0日が表す1600年3月1日の修正ユリウス日は -94493日です(フリーゲルの公式より、計算省略)。修正ユリウス日に94493を足せば経過日へ変換できます。
年については、経過日をグレゴリオ暦の1600年を基準としたので、結果に1600を足せばグレゴリオ暦の年に変換できます。
月については、3月〜12月まではそのまま、13月、14月を翌年の1月、2月と考えます。これで経過日、年月日ともにフリーゲルの公式と揃えることができました。
実装する関数の仕様は下記の通りです。
この処理をC言語で書くと下記のようになります。
int mjd_to_cal(int mjd, int *year, int *month, int *day)
{
int base, date, y, m, d, mod;
int result;
base = 1600;
date = mjd + 94493; //date 0 is 1600/3/1
date += (1600 - base) / 400 * 146097; //date 0 is base/3/1
result = date_to_year(date, &y, &mod);
if (result == -1) {
return result;
}
result = date_to_month(mod, &m, &d);
if (result == -1) {
return result;
}
y += base;
if (m > 12) {
y += 1;
m -= 12;
}
if (year) {
*year = y;
}
if (month) {
*month = m;
}
if (day) {
*day = d;
}
return 0;
}
上記で説明したこと以外に、mjd_to_cal関数では基準年を変更できるようになっています。base = 1200にすれば1200年3月1日以降の修正ユリウス日を扱えます。ただし負の数、0年には対応していないため、最小値は400年3月1日(base = 400)です。
きちんと変換できるか、異常値に対してエラーを返すかどうか、-94495(1600年3月1日の2日前)から944929(4446年1月2日)までの経過日を与えてテストします。
int main()
{
int y, m, d, mjd;
int f, result, i;
int tmin, tmax;
f = 0;
tmin = -94495;
tmax = 944930;
for (i = tmin; i < tmax; i++) {
result = mjd_to_cal(i, &y, &m, &d);
if (result == -1) {
printf("mjd->date:%3d -> error\n", i);
continue;
}
result = cal_to_mjd(y, m, d, &mjd);
if (result == -1) {
printf("date->mjd:%4d/%2d/%2d -> error\n", y, m, d);
continue;
}
if (i != mjd) {
printf("mismatch!!\n");
printf("mjd->date:%5d -> %4d/%2d/%2d\n", i, y, m, d);
printf("date->mjd:%4d/%2d/%2d -> %5d\n", y, m, d, mjd);
f = 1;
}
}
if (f == 0) {
printf("Test Passed, mjd [%d, %d]\n", tmin, tmax);
}
return 0;
}
実行結果は下記の通りです。
mjd->date:-94495 -> error mjd->date:-94494 -> error Test Passed, mjd [-94495, 944930]
1600年3月1日より前の日付はエラーになり、それ以外はテストにパスしました。どうやら正しく変換できているようです。
ネットで調べていたら、経過日から月日へ変換する際にループを回すのは遅くてナンセンスという記述を見つけてしまいました。な、なんだってぇー!?
高々12回、平均6回のループがそんなに遅いだろうか…?計算一発で出す方式を考えて、ループ方式と速度比較しようと思います。
< | 2009 | > | ||||
<< | < | 12 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
- | - | 1 | 2 | 3 | 4 | 5 |
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 | - | - |
合計:
本日:
管理者: Katsuhiro Suzuki(katsuhiro( a t )katsuster.net)
This is Simple Diary 1.0
Copyright(C) Katsuhiro Suzuki 2006-2023.
Powered by PHP 8.2.15.
using GD bundled (2.1.0 compatible)(png support.)