TactOSというディストリビューションを作りました.

## 何?
Gentooをクラウドでコンパイルするディストリビューション/Gentoo as a Serviceです.
読み方はタクトオーエスもしくはタクトスも可.

http://tactos.net
![20171220-012017.png](https://qiita-image-store.s3.amazonaws.com/0/136515/89239841-0282-0c70-f82c-434a01daba26.png)

## モチベーション
* Gentooを勧めると何故かArchを使い始めてしまう人がいる.(バグ)
* CPUの弱いマシン,コンテナ等でGentooを手軽に使いたい.  
->
ならGentooをサービス化して手軽さを発生させよう!

## 何が出来る? / 何が新しい?
* USEフラグ(上にある赤や青の奴)によるカスタマイズ機能を非力なマシンでコンパイルなしに使える.
* 利用者の多いパッケージはビルドなしでemergeできる.
* ccacheにより高速でemergeできる.
* distfilesを共有するので回線の無駄が減る.
* 動的にパッケージを生成するディストリビューションである.  
聞いたことがないので知っている方がいたら教えてください.

## デメリット
* コンパイル出来ない.  
  Gentooのコアユーザーのメイン使用では需要がない.  
  ArchユーザーはTactOSで気軽にGentooを使えるようになる需要があるのでは?
* それでも普通のディストリビューションと比べると待ち時間がある.  
  静的ディストリビューションに比べるとしかたないが恩恵のほうが大きいはず.
* CPUレベルの最適化度は下がる.  
  出来ないわけではないが, キャッシュが効きにくくなってしまうので,  
  需要があれば有料でサポートする予定.


## 使い方

いまのところGentoo Linux amd64からしか使えません.

### 1. まずGentooをインストールします

https://wiki.gentoo.org/wiki/Handbook:AMD64/ja
emergeが出てくるまで進めましょう.
最初はGentooのdockerコンテナで試してみるといいと思います.
その場合上のハンドブックは見る必要がありません.
gentooのコンテナを走らせる

```
# docker pull gentoo/stage3-amd64
# docker run -it gentoo/stage3-amd64
```

次にリポジトリを同期するためにコンテナ上でemerge-webrsyncをする必要があります.
docker runして続けてこのコマンドを打てばオッケーです.

```
# emerge-webrsync
```

### 2. tactコマンドの依存パッケージのインストール

tactコマンドはTactOSでのapt-getやyumに相当します.
emregeはGentooでのapt-getやyumに相当します.
curl, gentoolkit(equery)のパッケージをemergeでインストールします.

```
# emerge net-misc/curl app-portage/gentoolkit
```

### 3. tactコマンドのインストール

以下のようにgit cloneするかgithubのrawをwgetしましょう.

git clone方式

```
$ git clone https://github.com/tactos/tact
$ cd tact
# ./tact <好きなパッケージ名>
```

wget方式

```
$ wget https://raw.githubusercontent.com/TactOS/tact/master/tact
# ./tact <好きなパッケージ名>
```

でtactコマンドによりTactOSのパッケージをインストールできるようになりました.

### zshをインストールする例

```
root@7cb41ba20159:/root # ./tact zsh

These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild  N     ] app-shells/zsh-5.3.1::gentoo  USE="gdbm pcre unicode -caps -debug -doc -examples -maildir -static" 0 KiB

Total: 1 package (1 new), Size of downloads: 0 KiB

app-shells/zsh-5.3.1
http://10.10.10.3/api/1/atoms/gentoo/app-shells/zsh/5.3.1/builds/585b3953623f01f420293452e1aa5ab35f0cb2b5b51522ba899250ef1bb62ff3

Wait for app-shells/zsh-5.3.1.tbz2
http://10.10.10.3/api/1/atoms/gentoo/app-shells/zsh/5.3.1/builds/585b3953623f01f420293452e1aa5ab35f0cb2b5b51522ba899250ef1bb62ff3

Build success! (1 of 1)
Download success!

These are the packages that would be merged, in order:

Calculating dependencies... done!
[binary  N     ] app-shells/zsh-5.3.1::gentoo  USE="gdbm pcre unicode -caps -debug -doc -examples -maildir -static" 0 KiB

Total: 1 package (1 new, 1 binary), Size of downloads: 0 KiB

Would you like to merge these packages? [Yes/No]
y

>>> Emerging binary (1 of 1) app-shells/zsh-5.3.1::gentoo
 * zsh-5.3.1.tbz2 size ;-) ...                                           [ ok ]
>>> Extracting info
>>> Extracting app-shells/zsh-5.3.1

>>> Installing (1 of 1) app-shells/zsh-5.3.1::gentoo
 * checking 1264 files for package collisions
264 files remaining ...
>>> Merging app-shells/zsh-5.3.1 to /
```

ビルドはwebからも確認できます.
![20171220-010438.png](https://qiita-image-store.s3.amazonaws.com/0/136515/f0237f49-e62f-0186-fd22-b3beea37346b.png)

## 実装
### gentoo-build-server(API サーバー)
Rust+rustless+mongodb+Docker
rustlessでAPIサーバーを構築しました.
APIサーバーからパッケージ名やUSEフラグをdocker runに渡してemergeを行い,
quickpkgしてVolumeにコピーという流れでビルドしています.
mongodbはbuild情報の記録に使っています.

### tactos-front(フロントエンド)
React+Redux+Material-UI+parcel
で構築しました.
最低限の機能しか実装してないので, 今後がんばりを発生させたいところ.

### tact(CLIクライアント)
bash+curlで出来てます.
マルチアーキテクチャを手軽にやるためとりあえずbashを採用.
もっと対話的かつグラフィカルにしたいと思います.


## 今後実装予定の機能
### コンパイラーの指定やコンパイラーのバージョンの指定
libcやarmなどchostも指定できるようにしたい.

### パッケージが依存しているパッケージのバージョンを指定できない
ローカルのパッケージマスクでhtopがncurses-5.9に依存しているが, リモートではncurses-6.0でビルドしてしまうなどの問題がある.
とりあえず1層目の依存関係をつけて, 暗黙的依存関係をどうにかすればどうにかなるはず...?

### ローカルインストール(Zero Install的な)
rootがないUbuntuなどにローカルインストールできるようにする.
これを行うために依存関係解決用のAPIサーバーを構築しようと考えています.
それに伴いホスト環境にebuildリポジトリ(だいたい1GBぐらい)を用意する必要が無くなります.
またworldのパッケージ増加に伴い依存関係の解決に時間がかかる問題を解決できます.

### ファイルやコマンドの検索機能
パッケージのファイル一覧を副産物として得られるので利用していきたいところ.

### フロントエンドからのパッケージのビルド
いざという時にあれば嬉しい.

### kubernetesによってコンパイルサーバーを増やせるようにします.
今後の利用者増加によっては必要だと考えています.

## おわりに
今の所, 利用者が少ないので実質焼き放題です!
あと就職先探してます!

# あなたとTactOS, 今すぐコンパイル!!

http://tactos.net