amazon-auth-proxy このエントリーを含むはてなブックマーク このエントリーをブックマークした人数

2009-07-23追記: たださんのスクリプトが302リダイレクトするようになりましたので、そちらをそのまま使っています。

参加してみました。手順はhsbtさんのを元に、コードはたださんのをベースにして302対応しました。

diff --git a/amazon-auth-proxy.cgi b/amazon-auth-proxy.cgi
index 8c12e06..3f8ddd3 100755
--- a/amazon-auth-proxy.cgi
+++ b/amazon-auth-proxy.cgi
@@ -63,11 +63,7 @@ def paapi( conf, params )
      end
      qs << "Signature=#{u [hash].pack( "m" ).chomp}"
 
-      url = uri.to_s + '?' + qs * '&'
-
-      timeout( 10 ) do
-              open( url, &:read )
-      end
+   uri.to_s + '?' + qs * '&'
 end
 
 if __FILE__ == $0 then
@@ -78,13 +74,8 @@ if __FILE__ == $0 then
      conf = YAML::load_file( 'amazon-auth-proxy.yaml' )
 
      begin
-              header = cgi.header(
-                      'status' => '200',
-                      'type' => 'text/xml;charset="UTF-8"'
-              )
-              body = paapi( conf, cgi.params )
-              print header
-              print body
+           url = paapi(conf, cgi.params)
+           print cgi.header({'status' => '302', 'Location' => url})
      rescue
              print "Status: 500\nContent-Type: text/plain\n\n"
              print $!.message

一応プロキシの登録認証を通ったのでうまく動いているんだと思いますが、変なところがあったらごめんなさい。

Posted by iwadon ( 2009-07-21 16:34:00 GMT ) | カテゴリ , | タグ , , | トラックバックなし | コメントなし

not an lvalue このエントリーを含むはてなブックマーク このエントリーをブックマークした人数

会社で相談を受けたのでメモ。以下のようなコードをCodeWarriorでコンパイルすると”not an lvalue”と警告される。

struct A
{
  int v[100];
};

A foo()
{
  A a = {1, 2};
  return a;
}

int bar(A *a)
{
  return a->v[0] + a->v[1];
}

int main()
{
  return bar(&foo());
}

一時的なオブジェクトのアドレスを取ろうとするのがまずいのかな。ちなみにg++だと”taking address of temporary”という警告になる。こちらの方がわかりやすいかな。

以下のように修正するとコピーが発生するので、渡すものが大きいほど時間がかかる。

struct A
{
  int v[100];
};

A foo()
{
  A a = {1, 2};
  return a;
}

int bar(A a)
{
  return a.v[0] + a.v[1];
}

int main()
{
  return bar(foo());
}

そこで、参照で渡すと良いようだ。実際ポインタを使ったときと出力コードが同じなのに、こちらは警告が出ない。まあNULLを渡すことが無い限り参照で置き換え可能だよね。

struct A
{
  int v[100];
};

A foo()
{
  A a = {1, 2};
  return a;
}

int bar(const A &a)
{
  return a.v[0] + a.v[1];
}

int main()
{
  return bar(foo());
}

出力コードの差分はこんな感じ。関数のラベル名が違うだけ。

--- a0.s        2009-05-07 20:48:01.296495800 +0900
+++ a2.s        2009-05-07 20:48:49.155870800 +0900
@@ -1,4 +1,4 @@
-       .file   "a0.cpp"
+       .file   "a2.cpp"
        .data
        .align 4
 LC0:
@@ -29,9 +29,9 @@
        ret     $4
        .align 2
        .p2align 4,,15
-.globl __Z3barP1A
-       .def    __Z3barP1A;     .scl    2;      .type   32;     .endef
-__Z3barP1A:
+.globl __Z3barRK1A
+       .def    __Z3barRK1A;    .scl    2;      .type   32;     .endef
+__Z3barRK1A:
        pushl   %ebp
        movl    %esp, %ebp
        movl    8(%ebp), %edx
