Node.jsのフレームワークExpress.jsとMysqlを使ったCRUDアプリケーションの作成

Node.jsのフレームワークExpressを使い、Mysqlを使ったCRUDアプリケーションの作成を行う。また、テンプレートエンジンとしてEJSを利用する。

目次

1.本稿の実行環境
(1)ホストOS
 Windows 10 Pro
(2)仮想環境(VirtualBox)
 ・ゲストOS:CentOs8(Red Hat 64-bit)
 ・nodejs、及びnpmはインストール済
 # node -v
 v10.24.0
 # npm –version
 6.14.11

2.CRUDアプリケーションの概要
(1)データベース
・データベース名:crud_db
・テーブル(users)

(2)画面

3.開発環境作成
 WebフレームワークExpressとテンプレートエンジンEJS、およびデータベースMysqlによるアプリケーションの開発環境を作成する。
(1)Express.jsのインストール
・ディレクトリを任意の名前で作成
ここでは、”crud-app”とした。
・パッケージ情報の作成
 作成したディレクトリに移動して、パッケージ情報を作成する。
 # cd crud-app
 # npm init -y
 package.jsonファイルが作成される
・express.jsのインストール
 # npm install express

(2)テンプレートエンジンEJSのインストール
 $ npm install ejs

(3)MySQL接続ドライバのインストール
 express.jsからMySQLへ接続するためのドライバをインストールする。
 # npm install mysql

(4)データベースとテーブルの準備
データベース(crud_db)とテーブル(users)を作成する。
・Mysqlに接続
# mysql -u root -p
・データベースの作成
mysql> CREATE DATABASE crud_db;
・テーブルの作成mysql> CREATE TABLE users (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL);
・テーブルのフィールドの確認mysql> SHOW COLUMNS FROM users;
・テーブルが作成されたことを確認する

4.CRUDアプリケーションの作成
(1)nodejsアプリ
crud_app.js

const express = require('express');
const mysql = require('mysql');
const app = express();

app.use(express.urlencoded({extended: false}));

//mysqlと接続
const connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',//mysqlのインストール時の設定に合わせる
  password: ' ',//mysqlのインストール時の設定に合わせる
  database: 'crud_db' //作成したDBの名前
});

//viewsディレクトリ以下のejsファイル認識させる
app.set('views', './views');
app.set('view engine', 'ejs');

//新規作成画面のルーティング
app.get('/new', (req, res) => {
    res.render('new.ejs');
});

//新規登録
app.post('/create', (req, res) => {
connection.query(
    'INSERT INTO users (name, email) VALUES (?, ?)',
    [req.body.name, req.body.email],
    (error, results) => {
    res.redirect('/');//一覧画面へ
    }
);
});

//一覧画面のルーティング
app.get('/index', (req, res) => {
    connection.query(
      'SELECT * FROM users',
      (error, results) => {
        res.render('index.ejs', {items: results});//検索結果をitemsというキーでviewに渡す
      }
    );
  });

//編集画面のルーティング
app.get('/edit/:id', (req, res) => {
    connection.query(
      'SELECT * FROM users WHERE id = ?',
      [req.params.id],
      (error, results) => {
        res.render('edit.ejs', {item: results[0]});
      }
    );
});

//更新
app.post('/update/:id', (req, res) => {
    connection.query(
    'UPDATE users SET name = ?, email = ? WHERE id = ?',[req.body.name, req.body.email, req.params.id],(error,results)=>{
      res.redirect('/');
    })
});

//削除
app.post('/delete/:id', (req, res) => {
    connection.query(
      'DELETE FROM users WHERE id = ?',
      [req.params.id],
      (error, results) => {
        res.redirect('/');
      }
    );
});

//新規作成画面のルーティング
app.get('/', (req, res) => {
    res.render('menu.ejs');
});

app.listen(3000);//3000ポートでローカルサーバーを立てる

(解説)
・const express = require(‘express’);
require()でモジュール(オブジェクト)を呼び出す
・const app = express();
 express()オブジェクトを作成する
・app.use(express.urlencoded({extended: false}));
 urlencoded()メソッドでフォームデータを読めるようにする
・app.get(‘/new’, function (req, res) {
・・・})
 get受信時のルーティングとコールバック関数を定義する。
・connection.query(sql,コールバック関数)
 queryメソッドのコールバック関数は第一引数にクエリを文字列で指定、第二引数にはコールバック関数を指定する。
 コールバック関数ではerror, results, fieldsの引数を用いることができ、errorにはクエリ実行時のエラー、resultsにはクエリ実行後の結果、fileldsにはクエリの結果のフィールドの情報が入る。
connection.query(
‘SELECT * FROM users’,
(error, results,fields ) => {
console.log(results);
resultsの内容は、
[ RowDataPacket { id: 10, name: ‘test1’, email: ‘test1@test1.com’ },
RowDataPacket { id: 11, name: ‘test2’, email: ‘test2@test2.com’ } ]
・res.render(‘index.ejs’, {items: results})
使用するテンプレートファイルの指定とテンプレートファイルに渡すデータを{キー値: ‘渡す値’}で指定する。
 テンプレートの”index.ejs”内では<%= キー値 %>と記述することでデータを埋め込むことができる。

(2)テンプレートファイル
views/menu.ejs

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>メニュー</title>
</head>
<body>
<h2>【ユーザー管理】</h2>
<a href="/new">『ユーザー登録』</a><br>
<a href="/index">『ユーザー一覧』</a>
</body>
</html>

views/index.ejs

<!DOCTYPE html>
<html>
<head>
 <meta charset="UTF-8">
 <title>ユーザー一覧画面</title>
</head>
<body>
<table>
  <tr>
   <th >名前</th>
   <th >EMail</th>
   <th >ボタン</th>
   <th >ボタン</th>
  </tr>
  <tr>
   <% items.forEach((item) => { %> 
    <td><%= item.name %></td>
    <td><%= item.email %></td>
    <td>
     <a href="/edit/<%= item.id %>">編集</a>
    </td>
    <td>
     <form action="/delete/<%= item.id %>" method="post">
       <input type="submit" value="削除">
     </form>
    </td>
  </tr>
 <% }) %>
 </table>
 <a href="/">戻る</a>
</body>
</html>

views/new.ejs

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>登録</title>
</head>
<body>
<form action="/create" method="post">
    名前:<input type="text" name="name"><br>
    Email:<input type="text" name="email"><br>
    <input type="submit" value="登録">
    <a href="/">戻る</a>
</form>
</body>
</html>

views/edit.ejs

<!DOCTYPE html>
<html>
<head>
 <meta charset="UTF-8">
 <title>編集</title>
</head>
<body>
 <form action="/update/<%= item.id %>" method="post">
  名前:<input type="text" name="name" value="<%= item.name %>"><br>
  EMail:<input type="text" name="email" value="<%= item.email %>"><br>
  <input type="submit" value="更新">
  <a href="/">戻る</a>
 </form>
</body>
</html>

5.アプリケーションの実行
(1)Mysqlサーバの起動
 # service mysqld start
(2)nodeアプリケーションの実行
 crud_app.jsのディレクトリで下記コマンドを実行
 # node crud_app.js
(3)ブラウザからnodeのWebサーバに接続   http://127.0.0.1:3000/

The end

Node.jsのフレームワークExpress.jsを使いMysqlの接続

Node.jsのフレームワークExpressを使い、Mysqlと接続、クエリ文によるデータベースの操作を行います。

目次

1.本稿の実行環境
(1)ホストOS
 Windows 10 Pro
(2)仮想環境(VirtualBox)
 ・ゲストOS:CentOs8(Red Hat 64-bit)
 ・nodejs、及びnpmはインストール済
# node -v
v10.24.0
# npm –version
6.14.11

2.Expressを使ったMysqlの接続
(1)Express.jsのインストール
・ディレクトリを任意の名前で作成
ここでは、”crud-app”とした。
・パッケージ情報の作成
 作成したディレクトリに移動して、パッケージ情報を作成する。
# cd crud-app
 # npm init -y
 package.jsonファイルが作成される
・express.jsのインストール
 # npm install express

(2)MySQL接続ドライバのインストール
 express.jsからMySQLへ接続するためのドライバをインストールする。
 # npm install mysql

(3)データベースの作成
  予め、データベースを作成しておく。
  Mysqlに接続して、CREATE DATABASEコマンドでデータベース(crud_db)を作成する。

# mysql -u root -p
Enter password:

mysql> CREATE DATABASE crud_db;
Query OK, 1 row affected (0.25 sec)

mysql> SHOW databases;
+--------------------+
| Database           |
+--------------------+
| crud_db            |
| 
+--------------------+

3.テーブルの作成
 connectionクラスのqueryメソッドを使って、テーブル作成のクエリを出力する。
app1.js

const express = require('express')
const app = express()
const port = 3000
const mysql = require('mysql');
//データベースの接続情報
const con = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: ' ',
  database: 'crud_db'
});
//データベースの接続とテーブル作成
con.connect(function(err) {
  if (err) throw err;
  console.log('Connected');
  const sql = 'CREATE TABLE users (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL)';
  con.query(sql, function (err, result) {
        if (err) throw err;
        console.log('table created');
  });

});

