ティアのホームページ☆ミ:Page 151 oC
<<< << < prev3$F? 151/554ページ(1661件) $FAnext3 > >> >>>
To Close..中級編 その3 2014年11月17日10時10分
実は16日に書いていたのですが、途中で忙しくなり消してしまったので、また1から書き直しです。

先日の最後にフォルダの作成方法について書きました。

また、フォルダをたどっていくときの注意点についても書きました。

あと、何が必要でしょうか??


ファイルの送信ですね?


ファイルの送信は、色々なところに紹介されているようなMIME形式でMethod POSTを利用するのが最も楽です。

先日までの手段を用いて、フォルダのupload_locationを取得したら、それに対して、methodをPOSTに設定して

UploadFileで送信するだけで終わりです。

始め、ご丁寧にMIMEのmulti-partを作成してUploadDataを使って送信しようとしたんですが、"Content-Type"でエラーが出て送信が出来なかったんですよ。

ですので、送信先と、送信元で違うファイル名を設定することが出来ません。
ファイルに対する情報設定は事前にやっておく必要があります。


実際の送信方法はこちら

Byte[] bData = wc.UploadFile(UploadLocation + "?access_token=" + access_token, "POST", FullName);

また、APIその物に
http://msdn.microsoft.com/en-us/library/dn631834.aspx
ここを見ていただければ分かりますが、
name、description、sort_by以外に書き込める内容が存在しません。

プロパティの変更は、ほぼ何も出来ないと思って間違い有りません。

まぁ、descriptionにコード化したupdatetimeなどの情報を忍ばせても良いですが、
そこまでするのかな?って感じはしなくもありません。

ローカルの送信元のファイルがクラウド側の送信先のファイル日付より新しくなっていたら、更新するという非常にシンプルな構造でも、自動更新は可能です。

取りあえず、実行完了時に帰ってくるByte[]にフォルダ作成時と同じように新しいファイルのid等が入ったJSONが有りますので、それを利用すれば、デスクリプション等の変更やファイルのダウンロードが可能です。


これで、一応目的の、OneDriveの指定場所に、指定したフォルダの内容を自動的にアップロード/更新が出来る状態になりました。

ですが、まだちょっと問題が有ります。


そう、消したファイルです。


消したディレクトリを、まるまるクラウド側で消すのは、色々と問題が有ります。

なので、ディレクトリ削除については今回は行いませんが、

1個1個のファイルなら別です。


ファイルを削除する場合はこちら

ちなみに、UploadDataを利用していますが・・・送信データはありません。
wc.UploadData("https://apis.live.net/v5.0/" + id + "?access_token=" + access_token, "DELETE", new Byte[0]);

また、削除するので、返信もありません。多分、JSONが帰ってきたら、ファイルの削除に失敗しているとかそういう感じでしょうか?

イマイチ分かりません。

それにしてもMethod Deleteが日の目を見るとは思いませんでした。
httpの仕様にはかなり以前からDleteは存在したのですが、誰かが、Deleteを送信しただけでファイルが削除されてしまってはWWWなんか存在出来たものではありません。

ですが、OAuthが出来て、セキュリティの高い認証・クラウドでのファイルの授受が頻繁に行われるようになった現在になって、漸く利用出来るようになったと言うことでしょうか?


では、次回からは上級編です。

アクセストークンの更新の仕方などを調べておきます。
(1時間?程度で有効期限が切れます。)
閉じる
テーマ:日記 URL:https://tsukiyori.sakura.ne.jp/index_m.cgi?ID=1211
 
To Close..タスクを切ると言うこと 2014年11月14日14時43分
Vista以降のWindowsを終了していると、

xx個のプログラムが閉じられていません。

とか、そう言った類のメッセージが出て、なかなか終了出来ないときがあります。


これは主に、アプリケーション側が、OSからの終了メッセージに対して、終了しようとしたときに、

「ファイルを保存しますか?」

とかってメッセージを出して放置している場合になります。


それに対して「シャットダウンする」ボタンを押したりすると、アプリケーションは強制終了され、データは保存されないままで終了してしまいます。

まぁ、さっき編集した内容が保存されないだけなら、未だ何ともないのですが・・・・

自動で保存され、保存している最中に強制終了とかした場合には、未だ処理されていない書き出し内容が、全く保存されないままで、終了してしまうため、ファイルが壊れると言うよりも、未完のままって事になり、二度と読めなくなってしまうでしょう。


