具合が正常では無い状態。それを不具合と言います。
プログラムを作る上で、不具合というのは基本的に無い様に作っています。
今のプログラムは関数型が主だったもので、
aというパラメータを入れるとそれを計算した結果のAを出力します。
これは非常に固定的な物で、いつ、何処で、どんな風に、実行しようとも変わりません。
ですから、不具合が発生するはずが無いのです。
ゲームの場合も、アプリケーションでも、それらは変わりません。
ただ、パラメータが一つでは無く複数有るだけの話です。
パラメータが複数有ると、パラーメータの一つがちょこっと変わっただけで、画面上では大きく違う動作を行うことがあります。
それでも、全てのパラメータを正しく、順番通り、処理すれば不具合など発生しないのです。
それが、プログラムの利点で有り、プログラムの限界でもあります。
でも、それが故に、本来不具合は発生しないのです。
それでも、不具合が起きる。ユーザーから苦情が来る。
制作者は死にものぐるいで不具合の原因を突き止め、それを修正する。
大抵は、「全てのパラメータを正しく順番通りに処理」していないから起きます。
プログラムの作成は大抵、半年〜数年掛けます。
また、商品の寿命が長ければ、機能強化やらなにやらアップデートを繰り返すことになります。
作り始めた当初と、作り込んでいく先でプログラムに 新型と旧型が混ざることになります。
新型のプログラムというのは、これまで有った不具合を但し、新しく追加した機能のために様々なパラメータが増えたりしています。
しかし、古い方にはそう言った物が一切ありません。
大抵は、追加した機能により修正した部分よりも、何も変更しても居ない部分で発生することが多かったりもします。
でも、それ以上に問題なのは、連携です。
プログラム1とプログラム2の間で、取り決められている条件の物でパラーメータを遣り取りし、お互いに補完し合いながら動作することがあります。
しかし、プログラム1はアップデートしていないのに、プログラム2だけアップデートするなどで、取り決められた当初とは違うパラメータの遣り取りが発生する場合があります。
本来であれば、プログラム1側で、定められた範囲外のパラメータに対しては、プログラム2にエラーを返したり。
予め、プログラム2と連携するときに相手のバージョンを確認するなどの対応があれば、不具合が発生しないのですが・・・
相手側が一切情報を公開していない場合はどうなるのでしょうか??
ようするに、OneDriveの事です。
REST APIはあれもこれも色々と出来ると言っていますが。実際に始めると、色々と出来ないことが多いのが分かります。
じつはブラウザを利用したり、MS純正のOneDriveアプリを利用したりすると、ファイルの更新日が正しく反映されていたり、100M以上のファイルが送れたりします。
REST APIにはファイルが大きい場合は分割送信が出来ると書いてあり、 HTTP1.1のページへの誘導を行って、Range パラメータを利用することで、大きいファイルの送信が可能と言っていますが・・・、
multipart/byteranges
とか
Range
の話ですが、どれもこれも、サーバーのレスポンスの話として書いてあって、クライアントからの送信時に使えるかは分かりません。
いずれ試してみますが、WebClientではサポートしていないので、自分でバイナリデータを作ってやってみるしか有りません。
ようするに、OneDriveと、同期を取る方法として、現在公開されている範囲のRESTでは不完全なわけです。
「100M以上のファイルがあると同期が正常に取れない。」 これが一つ目の不具合です。
しかも、それだけじゃ有りません。
今作っているソフトは、OneDriveとクライアントで同期を取るだけで無く、一方的にアップロードすることや、一方的にダウンロードすることも出来ます。
ようするに、相互に最新の物を優先する方法と、 クライアントにあるのを絶対のマスターとすること、逆に鯖にある物をマスターとすることが可能になっています。
で、OneDriveのREST手引きには、「自動的にアップロードする様なアプリの作成は控えるべき」と書かれていましたが、ならば、一方的なダウンロードには特に問題が無いと言うことに成ります。
先述の通り、ファイルの更新日などが正常に反映されない、させる方法が公開されていないREST APIで更新するくらいなら、ブラウザでアップロードする方が楽かもしれません。
で、実験してみると、これがまぁ、不具合が出るのです。
サイズが100M以上有るから?
それも違います。
先日500M以上のファイルをなんの問題なくダウンロード出来ました。
じゃぁ、何か?
これまで、テストと称してダウンロードを始めたのですから、初めてのダウンロードです。
当然です。
ディレクトリも全部自動作成です。
それにもかかわらず、ダウンロード時にエラーが出るのです。
エラーを詳細に追ってみると、あり得ない場所であり得ないエラーが出ていたのです。
先ほどの通り、初ダウンロードです。
フォルダ自体も、事前に作っています。
しかし、根本的なところとして、事前にファイルがあった場合、それと差し替える機能を作ってあります。
そして、その差し替え機能が動作していました。
ダウンロードは、そもそも異なる名前でする用になっています。
違うファイル名でダウンロード、現在のファイルを別名に変更、新しいファイルを正しいファイル名に変更、古いファイルを削除、
そう言った手順です。
エラー処理も多重に入れており、いざというときは、旧ファイルで復旧出来るようにしてあります。
まず1つめの問題。
何故、ファイルがあったか。
考えられることは一つしかありません。2回ダウンロードしたからです。
ファイルリストに何らかの影響で、同名のファイルが二つあったのです。
ファイルリストはOneDriveに提出して貰っているので、履歴か何かの影響で複数合ったのでしょう。
2つ目の問題。
先ほどの通り、置き換えるようにプログラムを作っています。
例え2回ダウンロードしたとしても、後からダウンロードしたのが優先されるだけでエラーが出るはずがありません。
しかし、フォルダを見てみると、ファイルがありません。
ファイルは単純に、moveで順番に更新しているだけなので、消えるはずがありません。
しかも、ダウンロードしたファイルがありません。既存のファイルを大体のファイル名に変更した物はあるのに、ダウンロードしたファイルがありません。
一応、ダウンロード時にエラーが出た場合は、エラー処理を行いますので、それはそれで問題はありません。
ダウンロードを完了したのに、ダウンロードしたファイルが無い。
それが、今回の不具合です。
では、原因は何故でしょうか?
もちろん、2回同じファイルをダウンロードしようとしたこともあるでしょうが、もう一つが
1回目のダウンロードです。
1回目は別名でダウンロードしますが、特別な名称ではありません。
単に適当な文字列を追加しただけで、ユニークではありません。
別名で保存−>正式なファイル名で保存。
2回目の実行時ですが、先に別名の方を削除するプログラムを先頭に入れています。
そして、ファイルがある場合はエラーで返すことになっていますので、ここまでは問題ありませんし、別名でダウンロードした後、既存のファイルがある側の処理にうつっています。
ここで、既存のファイルの代替への変更が完了しています。
ここまでは実行されているのでエラーはこの後と言うことに成ります。
ダウンロードしたファイルを正しいファイル名へ変更ですが、ここでファイルが無いのでエラーになっています。
考えられるのは、ダウンロードのエラーですが、エラーその物は発生していないし、もう一つで言えば、ダウンロードは正常に終了したのに、ファイルは作られなかった。
ですね。
これらのことより
1.同じファイル名があったら、どちらをダウンロードするか判断する。
2.例外が発生しなくてもダウンロードが失敗していないか確認する必要がある。
ですね?
2.に付いては、事前のファイル情報を受信したときに、ファイルサイズとか調べておかないと分かりませんね? あと、ファイルの時間とかも更新日付で修正した方が良いかもしれません。
ある程度連続でダウンロードするとファイルの受信が出来ない。これが二つ目の不具合です。
ちなみに、ある程度は結構なファイル数です。
また、詳細なテストのために暫く放置していたためか、それ以降のファイルが全く受信出来なくなっていました。
|