・サーバの起動
[root@localhost crud-app]# node app1.js
Connected
table created

・テーブルが作成されたことを確認する

# mysql -u root -p
Enter password:
mysql> use crud_db;
Database changed
mysql> SHOW tables;
mysql> SHOW COLUMNS FROM users;

4.テーブルデータの取得
(1)テーブルデータの作成
予め、テーブルデータを作成しておく。
sql文
INSERT INTO crud_db(フィールド,・・・) VALUES(値,・・・);

# mysql -u root -p
Enter password:
mysql> USE crud_db;
mysql> INSERT INTO users(name,email) VALUES('test','test@t.com');
mysql> SELECT * FROM users;
+----+------+------------+
| id | name | email      |
+----+------+------------+
|  1 | test | test@t.com |
+----+------+------------+
1 row in set (0.00 sec)

(2)テーブルデータの取得
 テーブルデータを取得し、ブラウザで表示する。
app2.js

const express = require('express')
const app = express()
const port = 3000
const mysql = require('mysql');

const con = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: ' ',
  database: 'crud_db'
});

con.connect(function(err) {
	if (err) throw err;
	console.log('Connected');
});

app.get('/', (request, response) => {
	const sql = "select  * from users"
	con.query(sql, function (err, result, fields) {  
	if (err) throw err;
	response.send(result)
	});
});

app.listen(port);

アロー関数を使わない書き方
app3.js

const express = require('express')
const app = express()
const port = 3000
const mysql = require('mysql');

const con = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: ' ',
  database: 'crud_db'
});

con.connect(function(err) {
	if (err) throw err;
	console.log('Connected');
});

function doRequest (request, response){
	const sql = "select  * from users"
	con.query(sql, function (err, result, fields) {  
	  if (err) throw err;
	  response.send(result)
	});
}
app.get('/', doRequest)
app.listen(port);

(解説)
・connectionクラスのqueryメソッドを使ってクエリを出力する。queryメソッドでは第一引数にクエリを文字列で指定、第二引数にはコールバック関数を指定する。コールバック関数ではerror, results, fieldsの引数を用いることができ、errorにはクエリ実行時のエラー、resultsにはクエリ実行後の結果、fileldsにはクエリの結果のフィールドの情報が入る。
・サーバの起動
アロー関数を使ったプログラム
[root@localhost crud-app]# node app2.js
Connected
アロー関数を使わないプログラム
[root@localhost crud-app]# node app3.js
Connected

The end

Node.jsフレームワークExpressを使いWebサーバアプリの作成

Node.jsのフレームワークExpressを使い、Webサーバサンプルを作成します。

1.本稿の実行環境
(1)ホストOS
 Windows 10 Pro
