Windowsに開発環境を作る WSL編

WSLのセットアップ

設定変更

「アプリと機能」 >「プログラムと機能 」> 「Windowsの機能の有効かまたは無効化」から、Windows Subsystem Linuxを有効にする。
上記設定後、OSを再起動。
 

Linuxのインストール

MicroSoft Store からubuntuを検索し入手ボタンをクリック。
インストール出来たら、「起動」ボタンを押す
起動すると、初期設定が行われるのか、少し時間がかかる。
初期ユーザのユーザ名とパスワードの設定画面となるので、任意のものを設定する。
 
Installing, this may take a few minutes...Please create a default UNIX user account. The username does not need to match your Windows username.For more information visit: https://aka.ms/wslusers
Enter new UNIX username: gyamin
Enter new UNIX password:Retype new UNIX password:
 

初期設定

SSH設定
$ ssh-keygen -t rsa
 
wslのファイルシステムwindows側とのデータ共有のため?権限周りが普通ではない。777になっていて、変更もできない。
(以下参考)
で、根本的には解決していないようだが、777だと権限問題でコマンドなどが正常に動作しないこともあるので、Linuxからの見た目上755のような権限に設定できるようにマウントする。
  • オプション指定してmountする
$ sudo umount /mnt/c
$ sudo mount -t drvfs C: /mnt/c -o metadata
 
$ mount
C: on /mnt/c type drvfs (rw,relatime,metadata,case=off)
$ mkdir hoge
$ ls -l
drwxrwxrwx 1 gyamin gyamin 4096 Mar 10 20:06 hoge
  • chmoで権限変更(変更可能になった)
$ chmod -R 755 hoge/
$ ls -l
drwxr-xr-x 1 gyamin gyamin 4096 Mar 10 20:06 hoge
  • ubuntu再起動でもオプション指定したマウントを実施する
  • /etc/wsl.confを作成し、以下を記載する。
$ sudo vim /etc/wsl.conf
 
[automount]
enabled = true
options = "metadata"
mountFsTab = false
 
  • .profileにumaskを設定することでデフォルトを設定可能
$ vim .profile
umask 022
$ source .profile

その他設定

$ mkdir /mnt/c/Users/xxx/develop
$ ln -s /mnt/c/Users/xxx/develop ./
~$ ls -l
total 0
lrwxrwxrwx 1 gyamin gyamin 26 Feb 28 21:19 develop -> /mnt/c/Users/xxx/develop
$ cd develop
$ mkdir repos
.fileのコピー
$ ln -s develop/repos/dotFiles/.bash_profile ./
$ ln -s develop/repos/dotFiles/.gitconfig ./
$ ln -s develop/repos/dotFiles/.gitignore ./
$ ln -s develop/repos/dotFiles/.gvimrc ./
$ ln -s develop/repos/dotFiles/.vimrc ./

Windowsに開発環境を作る 基本方針編

Windowsマシンを開発マシンとして利用するに当たって、どのような環境が欲しいのか、まず考えてみます。
 
必要な開発に関する言語や環境は、Webエンジニアなんで、ざっと以下の通り。
 
言語
 
 
ツールなど
 
エディタ
 
色々ネットを漁ってみたが、以下のような案から選ぶことになると思う。
 
  1. Windowsインストーラでインストール
全部普通にWindowsにインストール。まぁ一番Windowsの基本に沿ったやり方なんだろうが、コマンドベースではなくて、インストーラでインストールすることになる。で、これが嫌だからMac使ってるわけなので、ちょっとWin32ベースで環境作るのは無し。
 
  1. VMとしてLinuxを起動し、必要なソフトウェアをインストール
vmware playerなどを利用して仮想マシンを作成、仮想マシンに開発環境を構築する。Linuxベースなんでまぁこれも選択肢としてはありだが、ただ、Windowsとは別マシンになるので、なんというか、WIndows端末使っている意味があんまり。まぁ各種ツールがあるので、ホストとゲストの連携もある程度はできるんでしょうが。
 
  1. WSLを利用する
これが本命。WSL(Window Subsystem for Linux)でWindowsOSに近いところにLinux(Ubuntu)環境を作る。ちょっとどこまでできるのか?だが、以下のようにできれば。
 
  • プログラム言語はUbuntuにインストール
  • DBサーバとかのミドルウェアはdokerで
  • プログラムのコーディングは、Windows上のIDEやエディタから実施
 
ということで、WSLを使った開発環境を作ってみたいと思う。dockerで作ってもあまり変わらないかもだが。

IntelliJでWSLのrubyをデバッグする

概要

WSLでインストールしたubunturubyをインストールする。
rubyのバージョン管理はrbenvを利用する。

rbenv

  • bash_profile設定
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
  • 必要パッケージ
$ sudo apt install autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm5 libgdbm-dev
  • bash_profile 設定
# rbenv
if [ -e $HOME/.rbenv ]; then
    export PATH="$HOME/.rbenv/bin:$PATH"
fi
 
  • 特定バージョンruby インストール
