injectの甘い罠

 Rubyの中でもinjectは個人的にキメると最高に気持ちの良いメソッドの一つなのですが、今回はinjectの罠にハマってしまったため、備忘録を兼ねて記録しておきます。

 まず、injectのチュートリアル的な使い方から。

[1,2,3,4,5].inject do |a, b|
  a + b
end
=> 15

 
 よく見る一般的な使い方です。1,2,3,4,5の値がbに代入され、aの値が次のループに引き継がれます。
 最後まで回るとaが返却されるため、この結果は15になります。
 
 また、injectは引数に初期値を設定することが出来、初期値を設定するとaに初期値が代入された状態でループが回ります。

[1,2,3,4,5].inject(10) do |a, b|
  a + b
end
=> 25

 aの初期値が10となるため、この結果は25となります。

 では、以下の場合はどうなるでしょうか。

[1,2,3,4,5].inject do |a, b|
  bb = b + 1
  a + bb
end
=>19

 15+5で20と思うかもしれませんが、injectの引数である初期値を省略した場合は、1番目の要素がaに、2番目の要素がbに代入されます。そのため、1はbの要素に数えられないため、結果は19となります。これは仕様通りの動作となります。

 http://www.ruby-lang.org/ja/man/html/Enumerable.html

 20にしたい場合は初期値を設定すればOKです。

[1,2,3,4,5].inject(0) do |a, b|
  bb = b + 1
  a + bb
end
=>20

 では、次は初期値を設定した上で、ブロックの中を空にするとどうなるでしょうか。

[1,2,3,4,5].inject(10) do |a, b|
end
=> nil

 この結果はnilになります。前のブロックの実行結果を次のブロックに引き継ぐため、初期値が入っていても、何も返さないので、以降はnilとなります。

[1,2,3,4,5].inject(10) do |a, b|
  puts "a=#{a},b=#{b}"
end

a= 10,b=1
a= ,b=2
a= ,b=3
a= ,b=4
a= ,b=5
=> nil

 ちなみに、if文で評価式を通過しないようにしても同様の現象が発生します。

[1,2,3,4,5].inject(10) do |a, b|
  a + b if b > 10
end
=> nil

 キメると最高に気持のいいinjectですが、よく分からない挙動も多いので注意して使いましょう、という話でした。

 ちなみに自分は文字列の連結や配列の展開をinjectを使って行うことが多いです。

Rubyで指定したメソッドをフックして特定処理を追加する

 今やっている開発で特定処理のみロギングをしたい、とか特定処理を挟みこみたい場合に簡単に追加や取り外しが出来るようにしたいと思ったので、ちょっとだけメタプロしてみました。
 
 まず、フックするメソッドの実装。
 フックを実装したいクラスにextendする形でHookModuleを実装します。今回はクラスメソッドとして実装して、クラス内からhook_method :hogeとメソッドを明示的に指定すると、関数をoriginal_という名前を付加したエイリアスメソッドを作成し、既存の関数の名前にフック処理を追加した後に、元のメソッドを呼び出すようにしています。
 
 特に意味はないですが、今回はObjectクラスにextendしておいたので、どのクラスに対してもフック処理が任意に追加できるようになります。RailsならActiveRecord::Baseあたりに追加しておけば、色々なモデルにフック処理が追加できて便利です。

module HookModule
    def hook_method(target)
        self.class_eval do
            alias_method "original_#{target.to_s}".to_sym, target
            define_method target do
                p "call hook method for #{target}"
                self.__send__("original_#{target.to_s}")
            end 
        end 
    end 
end
Object.extend HookModule

 次に呼び出し側を記述します。先程のコードをhook_method.rbとして保存したので、requireしてから処理を記述します。

require "hook_method.rb"
class CallHookMethod
    def hoge
        puts "hoge"
    end
    hook_method :hoge
end

m = CallHookMethod.new
m.hoge

 以下が、実行結果です。hogeメソッドを呼び出す際に、先にhook_method内で定義した出力が行われていることが確認できます。

"call hook method for hoge"
hoge

 応用すれば、hook_method :hoge, :inject_methodのように、任意のメソッドを実行させることも可能です。

追記:
 このパターンだと、ブロック、引数がある、なしに対応できないため、if文を使って4つの条件を作る必要があります。引数は*args、ブロックは&blockで取れるので、これを使って4つのパターンに対する__send__を作ればOKです。

 ブロックがないメソッドに対してブロックを送ったりすると__send__呼び出しの地点でエラーが発生します。