(2)仮想環境(VirtualBox)
 ・ゲストOS:CentOs8(Red Hat 64-bit
 ・nodejs、及びnpmはインストール済

2.Expressを使ったWebアプリケーションの作成
 ExpressはNode.jsのMVCフレームワーク。EJSはテンプレートエンジンで、EJSを利用することでテンプレートのデザイン部分とデータを扱うロジック部分を分けることができる。
(1)アプリケーションフォルダの作成
 作成したフォルダに入り下記のコマンドを実行して、npmの設定ファイルであるpackage.jsonを生成する。
 ここではフォルダをExpress-appとする。
 $ mkdir Express-app
 $ cd Express-app
 $ npm init -y

(2)Expressのインストール
 $ npm install express

(3)テンプレートエンジンEJSのインストール
 $ npm install ejs

Express を使用して Node.js のプログラムを作成
 前記(1)、(2)、(3)の操作で下記フォルダ、ファイルが作成される。

(4)プログラムの作成
node-sample14.js

const express = require('express');
const app = express();
app.get('/', doRequest);
app.listen(8000);
console.log('Server running!');

function doRequest(req, res) {
  res.send('Express Hello World!');
}

(解説)
・Expressオブジェクトのget()メソッドを使用してGETリクエストを処理する。引数にはアプリケーションが指定されたルート(エンドポイント)とHTTPメソッドへのリクエストを受け取ったときに呼び出されるコールバック関数(ハンドラ関数とも呼ばれます)を指定する。
・コールバック関数では、responseオブジェクトのend()メソッドでコンテンツを書き出す。

(5)サーバの起動
$ node node-sample14.js

(6)仮想マシンのブラウザで確認
http://127.0.0.1:8000/

3.Expressとテンプレートエンジンを使ったWebアプリケーションの作成
 前項2.のプログラムではresponseオブジェクトのsend()メソッドでコンテンツを書き出したが、本項ではテンプレートファイルをコンテンツとする。
(1)プログラムの作成
node-sample15.js

const express = require('express');
const app = express();
app.get('/', doRequest);
app.listen(8000);
console.log('Server running!');

function doRequest(req, res) {
  res.render('hello.ejs');
}

(解説)
・コールバック関数では、responseオブジェクトのrender()メソッドを使いレンダリングを行う。

(2)テンプレートファイルを作成
 views/hello.ejs

<h1>Express EJS Hello World</h1>

(3)サーバの起動
$ node node-sample15.js

(4)仮想マシンのブラウザで確認
 http://127.0.0.1:8000/

The end

Node.jsのWebサーバアプリケーションの作成

Node.jsのインストールからNode.jsのモジュールを使いWebサーバサンプルを作成します。
1.Node.jsとは
 Node.jsはサーバサイドでJavaScriptを実行できるようにするプラットフォーム。

特徴
・シングルスレッドにおける非同期処理を容易に実装可能にしたイベント駆動型プログラミング環境。
・サーバーへの接続台数が10,000台を超えると表示が遅くなるというC10K問題はノンブロッキングI/Oで発生しない。

2.本稿の実行環境
(1)ホストOS
 Windows 10 Pro
(2)仮想環境(VirtualBox)
 ・ゲストOS:CentOs8(Red Hat 64-bit)

3.Nodeのインストール
(1)EPEL リポジトリ情報をインストールする
 # yum -y install epel-release
(注1)epel-release

(注1)
 EPEL(Enterprise Linux用の追加パッケージ)は、Fedoraチームによるオープンソースの無料のコミュニティベースのリポジトリプロジェクト。Fedoraは、レッドハットが支援するコミュニティー。

(2)Node.jsのインストールとバージョン確認
 # yum -y install nodejs
 # node -v

(3)npmのインストールとアップデート
 # yum -y install npm
 # npm update -g npm
(注)npm
 npm(Node Package Manager)はNode.jsのパッケージを管理するツールで、npmのパッケージには、
・Node.jsのMVCフレームワークである”Express”
・非同期処理を実装するための”promise”、”async”
・双方向のリアルタイムアプリケーションが実装できる”Socket.io”
などがある。

3.Node.jsによるWebサーバサンプル(1)
 responseオブジェクトのwrite()メソッドでコンテンツを書き出す。
(1)プログラムの作成
node-sample1.js

const http = require('http');
const server=http.createServer();
server.on('request',doRequest);
server.listen(8000);
console.log('Server running!');

function doRequest(req,res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
res.write('Hello World\n');
res.end();
}

(解説)
・require()でhttpモジュール(オブジェクト)を呼び出す
・createServer()でhttp.serverサーバオブジェクトを作成する。
・on()メソッドでサーバオブジェクトにイベントを組み込む。第一引数にイベント名、第2引数に組み込む処理(関数)を指定する。
・listen()メソッドでポート番号などを指定
・consoleオブジェトのlog()イベントでコンソールにメッセージを出力する。
・requestイベントで実行される処理をdoRequest()関数に定義する。
 第一引数には”request”オブジェクト、第二引数には”response”オブジェクトが渡される。
 writeHead()は、responseオブジェクトのメソッドで
ヘッダー情報をレスポンスに書き出すもので、第1引数にステータスコードを指定し、第2引数にヘッダー情報を連想配列でまとめたものを指定する。
 {‘Content-Type’: ‘text/plain’}でコンテンツが標準テキストであることをクライアントに伝える。
 write()は、responseオブジェクトのメソッドで引数に指定した値がボディ部分のコンテンツとして書き出される。
 end()はresponseオブジェクトのメソッドでコンテンツの出力を完了する。引数に値を指定したときは値を書きだした後にコンテンツを完了する。

(2)サーバの起動
 # node node-sample1.js

(3)仮想マシンのブラウザで確認
 http://127.0.0.1:8000/

(4)別の端末から呼び出す
[root@localhost ~]# curl http://127.0.0.1:8000/
Hello World

(5)無名関数による書き方
 前記(1)を無名関数に書き換える
 node-sample12.js

const http = require('http');
http.createServer(function (requ,res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
res.write('Hello World\n');
res.end();
}).listen(8000);
console.log('Server running!');

4.Node.jsによるWebサーバサンプル(2)
 3.項ではResponseオブジェクトのwrite()メソッドでコンテンツを書き出したが、本項ではhtmlファイルをコンテンツとする。
(1)プログラムの作成
 node-sample13.js

const http = require('http');
const fs= require('fs');
const server=http.createServer();
server.on('request',doRequest);
server.listen(8000);
console.log('Server running!');

function doRequest(req,res) {
    fs.readFile('./node-sample3.html', 'UTF-8',
        function(err, data){
            res.writeHead(200, {'Content-Type': 'text/html'});
          res.write(data);
          res.end();
    });
}

(解説)
・require()でfsモジュール(オブジェクト)を呼び出す
・fsオブジェクトのreadFile()メソッドでは、第1引数に読み込むファイルのパスを指定、第2引数にエンコード名、第3引数に読み込み完了後のコールバック関数を指定。
・コールバック関数の第1引数はエラーが発生した場合のエラーメッセージ、第2引数dataに読み込まれたテキストが保管され、write()メソッドで書き出す。

node-sample13.html

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta http-equiv="content-type"
        content="text/html; charset=UTF-8">
    <title>node-sample</title>
</head>
<body>
 <p>Node.jsのnode-sample3のページ</p>
</body>
</html>

(2)サーバの起動
 # node node-sample13.js

(3)仮想マシンのブラウザで確認
 http://127.0.0.1:8000/

The end

PHPのWebアプリケーションフレームワークLaravelの環境構築

目次

1.開発環境の構成
  Laravelの開発環境の構成をイメージ図に示します。
開発環境のイメージ図

2.環境構築手順
Laravelの開発環境の構成を以下の順で説明します。
(1)VirtualBoxのインストール
(2)仮想マシンの作成とUbuntu(Ubuntuディスクトップ環境)をインストール
(3)Dockerインストール
(4)Docker-Composeのインストール
(5)SSHサービスのインストール
 ローカルと仮想マシン間でFTP通信ができるようにするため
(6)WinScp(FTPソフト)のインストール
(7)Dockerコンテナの作成とLaravelプロジェクトの作成
(8)ホストOS(windows)のブラウザからゲストOS(Ubuntu)にアクセスするポートを追加
(9)Putty(SSH対応リモートターミナルクライアント)ソフトのインストール
(10)WinScp(FTPソフト)をUbuntuに接続して、root権限で操作するための設定追加

3.VirtualBoxのインストール
https://www.virtualbox.org/wiki/Downloads

4.仮想マシンの作成とUbuntu(Ubuntuディスクトップ環境)をインストール
4.1 64-bitPC(AMD64)desktop imageをダウンロードします。
http://www.releases.ubuntu.com/16.04/

上記サイトからダウンロードしたファイル

4.2 仮想マシンの作成
①VirtualBoxを起動します。

②「新規」を選択し、名前の入力とタイプ、バージョンの選択

③メモリサイズの設定

④ハードディスクの選択

ここで仮想マシンが作成されます。

4.3 起動ハードディスクの設定
 今回作成した仮想マシンを選択して、「起動」します。

フォルダの釦を押します。

「追加」釦押すとディレクトリが表示されるので、ダウンロードしたUbuntuのイメージファイルを選択し、「開く」釦を押すと、光学ディスク選択の選択肢にUbuntuが表示されるので、Ubuntuを選択して、「選択」釦を押します。
「起動ハードディスクを選択」の画面に移ります。

4.4 Ubuntuを選択して、起動します。

「日本語」を選択して、「Ubuntuをインストール」を押します。

名前、ユーザ名、パスワードを登録します。

しばらく待つ(本稿では約1時間)

remove・・・がでたらリターン

マウス右ボタンでメニューが出て、「端末を開く」を選択するとコマンド入力画面が開きます。

4.5 Ubuntuのバージョン確認
$ cd /etc
$ cat os-release

5.Dockerインストール
$ sudo apt-get update

$ sudo apt-get install docker.io

$ docker –version

6.Docker-Composeのインストール

(途中、省略)

Yを入力

Docker-composeのバージョン確認

sudoなしでもdockerを使えるようにするため、dockerグループを作ります。
$ sudo groupadd docker
ユーザをdockerグループに追加します。
$ sudo gpasswd -a $USER docker

7.SSHサービスのインストール
 ローカルと仮想マシン間でFTPでファイル転送ができるようにするため、SSHサービスを使えるようにします。

7.1 仮想マシンの設定
①仮想マシンを選択して、「設定」釦押下します。

②ネットワーク>高度>ポートフォワーディングを選択

③「+」(追加)釦を押します。

④名前、プロトコル、ホストポート、ゲストポートを設定します。

ここではホストポート番号”2222”とした仮想マシンのUbntuにはローカルループバックアドレス127.0.0.1、ポート番号:2222で接続できます。

7.2 Ubuntuにopensshをインストールする
$ sudo apt-get install openssh-server

(途中、省略)

8.WinScp(FTPソフト)のインストール
https://forest.watch.impress.co.jp/library/software/winscp/

WinScpを起動します。

仮想マシンは起動されているものとします。

9.Dockerコンテナの作成とLaravelプロジェクトの作成
① /home/(ユーザ)配下にアプリケーションをおくフォルダを作成します。ここでは、”kadai”としました。
②”kadai”配下 にdockerフォルダとdocker-compose.ymlファイルを置きます。

\kadai\docker\web\default.conf

server {
    listen 80;

    root  /var/www/html/sample-app/public;
    index index.php index.html index.htm;

    access_log /var/log/nginx/access.log;
    error_log  /var/log/nginx/error.log;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }


    location ~ \.php$ {
          fastcgi_split_path_info ^(.+\.php)(/.+)$;
          fastcgi_pass   app:9000;
          fastcgi_index  index.php;

          include        fastcgi_params;
          fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
          fastcgi_param  PATH_INFO $fastcgi_path_info;
    }
}

