中国でソフトウェア開発を行う方法 Part2
2025-01-14
お久しぶりです、シルクです。
前回の投稿からだいぶ日が経ってしまいましたが、年末久しぶりに中国へ行ってきたので記事を書きました。
中国で旅行する傍らソフトウェア開発も行い、前回よりもだいぶ知見が溜まったので共有します。
手前味噌ですが、中国国内から外国企業でリモート開発を行うTipsとしては、現状日本で最も充実した記事の1つだと思いますので、急に中国への出張が決まった際などはぜひ参考にしてもらえたらと思います。
前回の記事を読んでいない方はぜひこちらを先に読んでみてください。
それでは、項目ごとに紹介していきます!
中国で安定したVPN環境を確保したい
中国で安定したVPNを確保したい場合はいくつかの選択肢があります。前回はQuickQを紹介したと思うのですが、今回また良いサービスを見つけたので紹介します。
それがこちらの1coinVPNというサービスです。なんだか宣伝のようになってしまいますが、自分が使って実際に良かったVPNを紹介しているだけなので許してください。このVPNは今回本当に感動しましたし助けられました。
1coinVPNの良さは挙げればキリがないのですが、まずなんといってもその安さです。名前の通り元々は500円だったようで、今でも一番安いプランが1ヶ月約600円と信じられない安さです。
そしてその速度も素晴らしいです。前回紹介したQuickQと比べるとこちらの方が全体的に高速です。そしてもちろんVPN特有のもっさりした動作もありません。私の場合滞在した場所のネット環境が良かったこともあって1coinVPNを使うと自宅のネット回線よりも速度が出ました(笑)
今回の滞在では前半はこのサービスを知らずQuickQを使っていたのですが、後半はPCでは1coinVPNばかり使っていました。iPhoneだと専用のアプリがないのでそこが難点ではあります。自分はできれば公式のアプリで1coinVPNを使いたかったのでiPhoneでは利用していませんでした。
そして次はサポートの手厚さです。日本の方が運営しているサービスとあってXで精力的にサーバー状況の発信などもされていますし、リプ欄で質問に返信などもされているようなのでだいぶ使っていて安心感がありました。
最後は同時接続できる端末数の多さです。QuickQは3台ですが1coinVPNは7端末まで接続できるので、実質制限がないようなものでした。
ここまで褒めちぎっていて欠点はないのかということなんですが、QuickQと比較して欠点ももちろんあります。1つ目は安定性です。
QuickQは中国国内のサービスということもあり、非常に安定感があります。数年間使ってきてメンテナンスで使えなくなったことはないですし、接続が不安定になったことすらありません。おそらく現存する中国のVPNサービスの中でも最も安定した部類だと思います。
一方1coinVPNは運営の規模の小ささもあり、使い始めて数ヶ月ですがメンテナンスで使えない時間帯などがあった記憶です。Xを見ていても「今日は1coinVPNが調子が悪かった」などの投稿も見かけました。このサービスだけをあてにして中国で働くことはお勧めできません。
次がUIの使いやすさです。UIはQuickQの方が何倍も洗練されていて使いやすいです。iOS、Android、MacOS、Windowsはもちろん、なんとLinux向けのネイティブアプリまであります。UIだけで採用を決める人は少ないと思いますが、サービスとしての安定性や運営体制の充実具合がUIにも現れているなと感じます。
個人的には両方準備していきつつ、スマホではAhamoを契約して、ホテルや滞在先の外では無料で国際ローミングするのが最強だと思っています。開発もそうですが中国で働くには冗長化は欠かせません。Aが使えなくなったらB、BがダメならCといくつも代案を持っておくことが重要です。
go getやgo installが遅すぎる問題
Golangで開発を行うケースは最近多いと思います。ですが中国国内でgo get
やgo install
を実行すると、通常は遅すぎてほとんどの場合失敗してしまいます。
これはGOPROXY
の設定で回避することができます。
ネットで検索したら色々な有名どころが出てくるのでどのミラーを設定してもいいですが、私は個人的にはgoprox.cn
を使用しています。名前からして公式が提供しているミラーのように見えますが、七牛云(Qiniu Cloud)という会社が提供しているサードパーティーのGoプロキシサービスなので注意が必要です。
中国国内だとアリババ Cloudの提供するミラーも人気があります。
# 中国のミラーを設定(どれか一つを選択して設定)
# -wオプションをつけると永続的にこの変数がセットされます
$ go env -w GOPROXY=https://goproxy.cn,direct
# または以下など
$ go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/,direct
なお、Dockerイメージ内でgo get
を実行している場合は、以下のようにイメージ内でも同様の設定が必要です。
ENV GOOS="linux"
ENV GO_TOOLCHAIN=auto
# 以下を追加
ENV GOPROXY="https://goproxy.cn,direct"
帰国後は以下のように設定を戻します。 この設定は GOPROXY 環境変数を未設定状態に戻し、デフォルト値(https://proxy.golang.org,direct) を使用するようにします。
$ go env -u GOPROXY
GitHubにアクセスできない問題
GitHubからの直接Clone等はVPNを接続するだけで可能ですが、Homebrewのレジストリとしてgithubからパッケージを取得する場合などは、それだけでは不十分です。
そこで以下の設定を行い、gitコマンドやcurl、wgetを含むすべてのトラフィックがローカルプロキシサーバー(VPN)を経由するようにします。
# curlやwget、pnpmなどターミナルから実行される全てのコマンドに適用されるグローバルなproxy設定
$ export https_proxy=http://127.0.0.1:10900
$ export https_proxy=http://127.0.0.1:10900
一応補足しておくと、サンプルコードのポート番号はVPNサービスによって変わるので自分の起動しているVPNがどのポートを使っているか調べてそれで置き換える必要があります。
$ networksetup -getwebproxy "Wi-Fi"
Enabled: Yes
Server: 127.0.0.1
Port: 10900
Authenticated Proxy Enabled: 0
日本に戻った際は、以下のコマンドで設定を元に戻すことができます。
# 環境変数を削除
$ unset http_proxy
$ unset https_proxy
Homebrewが使えない問題
同様に、brew install
やbrew upgrade
も中国国内では非常に遅いか、もしくは実行不可能な状態になります。
この問題に対しては、清華大学などが提供しているHomebrewのミラーリポジトリをリモートリポジトリとして使用することで解決できます。
## tsinghua
$ cd "$(brew --repo)"
$ git remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git
# homebrew/coreはHomebrewのデフォルトリポジトリ(タップ)で、公式に提供されている多くのパッケージの定義が含まれています。
# ただし、特定のパッケージをインストールするまでローカルにクローンされることはありません。
# そのため、普段使っていない場合や、すでに必要なパッケージがインストール済みの場合は、coreを特別に設定する必要はありません。
# 具体的には cd "$(brew --repo homebrew/core)" を実行してcd: no such file or directoryだった場合はcoreの設定は不要です。
$ cd "$(brew --repo homebrew/core)"
$ git remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git
# Homebrew-Bottlesをミラーに設定
$ export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles
# キャッシュをクリアして最新の情報を取得
$ brew update --force
日本に戻った際は、以下のコマンドで設定を元に戻すことができます。
# Homebrew本体のリポジトリを公式URLに戻す
$ git -C "$(brew --repo)" remote set-url origin https://github.com/Homebrew/brew.git
# Homebrew-Coreのリポジトリを公式URLに戻す
$ git -C "$(brew --repo homebrew/core)" remote set-url origin https://github.com/Homebrew/homebrew-core.git
# Bottlesのダウンロード元を公式に戻す
$ unset HOMEBREW_BOTTLE_DOMAIN
# キャッシュをクリアして最新の情報を取得
$ brew update --force
帰国後処理も含めた設定の自動化
これらの設定を中国滞在の旅に1つずつ設定するのは大きな手間です。また、帰国後に戻し忘れてしまうことも心配だと思います。
なので私は以下のように.zshrc
に処理を書いて、滞在期間を毎回設定するだけで設定が適用されるように半自動化しています。
# VPNサービスとポートのマッピング
# サービスの使用するポート番号は自分の環境やサービスに合わせて変更する
declare -A VPN_PORT_MAP=(
[10900]="QuickQ"
[33210]="1coinVPN"
# 必要に応じて追加
)
function get_vpn_service_name() {
local port=$1
local service_name=${VPN_PORT_MAP[$port]:-"Unknown VPN"}
echo $service_name
}
function reset_proxy_setting() {
unset http_proxy
unset https_proxy
# GOPROXYの設定を解除
go env -u GOPROXY
# Homebrewのプロキシ設定を解除
git -C "$(brew --repo)" remote set-url origin https://github.com/Homebrew/brew.git
git -C "$(brew --repo homebrew/core)" remote set-url origin https://github.com/Homebrew/homebrew-core.git
unset HOMEBREW_BOTTLE_DOMAIN
brew update --force
}
function check_proxy_period() {
# 滞在期間を毎回適切に設定する
local start_date="20240901"
local end_date="20241201"
local current_date=$(date +%Y%m%d)
if [[ $current_date -ge $start_date ]] && [[ $current_date -le $end_date ]]; then
# Wi-Fiのプロキシ設定を取得
local proxy_status=$(networksetup -getwebproxy "Wi-Fi")
if echo "$proxy_status" | grep -q "Enabled: Yes"; then
local proxy_host=$(echo "$proxy_status" | grep "Server:" | awk '{print $2}')
local proxy_port=$(echo "$proxy_status" | grep "Port:" | awk '{print $2}')
local vpn_service=$(get_vpn_service_name $proxy_port)
export http_proxy="http://${proxy_host}:${proxy_port}"
export https_proxy="http://${proxy_host}:${proxy_port}"
echo "🌏 中国滞在期間のため、プロキシを自動設定しました($start_date 〜 $end_date)"
echo "🔒 使用中のVPN: ${vpn_service}"
echo "📡 プロキシ設定: ${http_proxy}"
else
echo "🇯🇵 システムのプロキシが無効です"
reset_proxy_setting
fi
else
echo "🇯🇵 中国滞在期間外のため、プロキシ設定を解除しました"
reset_proxy_setting
fi
}
check_proxy_period
これを使うことで、start_date
とend_date
を滞在のたびに変更するだけで期間中であれば各種プロキシ設定などが適用されるようになります。
運用してみてかなり便利だったので、ぜひ利用してみてください。そして導入コスト低めでもっといい運用方法があれば、ぜひ教えてください!
2025年1月時点でこのブログにはまだコメント機能を実装していないので、私のBlueskyのアカウントなどで教えていただけると嬉しいです。
Zoomがカクつく・遅い場合の対処法
中国国内リモートワークをしていてzoomを使用したビデオ会議を行う機会は多いと思いますが、そのまま使用すると遅延が大きくなりがちです。場合によってはカクカクしすぎて会議にならない場合もあります。自分の経験上、以下の対策を順番に試してみることで改善が期待できます。
まず最も効果的な対処法は、zoomのデスクトップアプリケーションではなく、ブラウザから会議に参加することです。これにより、ラグを大幅に改善することができます。
次に、ブラウザでzoomにログインして設定画面からデータセンターを香港・台湾・日本・シンガポールなどに限定することを試してみてください。
ただし、この設定による改善効果は体感できるほど大きくない場合があります。現に私は体感としては改善しませんでした。
最後に、VPNを使用して会議に参加する方法があります。
VPN無しでも接続できる場合もありますが、VPNを使用することでより安定した通信を確保できます。
終わりに
いかがだったでしょうか?
意外と中国でもソフトウェア開発できるなと思ってもらえればこの記事を書いた価値があります。インドに行って人生観が変わったという話は聞きますが、中国大陸も旅行するとすごくパワーをもらえるので、ぜひ一度安全対策や準備をしっかりしてワーケーションにでも訪れてもらえるといいんじゃないかと思います。
前回同様たくさん旅行の写真も載せようかと思いましたが、それはまた別の記事で旅行記として載せることにします。ここでは少しだけ旅行の写真を載せておきます。
ここまで読んでいただきありがとうございました!また旅行記で会いましょう。