Alpine

# はじめに
登頂は無理だけど, 3合目まで頑張るぞい.
3合目は, 最低限のソフトウェアをインストールして, 最低限のセキュリティ確保して,
DockerでTensorflowを動かせるようにすること. DockerやTensorflowの勉強も含みです.
0.5合目くらいのような気もしますが.
HHKB Type-S新型やべーな, 会社のも新型にしたいな, 金ないけど.
全部Alpineのリファレンスに書いてあるぞ. 典型的なQiitaクソ記事だね.
Qiitaが検索に上がるの, 本当にやめてほしい.
この記事はインストールと設定しか書いていないため, 運営により削除されるはずです.
そうでなければおかしい.

[Speed Running Windows 95](https://hackaday.com/2019/03/09/speedrunning-windows-95/)みたいな. チャート作らなきゃ.

# インストロール
ムーミンはトロールだよ~~(ヒポポタマスじゃん)~~.
起動したらとりあえず rootって打っとけ.
 
```
$ setup-alpine
$ adduser nya
$ addgroup nya nekozoku
```

キーボードは, 'us us'.

## Network
`/etc/network/interfaces`を編集する.

```
iface eth0 inet static
     address xxx.xxx.xxx.xxx
     netmask 255.255.255.0
     gateway xxx.xxx.xxx.xxx
```

## Wifi
これはsetup-alpineで, できていると思われる.

```
$ iwconfig wlan0 essid SSID0
$ wpa_passphrase 'SSID0' 'PASSWORD' > /etc/wpa_supplicant/wpa_supplicant.conf
$ wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf
$ udhcpc -i wlan0
```

setup-alpineでは永続化はされない, サービスを入れておく.
リファレンスどおり, 確認してから起動する, ふーん慎重じゃん.

```
$ ifconfig wlan0 down
$ /etc/init.d/wpa_supplicant start
$ rc-update add wpa_supplicant boot
```

静的にするなら, `/etc/network/interfaces`

```
iface wlan0 inet static
     address xxx.xxx.xxx.xxx
     netmask 255.255.255.0
     gateway xxx.xxx.xxx.xxx
```

## TUI
というらしい, もうよくわからない.
常時SSHならそれほど必要ないのだけれど, 高解像度ディスプレイに直接つなぐ場合はそのままだとつらい.
### extlinux bootloader
`/boot/extlinux.conf`を書く.
`APPEND`から`nomodeset`を削除, `video=800x600`とか追加.
`Hyper-V`はかなり優秀というのは置いておいて, `video=hyperv_fb:800x600`とする.

### Screen
```
$ apk add screen
```


## リポジトリ追加
`/etc/apk/repositories`を編集する. communityリポジトリぐらいは追加しておく.

```
$ apk update
$ apk upgrade
```

## sshd
```
$ apk add tinyssh
$ rc-update add tinysshd
```

## Firewall
WIP

IPv6は必要なら.

```
$ sudo apk update
$ sudo apk add iptables ip6tables
$ sudo apk add -u awall
$ sudo apk version awall
```

カーネルモジュール追加, iptable_natはルーティングが必要な場合に追加.

```
$ sudo modprobe -v ip_tables
$ sudo modprobe -v ip6_tables
$ sudo modprobe -v iptable_nat
$ sudo rc-update add iptables
$ sudo rc-update add ip6tables
```
https://github.com/alpinelinux/awall から
`sample-policy.json`をベースにする.

```
$ wget https://raw.githubusercontent.com/alpinelinux/awall/master/sample-policy.json
$ sudo mv ./sample-policy.json /etc/awall/optional/default-policy.json
$ sudo awall list
$ sudo awall translate --verify
$ sudo awall enable default-policy
$ sudo awall activate
```
`/etc/awall/optional/base.json`

とりあえず何もしないもので試す.

```
{
  "description": "default policy",
  "zone": {
    "WAN": { "iface": ["eth0", "wlan0"] }
  },
  "policy": [
    {"in": "_fw", "out": "WAN", "action":"accept"},
    {"in": "WAN", "action": "accept" },
    {"out": "WAN", "action": "accept"}
  ]
}
```

## sudo
root権限で, wheelグループは最初からある.

```
$ apk add sudo
$ visudo
```
`%wheel ALL(=ALL) ALL`は入れておいて, `Defaults timestamp_timeout = 10`は好みで設定する.

## Certification
証明書が必要なときに.

```
$ sudo mv xxx.crt /usr/share/ca-certificates/
$ sudo vim /etc/ca-certificates.conf
 #xxx.crtを追記
$ sudo update-ca-certificates
```

## Python3

```
$ sudo apk add python3
$ sudo apk add py3-pip
```

## MariaDB

```
$ sudo apk add mariadb mariadb-client
$ sudo /etc/init.d/mariadb setup
```

`mysqld --help --verbose | grep my.cnf`

<details><summary>my.cnf</summary><div>

```
[client]
port		= 3306
socket		= /run/mysqld/mysqld.sock
default-character-set=utf8mb4

[mysqld]
port		= 3306
socket		= /run/mysqld/mysqld.sock
character-set-server	= utf8mb4
collation-server	= utf8mb4_general_ci
skip-external-locking
key_buffer_size = 8M
max_allowed_packet = 1M
table_open_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 4M

tmpdir		= /tmp/
log_error = /var/log/mysql/mariadb.log
#skip-networking
log-bin=mysql-bin
binlog_format=mixed
server-id	= 1
bind-address = 127.0.0.1

[mysqldump]
quick
max_allowed_packet = 8M

[mysql]
no-auto-rehash

[myisamchk]
key_buffer_size = 10M
sort_buffer_size = 10M
read_buffer = 1M
write_buffer = 1M

[mysqlhotcopy]
interactive-timeout
```
</div></details>

```
$ sudo rc-service mariadb start
$ sudo rc-update add mariadb
$ sudo mysql_secure_installation
```

## Gogs

```
$ git clone --depth 1 https://github.com/gogs/gogs.git gogs
$ cd gogs
$ go build -o gogs
```

OpenRCのサービスを作成する.
<details><summary>/etc/init.d/gogs</summary><div>

```
#!/sbin/openrc-run

SVCNAME=gogs
GOGS_PIDFILE=/var/run/gogs.pid
GOGS_USER=git
GOGS_HOME=/home/$GOGS_USER
GOGS_PATH=$GOGS_HOME/gogs
COMMAND="${GOGS_PATH}/gogs"
ARGS="web"

depend() {
    need net
    use dns logger mysql
}

checkconfig() {
    if [ ! -d "$GOGS_PATH" ] ; then
        eerror "gogs not installed" || return 1
    fi
    return 0
}

start() {
    checkconfig || return 1

    ebegin "Starting ${SVCNAME}"
    start-stop-daemon --start --quiet --background \
        --make-pidfile --pidfile "${GOGS_PIDFILE}" \
        --user "${GOGS_USER}" \
        -d ${GOGS_PATH} \
        --exec "${COMMAND}" "${ARGS}"
    eend $?
}

stop() {
    ebegin "Stopping ${SVCNAME}"
    start-stop-daemon --stop --quiet --pidfile $GOGS_PIDFILE
    eend $?
}
```
</div></details>

```
$ sudo rc-service gogs start
$ sudo rc-update add gogs
```

## Desktop

### Xfce

```
$ sudo setup-xorg-base xfce4 xfce4-terminal lightdm-gtk-greeter xfce4-screensaver dbus-x11
```

環境に合うビデオドライバを選択します.
Intelの場合, Haswell以降は`xf86-video-modesetting`, より前は`xf86-video-intel`を使うのが正解らしいです.

```
$ apk search xf86-video
$ sudo apk add xf86-video-fbdev # Use xf86-video-fbdev for Hyper-V guests
```

```
$ apk search xf86-input
$ sudo apk add xf86-input-keyboard xf86-input-mouse
$ sudo apk add kbd
```

```
$ sudo rc-update add dbus
$ sudo rc-update add lightdm
```

## OpenGL
```
$ sudo apk add mesa
$ sudo apk add mesa-dev
$ sudo apk add mesa-dri-gallium
```
テストアプリ.

[Mesa Demos](https://www.opengl.org/archives/resources/code/samples/glut_examples/mesademos/mesademos.html)

```
$ sudo apk add mesa-demos
```

## Xvfb

```
$ sudo apk add xvfb xvfb-run
```

## VNC

`/etc/local.d`のスクリプトが実行されるようにする.
```
$ sudo apk add x11vnc
$ sudo rc-update add local default
```

| Option     | Description                         | Example         |
| :-----     | :----------                         | :------         |
| -display   | Specify display                     | -display :0     |
| -rfbport   | The port to listen on               | -rfbport 5900   |
| -geometry  | Same as -scale WxH                  | -scale 1024x178 |
| -viewonly  | All clients can only watch          |                 |
| -shared    | Display is shared                   |                 |
| -forever   | Keep listening for more connections |                 |
| -bg        | Go into the background.             |                 |
| -noxdamage | Don't use the X DAMAGE              |                 |

`/etc/local.d/vnc.start`

```
#!/bin/sh
nohup x11vnc -xkb -noxrecord -noxfixes -noxdamage -display :0 -shared -forever -bg -auth /var/run/lxdm/lxdm-\:0.auth -rfbport 5900 -o /var/log/vnc.log > /dev/null 2>&1 &
```
```
$ sudo chmod +x /etc/local.d/vnc.start
```

## Headless

```
$ sudo apk add xf86-video-dummy
```

## Docker
`/etc/apk/repositories`, Dockerはcommunityにあるもよう.

```
http://dl-cdn.alpinelinux.org/alpine/v3.10/community
$ sudo apk update
```
よくないとは知りつつdockerグループに属する.

```
$ sudo apk add docker
$ sudo apk add docker-compose
$ sudo addgroup nya docker
$ sudo /etc/init.d/docker start
$ docker system info
$ sudo rc-update add docker boot
```
念願のDockerを手に入れたぞ.

# Tensorflow
**この項はまだ途中**
ここまでくると, Alpineは関係なくなっていますが.

## Intel optimized Tensowflow
Tensorflow 1.14からIntel MKL DNNを使用している.
https://software.intel.com/en-us/articles/intel-optimization-for-tensorflow-installation-guide
https://cloud.google.com/ai-platform/deep-learning-containers/docs/choosing-container

|REPOSITORY|TAG|SIZE|
|:----|:----|----:|
|intelaipg/intel-optimized-tensorflow|latest|3.29GB|
|intelaipg/intel-optimized-tensorflow |latest-py3|2.07GB|
|gcr.io/deeplearning-platform-release/tf2-cpu|latest|6.26GB|