会社を選ぶということ

 最近会社の採用の手伝いをしていて、内定が出たけど、まだ内定承諾を迷っているという学生の相談に乗ってたりするんだけれども、そこでよく学生に言っている内容をまとめてみる。あくまで持論なので、私が発した言葉、という以上に文章の責任は持てないし、「それは違うよ」と思う人はブクマコメントなり、ブログコメントなり、Twitterなりで伝えてください。
 あと、他の会社のことは分からないので、あくまで自分の会社の中の話、ということで。
 
(1)会社選びで最後に自分が幸せになれるかどうかは運である、ということ
 規模数十人の小さな会社であれば社風が合うか合わないかが重要かもしれないけれども、従業員が1000人とか5000人とかになってくると、もうそれは一つの社会で、色んな人がいるし、色んな部署がある。例えば、よく学生に「この会社はサービス残業がありますか?」とか聞かれるけれども、自分はサービス残業はしたことがないよ、としか言えないし、会社のコンプライアンス的にはそう言うのを厳しく取り締まっているので、殆どの部署はないと思う。ただ、社員が多くいれば例外的にルールを違反している部署がある可能性もあるわけで、100%ないかと言われれば、無いとは言い切れない。配属される場所・上司による、と答えてます。
 同様にやりたい仕事が出来るかどうか、も結局運じゃないかなぁ……と。
 
(2)ただし、自分が幸せになる確率を上げることは出来る
 運とは書いたけど、自分の行動次第で幸せになる確率を上げることは出来ると思う。例えば自分のやりたい仕事について、なるべく上手く相手に伝えるとか。そもそも学生の現時点の志望を聞くと「公共系の仕事がやりたい」とか「流通系の仕事がやりたい」程度で具体的に自分がそこでどんな仕事をするのか、などのイメージは持っていないことの方が多い。実際そのレベルでの希望が叶って配属されてみたら、あまりにも自分が想像した世界とかけ離れてて、辞めてしまう人だっている訳で。それは会社・当人両方にとって不幸なことなわけです。
 自分が思っているイメージの仕事が出来るかどうかを調べてから選択すれば、幸せになる確率は増えていくと思う。逆に先入観を殆ど持たずに、配属された場所に順応する、という人も居て、自分を納得させながら仕事をしている人もいる。実は、これが大多数のような気もするけど。
 
(3)まとめ
 というわけで、最近の自分が感じていることをまとめると以下のような感じになります。

  • 自分が会社に入って、配属されて本当に希望の叶った仕事が出来るかどうかは運である。
  • ひいては部署選び、会社選びの地点で、既に運の要素が絡んでいる。
  • ハズレくじを引かないようにするためには、なるべく自分の希望を詳細に定義して、採用面接時に問いかけていくことが重要。

 なんか普通の結論になってしまった。足りないところがあれば、また補足していきます。

第3回 Jenkins勉強会 Rubyで簡単にremote access apiを実行する

にわかJavaScripterにお薦めの1冊「JavaScriptパターン」

JavaScriptパターン ―優れたアプリケーションのための作法

JavaScriptパターン ―優れたアプリケーションのための作法

 JavaScriptの基礎を学ばずにjQueryとかのライブラリで表層的なJavaScriptしか書けない、まるで私のようななんちゃってJavaScripterにはお薦めの一冊。jQueryを使ったWebページが書けるなら、さほど躓くことなく、JavaScriptの上級者テクニックを身につけることが出来ると思います。

 jQueryなら使えるけど、クロージャ?カリー化?prototypeって美味しいの?な人に是非オススメです。

Android上でRubyアプリケーションが開発できるRubotoについて書いてみる

 ちょっと前にRubotoの記事を某雑誌に掲載するということで、色々準備していたのだけれども、Titanium Mobileとか、他にも魅力的な開発環境がたくさん出てきたので、結局Rubotoの記事を掲載するのはお流れに。とはいうものの、Ruboto自体は今後も発展するだろうし、国内のブログ記事を見渡しても、Rubotoの記事は殆ど無くて、あってもHello Worldを書いた程度だったりするので、ここにまとめておくことにします。
 雑誌に載せるレベルの量は書ききれないですが、雰囲気でも掴んでいただけると幸いです。
 
1.Rubotoについて

 Rubotoの紹介自体は、ちょっと調べてくれば出てくるので割愛しますが、参考リンクとしてここを挙げておきます。

 http://octoba.net/archives/20100305-ruboto-irb-android-427.html

 あまり語られることもありませんが、RubyRails)の世界では有名なEngineYard社がバックアップしているプロジェクトで、JRuby開発者のCharles Nutter氏などが参画しています。Titanium程の盛り上がりはありませんが、今も活発に開発が続いています。

 http://www.engineyard.com/open-source
 http://groups.google.com/group/rubotoGoogle Group)
 