\kadai\docker\phpdocker\Dockerfile

FROM php:7.2-fpm

# install composer
RUN cd /usr/bin && curl -s http://getcomposer.org/installer | php && ln -s /usr/bin/composer.phar /usr/bin/composer
RUN apt-get update \
&& apt-get install -y \
git \
zip \
unzip \
vim

RUN apt-get update \
    && apt-get install -y libpq-dev \
    && docker-php-ext-install pdo_mysql pdo_pgsql

WORKDIR /var/www/html

\kadai\docker-compose.yml

version: '3'
services:
  web:
    image: nginx:1.15.6
    ports:
      - "8000:80"

    depends_on: # 追加
      - app
    volumes:
      - ./docker/web/default.conf:/etc/nginx/conf.d/default.conf
      - .:/var/www/html

  app:
    #image: php:7.2-fpm
    build: ./docker/php #定義したDockerfileを元にイメージを作るように変更
    depends_on:
      - db 
    volumes:
      - .:/var/www/html
  
  db:
    image: postgres:12.1-alpine
    volumes:
      - db-store:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=${DB_NAME}
      - POSTGRES_USER=${DB_USER}
      - POSTGRES_PASSWORD=${DB_PASS}
      - POSTGRES_ROOT_PASSWORD=${DB_ROOT_PASS}
      - TZ=${TZ}
    ports:
      - "5432:5432"

volumes:
  db-store:

③kadaiのディレクトリに移動して、下記のビルドコマンドを入力します。
$ sudo docker-compose up -d –build

④web、app(php)、dbの3つのコンテナが起動されていることを確認します。
$ sudo docker ps

⑤app(php)のコンテナに入り、Laravelプロジェクトを作成する
下記のコマンドでappコンテナに入ります。
$ sudo docker-compose exec app bash

# composer create-project –prefer-dist laravel/laravel sample-app
※ここでLaravelプロジェクトのフォルダ名(sample-app)は任意、但し、webの”default.conf”のファイルの「root  /var/www/html/sample-app/public;」の名前と一致させる必要があります。

Laravelプロジェクトの作成に成功したときは、⑥へ進む

Laravelプロジェクト作成に失敗したとき
Laravelプロジェクト作成中に下記のスワップメモリ不足のエラーが出て、Laravelプロジェクトの作成に失敗した場合は、スワップメモリ領域を拡張する必要があります。

# exit
でコンテナから抜ける
SWAP領域用のファイルを作成
$ sudo /bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
SWAP領域作成
$ sudo /sbin/mkswap /var/swap.1
SWAP領域を有効化
$ sudo /sbin/swapon /var/swap.1

コンテナを再起動します。

$ sudo docker-compose up -d
再度、appのコンテナに入り、Laraveプロジェクトを作成します。
※途中まで作成されたフォルダが残っていると失敗するため、フォルダ(sample-app)毎削除します。

appコンテナに入ります。
$ sudo docker-compose exec app bash
Laravelプロジェクトの作成
# composer create-project –prefer-dist laravel/laravel sample-app

(途中、省略)

⑥”storage”フォルダのアクセス権限を変更する
下記のフォルダの権限を変える(chmod 777)
/var/www/html/sample-app/storage/logs
/var/www/html/sample-app/storage/framework
/var/www/html/sample-app/storage/framework/sessions
/var/www/html/sample-app/storage/framework/views

⑦ブラウザでローカルホスト(127.0.0.1)にアクセスする
 Laravelの画面が出れば、Webサーバとアプリケーションサーバ(php)は動作しています

フォルダ構成

10.ホストOS(windows)のブラウザからゲストOS(Ubuntu)にアクセスするポートを追加

TCP ホストポート:8080 ゲストポート:8000を追加

Windowsのブラウザから、127.0.0.1:8080で、VirtualBoxのゲストOSのWebサーバにアクセスできます。

11.Putty(SSH対応リモートターミナルクライアント)ソフトのインストール
Puttyを起動し、接続先を設定
IP:127.0.0.1 ポート:2222

文字コード、文字サイズの設定

UTF-8を選択

文字サイズの変更

12.WinScp(FTPソフト)をUbuntuに接続して、root権限で操作するための設定追加
 Ubuntu側のファイルの権限が”root”になっているときでも、WinScpを使って、Windows側とUbuntu間でファイルのコピーができる設定を追加します。

12.1 Ubuntu側の設定
Ubuntuの端末、又はputtyなどのターミナルから
$ cd /
$ sudo visudo
パスワード:

/etc/sudoers.tmpファイルが開く、下記を最後の行に追加します。
[ユーザ名] ALL=NOPASSWD:/usr/lib/openssh/sftp-server
※このユーザ名はUbuntuをインストールしたときに設定したユーザ名

Ctrl+Cで書込みされ、Ctrl+Xで終了し、コマンドプロンプトに戻ります。

12.2 WinScp側の設定
WinScpを起動し、「編集」選択

「設定」選択

SFTPサーバのところに下記を入力して、「OK」押します。
sudo /usr/lib/openssh/sftp-server

「保存」を押して、「ログイン」します。

.envなど書込みがroot権限のみになっているファイルの変更ができれば、設定はOKです。

