「かごもく #40 開発環境の紹介」に参加した

# 概要

[かごもく #40 開発環境の紹介](https://kagoben.connpass.com/event/200585/)に参加したので内容をまとめます。

補足等は個人的な背景により勘違いしている可能性があります。
遠慮なくご指摘いただけると助かります。
※日頃はVisual StudioでのWindowsアプリ開発、VSCodeでPython開発。WebはWeb API（.NET、Python）、ASP.NET WebForms程度

# 1. JetBrains

JetBrains社が作成したいろいろな言語用の開発環境

https://www.jetbrains.com/ja-jp/

## 1.1. 様々な開発言語に対応

Python、PHP、C＃など[様々な言語用の開発環境（IDE）](https://www.jetbrains.com/ja-jp/products/#type=ide)がそろっている。

> C/C++、C#、Dart、F#、Go、Groovy、HTML、Java、JavaScript, TypeScript、Kotlin、Objective-C、PHP、Python、R、Ruby、Rust、Scala、SQL、Swift、VB.NET

引用元：https://www.jetbrains.com/ja-jp/products/#type=ide

## 1.2. 環境構築が楽

Visual Studio Codeも拡張機能追加で同じことはできるが、インストールした時点である程度の機能がそろっているのが利点。
追加でないと困るので追加で入れないと、いうプラグインは、[.ignoreプラグイン](https://plugins.jetbrains.com/plugin/7495--ignore)（除外ファイルを指定する、Gitであれば`.gitignore`、Dockerなら`.dockerignore`）

## 1.3. 設定の同期

プラグインの設定などを別の環境（パソコン）間で同期することができる

https://pleiades.io/help/idea/sharing-your-ide-settings.html

## 1.4. 料金

https://www.jetbrains.com/ja-jp/store/#commercial?billing=yearly

サブスクリプション制で更新年数に応じて安くなる。

また侍割という紹介プログラムで割引を受けることができる。

> ご紹介により、新規のお客様も既存のお客様も割引をご提供する、いわゆるアフィリエイトの仕組みです。
> 新規のお客様は製品により1ライセンスあたり200円〜1,000円割引となります。
> 既存のお客様はご紹介いただいたライセンス1本あたり150円、次回更新またはライセンス追加時に割引となります。(割引可能額が購入金額を超える場合は切り捨てとなります。)

https://samuraism.com/referral-program

法人で（会社員として）使う場合は注意が必要。簡単に言うと、会社の経費で買うならば、個人ライセンス（安い）は使用できない（ライセンス違反となる）。

> 個人ライセンスについて補足すると、こちらにあるように個人ライセンスであっても業務利用は可能です。したがって、「プロとして自分が使うツールは自腹を切って準備する」や「諸般の事情から会社ではJetBrainsのライセンスを買ってもらえないので自腹を切らざるを得ない」という方、個人事業主（フリーランス）の方が個人ライセンスを業務利用することは全く問題ありません。
> 一方で、「会社の経費で買うんだけど、安いから個人ライセンス」という選択はライセンス規約違反となりますのでご注意ください。また時折、個人ライセンスをご利用のお客様から「会社で経費精算したいので、Invoiceの宛先を法人にして欲しい」というご要望をご連絡頂くことがあるのですが、当然ながら出来かねます。

https://blog.jetbrains.com/ja/2019/02/25/1731/

## 1.5. ライブテンプレート機能

コードの部品をテンプレートとして登録し呼び出すことができる。プロジェクト単位で登録しチームで共有することができる。

https://pleiades.io/help/idea/using-live-templates.html

💡 Visual Studio、VSCodeでも同様な機能としてスニペットがある。VSCodeではJetBrainsと同様にプロジェクト単位での共有が可能
　・[Visual Studio](https://docs.microsoft.com/ja-jp/visualstudio/ide/code-snippets?view=vs-2019)
　・[VSCode](https://code.visualstudio.com/docs/editor/userdefinedsnippets)
　
## 1.6. Diff時のコード補完

Diffツールでコード補完が効くのが良い

💡 Visual Studio、VSCodeでも標準の差分ツールであれば同様の操作が可能

## 1.7. Gitツール

標準でついているGitツールが高機能

https://pleiades.io/help/idea/using-git-integration.html

💡 Visual Studioは[機能強化中](https://docs.microsoft.com/ja-jp/visualstudio/ide/git-with-visual-studio?view=vs-2019)
💡 VSCodeは拡張機能の追加前提（[GitLens](https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens)）

## 1.8. リファクタリングなどのエンジン

VSCodeなどはリファクタリングやコードの静的解析（リンター）に使用する機能は各言語標準のものを使用している。

しかし、JetBrainsのIDEは独自で開発を行っているため、リファクタリングなどの際に他のIDEなどにないものを実現できる。

### 1.8.1. 使用箇所からコードを生成する 

特に便利なのは「使用箇所からコードを生成する」機能。

💡 Visaul Studio 2019には存在する（C#で確認。Visual Basicでは未確認）

> JetBrains Rider を使用すると、宣言する前にコードシンボル（クラス、メソッド、変数、プロパティ、フィールドなど）を使用できます。JetBrains Rider は、宣言されていないシンボルを検出すると、使用箇所に基づいて宣言を生成するための 1 つ以上のクイックフィックス Alt+Enter を提案し、使用箇所のコンテキストに従って宣言をスマートに調整します。

https://pleiades.io/help/rider/Code_Generation__Generating_Code_from_Usage.html

通常は定義を作成してから、作成した定義を利用するコードを書くことが多いと思う。
しかし、実際には使用しないプロパティを作成する、戻り値の型が不適切、切り出し単位が不適切、実装忘れなどの問題が出てくる。

**通常**

1. 定義を作成

    ```cs
    private byte GetNextByte(byte min, byte max)
    {
    }
    ```

2. 使用部分を記載

    ```cs
    private void ReadData()
    {
        ～
        return GetNextByte(min, max);
    }
    ```

3. 実装する

**「使用箇所からコードを生成する」を使用**

「使用箇所からコードを生成する」を使用すると、定義を考えながら利用するコードを書いていくことができる。

1. 使用部分を記載

    ```cs
    private void ReadData()
    {
        ～
        return GetNextByte(min, max);
    }
    ```

2. 「クイックフィックス Alt+Enter 」を**選択するのみ**で関数を**自動作成**（型、未実装例外なども自動で生成）。

    ```cs
    private byte GetNextByte(byte min, byte max)
    {
        throw ne NotImplementedExceptionl();
    }
    ```

3. 実装する

先に挙げた問題点の解決に加え、考えることを少なくできるので開発速度の向上につなげていくことができる。また、最終的に作成されたクラス、ファイルをなどを別のファイルに切り出すことも簡単なので、作成時に見通しよく開発することができる。

## 1.9. 操作が共通

リファクタリングの支援機能などのメニュー、ショートカットが共通。これは今まで触ってこなかった言語を使用するときに迷わなくて済む。

💡 これはVSCodeでも同様。.NET開発メインであればVisual Stuioがよいと思うが、様々な言語で開発する環境であれば学習コストが低いことは利点と思われる。

## 1.10. 自動支援

言語ごとに基本的に必要な設定を進めてくるので、不慣れ言語で開発しなければいけない時にも問題が起こりにくい。

## 1.11. 公式マニュアル

日本語版の公式マニュアルがある。
https://pleiades.io/


# 2. DBeaver（でぃーびぃーばー）

https://dbeaver.io/

基本的には無料。無料プランの中で有名なデータベース（SQL Server、Oracle、PostgreSQLなど）に対応している。

Windows版はインストーラ版、zip版、Microsoft Storeにも対応している。Javaで動作する（実行するにはJREが必要）。

構造から推測したER図表示、テーブル定義変更、表示した値からの簡単なフィルター機能などがあり、データベースを扱う上で**かなり便利**であり、**フリー版でもほしいと思う機能は大体入っている**。

💡 構造から推測したER図を表示する機能はかなり速度が速いようです。
💡 個人的にはクイックフィルター機能が便利と感じました。指定したセルと同一値以外（大小）での抽出や、指定した条件のセルを強調表示する機能などが何かあった時の調査時にかなり便利と思います。

　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/1ee5f240-5528-fa24-d730-04e7570f55ff.png)
　引用元：https://dbeaver.io/

💡 無償版と有償版の比較表

　https://dbeaver.io/download/

　有償版にある主な機能：
　・NoSQL データベースのサポート
　・Oracle、SQL Serverなどのための高度な拡張機能
　・AWS IAM、Kerberos、Active Directory認証のサポート
　・高度なセキュリティ
　・BigData/Cloudデータベース対応
　・オフライン/限定されたインターネットアクセス環境対応（インストーラーへのJDBCドライバー同梱）
　・追加のEEプラグイン（Visual SQL クエリビルダ、高度なスキーマ比較/移行ツール、統合されたGit（スクリプトや設定のバージョン管理）など多数）


# 3. A5:SQL Mk-2

> A5:SQL Mk-2は複雑化するデータベース開発を支援するために開発されたフリーのSQL開発ツールです。
> 高機能かつ軽量で、使い方が分かりやすいことを目標に開発されています。
> SQLを実行したり、テーブルを編集するほかに、SQLの実行計画を取得したり、ER図を作成したりすることが出来ます。

引用元：https://a5m2.mmatsubara.com/

💡 勉強会の中ではあまり説明できませんでしたが、記載します。

実際に使用する中で便利に使用している機能について紹介しておきます。

- [SQL入力支援機能](https://a5m2.mmatsubara.com/help/SQLEditor/)
    - ER図で列の論理名や説明の記載も表示できる。
- [SQL整形機能](https://a5m2.mmatsubara.com/help/SQLEditor/formatSql.html)
    - 複雑な長大なSQLでも見やすく強力に整形（そもそも複雑にならないことが大事とは思いますが…）。
- [ER図を作成する機能](https://a5m2.mmatsubara.com/help/ER/)
    - ER図をメインとした開発を行える。
    - エンティティ背景色変更（視覚的にエンティティの種別を分類）、付箋機能。
    - データベースからリバース生成。
    - ER図からExcelで定義書出力できるため、Excel形式での納品を求められる場合もER図をメインとした開発を行える。
- [SQLを２度実行しその結果を比較](https://a5m2.mmatsubara.com/help/SQLEditor/compareSql.html)
    - テストコードがない箇所のテストを行う際に、処理の前後で変更された箇所（データ、行）を表示し、そのまま検証結果として残すことができる（Excel形式等）。
         ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/2643c2f0-79af-8d4d-9a0c-b8c7992fd408.png)
         引用元：https://a5m2.mmatsubara.com/help/SQLEditor/compareSql.html
- [スキーマの比較](https://a5m2.mmatsubara.com/help/DBTree/compareSchema.html)

# 4. Vim（ヴィム）

Linux等で使えるvi から派生し発展した高機能なテキストエディタ。覚えておくと色々なところで使える。

キーボードのみで**効率的に操作を行う**ことができる。

例えば。。。

- テキストオブジェクトの選択がキーバインドのみで簡単にできる

    - https://qiita.com/kasei-san/items/143af11bb2559cf0e540

        > vi" で、 カーソル上の " で囲まれている文字列の内部を、ビジュアルモードで選択 という意味になる 

- 矩形ビジュアルモードがキーバインドのみでできる

    - https://qiita.com/mekagazira/items/e5c415632362b3b72f33

- `f`でインクリメンタル検索モードに入る

- `zf`で表示されている行の指定行を簡単に隠せる

    - https://vim.blue/vim-fold-create-remove/

- `w`で単語単位選択

- `h`,`j`,`k`,`l`でカーソル移動

    - [Google Chromeも対応している](https://qiita.com/TakahiRoyte/items/fb62c164e340173d60f8)

- オプション「-p」でファイルをタブモードで開いて、`gt` でタブ移動

    - http://atomiyama.com/linux/page/vim-tab-sousa/

キー操作一覧：https://www.ne.jp/asahi/hishidama/home/tech/unix/vi.html

💡 なれてしまえば、かなり効率的に編集を行うことができると感じました。Linuxに入っていることも多いため共通の操作として慣れておくと良さそうです。
💡 [VSCodeのキーバインドを変更するための拡張機能](https://qiita.com/jintz/items/d357478271179c90ffab)もあるようです。

# 5. JupyterLab

https://github.com/jupyterlab/jupyterlab

python環境が存在するならば簡単にインストール可能。

Pythonで**機械学習の開発**を行うときに便利！

例えば。。。

- フォルダ管理や実行中のnotebookの管理などが左側のウインドウで表示できるようになった（Jupyter Notebooksではブラウザの別ページ）。

- ファイル一覧CSVを選択しただけで表示してくれる。

- 補完機能がある。

- グラフ表示をインラインで行うことができる。

    - 学習の結果どうなったか？ということをわかりやすく人に（上司など）説明することが大事だが、そのための資料を作りやすい

- マークダウンとコードを混ぜて記載でき、拡張機能「[jupyterlab-toc](https://github.com/jupyterlab/jupyterlab-toc)」を利用するとコードに目次を付けることができる。

    ipynbファイルでデータ分析していく時はその中で完結するようにコードを記載していくことも多いためコードが長くなることはよくある。このプラグインを入れておくと、左側の目次からジャンプできる。非常に便利なのでお勧め。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/5b00842e-3e6e-ee2d-763e-ce0673787a36.png)
    引用元：https://github.com/jupyterlab/jupyterlab-toc

💡　日本語での紹介記事。[JupyterLabのすゝめ - Qiita](https://qiita.com/kirikei/items/a1639954ce5ccaf7ac3c)

# 6. VSCode（Python）

[発表資料](https://qiita.com/tfukumori/items/9f895f51baeaf31cb971)

インタラクティブウインドウ (`# %%`)機能が便利。

厳密な自動整形はチーム開発を行う上では重要だし、Pythonの実装上の不具合（定義間を２行開ける必要がある）を避けるためにもよい。

フレームワークの例外は通常の設定ではブレークされないが、例外の種類を指定することでブレークできる（はず）。この解決方法としては、[pdbというデバッガーを利用する方法](https://qiita.com/Kobayashi2019/items/98e74110d74e4c60f617)もある。

# 7. Emacs

Emacsは環境。

エディターはあくまでEmacs Lisp上に構築された環境であり、Mail、Twitterなどを行うこともできる。
https://emacs-jp.github.io/tips/emacs-in-2020

昔は端末で使われていたのでエディターはラインエディターとなる。

MailではHTMLメールなどの表示も可能で。Twitterも文字での表示でシンプルに見ることができる。エディターと統一した操作で操作できるのが効率的でやりやすい。

**画像例**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/0ae43008-1304-3f09-2a4b-b3ceb61d7ced.png)
引用元：http://mihai.bazon.net/articles/emacs/wanderlust-email-client

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/6ff5f0f5-54e2-aa2a-e160-6cc936908001.png)
引用元：https://gihyo.jp/admin/serial/01/ubuntu-recipe/0187

# 8. Krypton

https://krypt.co/

秘密鍵を**スマホに保管**することでセキュリティを高めることができる。

つまり、自分で立てたサーバーにSSHクライアントで接続時に**スマホで認証しないと使用できない**ように設定することができる。

**手順**

1. スマホのアプリを立ち上げる
2. krをインストールしたクライアントで`kr pair`を実行
3. 表示されたQRコードをアプリで読み込み許可する
4. クライアントに接続時に、スマホで認証確認が来るので許可方法（一度だけ、3時間だけなど）を選択する

公式ドキュメント：https://krypt.co/docs/start/installation.html

# 9. byobu

https://github.com/dustinkirkland/byobu
https://ja.wikipedia.org/wiki/Byobu

byobuを使うと、**同じターミナルの中でウインドウ分割を行う**ことができる。
ターミナルクライアントがタブ対応に対応していないなどクライアントの条件が異なっても、同じ操作でタブ表示・ウインドウ分割を行うことができる。

最近であれば、Ubuntuには標準で入っている

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/da332e9e-5705-e43b-8ae2-9f6110d17597.png)

引用元：https://www.byobu.org/

例えば。。。

- セッションの前の状態を覚えている
- 設定をほとんどしなくてよい
- 別々のターミナルでWindowsの同期表示
    - 例えば**物理的に遠い拠点でペアプログラミング**などへの活用が考えられる。
- バックグラウンドは[GNU Screen](https://ja.wikipedia.org/wiki/GNU_Screen)と[tmux](https://ja.wikipedia.org/wiki/Tmux)

💡 Windows Terminalでもタブ表示、ウインドウ分割は可能ですが、常にリッチなターミナルを使えるとは限らないので、慣れておくことで作業が楽になると感じました。
💡 WSL2(Ubuntu 20.04)で、`byobu`で実行できることを確認しました。
💡 Tips: https://www.byobu.org/
　・`F1`でヘルプ呼び出し

# 11. その他

## 11.1 バージョン管理システム（TFVC、Subversion、Git）

バージョン管理（構成管理）には中央集権型（TFVC、Subversion）と分散型（Git）がある。

参考：https://www.atmarkit.co.jp/ait/articles/1504/17/news023.html

どちらにも利点があり、どちらが優位というものではないが、最近の開発ではGitをベースとしたツール構成となっている。新規プロジェクトでは基本的にはGitを選択したほうが良い。

例えば、Azure DevOps (Server）でも新規プロジェクト作成時はGitが既定値となっている。

### 管理サーバーとバージョン管理システムの選択

💡 仕事で行う場合の個人的な考えを記載します（あくまで私見です）。

**管理サーバーの選択**

|開発形態|環境|管理サーバー|備考|
|---|---|---|---|---|
|外部組織と開発、<br>またはオンプレでサーバーを持ちたくない|クラウド|[GitHub](https://github.co.jp/)、[GitLab](https://www.gitlab.jp/pricing/#gitlab-com)、[Azure DevOps](https://azure.microsoft.com/ja-jp/services/devops/)など|・リスクアセスメントとして、権限管理、ログ収集、教育、定期的バックアップ、Single Sign-On (SSO)など。<br/>・GitHubなら有償契約を想定する。
|社内で開発、<br>または規約等でクラウドにデータを置けない|オンプレミス|[Azure DevOps Server](https://azure.microsoft.com/ja-jp/services/devops/server/)、[GitLab](https://www.gitlab.jp/pricing/#self-managed)、[GitBucket](https://github.com/gitbucket/gitbucket)|・権限管理にはAcitive Directoryが利用できる<br>・外部向けにAzure DevOps ServerやGitlabなどを公開する場合は、インフラ面の費用などが増加する<br>・Azure DevOps Serverについて、Visual Stuio サブスクリプション（旧 MSDN サブスクリプション）に[1つのサーバー ライセンスとユーザーCALが含まれている。](https://azure.microsoft.com/ja-jp/pricing/details/devops/server/)|

💡 Azure DevOps (Server）、GitHub、そしてGitLabともに、Issueベースの開発、プルリクエスト、CI/CDを行うことができます。プランにより可能なオプションは異なってきます。
💡 Azure DevOps (Server）はTFVC、Gitに対応しています。ただしTFVCの機能強化はストップしています。
💡 Azure DevOps Serverは、Azure DevOps（クラウド）のオンプレ版。旧名はTeam Foundation Server（略称TFS）。

💡 参考：
GitHubのSAML single sign-on (SSO)機能：https://techblog.zozo.com/entry/github_sso
Azure DevOps (Server)に関するセキュリティ情報：https://www.slideshare.net/kkamegawa/azure-devops-127875796
クラウドとオンプレミス：https://www.kagoya.jp/howto/rentalserver/on-premises/

**バージョン管理システムの選択**

|開発状況|バージョン管理システム|タイプ|管理サーバー|
|---|---|---|---|
|新規プロジェクト。<br>外に実装等を多く出している現場<br>開発の頻度が頻繁、またはリリースするバージョンが多岐にわたる|Git|リポジトリ分散型|Azure DevOps (Server）、GitHub、GitLabなど|
|基本的には**既存プロジェクトで選択**する。<br>少数の開発担当者（実装者）で開発する現場。<br>リリースするバージョンが多岐にわたらない。同時に編集できることがリスクとなる場合|TFVC、SubVersion|リポジトリ中央集権型|TFVC:<br>Azure DevOps (Server）、<br>Subversion:<br>SVNサーバー|

💡 参考：

https://www.remember-the-time.xyz/2015/01/git-tfs.html

> 結論
> TFS は Microsoft らしい合理的なバージョン管理システム。
> マスターのソースコードを美しく保守したいなら Git。
> といった印象。最終的には好みでいいのだろう。
> しかし、Git を使いこなすためには、Git マスターが必要だと思うし、教育とルールづくりをメンバーで守れる現場でないと、競合が出た時にかかるコスト（マージのコスト）が大きすぎる。ルール無視で使うと、ソースの消失やマージミスが多発する（多発した）。

## 11.2. Dockerのスケール

スケーリング（スケールの変更）をKubernetes + Dockerで行うよりは、Functions（Azure Functionsなど）を活用するほうが良いのではないか。

💡 Docker：https://docs.docker.jp/engine/docker-overview.html
💡 Azure Functions：https://blog.shibayan.jp/entry/20200921/1600695684

## 11.3. Gitのコマンドが変わった

`git checkout`の代替としてリリースされた `git switch` と `git restore`がリリースされた。
これは、できることが大きくなったcheckoutから機能を切り出すことで、使いやすくすることが目的。

> 2019年8月にリリースされた Git 2.23 から，Experimental（実験的機能）として新コマンド git switch と git restore が使える．今までずっと使ってきた git checkout は機能が多すぎたため，機能を分割し git checkout の代替としてリリースされた。

https://kakakakakku.hatenablog.com/entry/2020/04/08/151627

> ブランチの変更は git switch
> ファイルの変更は git restore
> 今まで通り git checkout は使える
> 新機能は「実験的機能」なので今後変更の可能性あり

https://qiita.com/yukibear/items/4f88a5c0e4b1801ee952

コマンドでgitを利用しているならば、変更されたことを覚えておいたほうが良い。

💡 個人的には`git checkout`という名称からブランチ切替は連想しにくく人への説明が難しかった点も含めて、合理的な変更と感じました。

## 11.4. Gitでの履歴改ざん

ブランチの中でCommitした履歴の中で誤字に気づいた場合など、そのためだけにCommitを作成するのも問題となる場合がある。

💡 納品するためにクリーンな履歴を残したい場合など

GitでRebaseを行うことで該当のコミットを修正した上で付け替えることができる。

この場合の操作は、コマンドから行う必要がある。

## 11.5. PowerShell

PowerShellはサブコマンド方式になっていないため、必要なコマンドを絞り込みにくい。

💡 サブコマンドとは `git fetch --prune`や`netsh winhttp import`など範囲を絞り込んでから（名詞）、実行したいこと（動詞）を書く方法

PowerShellで例えばGetで候補を表示しようとすると以下のような表示が出るが、この中から絞り込むのは厳しいところがある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/f823cc7a-3e18-e9d6-a54a-4a080c73bb95.png)

対策として、部分一致で使用するモジュールを絞り込む方法がある。

### 使用するモジュールを絞り込む方法

例：`user`が含まれるコマンドを絞り込みたい場合

**フィルター機能を利用**

```powershell
Get-Command *user*
```
**「Where-Object」コマンドを使用**

```powershell
Get-Command | Where-Object{$_.Name.ToString() -Like "*user*" }
```

**「Where」メソッドを使用**

```powershell
(Get-Command).Where{ $_.Name.ToString() -Like "*user*" }
```

引用元：https://xtech.nikkei.com/it/atcl/column/16/122000308/091300012/

## 11.6. テスト

管理サーバーに保存した段階で即テストするということができる。
テストコードを細かく作成したほうが結局は効率的という場合もある。