$ rbenv install 2.6.1
 

InltelliJ 設定

IntelliJRuby開発プロジェクトを設定する。
 
プラグインからRubyをインストール
 
Project設定
プロジェクトにRuby SDKを設定する。
左は新規プロジェクト、右は既存プロジェクト
  • WSL、Ubuntu を選択する。
  • Ruby or …はUbuntuにインストールしたrbenvの利用したいバージョンのrubyを指定する
  • /home/gyamin/.rbenv/versions/2.6.1/bin/ruby
 
Run/Debug設定
IntelliJからプログラム実行やデバッグを行うには、Run/Debugを設定する。SDKとして上記で設定したRubyを指定する。
Debugを開始すると、Debugに必要なGemがインストールされる。
正常にインストールできれば、エディタで設定したブレークポイントデバッグができるようになる。

Windows端末をメインマシンに 動機

WindowsからMacに変えたのが、2014年の初め頃だったので、5年ほどメインのPCとしてMacを使ってきた。
MacUnixライクでWebの開発をするには適した環境ではあるのだが、5年前と何も大きく変わっていないというか、進化がないように思う。ころころ変わらないことは、ある面ではいいのだが。
 
一方で、WindowsWindows8、8.1のゴタゴタがあって、Windows10になって。メインでは使っていないが、どうしてもちゃんとしたExcelを使いたいということで、ParallelsExcel利用のためだけに、細々と使ってきた。
Windowsを起動するたびに、Parallelsがアップデート適用のメッセージを表示して、相変わらずダメなやつ扱いをしていたが、最近のマイクロソフトは何かとアグレッシブな気がする。
 
.NET CoreでLinuxでも.NETが実行できるようになったり、AzureもAWSに負けないくらいに使えるインフラになってきた。
さらにSurfaceSurfaceは、Pro、Laptop、Go、Bookなど種類も増えてきて、かなり魅力的な端末になっている。特にペン入力に対応しているのはMacBookにないアドバンテージだと思う。
MacBookはTouch Barがついたくらいで、昔ながらのノートPCの域を超えていない。Retinaディスプレイインパクトがあったが、それもずいぶん昔、単に高価でカッコいい高性能なノートPCだ。(それでも十分魅力ではあるのだが。)
 
日々の作業をしている中で感じるMacのイマイチなところ。
  • オフィスアプリが致命的に使いづらい(まぁこれはマイクロソフトの問題かもしれないが)
    • エクセルでは、英数入力と日本語入力が切り替わらなかったり、コピペが出来なかったり、日本語入力が追いつかなかったり。
  • 日本語の変換が致命的にダメ。どうして一番の候補が変換して1個上に表示されるのか?
  • 結構OSがフリーズする。
  • フリーソフト的なものが少ない。SCPのソフトとかSQLツールとか。(コマンドでやりますけどね。GUIしかわからない人もいるんですよ。)
  • Macで動かないソフト使う前提の運用。VMWareとかSystemWalkerとか、、Windowsクライアントから操作することを当たり前にしている。(使わないきゃいんですけどね。そういう会社さんまだまだある。)
  • Finderがエクスプローラーに負けているのでは?ディレクトリ内ですぐにファイルが作れないのが、ちょっと。
 
とはいえ、Macbrewで簡単に開発に必要なソフトをインストールでき、Web開発などの環境を整えるのは非常に便利。あと、Windowsに比べれば待たされるアップデートが格段に少ない。
 
Windowsマシンをメインマシンにするには、開発環境をいい感じに構築できるのかに、かかっている気がする。まずはこの辺りを整理していきたいと思う。
 
まずは端末がないと始まらないので(ParallelsのWindows10でも検証はできるのでしょうけどね。)、色々悩んだ末に、Surface Pro6を買いました。TypeCインターフェイスは欲しかったのですが。Pro7出るまではまた1年近くかかると思うので。
ブラックは質感も高くて結構いいです。でもメインマシンのMacBookProと比べると、うーん、Macの方が造りはいいかな。
 
ということで、しばらくWindowsを開発のメインマシンにできるか?色々試していきたいと思います。

スバル純正ドライブレコーダーのマイクロSDカード

スバル純正ドライブレコーダーとマイクロSDカードの相性について

スバル車はアイサイトの誤動作防止の観点から、純正ドライブレコーダーを使うことを推奨されている。場所さえちゃんと考えれば、市販品の後付けでもいいとは思うが。

で、純正品は富士通テン製。おそらくDREC4000に近いものだと思うが、スペックは画像サイズなど違いがあって、スバル車向けの商品になっている模様。付属するマイクロSDカードは8GBのもので、繰り返し録画に強い産業用のSLCタイプのフラッシュメモリーを利用したものらしい。

できれば、もう少し容量が大きい方がいいかな。ということで、アマゾンでクラス10東芝のマイクロSDカードを買ってみたが、走行中にドライブレコーダーから頻繁に「ピーピー」と警告音が鳴り響く。FAT32でフォーマットしたりしたが、結局改善せず。