※接続できない場合は、Ubuntuの”sftp-server”のある場所を確認する
$cd /usr/lib
$ls -al
7.2項の「Ubuntuにopensshをインストール」で自動的に下記のようにシンボリックリンクが設定されています。

The end

特許の電子出願の手順

特許の電子申請について、下記の場合の電子出願方法について記載します。
ここでは、証明書はICカードのマイナンバー、特許印紙の納付は予納として手順を記載しました。実際に操作したときのメモから作成しましたが、手順の前後が反対になっている可能性もありますが、おおよその概要を把握することは可能かと思います。詳細は特許庁の公式ページで確認してください。

目次

1.電子出願ソフトのダウンロード

(1)電子出願ソフトのダウンロード請求
 下記のサイトからソフトのダウンロード請求を行う
 https://dl-sv1.pcinfo.jpo.go.jp/update/1_dl-seikyu/index.html

(2)電子出願ソフトのダウンロード

 「出願ソフトダウンロード請求」のタイトルのメールが届くので、メール本文記載のURLでWEBブラウザからアクセスする。

ダウンロードしたファイルサイズと一致することを確認する

2.電子出願ソフトのインストール

「証明書情報取込」を押し、ダウンロードした証明書情報を取り込む

3.初期設定

初めてインターネット出願・・・を選択

「申請人情報・証明書管理ツール」を起動

「識別番号取得&利用登録」を選択

以下、画面に従い情報を入力する
・証明書情報確認画面
・個人法人確認画面
・申請人情報入力画面(名前)
・申請人情報入力画面(住所)
・申請人情報入力画面(国籍・地域コード)
・申請人情報入力画面(電話番号)
・申請人情報入力画面(予納)
 どちらか(台帳あり、希望)選択する必要あり
・「申請人情報送信確認画面」で送信ボタン押す
・「識別番号取得&利用登録完了画面」

このまま、「更新」する

4.ひな形のダウンロード

電子出願ソフトサポートサイトへアクセスし、「申請書類の作成」をクリックします。
申請書類の作成の画面で、「ひな型より作成」をクリックhttp://www.pcinfo.jpo.go.jp/site/index.html

ひな型をインストールすると、デスクトップ上に「ひな型 20XX_XX」(20XX_XXはリリース年月)のアイコンが作成される

5.特許料の納付

 出願料などの手数料は、書類に納付方法を記載して、別途納付する。
 納付方法は5種類あり、ここでは予納(特許印紙を特許庁へ郵送)を選択。
 特許印紙を下記の様式の内、予納書に貼って、郵送する。
https://www.jpo.go.jp/system/patent/shutugan/tetuzuki/isdn_yoshiki.html

 特許庁の印紙購入窓口で特許印紙を購入して予納書に貼り、直接特許受付窓口に提出できました。
※「特許印紙による予納への入金廃止について」(令和5年2月特許庁)
 特許印紙による予納が廃止され、(1)インターネット出願ソフトを利用した予納、(2)現金納付による予納に変わるとの連絡がありました。
 従って、令和5年度末から以下の例は無効となります。

6.出願
 下記の資料に従い、出願操作を行う
 インターネット出願ソフト操作マニュアル
http://www.pcinfo.jpo.go.jp/site/3_inet/2_manual/0430/i2-04-sousa.pdf
(1)ひな型を使い、申請書をHTML形式で作成する。
 ここでは特許印紙の納付方法を予納とするため、下記のひな型を使いました。 
 ひな型2021.05\出願\特許\P1-特許願1100特許願(特記事項なし)(予納).htm
(2)インターネット出願ソフト操作マニュアルに従い、特許申請書を送信する。
 ・送信用フォルダの作成
 ・受信フォルダの作成
 ・送信ファイルの選択
  チェック結果OKになるまで修正
  図面はモノクロ、bmpファイルとする

The end

PythonのWebアプリケーションフレームDjangoを使う-その3 Mysqlを使う-

本記事ではDjangoにデフォルトで設定されているSQLiteをMysqlに変えるときの設定について確認する。
プロジェクト名:ex2
アプリ名:apl2

目次

1.本稿の開発環境
(1)ホストOS
 Windows 10 Pro
(2)仮想環境(VirtualBox)
 ・ゲストOS:CentOs8(Red Hat 64-bit)
 ・pythonバージョン
  Python 3.6.8
・MySQL Serverのバージョン 
   # mysqld –version
/usr/libexec/mysqld Ver 8.0.26 for Linux on x86_64
(Source distribution)
・MySQL Clientのバージョン
# mysql –version
mysql Ver 8.0.26 for Linux on x86_64
(Source distribution)
・Djangoのインストール
  # python3 -m pip install Django
# python3 -m django –version
3.2.7
仮想環境の作成については下記のページを参照
VirtualBoxにCentOS8の環境作成

2 Djangoプロジェクトの作成
 # django-admin startproject ex2

3 Djangoアプリを作成
 プロジェクトのフォルダで下記コマンドを実行
  # python3 manage.py startapp apl2

4 プロジェクトの初期設定
 プロジェクトのsettings.pyファイルで次の2つを編集
・INSTALLED_APPS変数
・TEMPLATES変数のDIRS
(1)INSTALLED_APPS変数にアプリケーションを登録
  ’apl2.apps.Apl1Config’を登録

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'apl2.apps.Apl2Config',

(2)テンプレートフォルダの指定
 HTMLテンプレートファイルを格納するフォルダを作成して登録する。ここではmanage.pyと同じディレクトリtemplatesフォルダを作成する。

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR/'templates'],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

5 データベースの設定
 プロジェクト名/settings.pyを編集
 mysqlを使うため、下記の内容に書き換える

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'ex2db',
        'USER': 'root',
        'PASSWORD': ' ',
        'HOST': '',
        'PORT': '',
    }
}

6 PyMySQL(Python製のMySQLクライアント)のインストール
 ・pymysql
  # pip3 install pymysql
 ・インストール済みのパッケージ一覧の確認
  # pip3 freeze -l

7 manage.pyの編集
 下記の2行を追加
 ・import pymysql
 ・pymysql.install_as_MySQLdb()

#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys
import pymysql #add
pymysql.install_as_MySQLdb() #add

def main():
    """Run administrative tasks."""
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'ex2.settings')
    try:
        from django.core.management import execute_from_command_line
    except ImportError as exc:
        raise ImportError(
            "Couldn't import Django. Are you sure it's installed and "
            "available on your PYTHONPATH environment variable? Did you "
            "forget to activate a virtual environment?"
        ) from exc
    execute_from_command_line(sys.argv)


if __name__ == '__main__':
    main()

(注)pymysqlについて
 「本番環境」でもMySQLが使えるようにするためにはwsgi.pyの編集が必要。
 wsgi.pyに下記を追加

8 マイグレーション
 データベースは予め作成しておく
 mysql> CREATE DATABASE ex2db;
 また、Mysqlサーバを起動しておく
 # service mysqld start
(1)マイグレーションを実行
 # python3 manage.py migrate

migrateコマンドではINSTALLED_APPSの設定を参照して、ex2/settings.pyファイルのデータベース設定に従って必要なすべてのデータベースのテーブルを作成する

(2)マイグレーションにより作成されたテーブルの確認
  # mysql -u root -p
  Enter password:
  mysql> SHOW databases;
  mysql> USE ex2db;
  mysql> SHOW tables;

