Windows 8.1ではじめるイマドキの開発環境

今までは、メインマシンにはLinuxやMacを利用していました。
ただ、最近はVagrantとかが充実してきてLinuxで動くWeb系の開発をするからって、環境をUnix系にする必要もないかな、と思って変化を求めてWindows 8.1 環境をデスクトップにししてみました。

別に紙芝居ゲームや艦これのため変えたわけじゃないですよ？　ええ、違うんです。

作業してて結構ハマったり、昔のWindowsの環境構築とは様変わりしてた部分もあるので、その辺をメモります。

はじまりはアカウントから
==============================

プログラマがWindows 8.1を使うならばまずはじめに考慮することはログインアカウントです。
Windows 8からは認証アカウントをMicrosoftアカウントと連携させることが推奨されます。
利用しているアカウントがローマ字などASCIIだけなら問題はありませんが、私のようについうっかりと日本語名にしていると、ユーザフォルダとかが日本語名になってしまいます。

Ruby系を始めとして日本語のパスが入ると正常に動作しないツールは結構あるので、英語表記のフォルダになるようにホームディレクトリを変更したいところです。が、できません＞＜
Windowsではその辺の機能がまともじゃないので、下記のように先にローカルアカウントを作って、それにMicrosoftアカウントを紐付けるほうが簡単かつ確実です。

1. アルファベット表記のローカルアカウントを作成
2. Microsoftアカウントに関連付けてしまったアカウントがあれば、関連付けを外す
3. 1で作ったアカウントに関連を付け直す

この方法で幸せになります。色々設定した後だと、移行が面倒なので、まずこの対応をするのが先決です。

HHK(Happy Hacking Keyboard)の罠
==================================

Linuxとの相性も良かったので自宅ではHHK(英語キーボード)を愛用しています。新調したデスクトップでもとりあえず使おうとしたのですが地味にハマりました。

