PC関係のメモ
WebDAVクライアント(2) / 構造体を宣言時にゼロクリア / ブログはコテハンで書くべきか、捨てハンで書くべきか / COMとpimplイディオム
WebDAVクライアント(2)
neonにopensslをリンクしてhttps通信に成功。ただしまだ証明書とか見てない。
あとはzlibをリンクして圧縮通信に対応させると、HTTPクライアントとしては十分な機能を備えることになるかな。
zlibをリンクするのは簡単そうだし、他の実装が終わったあとにでも作業する。httpsを先に試したのは後でつまづきそうだったから。
構造体を宣言時にゼロクリア
neonライブラリに下記のようなコードがあった。
struct fetch_context ctx = {0};
構造体を0クリアしているんだとわかるんだけど、よく考えてみると違和感がある。
つまり、{0}は構造体の最初のメンバーだけを初期化しているのであって、以降のメンバーは不定値なのでは?という疑問。
調べてみたところ、次のような理由によってゼロクリアされるということがわかった。
{0}は構造体を「0で埋める」ための特別な記述ではなく(当たり前なんだけど)、最初のメンバーに0で初期化するのみ。ただ、「初期化子が省略された場合に残りのメンバーを0で初期化する」という仕様((-これはあとで確信できるソースを探しておこう。K&Rに書いてあったっけ?-))のため結果として構造体全体が0で埋められるのである。
これでいちいち::ZeroMemory()とかmemset()しなくてもこの書き方で初期化できる。
こんなときに便利。
const struct hoge empty = {0};
static struct hoge empty = {0};
ブログはコテハンで書くべきか、捨てハンで書くべきか
内容は後で読む予定。
COMとpimplイディオム
どちらも軽く本で読んだだけだけど似てる気がする。
WebDAVとWindows クライアント
http://plan9.aichi-u.ac.jp/webdav/win.html
WebDAVが普及しない最も大きな理由の一つが、MS純正クライアントがあんまりなせいだと思う。
msysgit+BASIC認証の不具合と回避策
msysgitでBASIC認証を使ったページからcloneしようとすると途中でBASIC認証が効かなくなってcloneできなかった。
LinuxのGitクライアントからは問題なくcloneできる。
使用したバージョンは下記。
Git-1.7.4-preview20110204.exe msysGit-fullinstall-1.7.4-preview20110204.exe
その時のエラーメッセージは下記。(URLは例)
error: The requested URL returned error: 401 (curl_result = 22, http_code = 401, sha1 = 3f00ca6fd69c2fe3fff8fefe8c46c8d8c2379b89) error: Unable to find 3f00ca6fd69c2fe3fff8fefe8c46c8d8c2379b89 under http://dav.example.com/exsample.git Cannot obtain needed commit 3f00ca6fd69c2fe3fff8fefe8c46c8d8c2379b89 while processing commit a250db46bf02c5a27a73ac01e629f69d1f8d9d28. error: Fetch failed.
Webサーバ側のログを見ると、最初はBASIC認証使っているのに、途中からなぜか認証せずにアクセスしようとして取得に失敗している。
回避策はURLにBASIC認証のユーザ名を含めてあげること。(URLは例)
http://ユーザ名@dav.example.com/example.com


_ haru-s [ですよね]
_ Hajime [あれがちゃんとしてれば超便利なんですけどね~]