ちなみに、diskアクセスが終わっていないだけの場合は、アプリが堕ちても問題は無いので大丈夫です。

データは途中でフラッシュなどせず、迅速に出力し、その後で、書き終わるのを待つと良いでしょう。


では、本題。


最近気がついたのですが、携帯もタブレットも、タスクを着ることが無くなりました。

それだけAndroidというOSが安定してきたと言うことに成ると思います。

先月頃202Fが爆音を発し大変な目に遭いましたが、あれは再起動することで治りました。
どうも、音声出力系でおかしな事になったみたいです。

アプリも堕ちなければOSも堕ちなかったので、数ヶ月ずっと使い続けてきた結果軽微な不具合が蓄積されていったんでしょうね?

タスクスケジューラや、タスクキラーと言われるアプリケーションが活躍する場面は無くなったと言うことです。

Windowsのタスクマネージャも、結局の所アプリがフリーズするから必要になるものであって、アプリもOSも正常に動いているのであれば、タスクを切る必要は全くなく、タスクマネージャも要りません。


Ctrl+Alt+Delなんて呪文は要らなくなる時期が来るのかもしれません。


ところで、microsoftが言うWindowsが未だに堕ちまくると言う原因についてですが、

一般的には、デバイスドライバの不具合だそうです。

OSの深層部分はきわめて堅牢に出来ており滅多なことでは落ちません。
でも、デバイスドライバはそれよりも下層で動作する物も有り、デバイスドライバで不具合が起きるとOSにも影響があります。

OSはデバイスも仮想化して、デバイスをOSよりも上層で動作させている物も多いですが、全てではありませんし、結果的にはOSより下層のハードウェアに対して処理を送る関係で、デバイスドライバの不具合というのはとても致命的です。

また、OSよりも上層のアプリケーションであっても、OSによるタスクスイッチの瞬間を狙われたらひとたまりもありません。

OSとアプリが同じハードウェアで実行されている現状ではどうしようも無いのです。
.netフレームワークなどのOSを丸ごと隠蔽してしまうような、そう言った開発環境のみにしなければ防ぎようがありませんが、未だにC++やら他の言語がいまだに使われていますし、C#使いながらもAPIを呼びまくっています(笑

ランタイムの拡充と、OSの不可侵を推し進めないとダメですよね〜
閉じる
テーマ:日記 URL:https://tsukiyori.sakura.ne.jp/index_m.cgi?ID=1210
 
To Close..中級編 その2 2014年11月10日15時45分
先日のアップから間が空きましたが・・・仕事の方が忙しくて結構時間掛かったんですよ?


で先日はOneDriveのルートディレクトリを取得するところまで書きましたが・・・

では、そのデータの解体から始めましょう。

受信するのは先述の通りテキスト形式のJSONと言うものです。

で、これが・・・まぁ、色々と面倒なんですよ?
専用の形式であるため、自分で解読するしか無い様な雰囲気です。
まぁ、複雑な書式では無いので、1行ずつ読んでも良いですが、面倒なことこの上ありません。

そこで、.netの3.5とか4あたりからはこれのデコーダーが付録されています。

JsonReaderWriterFactory

と言うものですね。

しかも、これがやっかい、XML形式で返答するという物。

そこであたしのお勧めはこちら、

System.Net.WebClient wc = new System.Net.WebClient(); //WebClient作成
System.Xml.XmlDocument xDoc = new System.Xml.XmlDocument(); //出力用のXMLドキュメント

Byte[] dat = wc.DownloadData(URL); //バイナリ形式で戻り値を取得
System.Xml.XmlDictionaryReader xdr = System.Runtime.Serialization.Json.JsonReaderWriterFactory.CreateJsonReader(dat, System.Xml.XmlDictionaryReaderQuotas.Max); //リーダーに掛ける

xdr.Read();//ルートオブジェクトの読み込み
xDoc.LoadXml(xdr.ReadOuterXml());//変換済みのXMLソースをXmlドキュメントに流し込む

あとはxDocを一般的なxmlとして処理すれば、問題なくOK


所で、これで取得するのは、ルートディレクトリの情報です。

これを取得しただけでは何も出来ません。

操作したい対象のフィルだを開いて、ファイルをダウンロードする、アップロードする、 そう言った事をしないといけません。