個人輸入でアーロンチェアを買ってみた

 タイトルの通り、個人輸入でアーロンチェアを買ってみました。
 以前家で使っていた椅子が、ソファーのような椅子を使っていたので、パソコンの前に座ってもリラックスモードになってしまい、いまいち仕事向きではなかったので、今度はもっとオフィスチェアらしいオフィスチェアを買おうと思い、いろいろ探した結果、アーロンチェアを買うにいたりました。

 国内では約13万円ほどするアーロンチェアですが、円高でお得なので、個人輸入にチャレンジしてみることにしました。このエントリでは個人輸入をするに当たって踏んだプロセスと、発生した問題、実際に掛かった料金などを記載し、今後同じように輸入したい人向けの記録として残しておきます。

  • 実際に買ったモデル

 買ったモデルは、こちら。
 http://www.amazon.com/gp/product/B000XX4J2E/ref=cm_cr_rev_prod_title

 アーロンチェアはいろいろモデルがあって、一言でアーロンチェアと言っても、

    • 肘置きなしのLite
    • ランバー(腰)サポートの付いたポスチャーフィットモデルとランバーサポートモデル
    • フル機能モデル
    • 座面のカラー、フレームの材質(グラファイトチタニウム、アルミニウムポリッシュ)

 など色々あります。とりあえず、通信販売ではよく分からないことが多いので、まずは座ってみることが重要です。都内であれば大塚家具が、入店の際に名刺を求められる等、若干敷居が高いものの、丁寧に解説してくれるのでオススメです。
 ちなみに大塚家具でのアーロンチェアの値段は129000円でした。接客・サポート共に良いので、個人輸入をするに当たっての、到着期間やリスクを考えれば、この値段でそのまま購入しても良いと思います。

※追記
 いろいろ調べたのですが、どうやら届いた椅子はアルミニウムポリッシュのもので、国内ではまだ18万ぐらいする椅子でした。
  • 掛かった値段

 円高ということもあり、椅子本体はとても安く買うことができました。

椅子本体:74217円
椅子本体送料(アメリカ国内):0円
椅子本体送料(アメリカ→日本):282.8ドル(およそ23500円)
転送手数料:20ドル(およそ1600円)
保険:8ドル(およそ670円)
消費税:4600円

合計 104587円

 当初の見積もりに比べて、3つの誤算がありました。
誤算1:アーロンチェアの重量は約25kg程度なので、130ドル程度で転送できる予定でしたが、箱が大きいため、CHARGEABLE WEIGHT(みなし重量)が48kgとなり、送料が倍かかった。
誤算2:アメリカ国内では税金がかからなかったが、国内に持ち込まれてから消費税を取られた。
誤算3:Amazonから転送業者の元に届くまでは直ぐだったが、そこから日本に発送されるまでに20日以上掛かった。その間に北朝鮮と韓国の関係がきな臭くなり、円安に振れたため、1600円ほど値段が変わった。(椅子購入時は約81円→84円)


