Ballerinaとお付き合いをはじめたので軽く紹介してみる

この記事は[パーソルキャリア Advent Calendar](https://qiita.com/advent-calendar/2018/pca) 2018の1日目です。

# ballerinaとは

誤： こちらではありません
![ballerina.png](https://www.vogue.co.jp/uploads/media/2015/05/12/aflo_OWDE717800-2.jpg)

正： プログラミング言語です
![ballerina-logo.png](https://qiita-image-store.s3.amazonaws.com/0/9094/a386c297-988f-0900-cfaf-60d80dbaf476.png)

Ballerinaは `Cloud Native Programming Language` を謳い文句にした、ウェブサービスを作るためのプログラミング言語です。

> Ballerina is a simple programming language whose syntax and platform address the hard problems of integration. It is a general purpose, concurrent, transactional, statically and strongly typed programming language with both textual and graphical syntaxes. Its specialization is integration - it brings fundamental concepts, ideas and tools of distributed system integration into the language and offers a type safe, concurrent environment to implement such applications. These include distributed transactions, reliable messaging, stream processing, workflows and container management platforms.

簡単に言うと
> みんながWebアプリケーションを作るときに使っているstreamingとかContainerとかそういうものを詰め合わせて簡単に作れるようにしたよ

っていうこと

# ballerinaでできること / できないこと

## できること

- 簡単にAPIが実装できる
- すぐにgRPCの実装ができる
  - gRPCが標準パッケージ化されている 
- 外部ツール無しでswaggerのドキュメントをImport/Exportできる
  - 標準機能です 
- 外部ツール無しでAPIドキュメントできる
  - 標準機能です
- ソースコードをいじらずにプログラミングできる
  - このあとで説明しますが、IDEを使うとビジュアルプログラミング的なことができる
- 外部ツール無しでテストできる
  - ここらへんはGoなど最近の言語と同じでテストツールが同梱されているので、Ballerina単体でテストが可能です 

## できないこと

- ローカルで実行するコマンドラインツールなどの開発
  - Cloud上でAPIでリクエストされて動くもの作成することを想定しているため
- APIハンドラのファイル分割
  - 1ファイルを読み込んで、`run`したり、`build`したりすることが想定されているようなので、出来なさそうです。
  - もちろん共通処理をライブラリ化して、読み込むということはできます

# おすすめ機能: ダイアログ

IDE（`VSCode`もしくは`IntelliJ IDEA`）を使うと、公式プラグインで、IDE上に処理のダイアログ図を表示することができます。
このダイアログの面白いところは、コードを修正するとリアルタイムにダイアグラムに反映されるだけでなく、ダイアログを修正することでコードもリアルタイムに修正されます。

たとえば、ダイアログの面白い使い方として、考えられるのは、
アジャイルのスプリントレビューなどで、プログラマじゃない人たちにプログラムを見せて、処理上問題がないか判断してもらうことは困難だと思います。
ですが、ballerinaはダイアログでグラフィカルに表示されるので、それを見せながら説明することで、ビジネスロジックに問題がないかを確認することは、今までよりも用意になるのではないでしょうか？
さらに、簡単な修正であれば、ダイアログを少しいじるだけで修正できるので、その場で直して再度確認ということもできます。

作った機能は、`ballerina run xxx.bal(作ったファイル)` で実行することでサーバが立ち上がりすぐに確認することもできます。

<img width="1360" alt="diagram.png" src="https://qiita-image-store.s3.amazonaws.com/0/9094/afe65353-746e-36bf-3797-3c5122143090.png">

# インストール
現在、安定版（`0.983.0`）をMacにインストールするといろいろ正常に動かなかったりするようなので、通常のインストールとバージョン指定でインストールする方法を記載します

## 通常の手順
Homebrewもあるのですが、インストール時にうごくshellがHomebrewの不具合で正確に動かないものがあるらしいので、おすすめしません。
https://github.com/ballerina-platform/ballerina-lang/issues/12099

1. 公式サイト( https://ballerina.io/downloads/ )にアクセスして、インストーラをダウンロードします。
2. ダウンロードしたインストーラを実行します
3. `ballerina version` で正常にバージョンが表示されたら完了です
4. 以降VSCodeの設定です
    1. VSCodeを開きます
    2. 拡張機能で、`ballerina`を検索すると公式のプラグインが検索できるので、それをインストールします
    3. VSCode再読込するように言われるので、再読込します
    4. VSCodeで`基本設定 > 設定 > 拡張機能`でballerinaの設定を確認します
    5. `ballerina.home`が設定されていなかったら設定してください

```ballerina.home
/Library/Ballerina/ballerina-(インストールしたバージョン)
```

## 安定版に異常があるとき
バージョン指定して、インストールする場合の手順になります。

1. 公式サイト( https://ballerina.io/downloads/archived/ )にアクセスして、過去バージョンのインストーラをダウンロードします。
2. ダウンロードしたインストーラを実行します
3. `ballerina version` で正常にバージョンが表示されたら完了です
4. 以降VSCodeの設定です
    1. 公式サイト( https://ballerina.io/downloads/archived/ )にアクセスして、先程インストールしたバージョンと同じバージョンのVSCodeプラグイン( `ballerina-vscode-plugin-(インストールしたバージョン).vsix` )をダウンロードします
    2. ダウンロードしたvsixをインストールします
    3. VSCodeを開きます
    3. VSCode再読込するように言われるので、再読込します
    4. VSCodeで`基本設定 > 設定 > 拡張機能`でballerinaの設定を確認します
    5. `ballerina.home`が設定されていなかったら設定してください

```bash:vsixのインストール
code --install-extension ~/Downloads/ballerina-vscode-plugin-(インストールしたバージョン).vsix
```

VSCodeで意図的に古いバージョンのvsixを入れると、VSCode開いたあとで勝手にバージョンあげようとするんだけど、これはバグではないのかな、マイクロソフトさん？

```ballerina.home
/Library/Ballerina/ballerina-(インストールしたバージョン)
```

# Appendix
Qiitaで一部意訳してる記事を見つけたので、記載しておきます
https://qiita.com/shinshin86/items/e4361ff08737cac9533d