The end

PythonのWebアプリケーションフレームDjangoを使う-その2 Djangoデータベースアプリケーションの作成 -

 本記事ではDjangoにデフォルトで設定されているSQLiteを使い、データベースを使うアプリケーションを作成する。
 プロジェクト名:ex1
 アプリ名:apl1

1 Djangoプロジェクトの作成
 # django-admin startproject ex1
  ex1/
   init.py
   asgi.py
   settings.py
   urls.py
   wsgi.py

2 Djangoアプリを作成
 プロジェクトのフォルダで下記コマンドを実行
 # python3 manage.py startapp apl1
  apl1のフォルダが自動的に生成される
   apl1/
   __init__.py
    admin.py
    apps.py
    migrations
    models.py
    tests.py
    views.py
    models.py
    tests.py
    views.py

3 プロジェクトの初期設定
(プロジェクト名)/settings.pyファイルで次の2つを編集
・INSTALLED_APPS変数
・TEMPLATES変数のDIRS
(1)INSTALLED_APPS変数にアプリケーションを登録
 manage.pyがあるフォルダからのapps.pyまでのパスと定義されているクラス名を登録する
 自動生成されたapps.pyのクラス

from django.apps import AppConfig
class Apl1Config(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'apl1'

(プロジェクト名.settings.pyの抜粋)
  ’apl1.apps.Apl1Config’を追加する

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'apl1.apps.Apl1Config'
]

(2)テンプレートフォルダの指定
 HTMLテンプレートファイルを格納するフォルダを作成して登録する。ここではmanage.pyと同じディレクトリtemplatesフォルダを作成する。

BASE_DIRがmanage.pyと同じディレクトリを指すため、
‘DIRS’: [BASE_DIR/’templates’],で指定

4 URLのディスパッチの設定(urls.py)
 プロジェクトフォルダにあるurls.pyのURLパターンに該当するページが無いとき、プロジェクトフォルダにあるurls.pyのurlpatterns変数に追記して、アプリケーションフォルダ内のurls.pyを参照するようにする。
(プロジェクト名)/urls.pyに下記の赤枠内を追加

