ぐらめぬ・ぜぷつぇんのはてダ(2007 to 2011)

2007年~2011年ごろまで はてなダイアリー に書いてた記事を引っ越してきました。

GoogleとYahoo!のブログ検索を、自分のBlogを引用しているサイトの更新一覧にするには。

先ほど書いた件を実際にやってみたメモ。なお、表示文言や検索パラメータは2008/11/10時点のもので、将来変更される可能性があります。以下の情報は自己責任でどうぞ。

Googleのブログ検索(2008/11/10時点でBETAバージョン)

  1. http://blogsearch.google.co.jp/blogsearchにアクセスする。
  2. 検索ボックスに、"link:" + "自分のBlogのURL"を入力して検索。*1
  3. 「"自分のBlogのURL"にリンクするページの検索結果」と表示されれば多分正解?

Yahoo!ブログ検索(2008/11/10時点でBETAバージョン)

  1. http://blog-search.yahoo.co.jp/にアクセスする。
  2. 検索ボックスに、"link:" + "自分のBlogのURL"を入力して検索。Googleと一緒?
  3. 『「"自分のBlogのURL"」へのリンクをはっている記事を検索しています。 』と表示されれば多分正解?

注意点。Googleの場合は、ブログ検索のTOPでストレートに自分のブログURLを入力しても、"link:"付として解釈してくれるようです。Yahoo!ブログ検索の場合は、TOPでストレートに自分のブログURLを入力すると、『「(自分のブログURL)」へのリンクをはっている記事を検索しています。』というのが表示されないので、"link:"付のとは結果が違うのかも知れません。

*1:例:このはてなダイアリなら"link:http://d.hatena.ne.jp/msakamoto-sf/"

YakiBikiではTrackBack機能は当面、実装しません。

なんでか、という理由を長々と書いた将来また気が変わった自分用のエントリが、保存したと思ったら確認しかしてなくて、うっかりFirefox閉じちゃったので私の記憶の一部が蒸発しました(つд⊂)。

えっと、とにかくYakiBikiの基本ポリシーは「招かれざる者、コンテンツを弄るべからず」なのです。承認という関所を入れたとしても、関所の前でトラックバックスパムが山と積もる。YakiBikiは基本、個人がレンタルサーバーで立ち上げて、セミプライベートな空間として自分のメモをため込む為のツールですので、トラックバックスパムにディスクスペース費やすのは厭。
Services_TrackbackがNet_DNSBL -> Net_DNSとmhash拡張に依存してるのが厭と言えば厭で、でもNet_DNSでmhash関数使ってるのは一箇所だけでそれもRFC2104のHMACを素直に使ってるだけのようだから、PHPのmhash関数のページのユーザーコメントにあるPHPだけのHMAC算出実装に入れ替えたの同梱すればそれでよくね?とも思ったんですが、やっぱりなんというか、「招かれざる者、中に入れず」しかし「郵便受けがぱんぱんに詰まって破裂するわ、招かれざる者が玄関前で門前市を為すわ」というイメージは厭です。

ぶっちゃけ「TrackBackの『受信代行』してくれるサービスがあればなぁ・・・」と調べていたら、そのものは無いけど、どうやら昨今目にするGoogleやYahooの「ブログ検索」がブログ間の相互リンクに特化した検索機能とのこと。じゃぁコレでいいじゃん。元々自己顕示欲を満たす為だけに「TrackBack欲しいナー」と思ってたので、ようするに「誰か自分を見てくれてる」と確認できる機能があれば言い訳で、それなら検索エンジンがしてくれてたわという話。

という次第で、もうYakiBikiで無理してアレコレ考えてTrackBack実装しなくとも、多少の不満はあれど外部のそれも大御所がやってくれてるようですので、じゃぁこれでいいや、ということで、YakiBiki本体ではもう実装しない事にします。

・・・というわけです。また「あーでもこれこれこーすればうまくTrackBack制御できるかもー」とか思い出した未来の自分に向けてメモ。

WinInetのInternetGetCookie()で何度ブラウザで取れているのを確認してもERROR_NO_MORE_ITEMSが返されてしまう件