2.Rubotoの特徴

 RubotoはAndroid上でRuby言語を使って開発が出来る環境です。
 Rubotoにはruboto-irbとruboto-coreというものがあります。

 ruboto-irbrubyで開発したことがある人なら、パッと想像がつくかと思いますが、irbという対話式のインターフェースを持ったアプリケーションです。ruboto-irb上でプログラムを入力すると、即座に結果が返ってくるというシンプルなアプリケーションです。Android上で直接アプリ開発をしたり、動作確認をしたいときは、ruboto-irbを使います。

 一方ruboto-coreは、直接rubyファイルを解釈して、単体のアプリケーションとして動作させるエンジンとして動作します。そのため、開発はAndroidの外のPCで行い、付属のantビルドスクリプトを動作させることで、apkファイルを生成します。

 RubotoはJRubyを内蔵し、Javaで実装されたRubyインタプリタによりRubyプログラムを解釈します。
 そのため、RubyプログラムからJavaのライブラリを呼ぶことも出来ます。もちろんAndroidAPIを呼び出すことも可能です。
 ただし、少し凝ったことをするためにはRuboto側から開発する場合であっても、Anrdoid開発のルールを理解する必要があります。物によってはそのままJavaで書いてしまったほうが早く実現できることもあると思います。

 またパフォーマンスですが、JRubyはCで書かれたRubyよりも早く動作することもある言語なのですが、JRubyの初期化は遅く、ruboto-irbを起動したときのJrubyの初期化は非常に遅い物となっています。これは思いついたことをすぐに実現したいというモバイルアプリケーションを開発するには、致命的です。今後改善により初期化が早くならなければ、普及は難しいと思います。
 
3.RubotoによるHello World

 手っ取り早くRubotoでアプリケーションを動作させたいのであれば、ruboto-irbに付属しているtoast.rbが参考になると思います。

#displays a 'Toast'
import 'android.widget.Toast'

Toast.makeText($activity, "Hello Ruboto!", Toast::LENGTH_LONG).show

 1行目のimport文はいきなりJavaの呼び出しです。
 android.widget.Toastクラスを呼び出せるようにインポートします。

 http://developer.android.com/reference/android/widget/Toast.html

 呼び出すとToastクラスが直接使えるようになります。
 4行目のmakeTextはToastクラスのインスタンスを直接生成します。
 最後のshowでToast#showメソッドが呼ばれて、表示を行います。

 $activityグローバル変数は、rubotoアプリで利用出来る変数で、$activityはRubotoで表示するアクティビティのインスタンス変数が入っています。このような形で、Rubotoが管理する変数が用意されており、JavaAndroid APIに直接渡すことができます。
 
4.RubotoによるGPSアプリケーション開発

 ここまでは、いくつかのブログでも紹介されていますが、ここから更に踏み込んで、少し複雑なアプリケーションを作りたいと思います。折角Androidのアプリを作るので、GPSを使ったアプリケーションを作りたいと思います。

 本当はruboto-coreを使って、単体で動作するアプリケーションの手順を書きたいのですが、ruboto-coreの環境構築なども説明が必要なので、今回はruboto-irb上で動作するものを作りたいと思います。

 下記のサンプルでは、GPSから位置情報を得て、その情報を記録し位置情報をGoogle Mapに引数として渡し、Google Maps上で移動経路を表示するというアプリケーションです。

 画面にはボタンが3つ表示され、Create Tableで得たデータを表形式で表示し、Create Routing Pathを使うことでGoogle Mapでの表示を行います。またClear Location Tableを押すことで移動経路情報を削除します。

f:id:Kirika:20110327222103j:image

require 'ruboto.rb'
require 'pathname'
import "android.widget.Toast"
import "android.webkit.WebView"
import "android.content.Context"

ruboto_import "org.ruboto.callbacks.RubotoLocationListener"
ruboto_import_widgets :TextView, :LinearLayout, :Button, :TableLayout, :TableRow


$activity.start_ruboto_activity "$test" do
  $data = nil
  pathname = Pathname.new("data")
  if pathname.exist?
    pathname.open("rb") do |f|
      $data = Marshal.load(f)
    end
  end
  $data = Array.new if $data.nil?

  setTitle "This is the Title"
  setup_content do
    linear_layout :orientation => LinearLayout::VERTICAL do
      button :text => "Create Table", :width => :wrap_content
      button :text => "Create Routing Path", :width => :wrap_content
      button :text => "Clear Location Table", :width => :wrap_content
    end
  end
  handle_click do |view|
    if view.getText == "Create Table"
      self.start_ruboto_activity "$table" do
        setup_content do
          table_layout do
            $data.each do |d|
              table_row do
                text_view :text => d[0].to_s, :padding => [3,3,3,3]
                text_view :text => d[1].to_s, :padding => [3,3,3,3]
              end
            end
          end  
        end
      end
    elsif view.getText == "Create Routing Path"
      self.start_ruboto_activity "$map" do
        map_path = "http://maps.google.com/maps/api/staticmap?size=320x480&sensor=true&" +
        "path=color:0x0000ff|weight:5|" + $data.map{|d| "#{d[0]},#{d[1]}"}.join("|")
        webview = Java::AndroidWebkit::WebView.new(self)
        webview.loadUrl(map_path)
        setContentView(webview,
           ViewGroup::LayoutParams.new(
          ViewGroup::LayoutParams::FILL_PARENT,
          ViewGroup::LayoutParams::WRAP_CONTENT))
      end
    elsif view.getText == "Clear Location Table"
      $data = Array.new
    end
  end

  @location_listener = RubotoLocationListener.new.handle_location_changed do |location|
    $data.push([location.getLatitude, location.getLongitude])
    pathname = Pathname.new("data")
    pathname.open("wb") do |f|
      Marshal.dump($data, f)
    end
  end

  @manager = getSystemService(Context::LOCATION_SERVICE)
  @manager.requestLocationUpdates("gps", 0, 0, @location_listener) if @manager.present?