@@ -59,7 +59,7 @@
        call    __Z3foov
        subl    $4, %esp
        movl    %ebx, (%esp)
-       call    __Z3barP1A
+       call    __Z3barRK1A
        movl    -4(%ebp), %ebx
        leave
        ret

Posted by iwadon ( 2009-05-07 13:03:00 GMT ) | カテゴリ | タグ , | トラックバックなし | コメントなし

TortoiseSVN このエントリーを含むはてなブックマーク このエントリーをブックマークした人数

TortoiseSVN 1.6.0を使っていて、commit時に改行を含むログを指定するとCannot accept non-LF line endings in ‘svn:log’ propertyというエラーが出た。最初は訳がわからなかったのでログから改行をなくしたりしていたが、ログの各行の末尾に空白を付け足すだけでエラーが出なくなった。もしかして行末に日本語があるとまずいのかな。

このエラーメッセージで検索するといくつか見つかるのでうちの環境に依存した問題ではなさそう。対処方法がわかったのでそのうち直るのを期待して待つことにする。

Posted by iwadon ( 2009-04-14 05:46:00 GMT ) | カテゴリ | タグ , , | トラックバックなし | コメントなし

Rubyで名前修飾 このエントリーを含むはてなブックマーク このエントリーをブックマークした人数

こんな感じ?

module NameMangling
  def method_added(name)
    name = name.to_s
    @__method_added_stack__ ||= []
    if /\A__/ =~ name and not @__method_added_stack__.include?(name)
      new_name = "__#{self.name}" << name
      @__method_added_stack__ << new_name
      alias_method new_name, name
      @__method_added_stack__.pop
      remove_method name
    end
    super
  end
end

class A
  extend NameMangling
  attr_accessor :__foo
  def foo=(value)
    @__foo = value
  end
end

a = A.new
#p a.__foo    # undefined method `__foo'
#p a.__foo = 1    # undefined method `__foo='
p a.__A__foo # => nil
p a.__A__foo = 1 # => 1
p a.__A__foo # => 1
p a.foo = 2
p a.__A__foo # => 2

Posted by iwadon ( 2008-09-19 03:49:00 GMT ) | カテゴリ , | タグ , , | トラックバックなし | コメントなし

コンストラクタから仮想関数を呼び出すこと このエントリーを含むはてなブックマーク このエントリーをブックマークした人数

google:コンストラクタ 仮想関数

基底クラスのコンストラクタから派生クラスの仮想関数を呼び出すことはできない。プログラマから相談を受けたネタだけど、かなりポピュラーな話題だったのね。勉強になりました。

結局問題自体は別の方法で解決出来た。

Posted by iwadon ( 2007-09-07 06:43:00 GMT ) | カテゴリ | タグ , | トラックバックなし | コメントなし

ソースファイル名に悩む このエントリーを含むはてなブックマーク このエントリーをブックマークした人数

最近Rubyでコードを書くとき、クラス構造と似たディレクトリ構成にして、そこにソースファイルを置くようにしている。例えばText::Hatenaならtext/hatena.rbになる。これをCやC++でも行おうとして悩んでいることについて、現在までの考えなどをメモする。

Posted by iwadon ( 2007-09-07 01:56:00 GMT ) | カテゴリ | タグ , | トラックバックなし | コメントなし

構造体名に悩む このエントリーを含むはてなブックマーク このエントリーをブックマークした人数

過去数回シーケンスデータの再生プログラムを書いてきたけど、その中のある構造体名に毎回悩む。その構造体自体は「徐々に変化する値」を意味しているんだけど、僕の英語力の低さが大いに発揮されるためか、うまく英語で表現できない。かといって名前を付けないことには使えないので、毎回適当な名前を付けている。

Posted by iwadon ( 2007-04-20 08:09:00 GMT ) | カテゴリ | タグ , | トラックバックなし | 2 comments

