Gmailの.と+

Ref: http://blog.livedoor.jp/lalha/archives/50158699.html

私の Gmail アカウントは kazutoshi.ono@gmail.com なのだが、次のようなアドレスにメールを送っても、私のところにメールが届く。

    * kazutoshiono@gmail.com (ドットなし)
    * kazu.toshi.ono@gmail.com (ドットを増やす)
    * k.a...zu.to..shi.ono@gmail.com (ドットをさらに増やす)
    * kazutoshi.ono+hoge@gmail.com (プラスマークを使う)
    * kazutoshiono+hoge@gmail.com (ドットとプラスの併せ技)


これらの宛先に送られたメールがすべて私のところに届くのは、Gmail が次のような仕様になっているからだ。

    * .(ドット/ピリオド)は無視される
    * +(プラス) から @ までは無視される

これで、はてなのサブアカをいくらでも作れる!

今日のはまり

こんなスクリプトがあったとして。

== hoge.vim ==
  let hoge = 'hoge'

== test.vim ==
function! Hoge1()
  so hoge.vim
  echo hoge
endfunction

function! Hoge2()
  so hoge.vim
  echo g:hoge
endfunction

== command line ==
:echo hoge
>hoge
:call Hoge2()
>hoge
:call Hoge1()
>E121: 未定義の変数です: hoge

ここで:call Hoge1()でエラーになる理由が分からなかったのだが。
しかし、よく考えてみると、関数内ではg:を付けないとローカル変数との
区別がつかないことに気づく。


コマンドラインの場合はスコープが省略されたら暗黙的にグローバルとしているだけなのね。

埋め込みrubyスクリプトからソケットが使用できない件

こんなん出ましたけど。

コード

require 'net/https'
Net::HTTP.version_1_2
:
class HogeBlog
  :
  def update
    if @proxy.empty?
      https = Net::HTTP.new(@it_tec_url, 443)
    else
      https = Net::HTTP.new(@it_tec_url, 443, @proxy, @proxy_port)
    end

    https.use_ssl = true
    https.verify_mode = OpenSSL::SSL::VERIFY_NONE

    req = Net::HTTP::Post.new(@blog_result)
    req.basic_auth(@username, @password)

    https.start {|w|
      w.request(req, convert_data(@data))
    }
  end
  :
end

blog = HogeBlog.new
:
blog.update

エラーメッセージ

SocketError getaddrinfo: non-recoverable failure in name resolution.

同じコードを普通にruby.exeで実行したらエラーにならなかったけど・・・
なにやら深遠な問題のようである。


たぶんWS2_32.dllがなんかおかしい。

windows + vc8 で opensslをコンパイル

openssl.rbにこんなコードが。

require 'openssl.so'

うち、Windowsなんですけど・・・。
rubyをvc8で手動コンパイル/インストールしたせいかな。

ここを見つつ、opensslを再コンパイルしてみる。
url:http://jp.rubyist.net/magazine/?0007-buildrubywin

ここから、BinariesとDeveloper filesをダウンロード。
url:http://gnuwin32.sourceforge.net/

解凍して、lib以下をext/openssl以下に、inlucde以下を/ext/openssl/opensslにコピーする。

で、ext/openssl以下で、ruby extconf.rbを実行。
ようやくMakefileが作成された。

で、make。

>nmake

...
ライブラリ openssl-i386-mswin32_80.lib とオブジェクト openssl-i386-mswin32_80.exp を作成中
mt -nologo -manifest openssl.so.manifest -outputresource:openssl.so;2

これで、openssl.soが作成された。
Windowsなのに.soなファイルを使用するのがなんでか分からないけど。(クロスコンパイルってやつか?後で調べる)

>nmake install

...
Microsoft(R) Program Maintenance Utility Version 8.00.50727.42
Copyright (C) Microsoft Corporation.  All rights reserved.

install -c -p -m 0755 openssl.so c:\ruby\lib\ruby\site_ruby\1.8\i386-msvcr80
install -c -p -m 0644 .\lib\net\ftptls.rb c:\ruby\lib\ruby\site_ruby\1.8\net
install -c -p -m 0644 .\lib\net\telnets.rb c:\ruby\lib\ruby\site_ruby\1.8\net
install -c -p -m 0644 .\lib\openssl\bn.rb c:\ruby\lib\ruby\site_ruby\1.8\openssl
install -c -p -m 0644 .\lib\openssl\buffering.rb c:\ruby\lib\ruby\site_ruby\1.8\openssl
install -c -p -m 0644 .\lib\openssl\cipher.rb c:\ruby\lib\ruby\site_ruby\1.8\openssl
install -c -p -m 0644 .\lib\openssl\digest.rb c:\ruby\lib\ruby\site_ruby\1.8\openssl
install -c -p -m 0644 .\lib\openssl\ssl.rb c:\ruby\lib\ruby\site_ruby\1.8\openssl
install -c -p -m 0644 .\lib\openssl\x509.rb c:\ruby\lib\ruby\site_ruby\1.8\openssl
install -c -p -m 0644 .\lib\openssl.rb c:\ruby\lib\ruby\site_ruby\1.8

Rubyインターフェイス付VimをVC8でコンパイル

そのままMake_mvc.makを使っても、vc8でrubyコンパイルするとライブラリの名前がvc7以前と違うので上手くいかない。
ので、以下のように修正する。

638c638
< RUBY_PLATFORM = i386-mswin32
---
> RUBY_PLATFORM = i386-mswin32_80
641c641
< RUBY_INSTALL_NAME = msvcrt-ruby$(RUBY_VER)
---
> RUBY_INSTALL_NAME = msvcr80-ruby$(RUBY_VER)

こんなんでとりあえずコンパイル通った。