じゃぁ、目的のフォルダを取得するにはどうしたら良いでしょうか?
じゃぁ、
https://apis.live.net/v5.0/me/skydrive?
とやったところを
https://apis.live.net/v5.0/me/skydrive/フォルダ1/フォルダ2?

と殺れば出てくるでしょうか??

答えはノーです。

実際のフォルダは全て数字名になっているので、この方法では取得出来ません。

そこで利用するのが「upload_location」タグです。

これは、下位層の情報が含まれている場所へのリンクが格納されています。
(注:これ以降の情報はJSON形式がXML形式になったものです。)

<upload_location type="string">https://apis.live.net/v5.0/folder.xxxxxxxxxxxxxxxxxxx/files/</upload_location>
これをダウンロードすることで、フォルダの中身一覧が取得出来、その中から希望するフォルダの情報を取得することになります。

ちなみに、
upload_location以外の情報源として、<id type="string">folder.xxxxxxx</id>があります。

https://apis.live.net/v5.0/に idタグの中身を貼り付けることでフォルダその物にアクセス出来ます。
さらにその後ろに/files/を付けることで、フォルダの中のファイルの一覧を取得出来ます。

なお、ファイルの一覧と言っていますが、ファイルやらフォルダがすべて混ざって値が返ってくるので、
<type type="string">folder</type>または<type type="string">album</type>で、<name type="string">フォルダ名</name>が探しているフォルダ名かどうかを確認することで、確定出来ます。


また、ファイルの場合は
<id type="string">file.xxxxxxxx</id>
と、idの先頭もfileになり、
upload_locationの後ろもfilesからcontentに変わり、これを取得することで、多分ダウンロードすることになります。
<upload_location type="string">https://apis.live.net/v5.0/file.xxxxxxxxxxxxxx/content/</upload_location>


ってことで、/フォルダ1/フォルダ2を取得するには、

1.ルートディレクトリの情報を取得する。
2.ルートディレクトリのファイル一覧を取得する。
3.フォルダ1の情報を探す
4.フォルダ1のファイル一覧を取得する。
5.フォルダ2の情報を探す。
6.フォルダ2のファイル一覧を取得する。
といった方法をとる必要があるようです。

ちなみに注意事項ですが・・・・
ファイル一覧に表示されているフォルダの情報は当該フォルダのファイル一覧へのリンクしか保持していません。

フォルダその物の情報が必要な場合は、upload_locationを使う場合は、/files/を消してからデータの取得をするか、
idを用いるか、どちらかと言うことに成ります。

なぜフォルダの情報が必要なのでしょうか?
ある程度の情報なら、わざわざ取得しなくても分かるのでは無いかと言うことですが・・・・

じつはこれ、それなりに重要なのです。

フォルダの新規作成は、フォルダに対して行うので/files/や/content/が付いている状態で行っても、成功しません。
それと、
新規作成したフォルダは、当然中身がありません。

中身の一覧を返す/files/では中身が無い状態では、ほぼ情報を返しません。

<root type=\"object\"><data type=\"array\"></data></root>

これだけですね。

なので、フォルダの情報とフォルダのリスト情報をペアで保存しておかなければ前後不覚に陥ります。
基本的には、ディレクトリ階層のフォルダのidを全部保存しておく必要があるでしょう。
他に使うのであれば、日付などの情報も、予め抜いておくと良いでしょう。

せっかくのXML形式なのでそのまま取っておけば、便利かもしれません。
でも、必要な情報だけを保持した、構造体とかにしておくのも一つの手ですね☆

ちなみに、データが一つでもあれば、

<parent_id type="string">folder.xxxxxxxx</parent_id>

で、前のフォルダ情報が分かります。

不便です。


ちなみに、フォルダの作成方法ですが・・・・

フォルダを作成するフォルダのidに対して、
https://apis.live.net/v5.0/folder.xxxxxxxxxxxxxx?access_token=xxxxxxxx

{name:"フォルダ1"}

をデータで送ります。

wc.Headers["Content-Type"] = "application/json";

にする必要があります。



閉じる
テーマ:日記 URL:https://tsukiyori.sakura.ne.jp/index_m.cgi?ID=1209
 
<<< << < prev3$F? 151/554ページ(1661件) $FAnext3 > >> >>>