2007-03-05 このエントリーを含むはてなブックマーク このエントリーをブックマークした人数

うおお、Borland C++Builder 6でXACTを使おうとしたらヘッダファイルの時点でコンパイルできねー。

  • インライン関数内でインラインなアセンブリ言語が使われている。
  • __superとかMSVC固有の予約語が使われている。
  • などなど?

あああ。

Posted by iwadon ( 2007-03-05 12:23:00 GMT ) | カテゴリ | タグ | トラックバックなし | コメントなし

custom_feedプラグインの戻り値 このエントリーを含むはてなブックマーク このエントリーをブックマークした人数

仕事が忙しくなってなかなか触れないとかなんとか言い訳をしつつ、少しずつ触っている。カスタムフィードは出来るだけcustom_feedプラグインを試して、難しいようであれば手で書く、という方向で。書いたものは、まだちょこっとしかないけど、以下のSubversionのリポジトリで自作プラグインと設定ファイルを公開している。

http://moonrock.jp/~don/svn/pragger/trunk/

custom_feedプラグインは結果を文字列で返すが、付加的な情報を特異メソッドの形でその文字列に定義している。うっかり加工してその付加的情報を捨ててしまいそうな気がする。例えばこんな感じで:

module: custom_feed
config:
  (略)
module: subs
config:
  (略)

subsプラグインは入力された文字列をString#gsubメソッドで置換しているが、この際新たに文字列を作って結果として返すので、元の文字列へ定義された特異メソッドが無くなってしまう。ということで簡単に情報を捨ててしまえる。

そういうことがないようにするには、入力されたデータを破壊的に処理していくか、新たに作るオブジェクトにも元のオブジェクトと同じような特異メソッドを定義していく必要があるんじゃないかなあと思う。でも前者はそうでもないけど、後者って結構面倒そう。

expand_uriプラグインというのを書いた。これは文字列に含まれる相対URIっぽい文字列を絶対URIに書き換えるというプラグインなんだけど、先の前者にあたる破壊的に処理する方法を取っている。本当はHpricotとかREXMLのような便利なライブラリや、uriライブラリが持つ正規表現を使いたかったけど、結局String#gsub!ひとつで置換している。

強引にまとめ。custom_feedプラグインを使うなら、その出力結果をすぐにsave_rssプラグインへ入力してしまうか、加工するなら情報を無くなさないように加工しよう、という話なんだけど、もちろん無くなっても問題ないような用途であれば問題なし。この辺今後はもっとうまく扱えるようになったりするとうれしいなあ。

Posted by iwadon ( 2007-03-03 09:01:00 GMT ) | カテゴリ | タグ , , | トラックバックなし | コメントなし

2007-02-25 このエントリーを含むはてなブックマーク このエントリーをブックマークした人数

一昨日、仕事で使うツールを作るため、久しぶりにBorland C++Builder 6を起動する。VCLについてあらかた忘れているのでヘルプとかググったりしながらコードを書く。なんかListViewを使った画面を作るだけでヘトヘトになって時間切れまくりなので自宅に持ち帰る。

昨日、夜になってようやく作業を再開する。なんか妙に難しいことをしなければならなくなって困り果てて寝る。変な夢から覚めたところで作業再開。

今日、朝方まで作業するがちっとも進まずに不貞寝。昼過ぎから作業を再開するが調べれば調べるほどやっぱり難しいことをやろうとしたようで、日頃使っている他社製ツールが如何に凝った作りであるかを思い知らされる。妥協を重ねて何とか落ち着く。

今晩中にデータの読み込みと書き出しに対応すれば、ようやく明日からデータ自体の作成には入れるんじゃないかと妄想している。あいますやってる暇ないよ。本当だよ。

Posted by iwadon ( 2007-02-25 11:31:00 GMT ) | カテゴリ , | タグ , , | トラックバックなし | コメントなし