初心者用覚書

ActiveXC++を、いまになって勉強するようになってしまった。

ActiveXを作るためには、C++か.NET(C#など)で作る必要がある。

ローカルファイルにアクセスすることが前提だと、.NETの場合はインターネットではローカルアクセス権限がないのでできない(イントラは権限を下げて可能らしい)。

C++で作る場合は、
ATL(Active Template Library)かMFCのどちらかを使う。

ATLの方が軽量でよくできているので、今はMFCよりもよくつかわれるそうだ。

ただATLにはGUIが含まれていないATLにはボタンなどのツールキットが含まれていないしそれだけでは面倒、マイクロソフトが提供したオープンソースWTLを使うと扱いが楽になるようだ。

日本語版WTLは、http://www.usefullcode.net/2006/12/04/WTL80_6304_jp01.zip ここから頂ける。
英語版でよければ、http://sourceforge.net/projects/wtl こちらから。

インストールはsetup**.jsというのを実行するのだが、コマンドラインから以下のように実行する。
WSHはよく知らんかったから、これを見つけるのに5分もかかってしまった。ダブルクリックじゃ動かなかった。

cscript setup**.js

というわけで以下のチュートリアルをやりながら、ATL/WTLを勉強中
http://home.att.ne.jp/banana/akatsuki/doc/atlwtl/

RSS広告カットプロキシー

RSSの広告がうざいので広告カットプロキシーを作ってみました。
文字によるパターンマッチングですので広告表示方法が変わったり、逆に広告でないものがカットされることがあったら直して使ってください。

http://solisart.com/rss/?uri=[rssatomuri]
とすると、AD: やPR:の入っているアイテムを消すことができると思います。
(上のURLは有効ですが、アクセスが多いと停止するかもしれません。あしからず。)



index.cgi

#!/usr/local/bin/ruby

require 'cgi'
require 'open-uri'
require 'rexml/document'

# 以下の2行はxmlスパム防止のFIXですが、導入されていない場合はコメントアウトしてください。
# require 'rubygems'
# require 'rexml-expansion-fix'

cgi = CGI.new

uri = cgi.params['uri'][0]

rss = open(uri).read

doc = REXML::Document.new(rss)

adxpath_list = []

    if doc.root.name == 'rss' and doc.root.attribute("version").value == "2.0"
      doc.elements.each("//rss/channel/item/title") do |element|
        if element.text["AD:"] or element.text["PR:"]
          adxpath_list <<  element.xpath.gsub(/\/title$/, "") 
        end
       end
    elsif doc.root.name == 'RDF'
      doc.elements.each("*/item/title") do |element|
        if element.text["AD:"] or element.text["PR:"]
          adxpath_list <<  element.xpath.gsub(/\/title$/, "") 
        end
       end
    else
      doc.elements.each("//entry/title") do |element|
        if element.text["AD:"] or element.text["PR:"]
          adxpath_list <<  element.xpath.gsub(/\/title$/, "") 
        end
       end
      
    end


adxpath_list.reverse.each do |xpath|
  REXML::XPath.first(doc, xpath).remove
end

# スタイルシートの指定で、"http"から始まっていないことがあるので
output = doc.to_s.sub(/<\?xml-stylesheet[^>]*>/, '')
cgi.out( {'type' => 'application/xml'} ) { output }


?uri=を消してシンプルにしたい場合は、サーバー環境にもよりますが、以下のように設定すると
http://solisart.com/rss/[rssatomuri] となってシンプルになります。
(全てのRSSでうまくいくわけでないのですが、まだよくわかりません)

.htaccess

DirectoryIndex index.cgi
Options +ExecCGI  +FollowSymLinks

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*)$ /rss/?uri=$1

AddHandler cgi-script .cgi

広告関係の方、ごめんなさい。
AdBlockStylishを使って広告カットする人はたぶん一部だと思いますから。

大文字・小文字でトラブル

Mercurialでは、大文字と小文字の変更は行わない方がいいみたいです。

license.txtをLicense.txtと変更してコミットすると、両方のファイルがレポジトリに残ります。
次にclone, pull, updateなどをしようとすると、エラーが出てしまうことがあります。そうすると、他の人とレポジトリを共有できなくなります。

これを解消する方法は、該当のファイルを消し(hg remove)て、コミットすること。するとレポジトリから該当のファイルが削除されます。

WebClientはクッキーがとれない

WebClientを使うと、簡単にスクレイピングができる。
だけど、クッキーを取得することができない。
クッキーの設定は、wc.Headers.Add("Cookie: ...") とできるみたいだけれど。

そこで、HttpWebRequestとHttpWebResponseを使えばいけるようだ。

しかし扱いが面倒で、RubyPerlに比べるとコード量は3倍以上でわかりにくい。
改めて、Rubyなどのスクリプト言語の良さが目立つ。

ALTキーとダイアログでのイベントが拾えなかったとき

フォームでALT+Aのキーを聞かせる場合は、
modalform あるいはmodelessformで開くのがいいみたい。あとはキャプションで&Allと&をつけるのは、VB, VCのようにすればいい。

ところが、ListViewでitemchangedのイベントが拾えなくなってしまった。
Formでは自動的にVRComCtlContainerをincludeしているが、Dialogではしていないので、以下の含めば動いた。

include VRComCtlContainer