react-nativeで、ajax通信の結果を、setStateしたい時のthisのbindの仕方
reactと組み合わせてjqueryを使っている時に、ajaxでPOST通信を送ろうとした。この時のmthisのbindの位置が直感とはずれてたので、メモ。
thisにjqueryの関数自身が入る
export default class Example extends React.Component constructor() { this.example = this.example.bind(this); } example() { $.ajax({ type: 'POST', url, data: JSON.stringify(data), success(res) { // ここのthisの話 this.setState({ res }); }, error(error) { // ここのthisの話 this.setState({ error }); }, }); } }
そりゃそうか。直さなきゃ。
thisにjqueryの関数自身が入る〜Part2〜
ajaxメソッドを読んだ時に、thisをbindしなきゃいけないから、きっと関数の閉じカッコの後ろにつけてあげればいいんだろうな。。。から。
export default class Example extends React.Component constructor() { this.example = this.example.bind(this); } example() { $.ajax({ type: 'POST', url, data: JSON.stringify(data), success(res) { // ここのthisの話 this.setState({ res }); }, error(error) { // ここのthisの話 this.setState({ error }); }, }).bind(this); } }
しかしこれもajax関数自身がthisに入ってくる。
そんで以下を試したら解決
解決策
結局綺麗に(?)bindするのが無理だったので、変数に格納して取って置くことにした。すっきりしないけど、困ったら愚直に
export default class Example extends React.Component constructor() { this.example = this.example.bind(this); } example() { const _this = this; $.ajax({ type: 'POST', url, data: JSON.stringify(data), success(res) { // ここのthisの話 this.setState({ res }); }.bind(this), error(error) { // ここのthisの話 this.setState({ error }); }, }).bind(this); } }
あれ、no_underscore_dungleのlinter errorでてる。。。(気にしない)
店舗の会員権をすぐ無くす人に嬉しい、売買可能なオンライン取引所が誕生するらしい
面白いサービスを見つけたので、メモがてらに残しておく。
spotsaleというサービスで、店舗が発行する会員権のオンライン取引所らしい。
最近、Valuやtimebankなど従来取引できなかったものをプラットフォームを介して所有・売買が可能なサービスが流行ってる。多分そこから着想されたサービスだと思う。
何が嬉しいって、会員権をすぐに無くすし、管理する気すらさらさらない僕のような人は、アプリ1つでまとめていくことができるのではないでしょうか。
しかも、たまたま立ち寄った自分にとって価値の低い店舗の会員権を、相対的に価値を高く感じる人に対して販売できる。なんてお得な。
まだサービスの詳細はわからないけど、楽しみに待ちたいと思います。
ちなみに僕の招待コードは「uPuM」で、こちらから登録できますよ!
react-native, android, circleCI2.0, fastlaneでdeploy gateへのテスト版自動配信
情報が足りなくてとても辛かったので、情報共有に。
システムの作動順序
- githubのstagingにPR
- merge
- circleCIでbuild用に必要な環境構築
- fastlane経由ででdeploygateへのビルド&デプロイコマンド叩く
書くことが増えるのも嫌なので、ここでは3.のcircleCIの設定だけにフォーカスする。
設定ファイル
諸々の説明は公式ドキュメントを参考にした。
version: 2 jobs: build: docker: - image: circleci/android:api-25-alpha working_directory: ~/client environment: JVM_OPTS: -Xmx3200m ANDROID_HOME: /opt/android/sdk branches: only: - staging steps: - checkout - run: name: install android ndk command: | wget https://dl.google.com/android/repository/android-ndk-r10e-linux-x86_64.zip sudo apt-get install p7zip-full 7z x android-ndk-r10e-linux-x86_64.zip rm android-ndk-r10e-linux-x86_64.zip sudo mv android-ndk-r10e /opt/android export ANDROID_NDK_HOME=/opt/android/android-ndk-r10e export PATH=${PATH}:$ANDROID_NDK_HOME curl -sL https://deb.nodesource.com/setup_7.x | sudo -E bash - sudo apt-get install -y nodejs npm install sudo apt-get install ruby2.3 ruby-dev make g++ sudo gem install fastlane cd $HOME/client/android && fastlane android dg - store_artifacts: path: app/build/reports destination: reports
はまりポイントは、次の点くらいかな、、と思います。
あれ、だいぶ薄い記事になったな。。
linuxに、root userでも使えるpyenv環境の構築
ほとんどPyenvによるPython3.x環境構築(CentOS, Ubuntu)のモノマネですので、環境構築をしたい人は上記を参考にしてください。メモです。
背景
- ansibleをpipでインストールしようとする
- pyenvで管理されてるpythonとシステム pre-install pythonが呼ばれたり呼ばれなかったりでうまくいかない。
- 全部pyenvでインストールしてるものを使ってしまいたい。
やったこと
ec2上にpythonのインストール。systemにもともとインストールされているpythonに何もかも突っ込んで言って辛い思いをした過去があるので、できればバージョン切り替え用のパッケージをかませたい。
結果pyenvを導入した。多くのプロジェクトが同一サーバー化で動くことは想定していないので、仮想環境構築はしない。(virtualenv等)
やらなかったこと
virtualenv/pyenvなど仮想環境構築ツールの導入。
コード
pyenvインストール
PyenvによるPython3.x環境構築(CentOS, Ubuntu)にある通りです。下記コマンドで起動スクリプトを作成。
export PYENV_ROOT="/home/ec2-user/.pyenv" export PATH="${PYENV_ROOT}/shims:${PYENV_ROOT}/bin:${PATH}"
この後に設定を反映させるために下記コマンドを実行。
source /etc/profile.d/pyenv.sh
ログインし直した時も、この設定は反映されるようなので、一度実行すればきにする必要はなさそうです。
豆知識程度に補足をすると、/etc/profile.d
にはアプリケーション毎の設定を記述していくそうです。ここに設定を書いておくと、ログインユーザに関係なく起動時に読み込んでくれます。(下記手順)
/etc/profile
を実行/etc/profile
によって、/etc/profile.d
ディレクトリ配下のすべてのファイルを実行- ログインユーザーのホームディレクトリにある
~/.bash_profile
を実行 ~/.bash_profile
によって、~/.bashrc
を実行~/.bashrc
によって、/etc/bashrc
を実行
sudoでもuserのパス設定を引き継げるように設定
あとは、ログインユーザからsudo
で実行した時に、path情報とかを引き継げるように設定をする。
これをやらないと、なんかしらのscripthがpythonコマンドを叩こうとした時に、pyenvが呼ばれないことがある。visudo
を利用して設定ファイルを書き換える。
$ visudo ~~~ 編集モードに入るので、下記のように変更 ~~~ # Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin コメントアウト Defaults env_keep += "PATH" # 追加 Defaults env_keep += "PYENV_ROOT" # 追加
fabricでデプロイ自動化
独学マンなので、書き方等ご指摘頂けますと幸いです。
背景
- python3.6で書かれたjobを、ec2上に構築
- shceduleでスケジューリング
- supervisorでdaemon化
までできていた。デプロイ作業を失敗しそうなので、自動化した時の備忘録。自動デプロイツールとしてfabricを利用。
ちなみに現状、fabric本家はpython3系をサポートいません。参考: FabricのPython3への対応についてそのためforkされたprojectから、インストールする必要があります。
pip3 install fabric3
ディレクトリ構成はこんな感じ。シンプル。
... ├── fabfile │ ├── __init__.py # module読み込み │ ├── deploy.py # 基本処理の記述 │ ├── envs.py # 基本設定を記述 ...
基本処理の記述
from fabric.api import run, abort, env, cd, local from fabric.decorators import task class LocalHandler(object): """localでのデプロイ周りの処理""" def push(self): """localの変更をgithubへpushする commitまではされている想定 """ self.__check_has_commited() self.__check_on_master() self.__update_requirements() local('git push origin master') def __update_requirements(self): """requirements.txtをupdateするスクリプト""" req_txt = 'requirements.txt' local('pip freeze > {}'.format(req_txt)) res = local('git ls-files -m', capture=True) if res == req_txt: local('git add {}'.format(req_txt)) local('git commit -m "update requirements.txt"') def __check_has_commited(self): """変更がちゃんとcommitされているかを確認""" res = local('git ls-files -m', capture=True) if res: abort('there are some diff on git supervised files') def __check_on_master(self): """master branchにいるか確認""" branch = local('git rev-parse --abbrev-ref HEAD', capture=True) if branch != 'master': abort('you should call this on master branch') class RemoteHandler(object): def pull(self): """master branchに移動してソースコードの更新""" with cd(env.app_path): self.__check_no_change() run('git checkout master') run("git pull origin master") def restart_daemon(self): """svcを使って、restartさせる""" self.__install_required_package() res = run('supervisorctl restart {}'.format(env.daemon_name)) if res.failed: abort('REMOTE: fail restart daemon {}'.format(env.daemon_name)) return res def __install_required_package(self): req_txt = 'requirements.txt' with cd(env.app_path): run('pip3 install -r {}'.format(req_txt)) def __check_no_change(self): """変更がちゃんとcommitされているかを確認""" res = run('git ls-files -m') if res: abort('REMOTE: there are some diff on git supervised files') @task def deploy(): LocalHandler().push() rh = RemoteHandler() rh.pull() res = rh.restart_daemon() if res.succeeded: print("SUCCESS!! WELL DONE") else: print("TRY ONcE MORE :D")
基本設定を記述
from fabric.api import env from fabric.decorators import task @task def production(): """ 本番 """ env.environment = "production" env.app_path = '/path/to/project_root' env.daemon_name = 'supervisor daemon_name' env.user = 'ec2-user' env.hosts = ['host_name'] env.key_filename = '~/.ssh/key.pem'
module読み込み
このままだと、プロジェクトルートからfabricのタスクを呼べない。init.pyにimport書いてモジュール化する。
from fabfile.envs import production from fabfile.deploy import deploy
実際に自動デプロイをする
下記のコマンドをローカルで叩く。
$ fab production deploy
Facebookグロースハックチームが行った、グロースハックチームを会社全体で行うための試行錯誤
過去に作っていたメモをブログを作ったのでまとめてあげています。
QuoraにまとめられたFacebookのグロースチームに所属するAndy Johns人物が直接回答した有名なWhat are some decisions taken by the “Growth Team” at Facebook that helped Facebook reach 500 million users.というスレッドがある。
Andyの回答は日々の意思決定に焦点をあて、戦術・雇用・戦略・文化作りの4つの軸から、如何にしてたったの4年間でユーザー数を5億人にまで伸ばしたかについて具体例を交えながらまとめていた。
Andyのまとめだけもとても秀逸なのだが今回は、先輩からのリクエストを元にして以下の3つの異なる軸からこのスレッドを切り取ってみたい。若干、掲載するプラットフォームが変だっていうツッコミが入りそうな感じはするけど、こういうのはエンジニア主導で行われていくべきものだし、見ていて損は無い情報だろうから恐れずポストした。
- KPI策定に必要な要素とは
- PDCAサイクル高速化のためには
- 彼らの行った具体的な施作
運営するブログはこちら:努力1mm
本題に入る前に、、
本題に入る前には2010年時点でのFacebookのグロースチームに関する情報とFacebookの現状ユーザー数について少し触れておきたいと思う。
Facebookのグロースチームは当時、国籍のバラバラな30人ほどのメンバーが所属していた。このグロースチームが買収やパートナーシップ、FBページのマルチリンガル化も含めた、最適化の全責任を負っていた。その中には、なども含まれていた。残念ながら現在のグロースチームの情報は探せなかったので、知っている人がいたらどなたかFacebookかコメントにて教えて頂けたらとても嬉しいです。。
2006年に誕生したFacebookは2010年までにユーザー数5億人を達成。そこから2015年末までで、ユーザー数を3倍の15.9億人までに伸ばした。直近の2016年7月までに更に1億人を獲得し、17億人を超えた。これにはLGBTの人の要請を請けてFacebookが実名ポリシーを緩和したことなんかも影響しているのかもしれない。
出典:TechCrunch:facebook earnings Q4
それでは本題へ!
グロースチームのKPI 策定方法
実際に何かしらのサービスの最適化を行うとなっても、その第一段階である問題設定からKPI策定までの手順が分からなかったりすることが多い。中にはKPI策定した段階で「買収がベストプラクティスだ」という答えが出ることもあるが、ここではショートカット無しの自力での成長戦略に関するKPI策定手順をまとめてみる。
Facebookユーザー数増加のためのKPI策定の手順について
この場合のKPI策定の第一ステップは、課題をいくつかの小さな問いに分割していくことから始まる。今回はユーザー数増加を大きな課題としているので、KPIは少なくとも未登録・登録したて・利用中・利用停止の4段階のユーザーを対象に設定される必要がある。
対象が明確になれば、以下の4つをKPI策定への細分化された問いとして定義できる。 1. どうやって新規ユーザー獲得率を増やすか 1. 新規ユーザーをできるだけ早くアクティブユーザーにするための方法 1. アプリ使用時間を高めるためのトリガーはを引っ張る方法 1. 流出したユーザーを引き戻すためにどんなことができるのか
これはAndyが実際に作ってくれたカスタマージャーニーと、各段階のユーザーに対する課題に対する図で、なんとなくイメージをつけるのに最適かもしれない。
大抵の場合は、これらの問題の解を探しているうちに「新規ユーザー獲得にはFacebookの写真をアップロードできる機能を拡張すればいいんだ!」といった具体的な答えが見つかる。その答えが見つかったら、次の2つの手段からどちらが効率良いか考える必要がある。
- 既存のユーザー接点の価値を高める
- 新しいユーザー接点を0から作る
例えば写真の例でいくならば、既存の写真アップロード手順の簡易化と、Google Photoからのインポート機能を作成といった、2つのチャネルについて考えることができる。
ユーザーに登録を促すようなサービスを提供しているのであれば、Facebookのグロースチームが実際に見つけた次の例から、ユーザー接点最適化のヒントを得ることができるかもしれない。
- 招待メールの絶対量を増やす
- 既存ユーザーによる招待メールの送信を促す
- 招待メールのCTRを高める
- 既存ユーザーによる招待メールのCTRを高める
- ログアウトページのデザイン性
- 登録フォームの最適化
- 登録前のアカウント認証メールの改善
ユーザー獲得のためのKPIの策定は積み上げ棒グラフのようなもので、それぞれのチャネルが少しでも改善すれば、全体としては莫大な効果を発揮することになる。チャネルの数を増やせば増やすほど、全体のユーザー数もどんどんと増えて行く。
もちろんただ単にチャネルを増やせば成功する訳ではない。増やしたならば最適化をしなくてはいけないし、そのチャネルの評判が悪ければ逆効果になるかもしれない。
チャネルを増やし、それぞれの質を高めるためには、失敗を恐れずにチャレンジを繰り返し、リスクを取りながらPDCAサイクルを高速で回していくことが必要とされる。もちろんFacebookのグロースチームもPDCAサイクル高速化のための工夫を行っていた。
PDCAサイクル高速化のための取り組み
僕は本田圭佑が好きで、彼に関する記事などは頻繁に目を通している。彼のまっすぐな姿勢というか折れない精神とかは天性のもので自分には無いものだし、何より有言実行だしかっこいい。サッカー選手でありながら自分で経営もしてるあたりもとても好き。そんなビジネスにも手を伸ばしている本田圭佑が、目標達成に関することでこんなことを述べていた。
挫折は過程、最後に成功すれば挫折は過程に変わる。
だから成功するまで諦めないだけ。
成功をいち早く獲得するためにはできるだけたくさんチャレンジすることが必要で、そのためにはリスクテーキングは欠かせない。誰しもリスクを取ることはなるべく避けたいと願うが、企業として成功するためにはリスクを取りチャレンジをたくさんして、PDCAをできるだけ高速で回すことが必要だ。
上記のことを叶えるためにAndyは、Facebookで実践していた3つのポイントを挙げている。それは小手先の短期的な努力で結果の見えることではなく、長期間継続的に続けていく必要のある組織作り的な面が多かったことが印象的だった。
- 経営陣とグロースチームの距離感
- カルチャー作り
- M & A
経営陣とグロースチームの距離感
memeboxのデータサイエンスによる業務改善例で述べたようにデータによるグロースチームは経営陣に近い距離にある必要がある。Andyもグロースチームと経営陣が近い関係にあったことに写真までつけて触れていた。これはグロースチームのリーダーであるChamathとザッカーバーグを含めた経営陣が仲良く話している瞬間が切り取られている。
グロースチームが経営陣と近い距離を必要としている理由には、成長(グロース)の特性が影響している。成長は1部門として認識される実行されるべきことではなく、経営者のような視点から全ての部門に対して、企業ミッションを達成するために実施される必要がある。この写真からも分かるようにFacebookのグロースチームも、経営陣からの手厚いサポートを受け、部門横断的な視点から成長のための最適化を行っていたようだ。
最後にAndyは、企業の成長のために経営者がするべき意思決定で、何よりも大切なものがあることに触れた部分を引用したいと思う。それは壮大な企業ミッションの策定でもなく、グロースチームの会社内でのあるべき姿に触れる象徴的な内容だった。
グロースをエンジニア・オペレーション・企画チームの日々の活動において、最も根本的な要素と位置付ける。経営者がするべき最も大事な意思決定は、企業でのグロースのポジション設定にあるのかもしれない。
カルチャー作り
国際色豊かなグロースチームのオフィス天井には、メンバーの出身国の国旗が掲げられている。
グロースチームのオフィスの天井には、これらの国旗と並んで2つだけ、どこの国にも属さない旗が掛けられていたという。そこに掲げられていたのはグロースチームのメンバーが胸に刻むべき使命であり、リスクテーキングに恐怖を抱く人を奮い立たせるような内容になっていた。
GO BIG OR GO HOME
UP AND TO THE RIGHT
他にもありとあらゆる場所にメッセージは散りばめられていて、有名なDONE IS BETTER THAN PERFECTなんかは、オフィスの壁に書かれていたメッセージのうちの1つであった。
このような文化作りや経営陣によるサポートのような組織作りの取り組みが、高速でPDCAサイクルを回すためには役に立つのかもしれないなー、、と思ったりもした。続いて少し違ったPDCAサイクル高速化(というかショートカット?)の例を挙げてみる。
M&A
何かしらの目標があってなおかつ資金が潤沢にあるならば、企業を買収することもPDCAサイクル高速化の1つの手段かもしれない。Andyは実際にFacebookのグロースチームが主導で、企業の買収やパートナー提携が行われたと述べていた。
ここではFacebookが実際に行った、友人レコメンド機能拡張に向けた、企業買収によるサイクル高速化の具体例を挙げる。
Octazenの買収
Facebookのミッションは世界中の人を繋げることだ。そのためにはソーシャルグラフのような人間関係のリストを作成することは必須だった。そしてこのゴールに向かうためにFacebookが選んだのは、自前でのソーシャルグラフ作成ではなく、その情報を持っているOctazenというマレーシアのスタートアップを買収だった。
Octazenは、友人情報などを引き出せる権利をユーザーに認めてもらい、その情報を元にユーザーの連絡先リストやソーシャルグラフを抜き出して人間関係の繋がりのリストを作っていた。
Facebookは買収したOctazenの情報を元にして、自社で取り組んだら数年はかかるソーシャルグラフを数ヶ月で完成させた。拡充した友人レコメンド機能によって、継続的なユーザー数の増加を可能にしたのだ。
目的達成のためにPDCAの高速化を図ることは確かに大切なのかもしれない。でもサイクルを回し続けるのは工数もかかるし、精神的にも骨の折れる仕事だ。このような目標が現れた時、買収によるPDCAプロセスのショートカットも1つの手段として有効なのだろう。
具体的な施作
ユーザー5億人獲得のためにはいくつもの最適化を実践し、中には特別な施作もあったようだ。しかしAndyが強調して述べていたことはとてもシンプルなことで、memeboxのデータサイエンスによる業務改善例でも書いた、教科書通りのことを淡々とやり続けることだった。
僕たちが取り組んだ施作で、伝えていかなきゃいけないことは山ほどあるよ。でもね、そのほとんどは特別なものじゃなくて、マーケティングの教科書に載ってる内容なんだ。テストして、本番で試してみて、フィードバックを元に洗練する。これを繰り返していただけさ。
実際にAndyが上げていた具体例を挙げる前に、ここに書かれていることを愚直に実行してもうまくいく訳がないということには注意しておかなきゃいけない。プラットフォームだけでなく、時代によってもユーザーの行動は変化していく。これらを参考に、自社サービスで最も有効なように最適化を図っていくことが大事だと肝に銘じておきたい。
ここではその最適化の例を箇条書きでまとめていく。どのようなプロセスでこれらの具体例が導かれたかも丁寧に説明されているのだが、既に内容的には盛り沢山だし、また別の機会にそのプロセスについてはまとめたいと思う。以下が最適化の具体例だ。
- 文章よりもボタンを使おう
- ボタンの位置と言葉には気をつけよう
- 位置だけじゃなく、サイズ・色・影なども大切!
- 速さは正義。速度の遅いサイトはCV率を意識していないも同然
- 価値のあるコンテンツを作るために、見出しやサブ見出しを充実させよう
- 文字を使いすぎないこと。シンプルで簡潔なサイトを
- 色使いはグロースハッカーのたしなみ
- 画像はCV率を高める。効率良く使う方法をテストしよう
- ユーザーへの感謝を上手に述べれば、CV率もアップ
- 正しく使われれば、商品説明の動画はとても効果的だ
- ユーザー登録ホームはシンプルに。自動入力が可能な構成にしよう
- 所属欲求などの人間の欲求を上手に使おう(ex. 友達N人がサービスを使ってます!)
- メールの件名・送信元アドレス・日時のABテストは抜かりなく
- htmlメールよりもテキストメールの方がCV率が高かった!
- 広告を上手に使おう。更にランディングページを効率化すると3倍もCV率があがることもある
- 広告の画像やメッセージを数日間隔でローテーションさせると更に効果が上がる
- Facebook広告をクリックするための手段もシンプルに
- AdwordsのCTRを上げるには動的にキーワードを入れられるようにしよう
- SNSシェアボタンの位置もABテストを
- SEOメタデータの最適化も忘れずに
- 2万件以下のAdwordsキャンペーンしかもたないなら、1キーワード対して1つの広告グループを作成しよう。これによって狙いのキーワードに対して重複なく広告を打てるし、Adwords広告のCTRを上げるにはこれが一番手っ取り早かった
ソース
人工知能搭載ヘルスケアサービス「Health Tap」についてのまとめ
次に作るサービスについて考えているのですが、せっかくなら調べたことを後悔してしまおうということでまとめた。
health tap とは
health tapは、人間の、健康に関する関わり方を再開発するものとして、2010年にローンチされたサービス。医者と、利用者がプラットフォーム上でやり取りしあうサービスみたい。
2013年の状態で、登録している医者の数は3万5000人、毎月1000万件の質問が投稿され、累計アプリダウンロード数は200万を超えてるんだとか。医師も無料で回答しているし、患者も無料で利用できるのか?? どうやってお金稼いでるんだこの人たち。。
患者側の使い方は簡単で、主に以下の手順に沿って利用されている。
- 健康状態に疑問をもった人が、自分の症状を投稿する。(発疹がある、喉が腫れてる、とか)
- 人工知能がその症状に関して詳しい、適切な医者とマッチング
- 24時間以内に、その症状に対する対処法が回答される
- みんなハッピーになる<3
ここで疑問に思ったのが、以下の2点。順に調べてまとめてみる。
- どうやってその回答の厳密さを担保してるんだろう
- 医者の参加メリットは?
- 該当する国内サービスってあるのかな?
医者の参加するメリット、インセンティブ
health tap自身が発表している内容によると、医者が一回のログインで費やす時間は60分以上。激務なはずのお医者さんがなんで、こんなにたくさんの時間を割くのかは素直に不思議だなぁと、、
でもやっぱりお医者さんにもたくさんメリットはあるみたい。流行り(?)のゲーミフィケーションが使われているとかの他に、実務的な面でも。
- 受診不要な患者さんを減らすことによる、業務の効率化
- 潜在患者からの認知度
- 同業者からの認知度
があるらしい。いや、確かに。全部良さそうだけど、個人的には3が結構メリットありそう。医者ってなんだかんだ紹介ビジネスなところもあるだろうし。個人的な経験からもよく行く医者なんて、口コミで全部決めちゃうしね。。
類似の国内サービス
M3のアスクドクターズ?モデル的にはこれが似てるのかもしれないけど、個人的にはこれは流行らない気がする。というのも、月額でお金かかるのも結構しんどいし、怪我したってわざわざカードの登録とかしてから質問するようなサービスなら気持ちも萎えてやらないと思う。
自分がこれをやるなら、ビデオチャットでやるだろうなぁ、、 医者だけに限らず、働けていないママさん専門看護師/歯科衛生士/介護士/獣医といった層にアプローチをすると思う。
ただし、最近の医療サービスに対する風当たりからなかなか厳しい感じはするが。。
想像できる日本でできない困難さ
日本とアメリカの大きな違いは以下の通り
- 日本は医療費が格安
- 日本は病院に医者がいけば診察を受けれる(アメリカはファミリードクターの紹介状が必要)
とか。これは大きな違いな気がしますね