Webで使えるマークシート処理サービスを作る（構築編）

以前、C++にてマークシートを作成するという記事を書きましたが、ブラウザ上で動くダウンロード不要なマークシート読み取りプログラムを作成しました。

http://cell-sheet.work より動作を試せます。[サンプル画像データ](http://www.cell-sheet.com/wp-content/uploads/2018/01/Sample001.jpg) もありますので、興味のある方はお試しください。なお、かなり動作が不安定ですので、３分以上動作しなかった場合は申し訳ありませんが、サーバーの内部エラーかと思われます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224979/2e4c50a7-174f-ecd7-a792-9ec14b9672c1.png)


#VPSをレンタル
サーバーはGMOインターネットのConoHaを利用します。
メモリ512MB、CPU１コア、CentOS 7.4(64bit)の一番安いやつです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/224979/e731cbff-f1e1-a098-3559-b0cbeac15db4.png)


#環境構築
プログラムのコアとなる読み取り解析処理に部分は、C++で作成しました。
（本来Javaなどを使うと思うのですが、私の技術的にC++が慣れていたので）

###OpenCVのインストール
[CentOS7にOpenCVをインストールする](https://qiita.com/estaro/items/c2f8f790dc62a9f5965f) を参考にC++でOpenCVを動作させるために必要な環境を構築します。なお、Conohaのサーバーが64bitなので、共有ライブラリ情報の追加方法が異なります。

共有ライブラリ情報を追加します。

```
# echo /usr/local/lib64 > /etc/ld.so.conf.d/opencv.conf
# ldconfig -v
```


OpenCVの環境構築は、512MBプランでは1時間半ほどかかりましたが、2GBプランだと20分ほどで完了しました。

###Webサーバー構築
続いて [CentOS6 or 7 + Apache2系のインストール手順メモ](https://qiita.com/Esfahan/items/364462502b6d19dea1fe) を参考にVPSにApacheを導入します。
何をやっているのかわからない部分もありますが、次のようにしてみました。

```
# sudo yum install -y httpd
# sudo systemctl restart httpd
# sudo systemctl enable httpd
# sudo mkdir /var/log/httpd/sample_project
# sudo apachectl configtest
# sudo apachectl restart
# sudo systemctl restart httpd
# sudo firewall-cmd --permanent --zone=public --add-service=http
# 
```

そして [Linux(CentOS7)でWebサーバーを構築する。 -Apache導入編-](https://qiita.com/sango/items/b045a1da17606eda6f82) を参考に次のコマンドを実行します。

```
# firewall-cmd --reload
# firewall-cmd --list-all
```

servicesの欄にhttpが追加されていればOKらしい…

ここまで実行しIPアドレスにアクセスすると、確かにApacheがインストールできたみたいです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/224979/b7deef6d-8e2d-769f-334c-902f1a5d6f4e.png)

次に [Linux(CentOS7)でWebサーバーを構築する。 -php導入編-](https://qiita.com/sango/items/a08c5b04df7125aaaad3#_reference-e143e9b116a9399a6c71) を参考にPHPを使えるように設定します。

下のコマンドを実行するだけみたいです。リスタートしてあげないとPHPが有効になりませんでした。

```
# yum -y install php
# systemctl restart httpd.service
```

また、MariaDBを使う必要があるので、
[Linux(CentOS7)でWebサーバーを構築する。 -MySQL導入編-](https://qiita.com/sango/items/e6eaa5694cd4043f3c4e#_reference-d3ca28cfafa807ac8c2b)
[Linux(CentOS7)でWebサーバーを構築する。 -導入編Final-](https://qiita.com/sango/items/736d98d90203ab4634c6#_reference-fc2b81ae9888a2754d55)
を参考に、MariaDBを使うために以下のコマンドを実行しました。

```
# yum -y install mariadb-server
# yum -y install php-mysqli
# systemctl restart httpd.service
```

これを実行しないと、PHPにてデータベースを扱うPDOを実行した際にエラーとなってしまいます。

#プログラムをアップロード
FTPソフトを使って、VPSにプログラムをアップロードします。今回のシステムで作成したプログラムは、次の２つです。

###プログラムA：マークシート処理＆集計プログラム（C++）
常に実行しています。１秒おきにPHPからアップロードされた新規ファイルがないかを確認し、新たな画像ファイルがあれば解析＆集計を行います。大まかなアルゴリズムは [C++でマークシート読み取りソフトを作ってみた！](https://qiita.com/takoyaki3/items/c3ccd2765f285764e5a0) を参考にしてください。

C++で作成されたプログラムAを、サーバー上でコンパイルします。コンパイル方法は、[CentOS7にOpenCVをインストールする](https://qiita.com/estaro/items/c2f8f790dc62a9f5965f) を参考にしました。

なお、コンパイル時には次の3つの注意点があります。
１、プログラムAはC++11を使って書いたので、-std=c++11オプションを設定してあげないとコンパイルできませんでした。
２、_wtoiが使えないとのことなので、他の標準ライブラリの関数に置き換えました。
３、フォルダーの区切りを"￥"から"/"に変更。


###プログラムB：ファイルアップロードプログラム（PHP）
サーバーにファイルをアップロードするプログラムです。FTPソフトで素直に公開フォルダにアップロードします。

#アクセス権限の設定
これらのプログラムはファイル入出力を行います。そのために、ファイル属性を777に変更する必要があります。サブディレクトリの中の再帰にチェックをつけましょう。
※セキュリティ上、むやみに777にしない方がいいみたいです。

#プログラムAを実行
ｃ＋＋で作成したプログラムAは、常に実行中でなければいけません。Errorが発生した場合に自動で再開するようにするのが今後の課題です。

VPSからログアウトした後もプログラムを稼働させ続ける方法は [ログアウトした後もプログラムの処理を続ける？（コマンド実行時にnohup）](http://kazmax.zpp.jp/linux_beginner/nohup.html) を参考にしました。

実行時に

```
# nohup ./実行可能ファイル名 
```

とすることでログアウト後もコマンドを実行し続けることができます。

```
# ps aux
```

を実行し、起動中のプロセス一覧を見てみます。なお、プログラムAの起動のコマンドはサーバーを起動するたびに実行しなければいけません。
参考：[【ps・kill】実行中のプロセス表示と強制終了](https://qiita.com/shuntaro_tamura/items/4016868bda604baeac3c)


プログラムBは、URLアクセスをすると自動的に実行されます。

#ドメインを設定
最後に、ドメインを取得してVPSのIPアドレスを設定してあげれば完成です。