mishimaの日記: 俺はもうべからず集を作らないといけないのかも知れない 35
日記 by
mishima
「(OS起動直後はいろんなサービスが準備中だったりするから)OS起動後5分待ってから処理するようにしてね」
と要件に書いて委託したソースコードがこんな処理になって帰ってきた:
TimeSpan ReleaseTime = new TimeSpan(0, 5, 0);
DateTime DelayTime = DateTime.Now + ReleaseTime;
while (DelayTime > DateTime.Now)
{ }
コメントには堂々と「指定した時間待機させるにはこれしかない」と書いてあるわけですよ。
ぐぬぬ。
一瞬何が書いてあるか分からなかった (スコア:2)
あまりお近づきになりたくないタイプ。
Re:一瞬何が書いてあるか分からなかった (スコア:1)
近づかないようにできるならそれに越したことはないですね。
ただまぁ、少なくとも弊社が委託先に使っている会社(国内)には一名おりましたよ、と。
(これが最後の一人とは思えない、第二第三の…)
# mishimaは本田透先生を熱烈に応援しています
Re: (スコア:0)
言語ではなくOSの機能にスリープがあるということを知らないとこうなるし、思い込んでしまうと調べないのもよくわかるな
スラド民の大半がこうだよ?
Re:一瞬何が書いてあるか分からなかった (スコア:2)
> スラド民の大半がこうだよ?
へぇ、根拠は?
Re: (スコア:0)
> コメントには堂々と「指定した時間待機させるにはこれしかない」と書いてあるわけですよ。
しかない、ということはスマートな解決ではないことは自覚しているようですし、
> 本件のコメントには「タスクスケジューラが持っている遅延実行はランダム遅延だからダメ」
> とか書いてあってですね…なぜダメだと思ったのか。
とまあ、やっぱり思い込みの問題だと思うのですよ
しかしここについたコメントは彼の知識不足を取り上げるものばかりで、これもやはりスラド民の思い込みのなせる業だなと
Re:一瞬何が書いてあるか分からなかった (スコア:2)
失敬、「思い込んでしまうと調べない」の方ね
「言語ではなくOSの機能にスリープがあるということを知らない」かと思いましたよ
そんなのの比率知ってるのかと
たしかに (スコア:2)
sleepはOSによってはsignalがらみで変な行動になりかねないから…
Re: (スコア:0)
C#ってその程度のことも抽象化できてないの?
なぜ (スコア:0)
{ } の中にsleepがないんでしょうねえ...せめて
# 処理系によっては、適度にポーリングしないと、はあるので、ソースの大枠はわるくはないと思うけど
## というか起動時の待ちとして、これがいいかは日記からだとわからんけどね...
Re:なぜ (スコア:1)
sleepを知っていれば、五分間sleepするんじゃ…
いや、ヤツらは我々の想定の斜め上を行ってるかも。
Re:なぜ (スコア:1)
別の部分で Thread.Sleep() 使ってる形跡はあるので、
知らないわけではないようです。
なぜ Sleep() を使わなかったのかは謎(busy waitという概念を知らない?)。
# mishimaは本田透先生を熱烈に応援しています
Re:なぜ (スコア:1)
これは Windows の起動時にさせたいバッチ処理(特定のファイルをサーバにアップロードする)の一部です。
目的からしてもこんな書き方は不要だし、常識的に言っても busy wait をさせるには 5 分間は長すぎると思うのです。
# mishimaは本田透先生を熱烈に応援しています
Re: (スコア:0)
DelayTimeとReleaseTimeの変数名は逆にしたほうがいい
Re: (スコア:0)
誤記による代入を防ぐために (42 == value) なルールの可能性が…ないか。
Re: (スコア:0)
C#でC/C++みたいな誤記による代入って起きうるの?
特定のサービスが起動してるか確認する (スコア:0)
特定のサービスが起動してるか確認してから処理を開始する、というサンプルでも見て作ったのかな?
Re:特定のサービスが起動してるか確認する (スコア:1)
わからんですが、ネットに転がってるサンプルコードでも busy wait で待ってるのは存在してないんじゃないかなぁ、と。
# mishimaは本田透先生を熱烈に応援しています
Re:特定のサービスが起動してるか確認する (スコア:2)
現在時刻拾ってくる実装でお給料頂いていることに驚きでありますよ。
Re:特定のサービスが起動してるか確認する (スコア:2)
タイマーセット時の5分後だと,永遠に5分後が来ないかもしれないし…
Windowsなら (スコア:0)
タスクで起動するなら遅延時間を指定しておけばいいし、
サービスならそのものズバリ、他のサービスの開始を待ってから開始する「自動(遅延開始)」設定があるのに…
自前で時間を待機しようとするな。特に時間を待機するためだけにサービスで実装するな。と10年以上前からMSは仰せです。
Re:Windowsなら (スコア:1)
おっしゃるとおりです。
本件のコメントには「タスクスケジューラが持っている遅延実行はランダム遅延だからダメ」
とか書いてあってですね…なぜダメだと思ったのか。
# mishimaは本田透先生を熱烈に応援しています
Re:Windowsなら (スコア:2)
「5分遅延」に要求される精度に対する感覚が違ったんですかねぇ
Re:Windowsなら (スコア:2)
それならそれで、起点の精度についても考えて欲しかったですね。
svn-init() {
svnadmin create .svnrepo
svn checkout file://$PWD/.svnrepo .
}
Re:Windowsなら (スコア:1)
そうですね。
ただ、「当たり前」の感覚が違うのはコミュニケーションが難しいですね。
わたくしとかは「ミリ秒の世界ならともかく5分間の busy wait なんてありえねーだろ」と
思ってるのでわざわざ要件に入れたりしないですし。
今回についてはわたくしの「当たり前」がITエンジニアの標準になってほしいと思うばかりです。
# mishimaは本田透先生を熱烈に応援しています
Re:Windowsなら (スコア:2)
逆にわたしゃバッチ満載の[一般的な]業務アプリはよく分からないので,お互い様,な気もしますけどねw
Re:Windowsなら (スコア:1)
そうかもしれないですね。
今回のケースだと「客に出すコード書かせる前にこの程度は社内教育しておけないか」
ということになりますが。
# mishimaは本田透先生を熱烈に応援しています
Re:Windowsなら (スコア:2)
依頼先に頭でっかちのレビュアーが居て、その場しのぎで絡んだとか?
Re:Windowsなら (スコア:1)
ときどきそういう人いますよね、「お前落とし所考えて突っ込んでんの?」みたいな人。
ただ今回のケースでは、知ってる範囲の委託先メンバにそういう人はちょっと思い当たらず。
# mishimaは本田透先生を熱烈に応援しています
Re:Windowsなら (スコア:1)
あらかじめ、望むプログラムAを起動するタスクBを、スケジュール指定なしで登録しておいて、
そのタスクBが「今から5分後」に実行されるようにスケジュールを更新するスクリプトCを書いて、
そのスクリプトCをシステム起動時に実行するタスクDを登録しておく。
というのはどうでしょうか?
Re:Windowsなら (スコア:1)
うーん、タスクやモジュールが複数になる時点で管理が面倒になるので、
わたくしならそういう方法は選ばないですね。
# mishimaは本田透先生を熱烈に応援しています
Re:Windowsなら (スコア:1)
たしかに読み返してみたら複雑過ぎますね(^^;
タスクの遅延時間のランダム度合いを指定できるようになればベストなのですが。
相手の技量次第なら具体的に指示するほうがいいのでは (スコア:0)
sleepを使ったことによって、怒られた経験でもあったんじゃない?
具体的に指示しちゃいけない契約形態の委託先ならしかたがない。
5分待つってのも、あまり合理性のある話しとは思えない。
必要なサービスに依存関係をかけたモニタサービスから、カーネルmutex経由で、起動可能なタイミングを教えたり、
起動した依存するサービスのプロセスをチェックして適切なタイミングをはかったり出来るんじゃないかな。
Re:相手の技量次第なら具体的に指示するほうがいいのでは (スコア:1)
「なんでSleepを使ったら怒られたのか」の理由を理解していればよかったんでしょうけどね。
OS起動後5分後に、というのは実装を複雑にしないためです。
(弊社はお金がないので)
# mishimaは本田透先生を熱烈に応援しています
Re: (スコア:0)
OS起動後、5分という時間を待って実行というのは不確実性高いのでは。
# 時間に頼った実装は環境の変化に弱い
# それと、間違って面白おかしいのモデを付けてしまいました。。。
ため息かも (スコア:0)
スラド民なら分かってもらえると思ってたmishimaさんがため息している気がする