まずは、英語キーボードなのに日本語キーボードとして認識されてしまう問題。
最初のインストール画面で適当に次へ次へと押していたんですが、うっかりキーボードをデフォルトの日本語キーボードで設定してしましました。
結果、色々配置が違って残念なことに。。。　しかも、あとから変えるのがレジストリいじったりと妙に面倒。
どうも、別にインストール時に間違えなくても色々問題があるようです。公式で[HHKBキー配列切替ツール](http://www.pfu.fujitsu.com/hhkeyboard/download.html)が出てるのでこれを使うのが簡単です。

続いて発覚したのがダイヤモンドキーが使えないこと。マニュアルとか見るとダイヤモンドキーはWindowsキーにマッピングされるっぽいです。
Windows8系ではショートカットにも多用されてるし、ぜひ使いたいのですが反応がない。色々調べてみると、どうも無変換にマッピングされてた模様。
無変換なんて、当然使うことはないので[Change Key](http://pcgenki.com/soft3/changekey.htm)ってツールで入れ替えました。
xkeymacsとか使い慣れたこの手のツールはWindows 8.1 64bit版ではうまく動かないので注意です。

PowerShell と cmd と ターミナルと
===============================

Windows 7以降はPowerShellが標準搭載ということで、残念なcmdとはおさらばできます。lsとかrmとか打てるので、Google先生にWindowsのコマンドを確認する手間が少し減ります。
ただ、セキュリティのためかPowerShellのデフォルトではスクリプトが実行できないモードになってるので以下で解除が必要です。

なので、PowerShellのターミナルから下記を入力します。

```[cmd]
Set-ExecutionPolicy RemoteSigned
```

これで、「このシステムではスクリプトの実行が無効になっているためファイル (スクリプトファイル) を読み込むことができません。…」とか言われる悲しい自体を避けられます。

と、ここまでPowerShellを触られた皆さんならお気づきだと思うのですよね？

ターミナルエミュレータはcmd同様に残念なままです。
なぜ、Microsoftがもう少しでも頑張らなかったのか疑問でしょうがないのですが、20年くらい前のUIを強いられます。

これは、つらすぎるので、別のターミナルを入れます。[mintty](https://code.google.com/p/mintty/)とか [Console Z](https://github.com/cbucher/console) と色々ありまいたが、日本語入力も簡単そうで使い勝手の良かった[ConEmu](https://code.google.com/p/conemu-maximus5/)を使うことにしました。
半透明とかにできるし、タブ付きで便利です。

![ss001.jpg](https://qiita-image-store.s3.amazonaws.com/0/54904/567fc86f-77aa-1384-6935-20cde8be2a16.jpeg)


甘いお菓子とコマンドー
==================================

本格的な開発系の作業はVagrant上でやるつもりですが、CUI系のコンソールアプリも最低限は必要です。

普段のエディタとしてはAtomやsublimeを使うにしても、コンソール上のファイルをさくっと確認・編集したいときはvimが便利ですし、sshを使うためにPuttyなど別なサーバを立ち上げるのも面倒です。WebAPIの疎通確認はcurlがあれば簡単ですし、そもそもrsyncが無いとchefでknife-soloを使うことができません。

今までだとこんなニーズを満たすためにはCygwinを入れるのが定番でしたが、はるかに便利なものを見つけました。
それは[Chcolatey](https://chocolatey.org/)。aptあるいはMacのhomebrewのようなパッケージ管理ソフトです。
Windowsはパッケージ管理ソフトがないことが致命的に問題だったので、これの登場はすごいことですよね！

ChcolateyのインストールはPowerShellで下記のように実施します。

```
PS:> iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))
```

導入が終わったら下記のコマンドでバージョンを確認して動作確認をします。

```
PS:> choco version
```

エラーなくバージョンが確認できればOKです。

パッケージを入れるには

```
PS:> cinst vim
```

のように一つづつコマンドを入れていく他に

以下の様なパッケージファイルを作って、一括してインストールすることも可能です。


```[xml]
<?xml version="1.0"?>
<packages>
    <package id="ChocolateyGUI" />
    <package id="Atom" />
    <package id="GoogleChrome" />
    <package id="libreoffice" />
    <package id="dropbox" />
    <package id="vim" />
    <package id="curl" />
    <package id="cwrsync" />
    <package id="ruby" />
    <package id="ruby2.devkit" />
    <package id="git" />
    <package id="openssh" />
    <package id="hg" />
    <package id="jdk8" />
    <package id="7zip" />
    <package id="vagrant" />
    <package id="virtualbox" />
</packages>
```

このXMLをpackages.configとかにして下記の様に一括インストールができます。

```
PS:> cinst packages.config
```

この辺をうまく使うことで開発環境の配布がずいぶん楽になるんじゃないかと思うので、もっと調べてみたいですね。

CUIアプリはもちろんですがGUIアプリも管理できるので、管理をこれに集約できるかぎりしようと画策中。

SSHも罠がいっぱい
=====================

単に、リモートサーバにログインしたいだけなら、puttyとかTeraTearmとか昔ながらのWindowsな方法もいいのですが、gitでcloneするときや、knife-soloでrsyncをする時など、結構現代の開発ではSSHコマンドが前提となっています。
なので、手順が他とギャップの少ないopensshをを使うことにしました。
インストールはすでに上記の手順でChocoloteyにより完了しています。
ただ、私の環境だと、環境変数への登録が何故かうまくされなかったので、手動で環境変数のPATHに

```
;C:\Program Files (x86)\OpenSSH for Windows\bin\
```

を追加しました。この後、ターミナルを叩くとコマンドでSSHを使えるのがわかります。

```
PS:\> ssh
usage: ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]
           [-D [bind_address:]port] [-e escape_char] [-F configfile]
           [-i identity_file] [-L [bind_address:]port:host:hostport]
           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
           [-R [bind_address:]port:host:hostport] [-S ctl_path]
           [-w local_tun[:remote_tun]] [user@]hostname [command]
```

つづいて公開鍵の作成をします。作成手順はいつもどおり

```
PS:\> ssh-keygen
```

です。この時、鍵の作成される場所に注意してください。コンソール上は

```
/.ssh/id_rsa
```

という場所に作られるのですが、ホームディレクトリでもなんでもなく、何故か下記の場所に作られます。

```
%HOMEPATH%\AppData\Local\VirtualStore\Program Files (x86)\OpenSSH for Windows\.ssh
```

git cloneなどが利用するのは当然ホームディレクトリ配下の.sshをデフォルトとして扱うので、シムリンクでホームディレクトリに持ってきました。
シムリンクはショートカットではないのでコマンドからも扱えるのが便利ですね。

PowerShellでも作れるんですが、シムリンク作成に関してはcmdのがコマンドがシンプルだったので、cmdを *管理者権限* で立ち上げて下記のようにmklinkで作成します。

```
C:\Users\koduki>mklink /D .ssh "%HOMEPATH%\AppData\Local\VirtualStore\Program Files (x86)\OpenSSH for Windows\.ssh"
```

これで、公開鍵をgithubに登録することでcloneが使用可能になります。

まとめ
=========================

こっから先もVagrantを立ち上げてChefで連携とか色々ありますが、導入という意味でのまとまりはこの辺が良いと思うのでここで終わりとしときます。

久々にWindowsで開発環境を作ってみましたが、やはり不慣れなこともあって時間はかかりますね。
Windows 8自体はWin+qの検索がコマンドランチャーっぽく使えてそこまで不便は感じなかったですが。戸惑いは多いけど＞＜

特にHHKは罠すぎるだろう。。。　ただ、Chcolateyのことも知ることが出来ましたし、なかなか得るものも多かったです。

最近は個人的にWeb開発がメインでしたが、これからWindows系の開発ソフトや環境も使えるようになったので、もうちょっと色んな事に手を出してみたいですね。

それではHappy Hacking!

参考
========================

- [Windows8/8.1 で日本語アカウント名が使われてしまう](http://matome.naver.jp/odai/2137199088145156901)
- [Windowsソフトを管理！パッケージ管理システムChocolateyでインストール、アップデートを簡単にする](http://millkeyweb.com/win-chocolatey/)
- [Windowsの標準のコンソールが糞なのでより良い物を探したけど見つからなかった](http://qiita.com/ironsand/items/fbd5f474c6aea1079e6b)
- [シンボリック・リンクとジャンクションとハードリンクの違い](http://www.atmarkit.co.jp/ait/articles/1306/07/news111.html)