※2011/12/04 追記
 あれから少し状況が変わったようで、カリフォルニアへ発送するときは7.75%の消費税を取られるようです。(参考リンク: http://amzn.to/t27JRX/
 色々調べてみたのですが、カリフォルニア州の消費税は、カリフォルニア州内での取引でのみ発生するようですので、どうやら、業者がカリフォルニア州に移転したのではないかと思います。
 このブログで紹介しているスピアネットはカリフォルニアに本拠を置く転送業者なので、この影響を受けることになります。これを避けるためには、別の業者から購入するか、別の輸入代行業者を利用するのが良いと思います。
 スピアネットは転送業者の中ではかなり安い価格で転送してくれるので、輸入代行業者を変更することでメリットになるかどうかは分かりません。
 また、米国内で既に消費税を払っているため、国内での消費税は免税される事になると思います。これに関しては自分が踏んでいないので、詳細は不明です。各自で調査をお願いします。(情報をいただければこちらでも更新します。)

  • 購入から到着まで

 まず輸入転送業者を決めます。
 個人輸入をやっている友人からスピアネットがオススメ、と聞いたので、そこを利用することにしました。

 http://www.spearnet-us.com/
 
 登録は無料で、登録が完了するとアメリカ側の住所が貰えます。
 
 次に購入する店を選びます。
 クレジットカードを使うことになるのですが、安心してクレジットカードが使えそうなのはAmazon.comぐらいだったので、今回はAmazonで購入しました。ちなみにAmazon.comだと日本円も使えます。(クレジットカードで買うのであまり関係ないですが)

  • 注文

 11月7日にAmazon.comでマーケットプレイスを経由して注文しました。

  • 発送 Amazon.com→スピアネット(アメリカ側)

 注文した次の日に発送通知の連絡が届きます。
 ちなみにスピアネットではアーロンチェアは大型荷物の部類に入るため、先に連絡をしておきましょう。11月11日には購入した椅子はスピアネットに到着しました。

  • 見積もり

 さて、椅子も届いたので、すぐ発送かと思いきや、ここで全くスピアネットからの反応がなくなります。スピアネットによると大型荷物のため見積が必要、とのこと。結局この見積に1ヶ月近く待たされることになります。

 役に立つかわかりませんが、手持ちの資料ではアーロンチェアの重量は24.9kg、みなし重量は48kgとなっています。これを伝えれば早く見積もりを終わらせてくれるかもしれません。ここの対応が非常に遅く、かなり不安な日々を過ごしました。

 発送されるまでにスピアネットと3回のメールのやり取りをしています。

1回目
 Q.届いてるけど、まだ?(11月16日に質問)
 A.大型荷物のため見積もりが必要、ちょっと待って欲しい。(11月17日に回答)

2回目
 Q.到着から10日程度経ってるけど、まだ?(11月21日に質問)
 A.水曜日(11月24日)にやります。(11月23日に回答)

3回目
 Q.先週の水曜日にやるって言ってたけど、まだ?(12月1日に質問)
 A.ごめん、やっとできた(12月3日に回答)

 どうやら、円高の影響で忙しそうな感じではあるのですが、ちょっとのんびりし過ぎではないでしょうか……。実績のある大きい会社なので、いきなりドロンということはなさそうですが、商品が届くより前にAmazon.comのクレジット決済が終わってしまったので、かなり不安でした。

  • 発送

 12月3日に振込のURLが届き、そこにお金を振り込んだあと12月3日に発送通知が来て、国内のペリカン便から税関に届いている、と連絡が来たのが12月8日。商品を受け取ったのが12月11日、となります。

 注文から1ヶ月の出来事で、気の長い話でした。

  • まとめ

 総合的に考えると、やはり得だったと思います。円高なので、輸入に関しては恩恵が受けられることと、輸入の勉強ができました。なにより、アーロンチェアはとても良いです。

 ちなみに椅子が壊れたときは、これは大塚家具で聞いたところ、海外で輸入した製品であっても、故障したときは日本法人のハーマンミラー社に持っていけば良い、とのこと。
(ただし保証については、効かないとのご報告がありましたため、こちらでも改めて確認します。)

 ちょっと気の毒なのは、私の担当営業についてもらった方なのですが、もしこの文章を読んで個人輸入はちょっと……とお考えの方がいらっしゃれば、大塚家具で買ってあげてください。

 大塚家具は高い家具を売っているというイメージなのですが、いざ高い家具を買うときになると、他の会社よりは大分安いと感じました。今度私の担当営業の方を紹介しますので、是非買ってあげてください。 新人さんっぽいところはありますけど、美人さんですよ!w

ハーマンミラー アーロンチェア ポスチャーフィット フル装備 AE113AWB PJG1BBBK3D01

ハーマンミラー アーロンチェア ポスチャーフィット フル装備 AE113AWB PJG1BBBK3D01

無線ルータ導入

 WEPの無線LANを使い続けるのは危険だと思っていたので、マルチSSIDに対応した無線LANが欲しいと思っていたのですが、新宿のヤマダ電機にて6000円で売っていたので、ついに購入に踏み切りました。

 

BUFFALO Air Station NFINITI HighPower Giga 11n/g/b対応 無線LANアクセスポイント WZR-HP-G300NH

BUFFALO Air Station NFINITI HighPower Giga 11n/g/b対応 無線LANアクセスポイント WZR-HP-G300NH


 
 ひかりONEで、既に提供されていたルータの代わりに利用出来るか不安だったのですが、一工夫することで無事に接続もでき、自宅内回線をWPA2/TKIP+AES、DS用にインターネット接続限定のWEPの2つを設定して、無事に運用出来ています。
 
 残念なことは、今まで使っていた無線LANは超強力でかなり遠隔でも無線が使えていたのが使えなくなったことでしょうか。今はワンルームなので、無意味に強力な無線LANを使うことに意味はないのですが。