"""ex1 URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/3.2/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path,include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('apl1.urls')),
]

5 Djangoアプリのモデルを作成
「models.Model」クラスを継承した「Apl1Model」クラスを宣言し、科目を示す「itemname」(CharFieldで文字列型)、点数を示す「itemvalue」(IntegerFieldで整数型)を定義する

from django.db import models
# Create your models here.

class Apl1Model(models.Model):
    itemname = models.CharField(max_length=100)
    itemvalue = models.IntegerField()

6 モデルをデータベースに反映する(1) (makemigrationsコマンド)
 models.pyのデータ設計図をデータベースに書き込む前にmakemigrationsコマンドによってmodels.pyから中間の設計図(0001.pyなど)を生成する。
コマンド書式
python3 manage.py makemigrations <アプリ名>

モデルの中間ファイル”0001_initial.py”が作成される
”0001_initial.py”の内容

7 モデルをデータベースに反映する(2) (migrateコマンド)
 # python3 manage.py migrate

8 Djangoアプリのモデルのテストオブジェクトを作成
(1)スーパーユーザの作成
  # python3 manage.py createsuperuser
  Username (leave blank to use ‘root’): user
  Email address: user@sample.com
  Password:
  Password (again):
  The password is too similar to the username.
  This password is too short. It must contain at least 8   characters.
  This password is too common.
  Bypass password validation and create user anyway? [y/N]: y
  Superuser created successfully.

(2)サーバの起動
  # python3 manage.py runserver

(3)管理画面にログイン
  http://127.0.0.1:8000/admin/」へアクセスしてログインする

GroupsとUsersというユーザに関わる情報が表示される。アプリのデータモデルを管理画面上で表示、追加/削除するには、admin.pyファイルで定義する必要がある。

(4)管理画面にデータモデルを表示するように変更
 admin.site.register()メソッドの引数に作成したモデル「Apl1Model」を指定する。

from django.contrib import admin
from .models import Apl1Model
# Register your models here.
admin.site.register(AppModel)

 ・サーバの再起動
  # python3 manage.py runserver

 ・管理画面にログイン
  http://127.0.0.1:8000/admin/」へアクセスしてログインする

(5)管理画面からテストオブジェクトを追加

3科目の成績データを入力

9 成績一覧を表示
(1)URLの準備
 (アプリ名)/urls.pyの編集

from django.urls import path
from . import views
from .views import Apl1List
urlpatterns = [
    path('', views.index, name='index'),
    path('list/', Apl1List.as_view()),
]

 Djangoには関数ベースのビューと、クラスベースのビューの2種類があり、クラスベースは利用する時にas_view() クラスメソッドからviewオブジェクトを生成する。

(2)ビューの準備
 (アプリ名)/views.pyの編集

from django.shortcuts import render
from django.views.generic.list import ListView
from .models import Apl1Model
# Create your views here.
from django.http import HttpResponse
def index(request):
 return HttpResponse("Hello, world")
class Apl1List(ListView):
    template_name = 'list.html'
    model = Apl1Model

(3)HTMLテンプレートファイルの準備
 list.htmlファイルは、settings.py内のTEMPLATES変数のDIRSで設定した’templates’フォルダ直下に作成
Django Template Language (DTL)を使って書く

{% for item in object_list %}
<ul>
<li>{{ item.itemname }}</li>
<li>{{ item.itemvalue }}</li>
</ul>
{% endfor %}

(4)ページの確認
 サーバを再起動して、
 ”http://127.0.0.1:8000/list/”へアクセス
 # python3 manage.py runserver

The end

PythonのWebアプリケーションフレームDjangoを使う ーその1 Djangoの導入ー

 Webアプリケーションを作成するフレームワークには、javaにはspringboot、phpにはLaravel、PythonにはDjangoなどがある。これらのフレームワークは使い方は異なるものの下記の仕組みを持っている。
 ・MVC(Model・View・Control)デザインパターン
 ・O/Rマッピング(Object/RDB mapping)
 ・ページのディスパッチ先の定義
 ・ページのテンプレート
 ・データベースのテーブルを生成するマイグレーション
 ・データベースにテストデータを作成するシーダ
 ここではPythonのWebアプリケーションフレームワークであるDjangoについてインストールから設定、ビューのブラウザ表示について記載します。

1.Djangoとは
 ・Djangoは、Pythonで実装されたWebアプリケーションフレームワーク。
 ・MVCデザインパターンに従う。
 ・2005年7月にBSD Licenseで公式にリリース。
  ライセンス: 3-clause BSD
  最新版: 3.1 / 2020年8月4日
 ・プログラミング言語: Python
 ・開発元: ジャンゴソフトウェア財団
 ・サイズ: 8.9 MB
 ・作者: エイドリアン・ホロバティ(英語版)、サイモン・ウィリソン(英語版)
(出典 wikiから)

2.本稿の開発環境
(1)ホストOS
 Windows 10 Pro
(2)仮想環境(VirtualBox)
 ・ゲストOS:CentOs8(Red Hat 64-bit)
 ・pythonバージョン
  Python 3.6.8
 ・MySQL Serverのバージョン 
   # mysqld –version
  /usr/libexec/mysqld Ver 8.0.26 for Linux on x86_64
  (Source distribution)
 ・MySQL Clientのバージョン
  # mysql –version
  mysql Ver 8.0.26 for Linux on x86_64
  (Source distribution)
 ・Djangoのインストール
  # python3 -m pip install Django
  # python3 -m django –version
  3.2.7
 仮想環境の作成については下記のページを参照
 VirtualBoxにCentOS8の環境作成

3.公式サイト
 https://www.djangoproject.com/
 最新の公式バージョンは3.2.7(LTS)(注)
 (注)LTSはLong Term Supportの略字で長期間サポートのバージョン。
 Djangoの場合、通常バージョン(STS)は保証する期間は16ヶ月、LTSバージョンは3年。

4.Djangoの導入
(参考)
 はじめての Django アプリ作成、その 1
 https://docs.djangoproject.com/ja/3.2/intro/tutorial01/
(1)プロジェクトの作成
 プロジェクトフォルダを作成する作業ディレクトリに移動して下記コマンドを実行
 $ django-admin startproject (プロジェクト名)
 ※プロジェクトの名前は組み込みの Python モジュールやDjango のコンポーネントの名前を使わないこと。

 作業ディレクトリ/
  db.sqlite3
  manage.py
  プロジェクト名/
   init.py
   settings.py
   urls.py
   asgi.py
   wsgi.py
(ディレクトリ、ファイル(モジュール)の説明) 
 ・manage.py: Django プロジェクトに対する様々な操作を行うためのコマンドラインユーティリティ。
 ・プロジェクト名/のディレクトリは、このプロジェクトの実際のPython パッケージ。
 この名前が Pythonパッケージの名前でimport の際に使用する名前。
   (例 import mysite.urls)
 ・init.py: このディレクトリ(プロジェクト名/)が PythonパッケージであることをPythonに知らせるための空のファイルです。
 ・settings.py: Djangoプロジェクトの設定ファイル
 ・urls.py: DjangoプロジェクトのURL宣言
 ・asgi.py: プロジェクトを提供するASGI互換Webサーバーのエントリポイント
 ・wsgi.py: プロジェクトをサーブするためのWSGI互換Webサーバーとのエントリーポイント
(注)ASGI(Asynchronous Server Gateway Interface)
   :非同期サーバーゲートウェイインターフェース
  WSGIと呼ばれるPythonのWebサーバとWebアプリケーションが通信するためインタフェース定義の後継仕様で
  WebSocketと非同期をサポートするように設計されている。

(2)開発用サーバの起動
 作業ディレクトリに移動して、下記のコマンドを実行
 $ python3 manage.py runserver
 ブラウザで http://127.0.0.1:8000/ にアクセスする

 (注1)Django 開発サーバ
  Python だけで書かれた軽量な Web サーバで開発中の利用だけを考えて設計されている。

 (注2)ポート番号
  デフォルトではrunserverマンドは内部IPのポート8000で起動する。
  サーバーのポートを変えたい場合はコマンドライン引数を渡す。
  (例 ポート 8080 で起動
 $ python manage.py runserver 8080)   
(例 全ての IP からのリクエストを受け付けるには0:ポート番号を指定
 $ python manage.py runserver 0:8080)

 (注3)サーバのリロード
   開発サーバーは必要に応じてリクエストごとにPythonコードを自動的にリロードする

仮想マシン内のブラウザから接続
http://localhost:8000

(3)アプリケーション(sample)の作成
 プロジェクトフォルダと同じディレクトリで下記コマンドを実行
 python3 manage.py startapp (アプリケーション名)
  アプリケーションは Pythonパス上のどこにでも置くことができる。
  manage.py ファイルと同じディレクトリにアプリを作成することで、それ自身のトップレベルモジュールとしてインポートできる。
・アプリケーションsampleの作成
  $ python3 manage.py startapp sample
 
  作業ディレクトリ/
  db.sqlite3
  manage.py
  プロジェクト名/
   init.py
   settings.py
   urls.py
   asgi.py
   wsgi.py
  sample/
   init.py
   admin.py
   apps.py
   migrations/
   init.py
   models.py
   tests.py
   views.py

(4)アプリケーションの登録
 setting.pyのINSTALLED_APPSにアプリケーションを登録する。アプリケーション構成クラスを直接指定するか、または使用するパッケージを設定する。
 アプリケーションのディレクトリがプロジェクトのディレクトリと同じレベルのとき、
INSTALLED_APPS = [
 ’sample’,
又は
 ’sample.apps.SampleConfig’,
]

setting.pyにアプリケーションを追加

(5)ビューの作成
  views.pyをPythonコードで編集する。Djangoのビュー(view)はページがリクエストされたときにサーバー内でどのような処理をするかを記述したもの。

# vi views.py

from django.shortcuts import render
# Create your views here.
from django.http import HttpResponse
def index(request):
    return HttpResponse("Hello, world")

 Djangoには関数ベースのビューと、クラスベースのビューの2種類があり、ここでは関数index()を定義。

(5) プロジェクトのurls.pyファイル編集
  プロジェクトのルートのurls.pyにアプリケーションのurls.pyを参照するように下記を追加する
 ・django.urls.includeのimportを追加
 ・urlpatterns のリストにinclude()を挿入
  path(‘sample/’, include(‘sample.urls’)),
 (例:
  from django.contrib import admin
  from django.urls import include, path
  urlpatterns = [
   path(‘sample/’, include(‘sample.urls’)),
   path(‘admin/’, admin.site.urls),
  ] 

"""mysite URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/3.2/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import include,path

urlpatterns = [
    path('sample/', include('sample.urls')),
    path('admin/', admin.site.urls),
]

 

(6)アプリケーションのurls.pyファイルの作成
 アプリ名のフォルダにビューを呼ぶためのURLの対応付けするファイル(urls.py)を作成

from django.urls import path
from . import views
urlpatterns = [
    path('', views.index, name='index'),
]

 path関数は、第一引数:URL、第二引数:そのURLに対応するview関数、名前付き引数name:テンプレート内で指定するURLの名称でnameは省略可能。省略するとview関数の名前がそのまま利用される。

(7)開発サーバの起動
 作業ディレクトリに移動して、下記のコマンドを実行 
 # python3 manage.py runserver
 ブラウザで http://localhost:8000/sample/ にアクセスする 

The end

VirtualBoxにCentOS8の環境作成

目次


VirtualBoxで仮想マシン上にゲストOSとしてCentOS8をインストールし、C及びC++コンパイラ、Python、Apatch(HTTPサーバー)の環境を作成する。

1.仮想マシンの作成とCentOS8のインストール
(1)CentOS8のダウンロード
iSOイメージファイル
http://isoredirect.centos.org/

ミラーサーバーが表示されるので選択する

DVD ISOファイルをダウンロードする

ダウンロードしたファイル

(2)仮想マシンの作成とゲストOSのインストール
・「新規」を選択

・メモリサイズを2048MBに設定

・ハードディスクVDI・可変・20GBに設定

・仮想マシンを起動する

・起動ハードディスクの選択画面が表示される

フォルダを選択し、光学ディスク選択画面で「追加」を選択する

・ダウンロードしたファイルを選択する

・選択一覧に表示されたファイルを選択して「選択」押下

・CentOS8のISOイメージの表示を確認して「起動」押す

