If you prefer to read info in English, refer to English ver.
v1.0 / 2023-03-14
このレポジトリは,学生と教員が共同運用するTo-do管理システム「TacoClass」についてまとめたものです.
- 小島研究室のメンバー
- 外部の方々
小島研の方へ:このReadMeは外部の方々を想定して作成しました.細かい説明や機密情報は削除しているため,不明な点があれば遠慮なく相談してください.
システムのフォークにあたり,次の手順を踏むことをオススメします:
- 各種資料の閲覧(概要・論文・発表資料)
- 環境の構築
- 開発状況の把握
このシステムは,筆者とその先輩,計2名が共同で開発したものです.
システムは2つの主要機能を有し,筆者は2つめの機能の開発を担当しました.そのため,機能によって説明の分量や詳しさに差があるかもしれません.
このシステムに関する,筆者が作成した資料を掲載します.いずれも.pdfファイルで,筆者の個人用OneDriveにアップロードしたものです.
環境構築は以下の手順で行います.
- WSL
参考:Qiita - Node.jsとnpm
参考:Ubunlog - Gitとクローン
参考:Qiita, - データベース
参考:DigitalOcean,技術メモの壁,arkgame - Firebase
参考:Firebase
本研究では学内サーバにRaspberryPi(OSはLinuxベースであるRaspbian)を使っています.一方,普段と同じ環境(OSはWindows)で開発がしたいです.そこで,Windows上でLinuxの仮想マシンを動かせる技術「WSL」を使います.
今回はLinuxディストリビューションとしてUbuntuを使います.
- WSLのインストール
- アプリ「コントロールパネル」で「Windowsの機能の有効化または無効化」を選ぶ
- 2つの項目「Linux用Windowsサブシステム」「仮想マシンプラットフォーム」にチェックを入れる.「OK」を選択後,PCの再起動を求められるので従う
- Ubuntuのインストール
再起動後,アプリ「Microsoft Store」を開いて「Ubuntu」と検索.「入手」ボタンをクリックしてダウンロード - Ubuntuの初期設定
Ubuntuを起動する.コンソールの表示に従い,ユーザ名やパスワードを入力 - パッケージの更新
コマンドが入力できるようになったら,sudo apt update
とsudo apt upgrade -y
を順番に実行
- データ保存先
username
という名前のユーザが持つデータは,Windows上のパス\\wsl.localhost\Ubuntu-22.04\home\username
に保存されています. - WSLのバージョンアップやマザボの仮想化設定が必要になることも.適宜対応
本システムはフロントエンド(クライアント側)とバックエンド(サーバ側)をどちらもJavaScript言語(JS)をベースに実装しました.そこで,JSでプログラムを動作させるためにJS実行環境「Node.js」を用います.
また,本システムは要求実現のために多くのライブラリを使用します.ライブラリやそのバージョンの管理性を上げるために,パッケージ管理システム「npm」を用います.
※ここが一番重要な環境構築ですが,バージョンやデバイスの違いによって以下のコマンドでも正常にインストールできないことがあります.「論文に示したバージョン」または「LTSバージョン」であれば動くはずなので,とりあえずどちらかをインストールすることを目標にしてください.
- Node.js/npmのインストール
Ubuntuのターミナルを開き,sudo apt install nodejs
と入力 - npmの更新
インストール後,npm -v
でnpmのバージョンを確認する.バージョンが古い(例えばv5.6以下)場合は,sudo npm install -g npm@latest
でnpmを最新バージョンに更新する.
このシステムを手元で動かすには,手元にそのソースコードが必要です.ソースコードはGitHubにアップロードしてあるので,これを手元にコピー(clone)するためにGitを使います.
- Gitのインストール
Gitをインストールする.Ubuntuのターミナルを開きsudo apt install git
と入力 - Gitの初期設定(不要かも?)
ユーザの名前とメアドを設定する.以下両方のコマンドを入力
git config --global user.name [任意のユーザ名]
git config --global user.email [任意のユーザ名]
- Tacoのクローン Tacoをクローンする.以下のコマンドを入力
git clone https://github.com/pkmiya/Taco.git
To-do管理システム(Webアプリ)としてユーザやTo-doのデータを保管するためにデータベースを用意します.今回は,学内サーバとして使用中のRaspberryPiとの相性から「MariaDB」を採用しました.
- 依存パッケージのインストール
MariaDBが依存するパッケージを先にインストールする.Ubuntuのターミナルを開き以下のコマンドを入力
sudo apt install dirmngr ca-certificates software-properties-common gnupg gnupg2 apt-transport-https curl -y
- MariaDBのインストール
MariaDBをインストールする.sudo apt install mariadb-server mariadb-client -y
と入力 - MariaDBの起動
MariaDBの起動状態を確認する.sudo service mysql status
と入力し,「running」と表示されたら既に起動しているので,次へ進む.
ただし,「stopping」と表示されたら起動していないので,sudo service mysql start
と入力しSQLサーバを起動する. - セキュリティスクリプトの実行
SQLサーバの安全性を高めるよう設定を変更する.sudo mysql_secure_installation
と入力- Enter current password for root
何も入力せず「Enter」キーを押す - Set root password?
「n」と入力して「Enter」キー - これ以降の設定では,全て「y」と入力して「Enter」キーでよい
(匿名ユーザやテスト用データベースが削除されるが問題ない)
- Enter current password for root
- パスワード認証方式への変更
Ubuntuは,デフォルトではMariaDBのroot認証に「UNIX経由であるunix_socket
方式」を採用しています.安全で使いやすい一方,運用が複雑なため,root認証方式を「パスワードを用いたmysql_native_password
方式」へと変更します.- SQLサーバへログイン
SQLサーバへログイン.sudo mysql -u root -p
と入力 - ユーザ認証方式の変更 SQLサーバへ接続できたら,以下5行のコードを順に入力する.
- パスワードの設定
認証方式をパスワードへ変更し,rootのパスワードをmy_passwordとして設定する.
set password for 'root'@'localhost'=password('my_password');
と入力 - 権限の更新
コマンド
flush privileges;
を入力
- SQLサーバへログイン
最後に,パスワードでログインできるか確認します.mysql -u root -p
の後に(SQLサーバの)rootのパスワードを入力し,ログインできれば成功です.
- データベースの作成
SQLサーバにログインした状態で,コマンドCREATE DATABASE tacoclass
を入力します. - データベースの選択
DBの閲覧や操作は「どの」DBなのかを指す必要があります.そのため,コマンドUSE tacoclass
と入力して今作成したDBを選択します.このコマンドを叩くことで,コマンドラインの表示がMariaDB [none]>
からMariaDB [tacoclass]>
に変わったかと思います. - テーブルの作成
以下のソースコードをコピペしてテーブルを作成します.
CREATE TABLE members (
id INT(11) NOT NULL AUTO_INCREMENT,
team_id INT(11) NOT NULL,
uid CHAR(50) NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id),
KEY team_id (team_id)
);
CREATE TABLE teams (
id INT(11) NOT NULL AUTO_INCREMENT,
name CHAR(10) NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id)
);
CREATE TABLE todos_private (
id INT(11) NOT NULL AUTO_INCREMENT,
content CHAR(50) NOT NULL,
uid CHAR(50) NOT NULL,
dead_line DATETIME NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
memo TEXT,
is_done TINYINT(1) DEFAULT 0,
PRIMARY KEY (id)
);
CREATE TABLE todos_shared (
id INT(11) NOT NULL AUTO_INCREMENT,
team_id INT(11) NOT NULL,
content CHAR(50) NOT NULL,
dead_line DATETIME NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
memo TEXT,
is_done TINYINT(1) DEFAULT 0,
PRIMARY KEY (id),
KEY team_id (team_id)
);
CREATE TABLE todos_shared_status (
id INT(11) NOT NULL AUTO_INCREMENT,
todo_shared_id INT(11) NOT NULL,
member_id INT(11) NOT NULL,
is_done TINYINT(1) DEFAULT 0,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id),
KEY todo_shared_id (todo_shared_id),
KEY member_id (member_id)
);
このシステムでは,Googleアカウントを用いてユーザの認証と管理を行います.そのために,Googleが提供するプラットフォームFirebaseを利用します.
3者win-winなシステムになります(ユーザはGoogleアカウントさえあれば別途アカウント作成の必要がない.学校側はGoogle Workspaceを導入していればユーザを一括管理できる.開発者は実装の手間が省けてセキュアなユーザ周りの実装ができる).
- Firebaseコンソールにアクセス
お好みのアカウントでOKです(学校用アカウントでもよいが,アカウントが卒業時に消去されるためアクセスできなくなるよ) - プロジェクトの作成
- 「プロジェクトを追加」を押す
- プロジェクト名を入力
- Googleアナリティクスはチェックを外す
- Googleアカウント認証の有効化
- 左側タブの「Authentication」をクリック
- メイン画面タブの「Sign-in method」をクリック
- 「新しいプロバイダを追加」をクリックし,「Google」を追加
- Googleアカウント認証の設定(フロントエンド)
- 左側タブの歯車アイコン「プロジェクトの設定」をクリック
- メイン画面タブの「全般」をクリック
- 画面下部にスクロールして項目「マイアプリ」を見つける
- 「アプリを追加」をクリックし,ソースコードアイコンをクリック
- SDKの設定と構成で「npm・CDN・Config」のうち「npm」を選択
- SDK用ソースコードが表示されるので,
const firebaseConfig =
後の{}内をコンテンツをコピーしておく(設定①とします)
- Googleアカウント認証の設定(バックエンド)
- 左側タブの歯車アイコン「プロジェクトの設定」をクリック
- メイン画面タブの「サービスアカウント」をクリック
- メイン画面左側で「Firebase Admin SDK」をクリック
- Admin SDK構成スニペットで「Node.js・Java・Python・Go」のうち「Node.js」を選択
- 「新しい秘密鍵の生成」をクリック
- JSONファイルがダウンロードされるので,とっておく(設定②とします)
- フロントエンド(以下,
frontend
ディレクトリ内の作業です)- 修正:
package.json
ファイル
5行目のproxy
プロパティを"http://localhost:8080"
に修正.また,64行目のhomepage
プロパティを削除. - 修正:
src/firebase.js
ファイル
12-17行目const app = initializeApp({ ... })
内を設定①のコードに置き換える - 修正:
src/Components/modules/axios.js
ファイル
4行目のbaseURL
プロパティを"http://localhost:8080/api"
にする
- 修正:
- バックエンドの書き換え(以下,
backend
ディレクトリ内の作業です)- 修正:
index.js
ファイル
19行目var serviceAccount = require("")
の""内を,設定②のファイル名に書き換える - 移動:
.json
ファイル
設定②ファイルを/backend
直下に置く - 追加:
.env
ファイル
.envファイルを作成し,以下のコードを記入する.ただし,my_password
部分には自分が設定したパスワードを設定すること
- 修正:
DATABASE_HOST=localhost
DATABASE_USER=root
DATABASE_PASSWORD=my_password
DATABASE_NAME=tacoclass
- Safariで開けない
- リロードすると固まる(URLのスラッシュ以下(
/home
とか)を削除して再アクセスできる) - 学内限定
- 教員用機能
- 通知機能