お仕事でVB6でActiveXでユーザーコントロール作ってHTMLに埋め込んでHTTP(S)通信させるまぁよくあるプログラムを組んでいるわけです。一昔前ならともかく、もはや組み合わせとしては「枯れた」感のある技術群だけあって、Googleに片端から目に付いたAPI名とか放り込んでいくだけで出来上がっちゃうご時世に感動と感謝を。

えっと、セッションCookieと普通のCookieを送出する簡単なPHPIEで表示させて、Wiresharkでパケットキャプチャして何度も「うん、ちゃんとIECookieを送出してるよな。」と確認するわけですが。

http://support.microsoft.com/kb/196062/en-us/
http://msdn.microsoft.com/en-us/library/aa384710(VS.85).aspx
http://yamamoto56.blogtribe.org/entry-2eaf3906ca43587c101c12477e9ef51c.html

ここら辺みてVBで作ったスタンドアロンのフォームから InternetGetCookie() やっても、ずーっと ERROR_NO_MORE_ITEMS で、「そんなURLに結びついたCookieなんてねぇよ。」と怒られ続けてました。
「そんな馬鹿な・・・。第二引数にはちゃんとvbNullを指定してるしで、指定したURLの全Cookieを引っ張ってくるはずだ・・・。Cookieの値をコピーする第三引数にもvbNullを指定したから、単純に第四引数のlong型バッファにCookie値のサイズだけが入ってくるはずなのに・・・。」
と30分ほど悩んで、ふとパケットキャプチャでPHPがSet-Cookieして、IECookieで送っているところを見たら。
「・・・あ? expire指定してない・・・ということはブラウザ閉じたら終わり・・・これ?」

ということでexpireを設定し直して・・・ません。すみません、ここ実験してないです。一応多分これっぽいと目処は付いたので、とっとと方向を変える事にしました。
ActiveXからブラウザのCookieを取得する方法でGoogleにいろいろ放り込んでいる内に、VBの場合ユーザーコントロールのParentプロパティが、HTMLに埋め込んで実行している場合はHTMLDocumentのオブジェクトになるので、

Parent.Script.document.cookie

で取れるよ!というのをどこかで目にして試してみたらオッケー。VCのOLEコンテナであれば、IHTMLほげほげとかいうインターフェイス経由で取得できるオブジェクトで、同様の事が可能だそうです。
もともとWebページに埋め込まれたActiveXが、HTMLのDOMノードを操作する為の機能みたいですね。

というわけで、最終的にユーザコントロールのPublicメソッド内でこんな感じで"Cookie"プロパティに設定する事で成功!

If "HTMLDocument" = TypeName(Me.Parent) Then
    Me.Cookie = Me.Parent.Script.document.cookie
End If

なんでわざわざ条件分岐させたかというと、動作確認用のスタブ(VBのフォームアプリ)からも叩くので、ユーザコントロールのParentが常にHTMLDocumentになるとは限らないからです。つまりフォームに貼り付けて使う時は、Cookieプロパティを任意に設定することができるという感じですね。本物はもうちょっと肉付けしてますが。

・・・が、まだ嵌りどころがありました。タイトル変えて続きます。

CookieヘッダをWinInetのHttpAddRequestHeaders()で指定しても送られない件


疲れてきたので一言で済ませます。
InternetOpen() の dwFlags に INTERNET_FLAG_NO_COOKIES を含ませす。

InternetOpen() : http://msdn.microsoft.com/en-us/library/ms918368.aspx
InternetOpen()のdwFlagsで指定可能な定数 : http://msdn.microsoft.com/en-us/library/aa452096.aspx
NTERNET_FLAG_NO_COOKIESの説明 :

Does not automatically add cookie headers to requests, and does not automatically add returned cookies to the cookie database. This flag can be used by HttpOpenRequest and InternetOpenUrl (for HTTP requests).

ということで、これを入れておかないとCookieヘッダが自動で送受信されてしまうからみたいですね。手動設定する場合は忘れずに。

・・・どこか、中国語のサイトのサンプルコードで見かけて解決したんですよ。コレ。