マイクロSDカードを取り出して、PCで確認すると、いくつか動画が入っていて、全く動いていないわけではなさそう。。。 ってことで、書き込み速度の問題で、動画の圧縮率が高くない状況で書き込みエラーが出ている?と推測。

今度は、もう少しスピードの速いものをということで、SanDiskのものを購入。30分ほど走っただけだが、エラー音は全くなくなった。 エラーの頻度はだいぶ少なくなったが、長時間ドライブしていると、何度かピーピーエラー音が出る。カードを挿し直すと、しばらくは症状が出ないのだが。。。誰か、純正以外で問題がないっていうSDカードあれば教えてください。

エラーが出ないSDカードありました。
Transcend 高耐久 microSDHCカード MLCフラッシュ搭載 (ドライブレコーダー向けメモリ) 16GB Class10 TS16GUSDHC10V
少しだけ、値段高くなりますが、純正品よりは格安。16GBがOKだったので、32GBも購入しようかと思います。

マイクロSDカード

  • エラーが出たもの
メーカー 型番 参考URL
東芝 MSDAR40N16G Amazon
SanDisk SDSQUNC-016G-GN6MA Amazon
  • エラーが出なかったもの
メーカー 型番 参考URL
Transcend TS16GUSDHC10V Amazon

ドライブレコーダーでは基本的に繰り返し動画が録画されるので、耐久性を売りにしたSDカードがいいのだろうが、値段を考えると。純正だと5倍以上は価格差がある。書き換え寿命を迎えたら、新しいカードに交換するって割り切りでいいように思った。

Rails をInnteliJ IDEAでデバッグする

はじめに

Railsアプリケーションを開発にIntelliJ IDEAを利用し、デバッグ実行を行えるようにする。

色々試してみたが… 結論 remote-debug

IntelliJ IDEAにruby sdkを認識させ、gemsetを設定してみるが、うまくデバッグできることもあったが、再現性に乏しい。rbenv + gemsetでデバッグは正式にサポートされていないのか??
結局、リモートデバッグを利用することにした。リモートデバッグといっても、IDEAの設定をリモートデバッグにして、ローカルのターミナルでrailsを起動するので、新しい環境(サーバ)などは不要。

ruby/rails環境

rubyはrbenvを利用し、gemはrbenv gemsetを利用して管理する。

$ rbenv versions
  system
* 2.4.1 (set by /Users/xxxxx/Develop/Repos/gemset_name/src/.ruby-version)
$ rbenv gemset active
gemset_name global

デバッグツール(gem)のインストール

$ rbenv gemset active
gemset_name
$ gem install ruby-debug-ide
$ gem install debase

IDEA側設定

Project Settings > Project

一応SDKを設定する。
Project SDKにrbenv2.4.1 を選択する。

Run/Debug Configurations

+ボタンからruby remote debugを選択し、以下のように設定を行う。

項目 設定
Server Command rdebug-ide –host 0.0.0.0 –port 1234 –dispatcher-port 26162 – $COMMAND$
Remote host localhost
Remote port 1234
Remote root folder railsアプリケーションのルートフォルダ
Local port 26162
Local root folder railsアプリケーションのルートフォルダ

※ 今回はRemote と Localが同じマシンなので、root folderはいずれも同じになる。

デバッグの実行

リモートでrailsを起動

rdebug-ideでホスト、ポートなどを指定して、railsを起動する。

$ rdebug-ide --host 0.0.0.0 --port 1234 --dispatcher-port 26162 -- ./bin/rails server
Fast Debugger (ruby-debug-ide 0.6.0, debase 0.2.1, file filtering is supported) listens on 0.0.0.0:1234

debug実行

リモートでrailsを起動した状態で、IDEAのデバッグを実行する。
デバッグを開始し接続ができると、リモート側のコンソールに以下のようにコンソール出力がされる。

=> Booting Puma
=> Rails 5.1.1 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.9.1 (ruby 2.4.1-p111), codename: Private Caller
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000
Use Ctrl-C to stop

ブレークポイントの設定

あとは通常通りブレークポイントを設定し、ブラウザなどでrailsのページを開くと、ブレークポイントでデバッガが停止する。

LocalDate型の変数をJSPで任意のフォーマットで表示する

サーブレット側で設定した日付(LocalDate)を保持した変数をjspに表示する。
こんな単純なことなのに、案外はまってしまった。

  • コントローラ
@Service
public class TestService {
    public Model getTest( Model model) throws ApplicationException {
        model.addAttribute("today", LocalDate.of(2017, 5, 1));
            return model;
    }
}
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
...
<fmt:parseDate value="${today}" pattern="yyyy-MM-dd" var="parsedToday" type="date" />
<fmt:formatDate value="${parsedToday}" var="newParsedToday" type="date" pattern="yyyy/MM/dd" />
<p>${newParsedToday}</p>

parseDateを利用して一度、var=“parsedToday” とした後、 formatDateを利用し、表示したい形式にする。