tag:crieit.net,2005:https://crieit.net/tags/samba/feed 「samba」の記事 - Crieit Crieitでタグ「samba」に投稿された最近の記事 2021-12-03T02:33:10+09:00 https://crieit.net/tags/samba/feed tag:crieit.net,2005:PublicArticle/17809 2021-12-03T00:01:29+09:00 2021-12-03T02:33:10+09:00 https://crieit.net/posts/Samba-Docker-Desktop Samba が動く Docker Desktop のコンテナで、ボリューム内のファイルを見る <p>本記事は、 <a target="_blank" rel="nofollow noopener" href="https://qiita.com/advent-calendar/2021/docker">docker Advent Calendar 2021</a> 2日目 の記事だ。<br /> 昨日は、 <a target="_blank" rel="nofollow noopener" href="https://qiita.com/subretu">@subretu</a>氏 の <a target="_blank" rel="nofollow noopener" href="https://qiita.com/subretu/items/31a387510f84daaa4c1c">DockerfileにおけるCMDとRUNの挙動</a> だった。</p> <hr /> <p>docker のコンテナやボリュームの中身を見る際に、 ホスト PC から SMB ファイル共有で参照できると都合が良い。</p> <p>と言うことで以前、以下のような記事を作成したが、 Docker Desktop では利用できない問題があった。</p> <p><a target="_blank" rel="nofollow noopener" href="https://aquasoftware.net/blog/?p=1259">無認証 SMB を samba で秒で立ち上げる Dockerfile (& docker-compose) | Aqua Ware つぶやきブログ</a></p> <p>今回は、それを解消する手段について紹介したい。</p> <p>先に断っておくが、私自身でいくつかの PC で試したところ、上手くいく PC とダメな PC がハッキリと分かれてしまい、現時点ではどのような条件だとダメなのかハッキリわかっていない。</p> <h2 id="何故 Docker Desktop では Samba にアクセスできないのか"><a href="#%E4%BD%95%E6%95%85+Docker+Desktop+%E3%81%A7%E3%81%AF+Samba+%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%81%AE%E3%81%8B">何故 Docker Desktop では Samba にアクセスできないのか</a></h2> <p>Windows の SMB over TCP/IP アクセス機能は、接続先が 445 番ポートでないと利用できない制限がある。</p> <p>ところが、 Docker Desktop で 445 番ポートをリッスンしようとしても、 ホスト OS 側の <code>LanmanServer</code> サービス ("Server" と言う表示名のもの) が常に localhost の 445 番ポートを占有しているため、ポートをリッスンできずに失敗してしまう。</p> <p>さらに、この <code>LanmanServer</code> サービスは、 Docker Desktop サービスがこれに依存しているため、 このサービスを止めることもできない。</p> <p>このため、なんとか localhost の 445 番ポート以外をリッスンさせてる方法を考えなくてはならない。</p> <h2 id="ループバックアダプターと portproxy を使う"><a href="#%E3%83%AB%E3%83%BC%E3%83%97%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%80%E3%83%97%E3%82%BF%E3%83%BC%E3%81%A8+portproxy+%E3%82%92%E4%BD%BF%E3%81%86">ループバックアダプターと portproxy を使う</a></h2> <p>結論から言うと、 <a target="_blank" rel="nofollow noopener" href="https://docs.microsoft.com/ja-jp/troubleshoot/windows-server/networking/install-microsoft-loopback-adapter"><strong>"ループバックアダプター"</strong></a> と <strong>"portproxy"</strong> という Windows 組み込みの機能を利用する。</p> <p>ループバックアダプターとは、一言で言うと <strong>仮想的なネットワークアダプタ (NIC)</strong> だ。<br /> この 仮想NIC に <strong>適当なIPアドレス</strong> を割り当てて、 その 445 番ポートにアクセスすると、 localhost の <strong>445 番以外</strong> のアドレスに <strong>portproxy させる</strong> ことができる。<br /> Docker Desktop 側で その <strong>445 番以外</strong> のアドレスをリッスンしておけば、問題を回避できるはずだ。</p> <p><img src="http://www.plantuml.com/plantuml/svg/RP5FImCn4CNl-HIFdFJGmgwjrAL8_NDK48fuwMMQJRKqoIn9LXJfVdR3_baMyPZtVk_D3Dc4I3xMrWYlLIJtRZJaouF4Zm18HVQGhq5x2GgeWq_gmPDDq2Eha_PWXxVjKyS39KNQKz3uP5DRtMgEouHld--Xs4KwkhvDPNq8EBge_O5Kueh5OjdP2JuUMk0ywGbizSxzQSfRe9k9zMpsdv8LmzDoxQBeQYUJ3Iio7nnYSRKQbaZFRea9Ts6Ogpsf4wYaAicNEvVTvFFiUZNFbujvFfumW0BzDLWtJTzPe68VOQbARXqycjkHBt2db0v1O9IIFGObq8Ohpr_V0AGuYursPVh5Nm00" alt="" /></p> <h3 id="ループバックアダプターのインストール"><a href="#%E3%83%AB%E3%83%BC%E3%83%97%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%80%E3%83%97%E3%82%BF%E3%83%BC%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">ループバックアダプターのインストール</a></h3> <ol> <li>Win+R で「ファイルを指定して実行」を開き、 <code>hdwwiz.exe</code> を実行する<br /> <a href="https://crieit.now.sh/upload_images/89ac916ec4d187f3ec435778892a65c961a8e0144aefb.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/89ac916ec4d187f3ec435778892a65c961a8e0144aefb.png?mw=700" alt="smb-on-docker-desktop-01-01.png" /></a></li> <li>ハードウェア追加ウィザードで、「一覧から選択したハードウェアをインストールする」を選択する<br /> <a href="https://crieit.now.sh/upload_images/f39fdbeb6ba5eaf4cba419fa4f8fec2461a8e01e346af.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/f39fdbeb6ba5eaf4cba419fa4f8fec2461a8e01e346af.png?mw=700" alt="smb-on-docker-desktop-01-02.png" /></a> <a href="https://crieit.now.sh/upload_images/efd3fb5883aa94c2dc8825dd4d52625f61a8e021bb45f.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/efd3fb5883aa94c2dc8825dd4d52625f61a8e021bb45f.png?mw=700" alt="smb-on-docker-desktop-01-03.png" /></a></li> <li>ネットワークアダプタ → Microsoft → Microsoft KM-TEST Loopback Adapter を選択<br /> <a href="https://crieit.now.sh/upload_images/613a8016ee1018286cefefa98677cfb861a8e02c2da1c.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/613a8016ee1018286cefefa98677cfb861a8e02c2da1c.png?mw=700" alt="smb-on-docker-desktop-01-04.png" /></a> <a href="https://crieit.now.sh/upload_images/8ac078e306cc9ccf4c86e0f682b0523461a8e03adbf50.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/8ac078e306cc9ccf4c86e0f682b0523461a8e03adbf50.png?mw=700" alt="smb-on-docker-desktop-01-05.png" /></a></li> <li>ネットワーク接続の一覧 (Win+R で <code>ncpa.cpl</code> を実行) を開き、 今作成した 仮想NIC のプロパティを開く。<br /> <a href="https://crieit.now.sh/upload_images/5b8de4d5d6a36c6c2a4d494d1a8df3c561a8e03e4f763.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b8de4d5d6a36c6c2a4d494d1a8df3c561a8e03e4f763.png?mw=700" alt="smb-on-docker-desktop-01-06.png" /></a></li> <li>TCP/IPv4 のプロパティを開いて、 適当な固定 IPアドレスとサブネット (例として <code>192.168.254.2</code>) を設定する<br /> <a href="https://crieit.now.sh/upload_images/5ddc91e1d3d669965297caf67275d01e61a8e046bccb3.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5ddc91e1d3d669965297caf67275d01e61a8e046bccb3.png?mw=700" alt="smb-on-docker-desktop-01-07.png" /></a> <a href="https://crieit.now.sh/upload_images/85747f1bd260d98415c5c25e3b3f851861a8e04b05d16.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/85747f1bd260d98415c5c25e3b3f851861a8e04b05d16.png?mw=700" alt="smb-on-docker-desktop-01-08.png" /></a></li> <li>管理者権限でターミナル (コマンドプロンプトや PowerShell) を立ちあげ、 netsh コマンドでポートプロキシを立ちあげる。 <ul> <li>以下は、 仮想NIC の固定 IP に <code>192.168.254.2</code> を設定し、プロキシ先のポートを 38445 番にする場合。<br /> <code>powershell netsh interface portproxy add v4tov4 listenport=445 listenaddress=192.168.254.2 connectport=38445 connectaddres=127.0.0.1</code><br /> <a href="https://crieit.now.sh/upload_images/ad7b283d74cbfdf38529ec95c1e4ed0d61a8e04dd4caf.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/ad7b283d74cbfdf38529ec95c1e4ed0d61a8e04dd4caf.png?mw=700" alt="smb-on-docker-desktop-01-09.png" /></a></li> </ul></li> <li><strong>PC を再起動</strong> する</li> </ol> <p>これで準備完了だ。</p> <h3 id="SMB で使ってみる"><a href="#SMB+%E3%81%A7%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B">SMB で使ってみる</a></h3> <p>冒頭に紹介した、以前の記事の Dockerfile を使って、 SMB を立ちあげてみる。</p> <p><gist src="https://gist.github.com/advanceboy/a315d83d900929103d858a461b673e52.js"></gist></p> <p>この Dockerfile のあるディレクトリをカレントディレクトリにして、以下を実行する。</p> <pre><code class="powershell">docker build -t simple-samba . docker run --rm -p 38445:445 simple-samba </code></pre> <p>実用的には、 docker run の <code>-v</code> オプションなどで、適当なボリュームをマウントする感じになるだろう。</p> <p>そして、コンテナを起動した状態で ループバックアダプター の 仮想NIC に設定したアドレス (上記の例だと <code>\\192.168.254.2\</code>) に Windows エクスプローラー からアクセスできれば成功だ。</p> <p><a href="https://crieit.now.sh/upload_images/da0ed041118e80d7855560a1e6bca04e61a8e050c18c7.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/da0ed041118e80d7855560a1e6bca04e61a8e050c18c7.png?mw=700" alt="smb-on-docker-desktop-02-01.png" /></a></p> <h2 id="うまく動かない場合"><a href="#%E3%81%86%E3%81%BE%E3%81%8F%E5%8B%95%E3%81%8B%E3%81%AA%E3%81%84%E5%A0%B4%E5%90%88">うまく動かない場合</a></h2> <p>うまく動かない場合、 portproxy を提供する <code>iphlpsvc</code> (IP Helper) サービス が、 445 ポートをリッスンできているか調べてみよう。</p> <p><code>netstat</code> コマンドで、 192.168.254.2:445 をリッスンしているプロセスID を調べる。<br /> そして、その プロセスID が何のサービスなのか、 Windows PowerShell v5.1<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> Get-WmiObject Win32_Service から確認してみよう。</p> <p>うまく動作していれば、以下のように <code>iphlpsvc</code> サービス であることが確認できるだろう。</p> <pre><code class="plain">PS > netstat -ano | findstr 445 TCP 0.0.0.0:445 0.0.0.0:0 LISTENING 4 TCP 0.0.0.0:8445 0.0.0.0:0 LISTENING 13944 TCP 192.168.254.2:445 0.0.0.0:0 LISTENING 4016 TCP 192.168.254.2:60665 192.168.254.2:445 ESTABLISHED 4 PS > Get-WmiObject Win32_Service | ? ProcessId -EQ 4016; ExitCode : 0 Name : iphlpsvc ProcessId : 4016 StartMode : Auto State : Running Status : OK </code></pre> <p>もし、 192.168.254.2:445 をリッスンしているプロセスID が 4 だった場合、 OS の <code>LanmanServer</code> サービスに関係するカーネルプロセスがこのポートをふさいでしまっているため、 portproxy が正しく動作していないと言うことになる。</p> <pre><code class="plain">PS > netstat -ano | findstr 445 TCP 0.0.0.0:445 0.0.0.0:0 LISTENING 4 TCP 0.0.0.0:8445 0.0.0.0:0 LISTENING 13944 TCP 192.168.254.2:445 192.168.254.2:60665 ESTABLISHED 4 TCP 192.168.254.2:60665 192.168.254.2:445 ESTABLISHED 4 </code></pre> <p>これは、おそらく portproxy を機能させる <code>iphlpsvc</code> サービスが機能する前に、 <code>LanmanServer</code> サービスが 445 ポートを塞いでしまっているからだと考えられる。</p> <p>確実ではないと思われるものの、 <code>iphlpsvc</code> サービスが先に機能するかもしれない対策を、いくつか紹介する。<br /> いずれも、設定後 PC の再起動が望ましい。</p> <ul> <li>Win+R で「ファイルを指定して実行」を開き、 <code>services.msc</code> を実行して、 「サービス」 の管理コンソールを立ちあげ、 "IP Helper" (<code>iphlpsvc</code>) のスタートアップが「自動」 になっていることを確認する。 <ul> <li>管理者権限で PowerShell を立ちあげ、 以下のコマンドを実行するのでも OK<br /> <code>Set-Service iphlpsvc -StartupType Automatic;</code></li> </ul></li> <li>netsh で IPv6 のサポートを追加する <ul> <li>管理者権限でターミナル (コマンドプロンプトや PowerShell) を立ちあげ、 netsh コマンドで以下のように実行する。<br /> <code>netsh interface ipv6 install</code></li> <li>理由がよくわからないが、これで上手くいく場合があるらしい。<br /> <a target="_blank" rel="nofollow noopener" href="https://stackoverflow.com/questions/24646165/netsh-port-forwarding-from-local-port-to-local-port-not-working">portforwarding - NETSH port forwarding from local port to local port not working - Stack Overflow</a></li> </ul></li> <li><code>LanmanServer</code> サービスの起動を遅延させる: <ul> <li>管理者権限で PowerShell を立ちあげ、 <code>LanmanServer</code> サービスの起動を「手動」にして起動を遅延させる。<br /> <code>Set-Service LanmanServer -StartupType Manual;</code></li> <li>設定の → アカウント → サインイン オプション → 「更新または再起動の後にサインイン情報を使ってデバイスのセットアップを自動的に完了します。」 の on, off を切り替えてみる。</li> <li>ただし、 off にすると OS 再起動時のログイン速度が遅くなる。</li> </ul></li> <li>コントロール パネル → ネットワークとインターネット → ネットワークと共有センター → 共有の詳細設定 で、 仮想NIC が属するプロファイル (ゲストまたはパブリック) で、 「ファイルとプリンターの共有を無効にする」 を選択する。 <ul> <li>当然、ゲストまたはパブリックネットワークへ繋いだときに、ファイル共有ができなくなる。</li> </ul></li> </ul> <p>どうしても 仮想NIC の 445 ポートが PID 4 に奪われる場合、 <code>iphlpsvc</code> サービスと <code>LanmanServer</code> サービスの起動順とかを見てみると良いかもしれないが…<br /> 確認したところで何か具体的な対策があるわけでは無いが…</p> <pre><code>$procs = Get-WmiObject Win32_Service -Filter "Name='iphlpsvc' or Name='LanmanServer'"; Get-WmiObject win32_process -Filter (($procs.ProcessId | %{ "ProcessId='$_'" }) -join ' or ') | select Name,CreationDate,ProcessId,@{Name='Service'; Exp={$procs | ? ProcessId -eq $_.ProcessId | select -exp Name<span>}</span><span>}</span>; </code></pre> <h2 id="おわりに"><a href="#%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB">おわりに</a></h2> <p>後半、動作しない場合の対策についてつらつらと書いてしまったが、ちゃんと動きさえすればなかなか便利なはずだ。</p> <p>明日、 <a target="_blank" rel="nofollow noopener" href="https://qiita.com/advent-calendar/2021/docker">docker Advent Calendar 2021</a> の 3日目 は… 今のところ空いているようだ。<br /> どなたか書いてみてはいかがだろう?</p> <div class="footnotes" role="doc-endnotes"> <hr /> <ol> <li id="fn:1" role="doc-endnote"> <p>2021年現在、 PowerShell v7 系列だと <code>Get-WmiObject</code> コマンドが動かないため。 <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p> </li> </ol> </div> advanceboy tag:crieit.net,2005:PublicArticle/15974 2020-06-23T01:07:00+09:00 2020-06-23T01:07:43+09:00 https://crieit.net/posts/SMB-samba-Dockerfile-docker-compose 無認証 SMB を samba で秒で立ち上げる Dockerfile (& docker-compose) <p>docker 上の Linux (alpine) で Samba を立ち上げ、 無認証の SMB 共有を開始する Dockerfile をメモっておく。</p> <p><a target="_blank" rel="nofollow noopener" href="https://gist.github.com/advanceboy/a315d83d900929103d858a461b673e52">https://gist.github.com/advanceboy/a315d83d900929103d858a461b673e52</a></p> <pre><code class="Dockerfile">FROM alpine:3.10 RUN mkdir -p /samba/share && \ chmod -R 0777 /samba/share && \ chown -R nobody:nobody /samba/share # install samba RUN apk update && \ apk add samba RUN { \ echo "[global]"; \ echo " security = user"; \ echo " map to guest = Bad User"; \ echo " guest account = nobody"; \ echo " min protocol = SMB2"; \ echo "[public]"; \ echo " path = /samba/share"; \ echo " writable = yes"; \ echo " guest ok = yes"; \ echo " guest only = yes"; \ echo " create mode = 0666"; \ echo " directory mode = 0777"; \ } > /etc/samba/smb.conf EXPOSE 139 445 # start smbd as foreground ENTRYPOINT ["/bin/ash"] CMD ["-c", "nmbd restart -D && smbd restart -FS --no-process-group </dev/null"] </code></pre> <h3 id="使用例"><a href="#%E4%BD%BF%E7%94%A8%E4%BE%8B">使用例</a></h3> <p>手っ取り早く実行したい場合、以下のような <code>docker-compose.yml</code> を <code>Dockerfile</code> と同じフォルダに保存し、</p> <p>```yaml:docker-compose.yml<br /> version: '3'<br /> services:<br /> smb:<br /> build: .<br /> ports:<br /> - 445:445</p> <pre><code><br />コマンドプロンプト等のターミナルで、以下のように実行する。 ```bash docker-compose build docker-compose up </code></pre> <h3 id="何に使うのか"><a href="#%E4%BD%95%E3%81%AB%E4%BD%BF%E3%81%86%E3%81%AE%E3%81%8B">何に使うのか</a></h3> <p>docker でデータを永続化する際、 <a target="_blank" rel="nofollow noopener" href="https://docs.docker.com/storage/bind-mounts/">Bind Mounts</a> を使えば、デスクトップ側にファイルが永続化されているため、そのまま永続化されたファイルを覗き見ることができる。</p> <p>しかし、 Bind Mounts では一部の機能に制限があることから、 <a target="_blank" rel="nofollow noopener" href="https://docs.docker.com/storage/volumes/">Volumes (Named Volumes, Anonymous Volumes)</a> を使うこともあるだろう。<br /> (とりわけ Windows デスクトップから Linux コンテナを使う場合、 ファイルシステムの違いから Bind Mounts だと期待しない動きに遭遇しやすい。)</p> <p>このとき、 Volumes の中身を SMB で共有させるコンテナを起動させておくと、 デスクトップ側から Volumes の中身が簡単に見られるようになるので、開発や検証に便利になる。<br /> (但し上記の手順だと、 認証などが一切なく、 ネットワーク内のだれからでもアクセスできるので、 実運用上では 別途認証やアクセス元の制限を加えるなど、注意は必要だ。)</p> <h3 id="Docker Desktop for Windows での回避策"><a href="#Docker+Desktop+for+Windows+%E3%81%A7%E3%81%AE%E5%9B%9E%E9%81%BF%E7%AD%96">Docker Desktop for Windows での回避策</a></h3> <p>ホスト側が Linux であったり、 Windows 上の Docker Toolbox であれば、上記の手順だけでも問題なく SMB 共有が実行されるだろう。</p> <p>しかし、 ホスト側が Docker Desktop for Windows である場合は、 Windows とコンテナの間で 445 ポートが競合してしまい、 以下のようなエラーが出て起動に失敗するはずだ。</p> <pre><code class="text">ERROR: for smb Cannot start service smb: Ports are not available: listen tcp 0.0.0.0:445: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted. ERROR: Encountered errors while bringing up the project. </code></pre> <p>SMB は他のポートではアクセスができない。<br /> また、 Docker Desktop for Windows では、 Windows デスクトップにポートフォワーディングせずに、 Hyper-V 上の Linux のホストマシンにアクセスする方法が用意されていない。<br /> このため、コンテナの SMB 共有させたければ Docker Desktop を起動している Windows 側の SMB を止めるしかない。</p> <p>[blogcard url="http://sangosthi.blogspot.com/2011/03/how-to-disable-cifssmb-port-445-on.html"]</p> <p><a href="https://crieit.now.sh/upload_images/74b1ca7505c22dfdf8d56c3b135a152b5ef0d6afbcdd8.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/74b1ca7505c22dfdf8d56c3b135a152b5ef0d6afbcdd8.png?mw=700" alt="2002_docker_samba_smb-01.png" /></a></p> <p>上記の記事にあるように、 Windows 側で <code>Server</code> サービスを止め、無効化した後に OS を再起動すると、 445 ポートが空く。<br /> この状態で、 <code>docker-compose up</code> すれば、エラーなく実行できるだろう。<br /> ただ、ファイル共有をはじめとする様々な機能が Windows 側で動かなくなるだろうが。。。<br /> (ということもあり、あまりオススメできる方法ではない。)</p> advanceboy tag:crieit.net,2005:PublicArticle/14644 2018-12-11T09:58:00+09:00 2019-05-05T20:27:41+09:00 https://crieit.net/posts/Windows 開発マシンをWindowsに移行した話 <p>(2019/05/05追記)<br /> 一年も前に書いたジョークがいまさら発火して、もうどんな顔していいかわからないのだけど🙃 この記事には後日談があります<br /> <a href="https://crieit.net/posts/VSCode-Remote-Development">VSCodeのRemote Development機能が革命的な話。</a></p> <p>(追記終わり)</p> <p>2010年頃に開発マシンをMacに移行して、それからずっとMacで開発していたのだけれど、Windowsに戻してみることにした。</p> <p><a href="https://crieit.now.sh/upload_images/b334fc6e12964946d4dd17efac9146355c0f097e3cc3c.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/b334fc6e12964946d4dd17efac9146355c0f097e3cc3c.jpg?mw=700" alt="2018-11-22 21.00.06s.jpg" /></a></p> <h1 id="理由"><a href="#%E7%90%86%E7%94%B1">理由</a></h1> <p>最近なんかMacイケてないと思わない?</p> <ul> <li>新型MacBook Pro1.3kgはともかく、<a target="_blank" rel="nofollow noopener" href="https://www.apple.com/jp/mac/compare/results/?product1=macbook-air-retina-13&product2=macbook-pro-touchbar-13">13インチMacBook Airが1.2kg</a>ってありえないでしょ?アップルの空気はそんなに重いの?</li> </ul> <p>一方で、WindowsでWEB開発する条件が整いつつある</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://www.office.com/">Office 365</a>, <a target="_blank" rel="nofollow noopener" href="https://www.adobe.com/jp/creativecloud.html">Adobe CC</a>など、大手の会社のソフトウェアはだいたいマルチプラットフォーム対応になってきたよね <ul> <li><a target="_blank" rel="nofollow noopener" href="https://code.visualstudio.com/">VSCode</a>も<a target="_blank" rel="nofollow noopener" href="https://www.sublimetext.com/">Sublime Text</a>もWindowsで動くよ</li> </ul></li> <li>開発環境にDocker使うんだったら、もはやWindowsでも一緒なのでは?</li> <li>surfaceかっこいいよね!</li> </ul> <p>つまりこういうことです</p> <blockquote> <p>不満を持ちながらも惰性でMacを使い続けるよりはもっと良い環境になる可能性のある方向を目指す方が生産的だよねということで、試しにいっちょWindows機に移行してみるか、ということにしました<br /> <a target="_blank" rel="nofollow noopener" href="https://techracho.bpsinc.jp/morimorihoge/2018_12_02/65605">Web開発環境をMacBook ProからWindows機に移行してみた話</a></p> </blockquote> <h1 id="RFP"><a href="#RFP">RFP</a></h1> <ul> <li>nodeとかrubyといったunixネイティブのソフトウェアは、仮想マシンを使ってlinux上で動かす。中途半端にWindowsの上で動かすと余計な手間がかかるのでやらない <ul> <li>WSL(Windows Subsystem for Linux)はどうなんだろう?</li> </ul></li> <li>OfficeやAdobeソフト、エディタなどを仮想マシンで動かすと重そうなので、WindowsネイティブなアプリはWindows上で動かしたい</li> <li>その間にあるものをどうするかが悩み</li> </ul> <h1 id="構成"><a href="#%E6%A7%8B%E6%88%90">構成</a></h1> <p>しばらく試して落ち着いた構成がこちら。</p> <p><img src="https://qiita-image-store.s3.amazonaws.com/0/30743/ed84e9d9-dd14-3f0a-ba69-4bb5b5d77353.png" alt="Untitled.png" /></p> <ul> <li>Windowsが提供する仮想マシン環境 hyper-V でlinuxマシンを動かす</li> <li>一台目dev-baseは、開発環境のベースとなるマシン <ul> <li>sambaサーバでディスク領域をWindowsに公開して、Windowsのネットワークドライブとしてマウントする</li> <li>VSCodeやSourceTreeはすべてこのドライブに対して実行する</li> <li>同じ領域を、nfsサーバでも公開する</li> </ul></li> <li>二台目linuxは、プロジェクトごとに用意する仮想マシン <ul> <li>nodeとかrubyとかがインストールされる</li> <li>ソースコードなどは、nfs領域上にあるものをマウントして利用</li> </ul></li> </ul> <p>こうすることで、Windows上のアプリから読み書きしたファイルをリアルタイムでlinux上で操作することができる。</p> <p>あとは、Windows上で適当なシェルを用意して、SSHでlinuxに接続してしまえばもうlinuxの世界。</p> <h2 id="試行錯誤"><a href="#%E8%A9%A6%E8%A1%8C%E9%8C%AF%E8%AA%A4">試行錯誤</a></h2> <ul> <li>MacとWindowsのキーの違いは、<a target="_blank" rel="nofollow noopener" href="https://www.autohotkey.com/">AutoHotkey</a>でだいたい吸収できます</li> <li><del>仮想デスクトップの切り替えがキーボードでできないのも、<a target="_blank" rel="nofollow noopener" href="https://github.com/sdias/win-10-virtual-desktop-enhancer">win-10-virtual-desktop-enhancer</a>で解決</del> (2019/05/05追記)<a target="_blank" rel="nofollow noopener" href="https://twitter.com/matsudamper/status/1124995892245753856">標準でショートカットがある</a>ことを教えてもらいました!</li> <li>WindowsのPowerShell上でsshが動くので、シェルはこれでもいいのですけど、<del>なんか使いにくかったので<a target="_blank" rel="nofollow noopener" href="http://www.9bis.net/kitty/">Kitty</a>を入れました</del> (2019/05/05追記) <a target="_blank" rel="nofollow noopener" href="https://ja.poderosa-terminal.com/">Poderosa</a>に乗り換えました</li> <li>Macに乗り換えて泣く泣く別れた<a target="_blank" rel="nofollow noopener" href="https://hide.maruo.co.jp/software/hidemaru.html">秀丸エディタ</a>と感動の再開を果たしたのですが、昨今の複雑化した開発の前には、もはや単機能エディタでは力不足ですね。初恋の人と同窓会で再開したみたいだと思いました</li> <li>Docker on linux試したんだけど、これdocker内からファイルを書くとrootで書いたことになっちゃうのですよね <ul> <li>最近のDockerだと、User Namespaceという機能で解決できるらしいのですが、うまく行かなかったので諦めました</li> <li>Hyper-Vがすんなり動いたので、Docker for windowsはまだ試してない。うまく動けばこっちのほうがいいかも</li> </ul></li> </ul> <h1 id="良かったこと"><a href="#%E8%89%AF%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8">良かったこと</a></h1> <ul> <li>Surface軽い! <ul> <li>1.3kgのMacbook Proはリュックで背負っても辛い感じだったのですが、700gのSurface Proなら肩掛けカバンでも持ち歩くことができます。封筒にだって入っちゃうぞ。</li> </ul></li> <li>スナップ機能が便利 <ul> <li>Windows7の頃からあった機能らしいのですが、画面を左右に分割してブラウザとエディタなどのアプリを配置することができます。Macの<a target="_blank" rel="nofollow noopener" href="https://manytricks.com/moom/">Moom</a>でもできますが、Windowsだと、左70%右30%みたいなことができるのが嬉しい</li> </ul></li> <li>Windows Hello楽しい <ul> <li>iPhoneのFaceIDと同様の、顔認証によるログイン機能が搭載されています。パソコン起動したときディスプレイと目を合わせるのは「よろしくね」という感じでちょっとよいです</li> </ul></li> </ul> <h1 id="困ったこと"><a href="#%E5%9B%B0%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8">困ったこと</a></h1> <ul> <li><p>なんか不安定</p> <ul> <li>スリープから復帰した時に仮想マシンが起きてこなかったり、外付けディスプレイへの描画が起きてこないなどの、かゆいトラブルが発生しています。今思えばMacは安定していたなあ</li> <li>とはいえ、Macでトラブルが起きないのは、長いこと使ってきてトラブルを回避するノウハウを体が覚えているみたいなところもあるので、Windowsだってしばらく使えば安定してくるんじゃないかなと期待している</li> </ul></li> <li><p>surfaceビミョー</p> <ul> <li>surfaceの特徴であるTypeCover(超薄型キーボード)、キーボードとしては、多少ペコペコするけど普段使いでも行けるくらいよくできています。</li> <li>問題なのはタッチパネルの方で、普段はいいのだけれど、電車の中みたいに安定しないところで使おうとするとカーソルが暴走を始めます。たぶん、歪むと検出値が安定しなくなるんだと思う</li> <li>だからといって外付けマウスを電車の中で使うのは不可能なので、<a target="_blank" rel="nofollow noopener" href="https://direct.sanwa.co.jp/ItemPage/400-MA077">指輪マウス</a>を実験中w</li> </ul></li> </ul> <p><a href="https://crieit.now.sh/upload_images/fb8d8ccf1a5dc6e98e960d5ac225bd405c0f0990dc176.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/fb8d8ccf1a5dc6e98e960d5ac225bd405c0f0990dc176.jpg?mw=700" alt="2018-12-10 23.29.05.jpg" /></a></p> <h1 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h1> <p>予想していたとおり、Macじゃないと開発できないのはiPhoneアプリくらいで、unixベースのソフトウエアを使って開発するぶんには、MacでもWindowsでもできるなという感じです。</p> <p>Macは良かったんだなあ、と思うこともあるのですけど、新しい環境は楽しいのでしばらくこれで続けてみようと思います。</p> daisuke furukawa