end
  • 初期化処理

 まずruboto.rbをrequireします。ruboto.rbはrubotoの提供するヘルパークラスで、Androidアプリケーションを作る際の色々な決まりごとを簡単に書くためのメソッドを提供してくれます。
 その他アプリケーション内で使用するクラスなどを行頭でまとめてimportしておきます。

  • GPSの呼出処理(+リスナーメソッドの実装)

 次にruboto_importを使って、RubotoLocationListenerをインポートします。
 Androidでリスナークラスを使うようなアプリケーションを作ったことがあるなら分かりますが、GPSなどの外部から得られる情報をアプリケーション内で受け取るためにはリスナークラスを実装する必要があります。
 RubotoではAndroidで利用する汎用的なリスナークラス1つ1つに対して、Rubotoのヘルパークラスが用意されており、リスナークラスの実装メソッドであるonXXXXXという名前のメソッドがすべて、handle_XXXXXという名前でアクセスすることが出来ます。
 上記のサンプルアプリでは@location_listener = RubotoLocationListener.new.handle_location_changedという部分がそれに当たります。

 Listenerの種類はrubotoが用意してくれているもの以外は自前で用意する必要がありますが、rubotoがデフォルトで用意してくれているListenerだけでも、下記のURLで示すだけの量があり、Androidの基本的なアプリケーションであれば、自作の必要がありません。

https://github.com/ruboto/ruboto-irb/tree/master/src/org/ruboto/callbacks

 LocationListenerクラスのヘルパーを利用し、onLocationChangedを使ってGPSの位置情報が変更されたときの動作を記述しています。位置座標を記録したArrayクラスに位置座標を追加し、dataという名前のファイルに出力するように書いています。

 最後にgetSystemServiceにてLOCATION_SERVICEを呼び出して、requestLocationUpdatesで、位置情報を更新するように書いています。

  • UI周りの実装

 rubotoの画面はすべて$activity.start_ruboto_activityメソッドのブロックに記述します。

 start_ruboto_activityの中のそれぞれのメソッドについて説明します。

    • setup_content

 setup_contentは初期化処理を行うメソッドです。このサンプルでは、画面の構成を行うlinear_layoutを呼び出して、画面にボタンを作成する処理を行っています。また、普通のAndroidアプリケーションと同じようにレイアウトXMLを利用することも出来ます。

    • handle_click

 handle_clickは先程のGPSの項でも書きましたが、JavaのonClickメソッドを呼び出すためのRuby側のハンドラです。このサンプルでは各ボタンをクリックしたときの処理について記載しています。

 GPSで取得したデータを引数にGoogle Mapsのアドレスを使って、Google Mapsに移動経路を表示しています。AnrdoidにはWebViewというブラウザをビューとして利用する機能があるので、それを利用しました。import文でandroid.webkit.WebViewを呼び出すことで利用できます。

 こんな感じで呼び出したGoogle Map上の移動経路は以下のように表示されます。
f:id:Kirika:20110327222104j:image
 
5.まとめ
 こんな感じでJavaに比べて、短いコード量でAndroidアプリケーションを作成できるのがRubotoの強みです。とはいうものの、実際には分からないことはrubotoのソースコードを読まないといけなかったり、rubotoでうまく動かない場合に初めにJavaで組み立てて、rubotoの上でどう動かせばよいかを考えないといけなかったり、と課題が多くあります。
 まだrubyAndroid開発を行うというのは実用的ではありませんが、いずれAndroid開発の一手段となることを望みながら、この記事を締めくくりたいと思います。

 また、今回は諸事情により流れてしまいましたが、実際雑誌の記事になるときには、開発環境の構築方法、開発の進め方、よりrubotoの実装に突っ込んだ話なども書いていく予定でした。もし、今からでもどこかの雑誌で紹介してもらえるのであれば、喜んで書きますので、その際にはTwitter(@Kirika_K2)もしくはkirika.k2(gmail)にご連絡ください。

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