・「ライセンス情報」を選択

「アクティビティ」を選択するとメニューが表示される

(3)ネットワークの設定
 # cd /etc/sysconfig/network-scripts
 # vi ifcfg-enp0s3
 ONBOOT=noをONBOOT=yesにする

(4)PuTTY(リモートログオンクライアント)による接続
 SSHでホストから仮想マシンに接続するためのポートフォワーディングの設定を行います。
 VirtualBoxマネージャーから設定>ネットワーク>アダプター1のタブ選択>「高度」選択>ポートフォワーディング選択で「+」で追加します。
 ここではホストポート2222、ゲストポート22とします。

ホスト:127.0.0.1 ポート:2222で接続します。

(5)WinSCP(SSHクライアント)による接続

2.Cコンパイラのインストール
[root@localhost ~]# gcc –version

yesで継続

# gcc –version
gcc (GCC) 8.4.1 20200928 (Red Hat 8.4.1-1)

3.C++コンパイラのインストール
[root@localhost ~]# g++ –version

yesで継続

# g++ –version
g++ (GCC) 8.4.1 20200928 (Red Hat 8.4.1-1)

4.pythonのインストール
(1)python
 CentOS8にpython3はインストール済
 # python3 –version
 Python 3.6.8

(2)PythonIDLE
 ・Python3 IDEのインストール
 # yum install python3-tools
 ・CentOSのディスクトップで端末を起動
 # idle3
 リモートでsshで実行。idleはリモートでは使えない。

quit()で終了

5.Apatch(HTTPサーバー)のインストール
(1)Apache httpdパッケージの確認
 # dnf list | grep httpd

(2)Apache httpdパッケージのインストール
・下記の4つをインストール
httpd.x86_64 httpdウェブサーバー本体
httpd-devel.x86_64 httpd開発ツール、モジュールなど
httpd-manual.noarch httpdのマニュアル
httpd-tools.x86_64 httpdに関連するツール群
・インストール
# dnf -y install httpd httpd-tools httpd-devel httpd-manual

(3)Apache httpdインストール後の確認
  $ dnf list installed | grep http

(4)インストール先(パス)確認
$ which httpd

(5)httpd起動と確認
・起動
 # systemctl start httpd
・状態確認
 $ systemctl status httpd
  Active: active (running) since ・・・

・プロセスの稼働の確認
 $ ps -aux | grep httpd

・httpd自動起動の設定
 # systemctl enable httpd
・自動起動が設定されたことを確認
 $ systemctl is-enabled httpd
 enabled

(6)firewallの許可設定
・firewallの設定
 # firewall-cmd –add-service=http –permanent
・設定の反映
 # firewall-cmd –reload
・firewallの設定確認
 # firewall-cmd –list-all
  services:にサービス名が設定されていることを確認

・tcpプロトコルのポート番号
/usr/lib/firewalld/services/http.xml

<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>WWW (HTTP)</short>
  <description>HTTP is the protocol used to serve Web pages. If you plan to make your Web server publicly available, enable this option. This option is not required for viewing pages locally or developing Web pages.</description>
  <port protocol="tcp" port="80"/>
</service>

(7)テストページの確認
 VirtualBoxの仮想マシンのホスト→ゲストのポート変換の設定

ホストのブラウザからhttp://localhost

下記のフォルダにindex.htmlの名前で置く
/var/www/html/index.html

6.Mysql のインストール
(1)最新バージョンの確認
  # dnf info mysql-server

(2)mysql-serverのインストール
# dnf install mysql-server
・バージョン確認
# mysql –version
mysql  Ver 8.0.26 for Linux on x86_64 (Source distribution)

(3)mysqlclientのインストール
# yum install mysql-devel
 # pip3 install mysqlclient
Successfully installed mysqlclient-2.0.3

(4)ファイアウォールにmysqlを追加
# firewall-cmd –add-service=mysql –zone=public — permanent
# firewall-cmd –list-all
services:に”mysql”が追加される
services: cockpit dhcpv6-client http https mysql ssh

(4)MySQLの起動
 # service mysqld start
 # systemctl status mysqld

(5)MySQLの起動
 # service mysqld start
 # systemctl status mysqld

(6)mysqlの初期設定
 # mysql_secure_installation

下記の入力を求められる(入力値は本環境の例)
・VALIDATE PASSWORDコンポーネントをセットアップする? :n
・New password:? 空は設定できない。ここでは半角スペースを入力
・匿名ユーザーを削除しますか? :n
・rootログインをリモートで禁止しますか? :y
・テストデータベースを削除してアクセスしますか? :y
・特権テーブルをリロードしますか? :n

(6)データベースサーバに接続と確認
・mysqlサーバに接続
  # mysql -u root -p
・データベースの一覧の確認
  # mysql -u root -p
  Enter password:
・データベースの作成
  mysql> CREATE DATABASE (データベース名);
・データベースを選択
mysql> USE (データベース名);
・テーブル一覧確認
mysql> SHOW tables;
mysql> CREATE TABLE (テーブル名);
・テーブルの動作確認
作成したテーブルにデータを挿入・取得して動作確認する
現在のテーブルデータ
mysql> SELECT * FROM (テーブル名);
テーブルにデータ追加
INSERT INTO テーブル名(フィールド名) VALUES (‘値’);
取得
SELECT * FROM (テーブル名);

7.ホスト側からゲスト側に繋がらないときの対処方法
(1)ゲストOSのファイアウォール
・services:にサービス名が設定されていることを確認する
# firewall-cmd –list-all

・サービス名がないときは追加する
 service=httpを追加する
 firewall-cmd –permanent –add-service=http
 firewall-cmd –reload
・firewalldの起動状態
 $ systemctl status firewalld
・設定の反映
 # firewall-cmd –reload
・設定確認
 # firewall-cmd –list-all

・firewallサービスの停止
 $ systemctl stop firewalld
・firewallサービスの起動
 $ systemctl start firewalld

(2)サービスの状態を確認
 sshd(デーモン) の状態
 $ sudo systemctl status sshd

・sshdの設定ファイル
 # vi /etc/ssh/sshd_config

(3)IPアドレスの確認
 $ ifconfig

(4)iptables

 iptables(Linuxに実装されたパケットフィルタリング型のファイアウォール機能)の設定を確認する
 # iptables –version

・ポートの解放
 # iptables -I INPUT 5 -p tcp -m tcp –dport 443 -j ACCEPT
・ポートの設定確認
 # iptables -L

(5)接続待ちポートの確認
接続待ちをしているポートを確認する(ssコマンド)
 # ss -atn
 -a 全てのソケットを表示
 -n サービス名に変換せずに表示
 -t TCP情報のみ表示
 -u UDP情報のみ表示

(6)SELinux
SELinux(Security-Enhanced-Linuxの略称)は細かいアクセス制御を可能とする。
・SELinuxの状態の確認
# getenforce
・無効化
# setenforce 0
setenforceでの変更はリアルタイムで一時的なもので再起動すると初期化される。恒久的に設定を有効化、もしくは無効化する場合は下記ファイルに設定する。
# vi /etc/selinux/config

・有効の設定 SELINUX=enforcing
・無効で警告表示のみの設定 SELINUX=permissive
・無効の設定 SELINUX=disabled

The subject ends herewith.