20201028のPHPに関する記事は23件です。

Laravel:検索機能をつける方法

【概要】

1.結論

2.どのようにコーディングするか

3.開発環境

1.結論

$変数 = モデルクラス :: where(カラム名 , $request->request)->all or find or first();

をつける!

2.どのようにコーディングするか

app/Http/Controllers/PersonController.php
    public function search (Request $request)
    {
        $item = User::where('name',$request->input)->first(); #---❶
        $param = ['input' => $request->input, 'item' => $item]; #---❷
        return view('user.find', $param); #---❸
    }


❶:Userテーブルで、whereを使用し、nameカラムを指定しています。Requestは、クライアントから送られてくる情報を含んでおり$request->inputでファイル以外のデータを受け取っています。firstは条件に引っかかった最初だけを拾っています。
❷:paramの中にinput, itemを入れて連想配列にしています。
❸:user/findはgetした時にsearchはpostで処理しています。getの際に、paramの情報も入っています。

上記で記載したものをコントローラーに処理させたいので、ルーティングします。

routes/web.php
Route::get('user/find' , 'App\Http\Controllers\PersonController@find' );
Route::post('user/find' , 'App\Http\Controllers\PersonController@search' );

*部分検索についてはしっかり学習してから、また投稿します。

3.開発環境

PHP 7.4.10
Laravel 8.9
Apache 2.4.41
Mysql 5.6.47
Sequl Pro 1.1.2

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[PMMP]Vector3ってなにさ + ちょっとつかってみる[覚書]

はじめに

この記事はMinecraft BedRock Editionのサーバーソフト、PocketMine-MP(以下pmmp)について記述されたものです。ご了承ください。

また、著者はpmmpについて全くの初学者であり、調べながらちょこちょこ書いた覚え書きのため、すべての情報が正しいとは限りません。あらかじめ把握頂いたうえで読んでいただくことをお勧めいたします(内容の修正があればお気軽にコメント頂けると幸いです)

さらに詳しい説明は専用のdiscordサーバーの質問フォームにて質問すると確実かなと思います?

前提知識

  • Minecraftについての基本的な知識
  • pmmpのプラグイン制作についての最低限の知識(読み込むだけのプラグインをつくれればOKです)

Vector3とは

マインクラフトのx, y, zからなる座標を表すクラスです。(ソースコードはココ)
このクラスでは、座標を示す3つの変数$x, $y, $zの定義と、それに足したり引いたりして加工する関数が用意されてるみたいです。

ただ、例えば「特定のプレイヤーを指定した座標にワープさせる関数」のようなものはない様子。
/tp のようなコマンドを実装するためにはどうすればいいのでしょうか?

Entityをテレポートさせてみる

実際にプレイヤーやEntityをテレポートさせるためのコードを考えてみることにします。

pmmpで実装されている/tpコマンドの実装を見てみるとなにかわかるかも。(ソースコードはココ)

TeleportCommand.php
// Player $subject;
$subject->teleport($targetPlayer->getLocation());

どうやらこの一文がテレポートを実行しているみたい。
$subject->teleport()の実装部分も見てみましょう(ソースコードはココ)

Player.php
    public function teleport(Vector3 $pos, float $yaw = null, float $pitch = null) : bool {
        ...
}

引数にVector3型を用いていますね。
(ちなみにEntity.phpでも同じ実装がなされていることから、他Entityに対しても有効です)

以上のことから、/tpのようにエンティティを瞬間移動させるためには、

Player型 or Entity型の変数(ここでは\$entityとする)を用意

指定したい座標を代入したVector3型の変数(ここでは\$positionとする)を用意

$entity->teleport($position);

でオッケーです。

ちょっとつかってみよう

これをつかっていくつか軽い実装をしてみます。
(コマンド登録や例外処理などの方法はここでは省略しています)

プレイヤーを指定の座標に飛ばすコマンド

/warp [player] [x] [y] [z]で指定座標にテレポートできるような、/tpと同じようなコマンドを作ってみます。

ライブラリの読み込み

使うライブラリを読み込んでいきます。 1

warp.php
use pocketmine\math\Vector3;
use pocketmine\Player;

実装

warp.php
# テレポート先の座標を定義(Vector3型)
$targetPosition = new Vector3($x, $y, $z);

$player->teleport($targetPosition);

これだけです。結構単純。

結果

https://youtu.be/ysOivioXyNw
指定した座標にプレイヤー(この場合は自分)がテレポートされているのが確認できました。


  1. 実は、Vector3とPlayerのあるpocketmineディレクトリはそれぞれ違う場所にあるものです。前者は名前空間(namespace)というシステムによってpocketmineディレクトリから参照できるようになっていますが、実際にはpmmp\Math\srcにソースコードが置いてあります。(最初はどこに書いてあるかわからず混乱しました) 

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【超自分用】Laravelのページネーションのまとめ【随時更新予定】

導入

以下のコマンド導入可能

php artisan vendor:publish --tag=laravel-pagination

resources/views/vendor/pagination/の中にいろいろテンプレファイルができればおっけー

実装例

Contoroller側

xxxContoroller.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Book;

class BookListController extends Controller
{
    public function index()
    {
        $books = Book::join('users', 'books.create_user', '=', 'users.id')
            ->select('books.*', 'users.id', 'users.name')
            ->orderByRaw('books.created_at DESC')
            ->paginate(10);

        return view('bookList', ['books' => $books]);
    }
}

いろいろjoinとかしてますが、一旦無視してください。
>paginate(10);で1ページに表示する数を設定

view側

                @if (count($books) > 0)
                <table class="table table-striped task-table">
                    <thead>
                        <th>書籍タイトル</th>
                        <th>投稿者</th>
                        <th>投稿日</th>
                    </thead>
                    <tbody>
                        @foreach ($books as $book)
                        <tr>
                            <td class="table-text">
                                <div>{{ $book->title }}</div>
                            </td>
                            <td class="table-text">
                                <div>{{ $book->name }}</div>
                            </td>
                            <td class="table-text">
                                <div>{{ $book->created_at }}</div>
                            </td>
                        </tr>
                        @endforeach
                    </tbody>
                </table>
                {{ $books->links('vendor.pagination.bootstrap-4') }}
                @endif

いろいろごちゃごちゃ書いてますが無視してください
{{ $books->links('vendor.pagination.bootstrap-4') }}でブートストラップのデザインが適用可能
導入した際のファイルが実際のスタイルを記述している
image.png

他にもいろんなテンプレがあるので試してみてください
もちろん自分で書き換えることも可能

まとめ

めっちゃ便利。忘れたくない

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【PHP】classの復習

目次

classの作り方
instanceを作るためのnew
継承するためのextends
instance作成と同時に色々処理したいときの__construct()
instanceが継承元classのプロパティとメソッド取得するためのstaticselfコンビ
①instanceごとに好き勝手させないためのabstract
①instanceごとに好き勝手させないためのinterface

classの作り方

classとはプロパティ(変数)とメソッド(関数)をグルーピングしたもの。

変数や関数は、小規模開発の際は名前のつけたで管理できるが、人間なので、沢山できてくると関数や変数名を重複してうわがいてしまったり、やたら関数や変数名が長くなってしまったり、まったく関係ない処理を作りたいのに他の処理と競合してしまわないかと気を使ったりなど非効率なので、「商品情報を処理する変数と関数」「ユーザー情報を処理する変数と関数」「購入情報を処理する変数と関数」という処理に必要なプログラムをグルーピングして管理しやすくしよう!という先人の試み

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【PHP】作成中、classの復習

目次

classの作り方
instanceを作るためのnew
継承するためのextends
instance作成と同時に色々処理したいときの__construct()
instanceが継承元classのプロパティとメソッド取得するためのstaticselfコンビ
①instanceごとに好き勝手させないためのabstract
①instanceごとに好き勝手させないためのinterface

classの作り方

classとはプロパティ(変数)とメソッド(関数)をグルーピングしたもの。

変数や関数は、小規模開発の際は名前のつけたで管理できるが、人間なので、沢山できてくると関数や変数名を重複してうわがいてしまったり、やたら関数や変数名が長くなってしまったり、まったく関係ない処理を作りたいのに他の処理と競合してしまわないかと気を使ったりなど非効率なので、「商品情報を処理する変数と関数」「ユーザー情報を処理する変数と関数」「購入情報を処理する変数と関数」という処理に必要なプログラムをグルーピングして管理しやすくしよう!という先人の偉大な産物。

”設計書”と例えられることが多いが、”設計書”であるclass内のプロパティやメソッドを使うこともあり、この後出てくるが継承元にも継承先にもなるため、実態がないというイメージは持たない方が良い。

作り方

class 

継承元class=全ての個人の共通処理
親class=
instance=個人

メモ
インスタンス化できない
通常クラスの継承は、メソッド名と処理内容含め継承できるため、重複処理の記述を激減できる
abstractクラスはメソッド名のみ継承で、処理内容は継承先でそれぞれ記述する、プログラム処理上メソッド名を統一したい、最低限必要な共通メソッド名なので漏れないでほしい
abstractクラスは処理を書かないので当然__constructはかけない、そのため

abstractクラス:最低限必要なメソッド名を定義(抽象的な定義)
通常クラス:abstractクラスから継承したメソッドの処理を記述+__constructでインスタンス化した時の共通処理を記述(具体的な処理内容の記述)

abstractクラス(抽象的な定義)

通常クラス(具体的な処理内容の記述)

インスタンス(決められたプロパティとメソッドの取得作業)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

header関数が効かない話

はじめに

PHPでREST APIを作っていたときにふと気づいたのでメモ。

追記: http_response_code()を使いましょう(@tadsan さん、ご指摘ありがとうございます)

環境

二つのサーバで同時に同じものを動かしています。(CI/CD)

  • 開発サーバ (非公開)

    • 場所: さくらインターネット レンタルサーバ(スタンダード)
    • バージョン
      • php: PHP 7.4.10 モジュールモード
  • デプロイサーバ (公開)

    • 場所: さくらインターネット レンタルサーバ(スタンダード)
    • バージョン
      • php: PHP 7.4.10 CGIモード

header関数の挙動がおかしい

REST APIの場合、処理の結果はHTTPステータスコードで返すことが多いかと思います。
(処理に成功したら200 OKまたは201 Created、エラーが発生したら400 Bad Requestなど)
今回の設計もそれに倣い、header関数でステータスコードを返そうとしたのですが…

なぜか、headerがうまく働かないのです。

HTTPレスポンスを返すheaderの書き方

headerにはいくつかの書き方があります。

headerEx.php
    // 方法1. HTTPレスポンスを直接記述する
    header("HTTP/1.1 400 Bad Request");

    // 方法2. 引数 $header, $replace, $code を設定する
    header('HTTP', true, 400);

公式ドキュメントによると、後ろ二つの引数は指定されていなくても動くようです。

ではまず、方法1にならってheaderを呼び出してみます。

<?php
    // (<?phpの前に任意の文字列がないようにしてください)
    header('HTTP', true, 400);
?>
<html><body>
    <h1>400 Bad Request</h1>
    <p>This page is not working properly.</p>
    <p>If this issue occur repeatedly, please contact administrator.</p>
</body></html>

このプログラムを開発サーバに配置し、httpリクエストを投げてみます。

    HTTP/2 400 
    server: nginx
    date: Wed, 28 Oct 2020 09:38:50 GMT
    content-type: text/html; charset=UTF-8
    content-length: 148
    x-powered-by: PHP/7.4.10
    <html><body>
        <h1>400 Bad Request</h1>
        <p>This page is not working properly.</p>
        <p>If this issue occur repeatedly, please contact administrator.</p>
    </body></html>

問題なく動作することが確認できます。しかし、これをデプロイサーバに移すと…

    HTTP/1.1 500 Internal Server Error
    Server: nginx
    Date: Wed, 28 Oct 2020 09:41:38 GMT
    Content-Type: text/html; charset=iso-8859-1
    Content-Length: 531
    Connection: keep-alive
    <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    <html><head>
    <title>500 Internal Server Error</title>
    </head><body>
    <h1>Internal Server Error</h1>
    <p>The server encountered an internal error or
    misconfiguration and was unable to complete
    your request.</p>
    <p>Please contact the server administrator at 
    [no address given] to inform them of the time this error occurred,
    and the actions you performed just before this error.</p>
    <p>More information about this error may be available
    in the server error log.</p>
    </body></html>

サーバが生成したと思しき 500 Internal Server Errorが返ってきます。

送るリクエストの内容にかかわらず、header($header, $replace, $code)の形でレスポンスコードを書き換えるとServer Errorが返されてしまいます。

発生原因と対策

この現象はどうやらPHPがCGIモードで動作していると発生するようです。
(詳しくは検証していませんが、似たような現象が発生しているページを発見しました)

この現象はheaderの引数に直接ヘッダを記述することで回避できます。

<?php
    // (<?phpの前に任意の文字列がないようにしてください)
    header("HTTP/1.1 400 Bad Request");
?>
<html><body>
    <h1>400 Bad Request</h1>
    <p>This page is not working properly.</p>
    <p>If this issue occur repeatedly, please contact administrator.</p>
</body></html>

実行すると以下のようになります。

開発サーバの場合
HTTP/2 400 
server: nginx
date: Wed, 28 Oct 2020 11:54:24 GMT
content-type: text/html; charset=UTF-8
content-length: 148
x-powered-by: PHP/7.4.10
<html><body>
    <h1>400 Bad Request</h1>
    <p>This page is not working properly.</p>
    <p>If this issue occur repeatedly, please contact administrator.</p>
</body></html>
デプロイサーバの場合
HTTP/1.1 400 Bad Request
Server: nginx
Date: Wed, 28 Oct 2020 11:55:24 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
<html><body>
    <h1>400 Bad Request</h1>
    <p>This page is not working properly.</p>
    <p>If this issue occur repeatedly, please contact administrator.</p>
</body></html>

どちらも想定通りのレスポンスコード及びコンテンツボディが返されていることがわかります。

結論

header関数によるレスポンスコード書き換えの際は呼び出し方に注意した方が良さそうです。
今回はデプロイサーバが古く、PHPをモジュールモードで動かせなかったため
このような実装で乗り切りました。

    function make_response($responseCode){
        // php_sapi_nameで動作モードを確認し、呼び出し方を変える
        $phpMode = strtolower(php_sapi_name());
        if(strpos($phpMode, "cgi") === FALSE){
            header('HTTP', true, $responseCode);
        }else{
            header("HTTP/1.1 $responceCode");
        }
    }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Computeインスタンス上にPHPのWebアプリケーション環境を構成し、Database Cloud ServiceのDBシステムにアクセスしてみた

はじめに

Computeインスタンス上に構成したPHPのWebアプリケーションからDatabase Cloud Serviceにアクセスしてみた時の手順です。
(2020年10月現在)

構築イメージ

今回構築した環境のイメージはこのような感じです。
スクリーンショット 2020-10-28 18.24.02.png

作業の流れ

1.VCNの構成
2.ネットワーク・セキュリティ・グループの作成
3.DBシステムの作成
4.Computeインスタンス(APサーバ)の作成
5.パブリックIPの作成
6.パブリックIPの割り当て
7.Oracle Instant Clientのインストールと設定
8.Apache/PHPのインストールと設定
9.firewalldの設定
10.SELinuxの設定
11.Apache/PHPの動作確認
12.DBシステム(DBサーバ)の設定
13.アプリケーションで使用するDBデータの準備
14.APサーバの設定
15.PHPアプリケーションの動作確認

1. VCNの構成

こちらの記事を参考に、仮想クラウド・ネットワークを構成します。

OCIのネットワークを構成する際に手戻りの少ない手順を考えてみる(初心者向け)

2.ネットワーク・セキュリティ・グループの作成

APサーバ、DBサーバそれぞれに適用するネットワーク・セキュリティ・グループを作成します。

「コンソールメニュー」 → 「ネットワーキング」 → 「仮想クラウド・ネットワーク」 → 「仮想クラウドネットワークの詳細」 → 「ネットワーク・セキュリティ・グループ」

<APサーバ用のネットワーク・セキュリティ・グループ>
「ネットワーク・セキュリティ・グループの作成」をクリック
 ・名前:Network Security Group for AP
 ・コンパートメントに作成:「Compartment1」を選択
 ・「次」をクリック
 ・セキュリティ・ルールの追加
  ルール
   ステートレス:チェックをオフ(デフォルト)
   方向:「イングレス」を選択
   ソースタイプ:「CIDR」を選択
   ソース:0.0.0.0/0
   IPプロトコル:「TCP」を選択
   ソース・ポート範囲:デフォルトのまま(入力しない)
   宛先ポート範囲:80
  説明:Security Rule for HTTP(TCP 80)
 ・「作成」をクリック

<DBサーバ用のネットワーク・セキュリティ・グループ>
・「ネットワーク・セキュリティ・グループの作成」をクリック
 ・名前:Network Security Group for DB
 ・コンパートメントに作成:「Compartment1」を選択
 ・「次」をクリック
 ・セキュリティ・ルールの追加
  ルール
   ステートレス:チェックをオフ(デフォルト)
   方向:「イングレス」を選択
   ソースタイプ:「ネットワーク・セキュリティ・グループ」を選択
   ソースNSG:「NSG for AP」を選択
   IPプロトコル:「TCP」を選択
   ソース・ポート範囲:デフォルトのまま(入力しない)
   宛先ポート範囲:1521
   説明:Security Rule for Oracle Net Listener on DB System
 ・「作成」をクリック

3.DBシステム(DBサーバ)の作成

「コンソールメニュー」 → 「ベア・メタル、VM、Exadata」

「DBシステムの作成」をクリック

 DBシステム情報
 ・コンパートメントの選択:「Compartment1」を選択
 ・DBシステムの名前の指定:DBSystem1
 ・可用性ドメインの選択:任意の可用性ドメインを選択
 ・シェイプ・タイプの選択:「仮想マシン」を選択
 ・シェイプの選択:任意のシェイプを選択
 ・Oracle Database ソフトウェア・エディション:任意のエディションを選択
 ・ストレージ管理ソフトウェアの選択:任意のストレージ管理ソフトウェアを選択
 ・ストレージの構成 使用可能なストレージ(GB):任意のストレージサイズを選択
 ・公開SSHキーの追加:「 SSHキー・ファイルのアップロード」を選択、「browse」をクリックして共有鍵ファイル(.pub)を選択
 ・ライセンス・タイプの選択:「含まれるライセンス」を選択
 ・仮想クラウド・ネットワーク:「VCN1」を選択
 ・クライアントのサブネット:「Subnet1」を選択
 ・ネットワーク・セキュリティ・グループを使用してトラフィックを制御:チェックをオン
 ・ネットワーク・セキュリティ・グループ:「Network Security Group for DB」を選択
 ・ホスト名接頭辞:db1
 ・「拡張オプションの表示」をクリック
 ・フォルト・ドメイン オプション:任意のフォルト・ドメインを選択
 ・タイム・ゾーン:「Asia/Tokyo」を選択 

「次」をクリック

データベース情報
 ・データベース名:DB1
 ・データベースのバージョン:「19c」を選択
 ・PDB名:PDB1
 ・管理者資格証明の作成 パスワード:Demo#1Demo#1
 ・管理者資格証明の作成 パスワードの確認:Demo#1Demo#1
 ・自動バックアップの有効化:チェックをオン
 ・バックアップ保持期間:「7days」を選択
 ・バックアップスケジューリング:「Anytime」を選択
 ・「拡張オプションの表示」をクリック
  ・文字セット:「AL32UTF8」を選択(デフォルト)
  ・各国語文字セット:「AL16UTF16」を選択(デフォルト)

「DBシステムの作成」をクリック

4.Computeインスタンス(APサーバ)の作成

「コンソールメニュー」 → 「コンピュート」 → 「インスタンス」

「インスタンスの作成」をクリック
 ・名前:AP1
 ・コンパートメントに作成:任意のコンパートメントを選択

 ・配置とハードウェアの構成
  ・可用性ドメイン:任意のADを選択
  ・イメージ:「Oracle Linux 7.8」を選択
  ・シェイプ:任意のシェイプを選択

 ・ネットワーキングの構成 
  ・ネットワーク:「既存の仮想クラウド・ネットワークを選択」を選択し、「VCN1」を選択
  ・サブネット:「既存のサブネット」を選択し、「Subnet 1」を選択
  ・ネットワーク・セキュリティ・グループを使用してトラフィックを制御:チェックをオン
  ・ネットワーク・セキュリティ・グループ:「Network Security Group for AP」を選択
  ・パブリックIPアドレス:「パブリックIPアドレスを割り当てないでください」を選択
 
 ・SSHキーの追加
  ・「公開キー・ファイルの選択」を選択し、「または場所を参照します」をクリックして公開キー・ファイルをアップロードします
 
 ・ブートボリュームの構成
  ・全てデフォルトのまま

 ・「拡張オプションの表示」をクリック
  ・「管理」タブ
   ・全てデフォルトのまま
  ・「ネットワーキング」タブ
   ・プライベートIPアドレス:10.0.1.100
   ・ホスト名:ap1
   ・起動オプション:デフォルトのまま
  ・「イメージ」タブ
   ・デフォルトのまま
  ・「配置」タブ
   ・デフォルトのまま
「作成」をクリック

5.予約済パブリックIPの作成

「コンソールメニュー」 → 「ネットワーキング」 → 「IP Management」

「パブリックIPアドレスの予約」をクリック

 ・予約済パブリックIPアドレス名:PublicIP1
 ・コンパートメントに作成:「Compartment1」を選択
 ・IPアドレスのソース:「Oracle」を選択

 ・「パブリックIPアドレスの予約」をクリック

6.予約済パブリックIPの割り当て

「コンソールメニュー」 → 「コンピュート」 → 「インスタンス」 → 「インスタンスの詳細」

・リソース欄の「アタッチされたVNIC」をクリック
VNIC名(AP1)をクリック
・リソース欄の「IPアドレス」をクリック
IPアドレスの欄の「:」をクリックし、「編集」をクリック
 ・パブリックIPタイプ:「予約済パブリックIP」を選択
 ・「既存の予約済パブリックIPの選択」を選択
 ・RESERVED IP ADDRESS:「PublicIP1」を選択
「更新」をクリック

7.Oracle Instant Clientのインストール

秘密鍵を使って、SSHクライアントからComputeインスタンス(AP1)にopcユーザでログインします。

タイムゾーンとロケールを設定します。

sudo timedatectl set-timezone Asia/Tokyo
sudo localectl set-locale LANG=ja_JP.utf8

yumコマンドでOracle Instant Clientをインストールします。

sudo yum -y install oracle-release-el7

sudo yum install -y oracle-instantclient19.6-sqlplus.x86_64

/etc/profileを編集し、環境変数の設定を追加します。

sudo vi /etc/profile

以下の内容をファイルの末尾に追加して保存します。

/etc/profile
export ORACLE_HOME=/usr/lib/oracle/19.6/client64/lib
export NLS_LANG=Japanese_Japan.AL32UTF8
export LD_LIBRARY_PATH=$ORACLE_HOME:$LD_LIBRARY_PATH
export PATH=/usr/lib/oracle/19.6/client64/bin:$PATH

環境変数を適用します。

source /etc/profile

8.PHPとApache のインストールと設定

yumコマンドでPHPとApacheをインストールします。

sudo yum install -y oracle-php-release-el7

sudo yum -y install php php-oci8-19c

PHPとApacheの連携を設定します。

sudo vi /etc/httpd/conf/httpd.conf

以下の内容をファイルの末尾に追加して保存します。

/etc/httpd/conf/httpd.conf
<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>

Apacheを起動します。

sudo systemctl start httpd.service

OS起動時のApacheが自動的に起動するように設定します。

sudo systemctl enable httpd.service

9.firewalldの設定

firewall-cmdコマンドでfirewalldにhttp通信を許可する設定を追加します。

sudo firewall-cmd --add-service=http --zone=public --permanent
sudo firewall-cmd --reload
sudo firewall-cmd --list-all --zone=public

10.SELinuxの設定変更

SELinuxの設定を変更します。

sudo setenforce 0

再起動後にSELinuxが有効にならないように設定ファイルを変更します。

sudo vi /etc/selinux/config
/etc/selinux/config
SELINUX=enforcing

の部分を以下のように変更して保存します。

/etc/selinux/config
SELINUX=permissive

11.Apache/PHPの動作確認

Apacheの接続テスト用HTMLを作成します。

sudo vi /var/www/html/index.html

以下の内容を入力して保存します。

index.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>test</title>
  </head>
  <body>
    <h1>やったぜ!</h1>
  </body>
</html>

Apache + PHPの連携テスト用PHPファイルを作成します。

sudo vi /var/www/html/info.php

以下の内容を入力して保存します。

info.php
<?php
echo phpinfo();
?>

ブラウザから以下のURLにアクセスし、正しく表示されるかを確認します。

http://<AP1のパブリックIPアドレス>/index.html

http://<AP1のパブリックIPアドレス>/info.php

12.DBシステム(DBサーバ)の設定

秘密鍵を使って、SSHクライアントからDBシステムにopcユーザでログインします。

oracleユーザにスイッチします。

sudo su - oracle

SQL*Plusで管理者としてDBにログインします。

sqlplus / as sysdba

接続先を確認します。

SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT

SQL*Plusを終了します。

SQL> exit

Oracle Net Listenerのステータスを確認し、DBシステム作成時に作成されたPDBに対応したサービス名を出力結果から確認します。

lsnrctl status

 LSNRCTL for Linux: Version 18.0.0.0.0 - Production on
 <略>
 Service "pdb1.subnet1.vcn1.oraclevcn.com" has 1 instance(s).
   Instance "DB1204", status READY, has 1 handler(s) for this service...

tnsnames.oraの内容を確認します。

vi $ORACLE_HOME/network/admin/tnsnames.ora
tnsnames.ora(編集前)
# tnsnames.ora Network Configuration File: /u01/app/oracle/product/19.0.0/dbhome_1/network/admin/
tnsnames.ora
# Generated by Oracle configuration tools.

DB1 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = db1.subnet1.vcn1.oraclevcn.com)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = DB1.subnet1.vcn1.oraclevcn.com)
    )
  )

tnsnames.oraを編集し、PDB接続用のエイリアスを追加します。

tnsnames.ora(編集後)
# tnsnames.ora Network Configuration File: /u01/app/oracle/product/19.0.0/dbhome_1/network/admin/
tnsnames.ora
# Generated by Oracle configuration tools.

DB1 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = db1.subnet1.vcn1.oraclevcn.com)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = DB1.subnet1.vcn1.oraclevcn.com)
    )
  )

PDB1 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = db1.subnet1.vcn1.oraclevcn.com)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = pdb1.subnet1.vcn1.oraclevcn.com)
    )
  )

13.アプリケーションで使用するDBデータの準備

tnsnames.oraに追加したエイリアス(PDB1)を使用して、SQL*PlusでPDB1に管理者としてログインします。

sqlplus sys/Demo#1Demo#1@PDB1 as sysdba

接続先を確認します。

SQL> show con_name

CON_NAME
------------------------------
PDB1

アプリケーションで使用するDBユーザを作成します。

SQL> GRANT CONNECT,RESOURCE,UNLIMITED TABLESPACE TO test IDENTIFIED BY Test#1Test#1;

アプリケーションで使用するDBユーザ(test)としてPDB1に接続します。

SQL> CONNECT test/Test#1Test#1@PDB1

アプリケーションで使用するテーブルを作成します。

SQL> CREATE TABLE dept (
2 deptno NUMBER(2) CONSTRAINT PK_DEPT PRIMARY KEY,
3 dname VARCHAR2(14) ,
4 loc VARCHAR2(13) ) ;

アプリケーションで使用するテーブルにデータを挿入します。

SQL> INSERT INTO dept VALUES (10,'ACCOUNTING','NEW YORK');
SQL> INSERT INTO dept VALUES (20,'RESEARCH','DALLAS');
SQL> INSERT INTO dept VALUES (30,'SALES','CHICAGO');
SQL> INSERT INTO dept VALUES (40,'OPERATIONS','BOSTON');

SQL> COMMIT;

SQL> SELECT * FROM dept;

SQL*Plusを終了します。

SQL> exit

14.APサーバの設定

秘密鍵を使って、SSHクライアントからComputeインスタンス(AP1)にopcユーザでログインします。

tnsnames.oraファイルを作成します。

sudo vi $ORACLE_HOME/network/admin/tnsnames.ora

DBサーバのtnsnames.oraの内容をコピー&ペーストして保存します。

tnsnames.ora
DB1 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = db1.subnet1.vcn1.oraclevcn.com)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = DB1.subnet1.vcn1.oraclevcn.com)
    )
  )

PDB1 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = db1.subnet1.vcn1.oraclevcn.com)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = PDB1.subnet1.vcn1.oraclevcn.com)
    )
  )

SQL*PlusでAPサーバからDBシステムのPDB(PDB1)に接続します。

sqlplus test/Test#1Test#1@PDB1

接続先を確認します。

SQL> show con_name

CON_NAME
------------------------------
PDB1

SQL*Plusを終了します。

SQL> exit

アプリケーション用のPHPファイルを作成します。

sudo vi /var/www/html/test.php

下記の内容を入力して保存します。

/var/www/html/test.php
<html>
<head><meta charset="UTF-8">
<title>PHP to Oracle Connection Test</title>
</head>
<body>
<?php
    error_reporting(E_ALL);
    ini_set('display_errors', '1');

    $conn = oci_connect('test', 'Test#1Test#1', 'PDB1');
    $stid = oci_parse($conn, 'SELECT deptno,dname,loc FROM dept ORDER BY deptno');
    oci_execute($stid);
    echo "<table border='1'>\n";
    echo "<caption>DEPT Table</caption>\n";
    echo "<tr><th>Dept No.</th><th>Dept Name</th><th>Location</th></tr>\n";
    while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
        echo "<tr>\n";
        foreach ($row as $item) {
            echo " <td>" . ($item !== null ? htmlentities($item, ENT_QUOTES) : "&amp;nbsp;") . "</td>\n";
        }
        echo "</tr>\n";
    }
    echo "</table><br>\n";
    echo "Response from ".gethostname();
?>
</body>
</html>

15.PHPアプリケーションの動作確認

ブラウザから以下のURLにアクセスし、正しく表示されるかを確認します。

http://*<AP1のパブリックIPアドレス>*/test.php

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Computeインスタンス上にPHPのWebアプリケーション環境を構成して、Database Cloud ServiceのDBシステムにアクセスしてみた

はじめに

Computeインスタンス上に構成したPHPのWebアプリケーションから、Database Cloud ServiceのDBシステムにアクセスしてみた時の手順です。
(2020年10月現在)

構築イメージ

今回構築した環境のイメージはこのような感じです。
スクリーンショット 2020-10-28 18.24.02.png

作業の流れ

1.VCNの構成
2.ネットワーク・セキュリティ・グループの作成
3.DBシステムの作成
4.Computeインスタンス(APサーバ)の作成
5.パブリックIPの作成
6.パブリックIPの割り当て
7.Oracle Instant Clientのインストールと設定
8.Apache/PHPのインストールと設定
9.firewalldの設定
10.SELinuxの設定
11.Apache/PHPの動作確認
12.DBシステム(DBサーバ)の設定
13.アプリケーションで使用するDBデータの準備
14.APサーバの設定
15.PHPアプリケーションの動作確認

1. VCNの構成

こちらの記事を参考に、仮想クラウド・ネットワークを構成します。

OCIのネットワークを構成する際に手戻りの少ない手順を考えてみる(初心者向け)

2.ネットワーク・セキュリティ・グループの作成

APサーバ、DBサーバそれぞれに適用するネットワーク・セキュリティ・グループを作成します。

「コンソールメニュー」 → 「ネットワーキング」 → 「仮想クラウド・ネットワーク」 → 「仮想クラウドネットワークの詳細」 → 「ネットワーク・セキュリティ・グループ」

<APサーバ用のネットワーク・セキュリティ・グループ>
「ネットワーク・セキュリティ・グループの作成」をクリック
 ・名前:Network Security Group for AP
 ・コンパートメントに作成:「Compartment1」を選択
 ・「次」をクリック
 ・セキュリティ・ルールの追加
  ルール
   ステートレス:チェックをオフ(デフォルト)
   方向:「イングレス」を選択
   ソースタイプ:「CIDR」を選択
   ソース:0.0.0.0/0
   IPプロトコル:「TCP」を選択
   ソース・ポート範囲:デフォルトのまま(入力しない)
   宛先ポート範囲:80
  説明:Security Rule for HTTP(TCP 80)
 ・「作成」をクリック

<DBサーバ用のネットワーク・セキュリティ・グループ>
・「ネットワーク・セキュリティ・グループの作成」をクリック
 ・名前:Network Security Group for DB
 ・コンパートメントに作成:「Compartment1」を選択
 ・「次」をクリック
 ・セキュリティ・ルールの追加
  ルール
   ステートレス:チェックをオフ(デフォルト)
   方向:「イングレス」を選択
   ソースタイプ:「ネットワーク・セキュリティ・グループ」を選択
   ソースNSG:「NSG for AP」を選択
   IPプロトコル:「TCP」を選択
   ソース・ポート範囲:デフォルトのまま(入力しない)
   宛先ポート範囲:1521
   説明:Security Rule for Oracle Net Listener on DB System
 ・「作成」をクリック

3.DBシステム(DBサーバ)の作成

「コンソールメニュー」 → 「ベア・メタル、VM、Exadata」

「DBシステムの作成」をクリック

 DBシステム情報
 ・コンパートメントの選択:「Compartment1」を選択
 ・DBシステムの名前の指定:DBSystem1
 ・可用性ドメインの選択:任意の可用性ドメインを選択
 ・シェイプ・タイプの選択:「仮想マシン」を選択
 ・シェイプの選択:任意のシェイプを選択
 ・Oracle Database ソフトウェア・エディション:任意のエディションを選択
 ・ストレージ管理ソフトウェアの選択:任意のストレージ管理ソフトウェアを選択
 ・ストレージの構成 使用可能なストレージ(GB):任意のストレージサイズを選択
 ・公開SSHキーの追加:「 SSHキー・ファイルのアップロード」を選択、「browse」をクリックして共有鍵ファイル(.pub)を選択
 ・ライセンス・タイプの選択:「含まれるライセンス」を選択
 ・仮想クラウド・ネットワーク:「VCN1」を選択
 ・クライアントのサブネット:「Subnet1」を選択
 ・ネットワーク・セキュリティ・グループを使用してトラフィックを制御:チェックをオン
 ・ネットワーク・セキュリティ・グループ:「Network Security Group for DB」を選択
 ・ホスト名接頭辞:db1
 ・「拡張オプションの表示」をクリック
 ・フォルト・ドメイン オプション:任意のフォルト・ドメインを選択
 ・タイム・ゾーン:「Asia/Tokyo」を選択 

「次」をクリック

データベース情報
 ・データベース名:DB1
 ・データベースのバージョン:「19c」を選択
 ・PDB名:PDB1
 ・管理者資格証明の作成 パスワード:Demo#1Demo#1
 ・管理者資格証明の作成 パスワードの確認:Demo#1Demo#1
 ・自動バックアップの有効化:チェックをオン
 ・バックアップ保持期間:「7days」を選択
 ・バックアップスケジューリング:「Anytime」を選択
 ・「拡張オプションの表示」をクリック
  ・文字セット:「AL32UTF8」を選択(デフォルト)
  ・各国語文字セット:「AL16UTF16」を選択(デフォルト)

「DBシステムの作成」をクリック

4.Computeインスタンス(APサーバ)の作成

「コンソールメニュー」 → 「コンピュート」 → 「インスタンス」

「インスタンスの作成」をクリック
 ・名前:AP1
 ・コンパートメントに作成:任意のコンパートメントを選択

 ・配置とハードウェアの構成
  ・可用性ドメイン:任意のADを選択
  ・イメージ:「Oracle Linux 7.8」を選択
  ・シェイプ:任意のシェイプを選択

 ・ネットワーキングの構成 
  ・ネットワーク:「既存の仮想クラウド・ネットワークを選択」を選択し、「VCN1」を選択
  ・サブネット:「既存のサブネット」を選択し、「Subnet 1」を選択
  ・ネットワーク・セキュリティ・グループを使用してトラフィックを制御:チェックをオン
  ・ネットワーク・セキュリティ・グループ:「Network Security Group for AP」を選択
  ・パブリックIPアドレス:「パブリックIPアドレスを割り当てないでください」を選択
 
 ・SSHキーの追加
  ・「公開キー・ファイルの選択」を選択し、「または場所を参照します」をクリックして公開キー・ファイルをアップロードします
 
 ・ブートボリュームの構成
  ・全てデフォルトのまま

 ・「拡張オプションの表示」をクリック
  ・「管理」タブ
   ・全てデフォルトのまま
  ・「ネットワーキング」タブ
   ・プライベートIPアドレス:10.0.1.100
   ・ホスト名:ap1
   ・起動オプション:デフォルトのまま
  ・「イメージ」タブ
   ・デフォルトのまま
  ・「配置」タブ
   ・デフォルトのまま
「作成」をクリック

5.予約済パブリックIPの作成

「コンソールメニュー」 → 「ネットワーキング」 → 「IP Management」

「パブリックIPアドレスの予約」をクリック

 ・予約済パブリックIPアドレス名:PublicIP1
 ・コンパートメントに作成:「Compartment1」を選択
 ・IPアドレスのソース:「Oracle」を選択

 ・「パブリックIPアドレスの予約」をクリック

6.予約済パブリックIPの割り当て

「コンソールメニュー」 → 「コンピュート」 → 「インスタンス」 → 「インスタンスの詳細」

・リソース欄の「アタッチされたVNIC」をクリック
VNIC名(AP1)をクリック
・リソース欄の「IPアドレス」をクリック
IPアドレスの欄の「:」をクリックし、「編集」をクリック
 ・パブリックIPタイプ:「予約済パブリックIP」を選択
 ・「既存の予約済パブリックIPの選択」を選択
 ・RESERVED IP ADDRESS:「PublicIP1」を選択
「更新」をクリック

7.Oracle Instant Clientのインストール

秘密鍵を使って、SSHクライアントからComputeインスタンス(AP1)にopcユーザでログインします。

タイムゾーンとロケールを設定します。

sudo timedatectl set-timezone Asia/Tokyo
sudo localectl set-locale LANG=ja_JP.utf8

yumコマンドでOracle Instant Clientをインストールします。

sudo yum -y install oracle-release-el7

sudo yum install -y oracle-instantclient19.6-sqlplus.x86_64

/etc/profileを編集し、環境変数の設定を追加します。

sudo vi /etc/profile

以下の内容をファイルの末尾に追加して保存します。

/etc/profile
export ORACLE_HOME=/usr/lib/oracle/19.6/client64/lib
export NLS_LANG=Japanese_Japan.AL32UTF8
export LD_LIBRARY_PATH=$ORACLE_HOME:$LD_LIBRARY_PATH
export PATH=/usr/lib/oracle/19.6/client64/bin:$PATH

環境変数を適用します。

source /etc/profile

8.PHPとApache のインストールと設定

yumコマンドでPHPとApacheをインストールします。

sudo yum install -y oracle-php-release-el7

sudo yum -y install php php-oci8-19c

PHPとApacheの連携を設定します。

sudo vi /etc/httpd/conf/httpd.conf

以下の内容をファイルの末尾に追加して保存します。

/etc/httpd/conf/httpd.conf
<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>

Apacheを起動します。

sudo systemctl start httpd.service

OS起動時のApacheが自動的に起動するように設定します。

sudo systemctl enable httpd.service

9.firewalldの設定

firewall-cmdコマンドでfirewalldにhttp通信を許可する設定を追加します。

sudo firewall-cmd --add-service=http --zone=public --permanent
sudo firewall-cmd --reload
sudo firewall-cmd --list-all --zone=public

10.SELinuxの設定変更

SELinuxの設定を変更します。

sudo setenforce 0

再起動後にSELinuxが有効にならないように設定ファイルを変更します。

sudo vi /etc/selinux/config
/etc/selinux/config
SELINUX=enforcing

の部分を以下のように変更して保存します。

/etc/selinux/config
SELINUX=permissive

11.Apache/PHPの動作確認

Apacheの接続テスト用HTMLを作成します。

sudo vi /var/www/html/index.html

以下の内容を入力して保存します。

index.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>test</title>
  </head>
  <body>
    <h1>やったぜ!</h1>
  </body>
</html>

Apache + PHPの連携テスト用PHPファイルを作成します。

sudo vi /var/www/html/info.php

以下の内容を入力して保存します。

info.php
<?php
echo phpinfo();
?>

ブラウザから以下のURLにアクセスし、正しく表示されるかを確認します。

http://<AP1のパブリックIPアドレス>/index.html

http://<AP1のパブリックIPアドレス>/info.php

12.DBシステム(DBサーバ)の設定

秘密鍵を使って、SSHクライアントからDBシステムにopcユーザでログインします。

oracleユーザにスイッチします。

sudo su - oracle

SQL*Plusで管理者としてDBにログインします。

sqlplus / as sysdba

接続先を確認します。

SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT

SQL*Plusを終了します。

SQL> exit

Oracle Net Listenerのステータスを確認し、DBシステム作成時に作成されたPDBに対応したサービス名を出力結果から確認します。

lsnrctl status

 LSNRCTL for Linux: Version 18.0.0.0.0 - Production on
 <略>
 Service "pdb1.subnet1.vcn1.oraclevcn.com" has 1 instance(s).
   Instance "DB1204", status READY, has 1 handler(s) for this service...

tnsnames.oraの内容を確認します。

vi $ORACLE_HOME/network/admin/tnsnames.ora
tnsnames.ora(編集前)
# tnsnames.ora Network Configuration File: /u01/app/oracle/product/19.0.0/dbhome_1/network/admin/
tnsnames.ora
# Generated by Oracle configuration tools.

DB1 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = db1.subnet1.vcn1.oraclevcn.com)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = DB1.subnet1.vcn1.oraclevcn.com)
    )
  )

tnsnames.oraを編集し、PDB接続用のエイリアスを追加します。

tnsnames.ora(編集後)
# tnsnames.ora Network Configuration File: /u01/app/oracle/product/19.0.0/dbhome_1/network/admin/
tnsnames.ora
# Generated by Oracle configuration tools.

DB1 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = db1.subnet1.vcn1.oraclevcn.com)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = DB1.subnet1.vcn1.oraclevcn.com)
    )
  )

PDB1 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = db1.subnet1.vcn1.oraclevcn.com)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = pdb1.subnet1.vcn1.oraclevcn.com)
    )
  )

13.アプリケーションで使用するDBデータの準備

tnsnames.oraに追加したエイリアス(PDB1)を使用して、SQL*PlusでPDB1に管理者としてログインします。

sqlplus sys/Demo#1Demo#1@PDB1 as sysdba

接続先を確認します。

SQL> show con_name

CON_NAME
------------------------------
PDB1

アプリケーションで使用するDBユーザを作成します。

SQL> GRANT CONNECT,RESOURCE,UNLIMITED TABLESPACE TO test IDENTIFIED BY Test#1Test#1;

アプリケーションで使用するDBユーザ(test)としてPDB1に接続します。

SQL> CONNECT test/Test#1Test#1@PDB1

アプリケーションで使用するテーブルを作成します。

SQL> CREATE TABLE dept (
2 deptno NUMBER(2) CONSTRAINT PK_DEPT PRIMARY KEY,
3 dname VARCHAR2(14) ,
4 loc VARCHAR2(13) ) ;

アプリケーションで使用するテーブルにデータを挿入します。

SQL> INSERT INTO dept VALUES (10,'ACCOUNTING','NEW YORK');
SQL> INSERT INTO dept VALUES (20,'RESEARCH','DALLAS');
SQL> INSERT INTO dept VALUES (30,'SALES','CHICAGO');
SQL> INSERT INTO dept VALUES (40,'OPERATIONS','BOSTON');

SQL> COMMIT;

SQL> SELECT * FROM dept;

SQL*Plusを終了します。

SQL> exit

14.APサーバの設定

秘密鍵を使って、SSHクライアントからComputeインスタンス(AP1)にopcユーザでログインします。

tnsnames.oraファイルを作成します。

sudo vi $ORACLE_HOME/network/admin/tnsnames.ora

DBサーバのtnsnames.oraの内容をコピー&ペーストして保存します。

tnsnames.ora
DB1 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = db1.subnet1.vcn1.oraclevcn.com)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = DB1.subnet1.vcn1.oraclevcn.com)
    )
  )

PDB1 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = db1.subnet1.vcn1.oraclevcn.com)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = PDB1.subnet1.vcn1.oraclevcn.com)
    )
  )

SQL*PlusでAPサーバからDBシステムのPDB(PDB1)に接続します。

sqlplus test/Test#1Test#1@PDB1

接続先を確認します。

SQL> show con_name

CON_NAME
------------------------------
PDB1

SQL*Plusを終了します。

SQL> exit

アプリケーション用のPHPファイルを作成します。

sudo vi /var/www/html/test.php

下記の内容を入力して保存します。

/var/www/html/test.php
<html>
<head><meta charset="UTF-8">
<title>PHP to Oracle Connection Test</title>
</head>
<body>
<?php
    error_reporting(E_ALL);
    ini_set('display_errors', '1');

    $conn = oci_connect('test', 'Test#1Test#1', 'PDB1');
    $stid = oci_parse($conn, 'SELECT deptno,dname,loc FROM dept ORDER BY deptno');
    oci_execute($stid);
    echo "<table border='1'>\n";
    echo "<caption>DEPT Table</caption>\n";
    echo "<tr><th>Dept No.</th><th>Dept Name</th><th>Location</th></tr>\n";
    while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
        echo "<tr>\n";
        foreach ($row as $item) {
            echo " <td>" . ($item !== null ? htmlentities($item, ENT_QUOTES) : "&amp;nbsp;") . "</td>\n";
        }
        echo "</tr>\n";
    }
    echo "</table><br>\n";
    echo "Response from ".gethostname();
?>
</body>
</html>

15.PHPアプリケーションの動作確認

ブラウザから以下のURLにアクセスし、正しく表示されるかを確認します。

http://*<AP1のパブリックIPアドレス>*/test.php

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[OCI] Computeインスタンス上にPHPのWebアプリケーション環境を構成して、Database Cloud ServiceのDBシステムにアクセスしてみた

はじめに

Computeインスタンス上に構成したPHPのWebアプリケーションから、Database Cloud ServiceのDBシステムにアクセスしてみた時の手順です。
(2020年10月現在)

構築イメージ

今回構築した環境のイメージはこのような感じです。
スクリーンショット 2020-10-28 18.24.02.png

作業の流れ

1.VCNの構成
2.ネットワーク・セキュリティ・グループの作成
3.DBシステムの作成
4.Computeインスタンス(APサーバ)の作成
5.パブリックIPの作成
6.パブリックIPの割り当て
7.Oracle Instant Clientのインストールと設定
8.Apache/PHPのインストールと設定
9.firewalldの設定
10.SELinuxの設定
11.Apache/PHPの動作確認
12.DBシステム(DBサーバ)の設定
13.アプリケーションで使用するDBデータの準備
14.APサーバの設定
15.PHPアプリケーションの動作確認

1. VCNの構成

こちらの記事を参考に、仮想クラウド・ネットワークを構成します。

OCIのネットワークを構成する際に手戻りの少ない手順を考えてみる(初心者向け)

2.ネットワーク・セキュリティ・グループの作成

APサーバ、DBサーバそれぞれに適用するネットワーク・セキュリティ・グループを作成します。

「コンソールメニュー」 → 「ネットワーキング」 → 「仮想クラウド・ネットワーク」 → 「仮想クラウドネットワークの詳細」 → 「ネットワーク・セキュリティ・グループ」

<APサーバ用のネットワーク・セキュリティ・グループ>
「ネットワーク・セキュリティ・グループの作成」をクリック
 ・名前:Network Security Group for AP
 ・コンパートメントに作成:「Compartment1」を選択
 ・「次」をクリック
 ・セキュリティ・ルールの追加
  ルール
   ステートレス:チェックをオフ(デフォルト)
   方向:「イングレス」を選択
   ソースタイプ:「CIDR」を選択
   ソース:0.0.0.0/0
   IPプロトコル:「TCP」を選択
   ソース・ポート範囲:デフォルトのまま(入力しない)
   宛先ポート範囲:80
  説明:Security Rule for HTTP(TCP 80)
 ・「作成」をクリック

<DBサーバ用のネットワーク・セキュリティ・グループ>
・「ネットワーク・セキュリティ・グループの作成」をクリック
 ・名前:Network Security Group for DB
 ・コンパートメントに作成:「Compartment1」を選択
 ・「次」をクリック
 ・セキュリティ・ルールの追加
  ルール
   ステートレス:チェックをオフ(デフォルト)
   方向:「イングレス」を選択
   ソースタイプ:「ネットワーク・セキュリティ・グループ」を選択
   ソースNSG:「NSG for AP」を選択
   IPプロトコル:「TCP」を選択
   ソース・ポート範囲:デフォルトのまま(入力しない)
   宛先ポート範囲:1521
   説明:Security Rule for Oracle Net Listener on DB System
 ・「作成」をクリック

3.DBシステム(DBサーバ)の作成

「コンソールメニュー」 → 「ベア・メタル、VM、Exadata」

「DBシステムの作成」をクリック

 DBシステム情報
 ・コンパートメントの選択:「Compartment1」を選択
 ・DBシステムの名前の指定:DBSystem1
 ・可用性ドメインの選択:任意の可用性ドメインを選択
 ・シェイプ・タイプの選択:「仮想マシン」を選択
 ・シェイプの選択:任意のシェイプを選択
 ・Oracle Database ソフトウェア・エディション:任意のエディションを選択
 ・ストレージ管理ソフトウェアの選択:任意のストレージ管理ソフトウェアを選択
 ・ストレージの構成 使用可能なストレージ(GB):任意のストレージサイズを選択
 ・公開SSHキーの追加:「 SSHキー・ファイルのアップロード」を選択、「browse」をクリックして共有鍵ファイル(.pub)を選択
 ・ライセンス・タイプの選択:「含まれるライセンス」を選択
 ・仮想クラウド・ネットワーク:「VCN1」を選択
 ・クライアントのサブネット:「Subnet1」を選択
 ・ネットワーク・セキュリティ・グループを使用してトラフィックを制御:チェックをオン
 ・ネットワーク・セキュリティ・グループ:「Network Security Group for DB」を選択
 ・ホスト名接頭辞:db1
 ・「拡張オプションの表示」をクリック
 ・フォルト・ドメイン オプション:任意のフォルト・ドメインを選択
 ・タイム・ゾーン:「Asia/Tokyo」を選択 

「次」をクリック

データベース情報
 ・データベース名:DB1
 ・データベースのバージョン:「19c」を選択
 ・PDB名:PDB1
 ・管理者資格証明の作成 パスワード:Demo#1Demo#1
 ・管理者資格証明の作成 パスワードの確認:Demo#1Demo#1
 ・自動バックアップの有効化:チェックをオン
 ・バックアップ保持期間:「7days」を選択
 ・バックアップスケジューリング:「Anytime」を選択
 ・「拡張オプションの表示」をクリック
  ・文字セット:「AL32UTF8」を選択(デフォルト)
  ・各国語文字セット:「AL16UTF16」を選択(デフォルト)

「DBシステムの作成」をクリック

4.Computeインスタンス(APサーバ)の作成

「コンソールメニュー」 → 「コンピュート」 → 「インスタンス」

「インスタンスの作成」をクリック
 ・名前:AP1
 ・コンパートメントに作成:任意のコンパートメントを選択

 ・配置とハードウェアの構成
  ・可用性ドメイン:任意のADを選択
  ・イメージ:「Oracle Linux 7.8」を選択
  ・シェイプ:任意のシェイプを選択

 ・ネットワーキングの構成 
  ・ネットワーク:「既存の仮想クラウド・ネットワークを選択」を選択し、「VCN1」を選択
  ・サブネット:「既存のサブネット」を選択し、「Subnet 1」を選択
  ・ネットワーク・セキュリティ・グループを使用してトラフィックを制御:チェックをオン
  ・ネットワーク・セキュリティ・グループ:「Network Security Group for AP」を選択
  ・パブリックIPアドレス:「パブリックIPアドレスを割り当てないでください」を選択
 
 ・SSHキーの追加
  ・「公開キー・ファイルの選択」を選択し、「または場所を参照します」をクリックして公開キー・ファイルをアップロードします
 
 ・ブートボリュームの構成
  ・全てデフォルトのまま

 ・「拡張オプションの表示」をクリック
  ・「管理」タブ
   ・全てデフォルトのまま
  ・「ネットワーキング」タブ
   ・プライベートIPアドレス:10.0.1.100
   ・ホスト名:ap1
   ・起動オプション:デフォルトのまま
  ・「イメージ」タブ
   ・デフォルトのまま
  ・「配置」タブ
   ・デフォルトのまま
「作成」をクリック

5.予約済パブリックIPの作成

「コンソールメニュー」 → 「ネットワーキング」 → 「IP Management」

「パブリックIPアドレスの予約」をクリック

 ・予約済パブリックIPアドレス名:PublicIP1
 ・コンパートメントに作成:「Compartment1」を選択
 ・IPアドレスのソース:「Oracle」を選択

 ・「パブリックIPアドレスの予約」をクリック

6.予約済パブリックIPの割り当て

「コンソールメニュー」 → 「コンピュート」 → 「インスタンス」 → 「インスタンスの詳細」

・リソース欄の「アタッチされたVNIC」をクリック
VNIC名(AP1)をクリック
・リソース欄の「IPアドレス」をクリック
IPアドレスの欄の「:」をクリックし、「編集」をクリック
 ・パブリックIPタイプ:「予約済パブリックIP」を選択
 ・「既存の予約済パブリックIPの選択」を選択
 ・RESERVED IP ADDRESS:「PublicIP1」を選択
「更新」をクリック

7.Oracle Instant Clientのインストール

秘密鍵を使って、SSHクライアントからComputeインスタンス(AP1)にopcユーザでログインします。

タイムゾーンとロケールを設定します。

sudo timedatectl set-timezone Asia/Tokyo
sudo localectl set-locale LANG=ja_JP.utf8

yumコマンドでOracle Instant Clientをインストールします。

sudo yum -y install oracle-release-el7

sudo yum install -y oracle-instantclient19.6-sqlplus.x86_64

/etc/profileを編集し、環境変数の設定を追加します。

sudo vi /etc/profile

以下の内容をファイルの末尾に追加して保存します。

/etc/profile
export ORACLE_HOME=/usr/lib/oracle/19.6/client64/lib
export NLS_LANG=Japanese_Japan.AL32UTF8
export LD_LIBRARY_PATH=$ORACLE_HOME:$LD_LIBRARY_PATH
export PATH=/usr/lib/oracle/19.6/client64/bin:$PATH

環境変数を適用します。

source /etc/profile

8.PHPとApache のインストールと設定

yumコマンドでPHPとApacheをインストールします。

sudo yum install -y oracle-php-release-el7

sudo yum -y install php php-oci8-19c

PHPとApacheの連携を設定します。

sudo vi /etc/httpd/conf/httpd.conf

以下の内容をファイルの末尾に追加して保存します。

/etc/httpd/conf/httpd.conf
<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>

Apacheを起動します。

sudo systemctl start httpd.service

OS起動時のApacheが自動的に起動するように設定します。

sudo systemctl enable httpd.service

9.firewalldの設定

firewall-cmdコマンドでfirewalldにhttp通信を許可する設定を追加します。

sudo firewall-cmd --add-service=http --zone=public --permanent
sudo firewall-cmd --reload
sudo firewall-cmd --list-all --zone=public

10.SELinuxの設定変更

SELinuxの設定を変更します。

sudo setenforce 0

再起動後にSELinuxが有効にならないように設定ファイルを変更します。

sudo vi /etc/selinux/config
/etc/selinux/config
SELINUX=enforcing

の部分を以下のように変更して保存します。

/etc/selinux/config
SELINUX=permissive

11.Apache/PHPの動作確認

Apacheの接続テスト用HTMLを作成します。

sudo vi /var/www/html/index.html

以下の内容を入力して保存します。

index.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>test</title>
  </head>
  <body>
    <h1>やったぜ!</h1>
  </body>
</html>

Apache + PHPの連携テスト用PHPファイルを作成します。

sudo vi /var/www/html/info.php

以下の内容を入力して保存します。

info.php
<?php
echo phpinfo();
?>

ブラウザから以下のURLにアクセスし、正しく表示されるかを確認します。

http://<AP1のパブリックIPアドレス>/index.html

http://<AP1のパブリックIPアドレス>/info.php

12.DBシステム(DBサーバ)の設定

秘密鍵を使って、SSHクライアントからDBシステムにopcユーザでログインします。

oracleユーザにスイッチします。

sudo su - oracle

SQL*Plusで管理者としてDBにログインします。

sqlplus / as sysdba

接続先を確認します。

SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT

SQL*Plusを終了します。

SQL> exit

Oracle Net Listenerのステータスを確認し、DBシステム作成時に作成されたPDBに対応したサービス名を出力結果から確認します。

lsnrctl status

 LSNRCTL for Linux: Version 18.0.0.0.0 - Production on
 <略>
 Service "pdb1.subnet1.vcn1.oraclevcn.com" has 1 instance(s).
   Instance "DB1204", status READY, has 1 handler(s) for this service...

tnsnames.oraの内容を確認します。

vi $ORACLE_HOME/network/admin/tnsnames.ora
tnsnames.ora(編集前)
# tnsnames.ora Network Configuration File: /u01/app/oracle/product/19.0.0/dbhome_1/network/admin/
tnsnames.ora
# Generated by Oracle configuration tools.

DB1 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = db1.subnet1.vcn1.oraclevcn.com)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = DB1.subnet1.vcn1.oraclevcn.com)
    )
  )

tnsnames.oraを編集し、PDB接続用のエイリアスを追加します。

tnsnames.ora(編集後)
# tnsnames.ora Network Configuration File: /u01/app/oracle/product/19.0.0/dbhome_1/network/admin/
tnsnames.ora
# Generated by Oracle configuration tools.

DB1 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = db1.subnet1.vcn1.oraclevcn.com)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = DB1.subnet1.vcn1.oraclevcn.com)
    )
  )

PDB1 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = db1.subnet1.vcn1.oraclevcn.com)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = pdb1.subnet1.vcn1.oraclevcn.com)
    )
  )

13.アプリケーションで使用するDBデータの準備

tnsnames.oraに追加したエイリアス(PDB1)を使用して、SQL*PlusでPDB1に管理者としてログインします。

sqlplus sys/Demo#1Demo#1@PDB1 as sysdba

接続先を確認します。

SQL> show con_name

CON_NAME
------------------------------
PDB1

アプリケーションで使用するDBユーザを作成します。

SQL> GRANT CONNECT,RESOURCE,UNLIMITED TABLESPACE TO test IDENTIFIED BY Test#1Test#1;

アプリケーションで使用するDBユーザ(test)としてPDB1に接続します。

SQL> CONNECT test/Test#1Test#1@PDB1

アプリケーションで使用するテーブルを作成します。

SQL> CREATE TABLE dept (
2 deptno NUMBER(2) CONSTRAINT PK_DEPT PRIMARY KEY,
3 dname VARCHAR2(14) ,
4 loc VARCHAR2(13) ) ;

アプリケーションで使用するテーブルにデータを挿入します。

SQL> INSERT INTO dept VALUES (10,'ACCOUNTING','NEW YORK');
SQL> INSERT INTO dept VALUES (20,'RESEARCH','DALLAS');
SQL> INSERT INTO dept VALUES (30,'SALES','CHICAGO');
SQL> INSERT INTO dept VALUES (40,'OPERATIONS','BOSTON');

SQL> COMMIT;

SQL> SELECT * FROM dept;

SQL*Plusを終了します。

SQL> exit

14.APサーバの設定

秘密鍵を使って、SSHクライアントからComputeインスタンス(AP1)にopcユーザでログインします。

tnsnames.oraファイルを作成します。

sudo vi $ORACLE_HOME/network/admin/tnsnames.ora

DBサーバのtnsnames.oraの内容をコピー&ペーストして保存します。

tnsnames.ora
DB1 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = db1.subnet1.vcn1.oraclevcn.com)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = DB1.subnet1.vcn1.oraclevcn.com)
    )
  )

PDB1 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = db1.subnet1.vcn1.oraclevcn.com)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = PDB1.subnet1.vcn1.oraclevcn.com)
    )
  )

SQL*PlusでAPサーバからDBシステムのPDB(PDB1)に接続します。

sqlplus test/Test#1Test#1@PDB1

接続先を確認します。

SQL> show con_name

CON_NAME
------------------------------
PDB1

SQL*Plusを終了します。

SQL> exit

アプリケーション用のPHPファイルを作成します。

sudo vi /var/www/html/test.php

下記の内容を入力して保存します。

/var/www/html/test.php
<html>
<head><meta charset="UTF-8">
<title>PHP to Oracle Connection Test</title>
</head>
<body>
<?php
    error_reporting(E_ALL);
    ini_set('display_errors', '1');

    $conn = oci_connect('test', 'Test#1Test#1', 'PDB1');
    $stid = oci_parse($conn, 'SELECT deptno,dname,loc FROM dept ORDER BY deptno');
    oci_execute($stid);
    echo "<table border='1'>\n";
    echo "<caption>DEPT Table</caption>\n";
    echo "<tr><th>Dept No.</th><th>Dept Name</th><th>Location</th></tr>\n";
    while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
        echo "<tr>\n";
        foreach ($row as $item) {
            echo " <td>" . ($item !== null ? htmlentities($item, ENT_QUOTES) : "&amp;nbsp;") . "</td>\n";
        }
        echo "</tr>\n";
    }
    echo "</table><br>\n";
    echo "Response from ".gethostname();
?>
</body>
</html>

15.PHPアプリケーションの動作確認

ブラウザから以下のURLにアクセスし、正しく表示されるかを確認します。

http://*<AP1のパブリックIPアドレス>*/test.php

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[PHP/symfony1.4]外部キー未設定のテーブルをDoctrineでJOINしたい

symfony(1.4)のDoctrineを使って、外部キーが登録されていないテーブル同士をJOINさせるのに躓いた時のメモ。

元のプログラム

$q = StoreTable::getInstance()
      ->createQuery('s')
      ->setHydrationMode(Doctrine_Core::HYDRATE_SCALAR)
      ->select('s.*')
      ->leftJoin('s.StoreItem si')
      ->leftJoin('si.Item i')
      ...()
      ->execute();

StoreItemテーブルには、store_idカラムが存在してるけれど、訳あって外部キーが設定されていない。このテーブルを結合しないと他のテーブルと結合できる方法がない状態だった。

この状態でクエリを実行すると、

Oct 28 12:23:48 symfony [err] {Doctrine_Table_Exception} Unknown relation alias StoreItem

とエラーが出てしまう。

解決策

Doctrineの実行前に、bindを使ってリレーションを一時的に定義する。

修正したプログラム

途方に暮れていたら、無理やり結合させている他の人のコードを見つけた。笑
ドキュメントで見つけられなかったけど下のような書き方をして、リレーションを一時的に?定義できるみたい。

StoreTable::getInstance()
      ->bind(array('StoreItem as StoreItem', array(
        'local'   => 'store_id',
        'foreign' => 'id',
      )),
        Doctrine_Relation::ONE
      );

$q = StoreTable::getInstance()
      ->createQuery('s')
      ->setHydrationMode(Doctrine_Core::HYDRATE_SCALAR)
      ->select('s.*')
      ->leftJoin('s.StoreItem si')
      ->leftJoin('si.Item i')
      ...()
      ->execute();
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Moodle 3.9 マニュアル - 登録FAQ

原文

目次

1 一般的な登録と登録解除の質問
1.1 学生がコースに自己登録しないようにするにはどうすればいいですか?
1.2 なぜユーザーが明らかな理由もなく登録解除されてしまうのか?
1.3 なぜすべての学生がすべてのコースに登録されているのですか?
1.4 学生がコースから自分自身を登録解除できるようにするには?
1.5 教師が誤ってコースの登録方法を無効にしてしまうのを防ぐにはどうしたらいいですか?
1.6 「登録済みユーザー」をクリックしても「ユーザー登録」ボタンが表示されません。
2 自己登録に関する質問
2.1 学生がコースに登録したときに教師に通知する方法はありますか?
2.2 学生が自己登録した場合、ウェルカムメールのメッセージをカスタマイズすることはできますか?
2.3 コースのウェルカムメールは誰から送られてくるのですか?
3 コホート、メタコース、ゲスト、およびその他の登録タイプ
3.1 コホートをコースに追加できないのはなぜですか?(あるのは知っています!)
3.2 Paypalを使用していますが、ユーザーはお金を払わなくても私のコースにアクセスできます。
3.3 メタコースのメタコースを持つことはできますか?
4 その他の雑学
4.1 "enrol"のスペルを"enroll"に変えるには?
4.2 コース参加者リストに特定の教師が表示されないようにするにはどうすればいいですか?
4.3 コースのフロントページに表示される先生を変更するにはどうすればいいですか?
4.4 誤って登録を解除してしまったユーザーの成績を元に戻すにはどうすればいいですか?
4.5 未登録と一時停止の違いは何ですか?
4.6 ユーザーをコースから一時停止にするにはどうすればいいですか?
4.7 自分のコースに登録されている全ての学生のリストをエクスポート/印刷するにはどうしたらいいですか?
5 他に質問はありますか?
6 関連項目

1 一般的な登録と登録解除の質問

1.1 学生がコースに自己登録しないようにするにはどうすればいいですか?

あなたがコースの教師の場合は、コース管理 > ユーザー > 登録方法を選択し、自己登録オプションを無効にしてください(目を閉じてください)。あなたがサイト管理者の場合は、サイト管理 > プラグイン > 登録プラグインを管理し、自己登録プラグインを無効にしてください(目を閉じてください)。

1.2 なぜユーザーが明らかな理由もなく登録解除されてしまうのか?

コースで、コース管理 > ユーザー > 登録方法に移動し、自己登録オプションの編集(手/ペン)アイコンをクリックします。その後、アクティブなアンロールの隣のドロップダウンで時間を確認してください... (登録解除を制御するものの完全なリストについては、登録解除を参照してください。) サイト管理者として、サイト管理 > プラグイン > 登録 > 自己登録で、ユーザーが登録解除された後のデフォルトの時間を指定することができます。

1.3 なぜすべての学生がすべてのコースに登録されているのですか?

学生が誤って学生というシステムロールを割り当てられている可能性があります。サイト管理] > [ユーザー] > [権限] > [システムロールの割り当て] を確認し、必要に応じてユーザーの割り当てを解除してから、コースのコンテキストで学生のロールを再割り当てしてください。ロール・コンテキストの説明については、ロールの割り当てを参照してください。

1.4 学生がコースから自分自身を登録解除できるようにするには?

学生が任意のコースから登録を解除できるようにするには、以下の手順に従います。

  1. サイト管理] > [ユーザー] > [権限] > [ロールの定義]にアクセスします。
  2. 学生ロールの反対側の編集アイコンをクリックします。
  3. enrol/manual:unenrolself、enrol/paypal:unenrolself、enrol/self:unenrolself (サイトで有効になっている登録プラグインに応じて) のいずれか/すべての機能を未設定から許可に変更します。
  4. ページ下部の「変更を保存」ボタンをクリックします。

学生が特定のコースからの登録を解除できるようにするには、次の手順に従います。

  1. コース管理 > ユーザー > アクセス権 に行きます。
  2. 適切な未受講者能力(学生が登録されている方法に対応する)の反対側の[許可]アイコン(+)をクリックして、学生ロールを許可します。

注意: 学生が手動でコースに登録する場合、enrol/manual:unenrolself を許可してください。

1.5 教師が誤ってコースの登録方法を無効にしてしまうのを防ぐにはどうしたらいいですか?

管理 > サイト管理 > ユーザー > 権限 > ロールの定義で教師ロールを編集し、ケイパビリティmoodle/course:enrolconfigのチェックを外してください。

1.6 「登録済みユーザー」をクリックしても「ユーザー登録」ボタンが表示されません。

コースで手動登録が有効になっていることを確認してください。外部のタイプの登録のみを使用していて、コースに手動登録が許可されていない場合、コースの外部で制御されているため、「ユーザーの登録」ボタンは表示されません。

もしこれができるようになった場合、あなたが教師またはこの機能を持つ他のロールにいることを確認してください。ロールを切り替えて...ボタンを使用しているときに、うっかり学生ロールまたは編集教師ロールに自分を置いたままにしていないことを確認してください。

2 自己登録に関する質問

2.1 学生がコースに登録したときに教師に通知する方法はありますか?

フラットファイル登録には登録完了時の電子メール通知機能がありますが、自己登録のオプションはありません。

2.2 学生が自己登録した場合、ウェルカムメールのメッセージをカスタマイズすることはできますか?

はい - 詳細については、自己登録の「新規ユーザーへのウェルカムメッセージの送信」を参照してください。

2.3 コースのウェルカムメールは誰から送られてくるのですか?

自己登録設定では、ウェルカムメッセージの送信元をコース連絡先:(翻訳準備中)キーホルダー:(翻訳準備中)、またはデフォルトの無返信アドレスのいずれかに指定することができます。コース連絡先を選択した場合、そのロールを持つユーザーが複数いる場合、ウェルカムメッセージは、アルファベット順(MDL-61236)で最初に来る苗字のコース連絡先から送信されます。

3 コホート、メタコース、ゲスト、およびその他の登録タイプ

3.1 コホートをコースに追加できないのはなぜですか?(あるのは知っています!)

デフォルトでは、教師はコースにコホートを追加することができますが、管理者がコホートを表示し、教師が使用しようとしているカテゴリで利用できるように設定している場合に限ります。特定のコホートを登録できるようにしたい場合は、サイトの管理者や管理者に確認してください。

3.2 Paypalを使用していますが、ユーザーはお金を払わなくても私のコースにアクセスできます。

また、登録キーを有効にせずに自己登録を行っていないことを確認してください。これにより、ユーザーはPaypalをバイパスすることができます。(Paypal経由で登録するクライアントだけでなく、一部のユーザーにも無料で自己登録させる必要がある場合は、自己登録の設定で登録キーを追加してください)。

3.3 メタコースのメタコースを持つことはできますか?

これは不可能です。コースのメタリンク:(翻訳準備中)を参照してください。代わりにコホートを使うことができるかもしれません。

4 その他の雑学

4.1 "enrol"のスペルを"enroll"に変えるには?

"enroll" はアメリカ英語の方言でのスペルです。サイトのスペルを変更するには、管理 > サイト管理 > 言語 > 言語パックからアメリカ英語の言語パック (en_us) をインストールし、管理 > サイト管理 > 言語 > 言語設定でサイトのデフォルト言語として選択してください。

サイト上のすべての新規アカウントは、プロフィールの優先言語として en_us が設定されています。しかし、これは自動的に既存のユーザーの言語を更新することはできません。その場合は、プロフィールの設定でen_usを優先言語として設定するように指示してください。

4.2 コース参加者リストに特定の教師が表示されないようにするにはどうすればいいですか?

参加者リストに誰が表示されるかはその人のロールによって制御されます。デフォルトの教師ロールにある人は誰でもリストに表示されます。これを回避する方法の1つは、教師から重複したロールを作成することです。次のようにしてください。

  1. サイト管理 > ユーザー > 権限 > ロールの定義に移動し、教師ロールをクリックします。
  2. ロールの複製」ボタンをクリックします。
  3. 役割の名称を「不参加の教師」などに変更する
  4. フィルタにmoodle/course:viewを入力し、moodle/course:view機能を有効にするにはチェックボックスにチェックを入れてください。
  5. このロールの作成」ボタンをクリックします。
  6. コースの管理 > コースの管理 > ユーザー > その他のユーザーに移動します。
  7. 役割の割り当て」ボタンをクリックして、ユーザーに「無所属教師」の役割を割り当てます。

4.3 コースのフロントページに表示される先生を変更するにはどうすればいいですか?

これは管理者がサイト管理 > 外観 > コース > コース連絡先で設定することができます。上記の「教師の役割を複製する」トリックを使用した場合、コース参加者リストだけでなく、すべてのユーザーのコースカタログに表示されるかどうかを制御することもできます。

4.4 誤って登録を解除してしまったユーザーの成績を元に戻すにはどうすればいいですか?

サイト管理 > 成績 > 一般設定 > 成績のデフォルト値を回復するの設定に関連する、未登録とユーザーデータの未登録のセクションを参照してください。

4.5 未登録と一時停止の違いは何ですか?

コースから一時停止されたユーザーはコースにアクセスできなくなりますが、コースへの登録やコース内のすべてのデータやアクティビティは変更されません。一時的または恒久的にコースからのアクセスをブロックしたいが、そのユーザーのデータには何ら影響を与えたくない場合には suspend を使用してください。

登録解除はユーザーをコースから削除し、他の設定によっては成績を含むコースデータを削除または削除することができます。

詳細については、「登録の一時停止または登録解除」のセクションを参照してください。

4.6 ユーザーをコースから一時停止にするにはどうすればいいですか?

教師として、コース管理 > ユーザー > 登録されているユーザーで、ユーザー名の横にある編集(歯車)アイコンをクリックして、ユーザーのステータスを「アクティブ」から「一時停止」に変更することができます。これは一人または少数のユーザーに便利です。

多くのユーザーのために一斉にこれを行うには、サイト管理者または管理者は、サイト管理 > ユーザー > アカウント > ユーザーをアップロード > enrolstatusフィールドを使用して、テキスト/csvファイルを介してコースからユーザーを一時停止することができます。詳細については、ユーザーアップロード:3 含めることができるユーザーフィールドを参照してください。

4.7 自分のコースに登録されている全ての学生のリストをエクスポート/印刷するにはどうしたらいいですか?

教師として、次のように行うことができます。

  1. コース管理 > 成績」を選択します。
  2. その後、「成績管理 > エクスポート」を選択して続行します。そこで、出力したいファイルの種類を選択します(例:OpenDocument ファイル)。
  3. 次のページで「select all/one」をクリックして、すべての成績項目の選択を解除します。
  4. 提出」をクリックすると、登録されているすべての学生のリストがファイルとして出力され、編集したり印刷したりすることができます。 実際にエクスポートされたのは、すべてのコースの学生の空の成績表、つまり名前、苗字、Eメールアドレスのみです。

5 他に質問はありますか?

moodle.orgの登録フォーラムに投稿してください。

6 関連項目

フォーラムでの議論。

再登録・再登録に関する質問
学校の年度末、次の開始のためのベストプラクティス?

カテゴリ | 登録 | FAQ

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

CKFinderでアップロードファイルサイズの設定を変更しようとしたらハマった話

お客さん:CKFinderでちょっと大きめのファイルもアップロードできるようにしたい!!
僕:よっしゃconfig変えるだけでいけるな。余裕や!!
一時間後...
僕:あれconfig変えたのにアップロードできない。。オワタ。。

ということが発生したので忘れないようにメモメモ。実は単純な話でした。

まずDocumentを確認

https://ckeditor.com/docs/ckfinder/ckfinder3-php/configuration.html
スクリーンショット 2020-10-28 17.18.09.png
どうやらfileSizeに20Mとか2Gとか設定すればいいみたいだ(ここまでは余裕モードでした)

アップロードできない。なんか設定効いてないっぽい。。

色々設定を変えてみてもある一定までは効くけど、それ以上はアップロードできない状態になってました(ここら辺から暗雲が立ち込める)
しょうがないのでCKFinderのソースを確認してみることに。

ckfinder/core/connector/php/vendor/cksource/ckfinder/src/CKSource/CKFinder/Command/Init.php
$resourceTypeObject = array(
  'name'              => $resourceTypeName,
  'allowedExtensions' => implode(",", $resourceType->getAllowedExtensions()),
  'deniedExtensions'  => implode(",", $resourceType->getDeniedExtensions()),
  'hash'              => $resourceType->getHash(),
  'acl'               => $aclMask,
  'maxSize'           => $resourceType->getMaxSize() ? min($resourceType->getMaxSize(), $phpMaxSize) : $phpMaxSize
)

ソースを追っていてふと気づく。$resourceType->getMaxSize()$phpMaxSizeの最小値を設定してる?

ckfinder/core/connector/php/vendor/cksource/ckfinder/src/CKSource/CKFinder/Command/Init.php
$phpMaxSize = 0;

$maxUpload = Utils::returnBytes(ini_get('upload_max_filesize'));
if ($maxUpload) {
  $phpMaxSize = $maxUpload;
}

$maxPost = Utils::returnBytes(ini_get('post_max_size'));
if ($maxPost) {
  $phpMaxSize = $phpMaxSize ? min($phpMaxSize, $maxPost) : $maxPost;
}

//ini_get('memory_limit') only works if compiled with "--enable-memory-limit"
$memoryLimit = Utils::returnBytes(@ini_get('memory_limit'));
if ($memoryLimit && $memoryLimit != -1) {
  $phpMaxSize = $phpMaxSize ? min($phpMaxSize, $memoryLimit) : $memoryLimit;
}

さらに追っていくと。
あ、やはりupload_max_filesizeとかpost_max_sizeを超えないようにしている!!
まあ冷静に考えてみればそりゃそうですよね。。

解決

ということでCKFinderのconfigの設定と合わせて、phpのupload_max_filesizeも合わせて許容値までに上限をあげて解決しました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

よく使うPhpStormショートカット

2年間PhpStormを使ってみて、個人的によく使うショートカットキーをまとめてみました。
独断で基本と応用に分けています...(特に意味はないです)

チートシート

基本

説明 キー
単語移動 ctrl + ←→
単語選択 ctrl + W
単語選択の縮小 ctrl + shift+ W
選択した単語の大/小文字を入れ替え ctrl + shift + U
コメント化/解除 ctrl + shift + /
選択したブロックの複製 ctrl + D
タブを閉じる ctrl + F4
タブの移動 alt + ←→
ヒストリーからの貼り付け ctrl + shift + V
戻る ctrl + alt + ←
ファイル内検索 ctrl + F
パス内検索 ctrl + shift + F
なんでも検索 shiftを2回
Class検索 ctrl + N
ファイル内置換 ctrl + R
パス内置換 ctrl + shift + R
コードフォーマット ctrl + alt + L

応用

説明 キー
宣言に移動 ctrl + B
前/次のメソッドに移動 alt + ↑ ↓
直近のファイルを開く ctrl + E
ツールウィンドウ ctrl + tab
リファクタリング ctrl + alt + shift + T
行を指定して移動 ctrl + G
クイックフィックス alt + Enter
ヘルプ ctrl + P
簡易ヘルプ ctrl + Q
ブックマーク ctrl + F11
ブックマーク一覧 shift + F11
メソッド実装 ctrl + I
次/前の強調表示されたエラー F2/shift + F2
構造の確認 alt + 7
スーパークラスへ ctrl + U
インデントの調整 ctrl + alt + I
use文の整理 ctrl + alt + O

おまけ

クラス検索でSampleHogeControllerを検索したい場合は、SHCと頭文字を入力すれば簡単に検索できます!

参考

PhpStorm キーボードショートカット

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Moodle 3.9 マニュアル - その他のユーザー

原文

その他のユーザー

ユーザーは管理 > コース管理 > ユーザー > その他のユーザーで登録しなくても、コース内でのロールを割り当てることができます。

これは、権限に関連したタスクを実行することができますが、参加者リストには表示されないことを意味します。この例としては、受講者リストを混乱させずにアクセスできるようにするために、ユーザーをプリンシパル、マネージャー、またはヘルプデスクタイプのロールに割り当てることが挙げられます。

このページには、サイトまたはカテゴリレベルで同様のロールを割り当てられたユーザーのリストも表示されます。

注: デフォルトでは、他のユーザーに割り当てることができる役割は、マネージャーの役割のみです。教師のような他のロールを割り当てられるようにするには、そのロールに対してケイパビリティmoodle/course:view「参加せずにコースを表示する」を許可してください。
otherusers.png
otherusers.png
assign-otherusers.gif
他のユーザーに割り当てる.gif

関連項目

ケイパビリティ: Review other users:(翻訳準備中)
ロールの割り当て:(翻訳準備中)

カテゴリ | 登録 | ロール

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Moodle 3.9 マニュアル - カテゴリ:ロール

原文

ロールとパーミッションに関するドキュメントページのインデックス。

サブカテゴリ
このカテゴリには以下のサブカテゴリしかありません。

C
Capabilities

カテゴリー「ロール」のページ
全68ページのうち、次の68ページがこのカテゴリに属しています。

キーホルダーロール

ゲストロール

その他のユーザー

A
Development:Ajax user selector
Assign roles
Authenticated user role
B
Blogger role
C
Calendar editor role
Capabilities/moodle/role:assign
Capabilities/moodle/role:manage
Capabilities/moodle/role:override
Capabilities/moodle/role:review
Capabilities/moodle/role:safeoverride
Capabilities/moodle/role:viewhiddenassigns
Development:Cohorts
Competency reviewer
Course creator role
Course list viewer role
Course requester role
Course tagger
Creating custom roles
D
Demo teacher role
E
Development:Enrolment usage overview
error/moodle/couldnotassignrole
error/moodle/nopermissions
F
Feedback template creator
Forum moderator role
Forum poster role

G

Gallery owner role
Grade viewer role
Grading forms manager
Grading forms publisher
Guest role ゲストロール

H
Development:Hardening new Roles system

K

Keyholder role (日本語訳:キーホルダーロール)

L
Learning plan supervisor
Learning plan viewer
M
Manager role
Managing roles
N
Development:New enrolments in 2.0
Development:New permission overriding UI
Development:New permissions evaluation in 2.0
Development:NEWMODULE Adding capabilities
Non-editing teacher role

O

Other users (日本語訳:その他のユーザー)
Override permissions

P
Parent role
Permissions
Privacy officer role
Q
Question contexts
Question creator role
Question permissions
Question sharer
Quiz user with unlimited time role
R
Development:Redesigning the override roles page
Risks
Development:Role archetypes
Role export and import
Development:Roles
Development:Roles administration improvements for Moodle 2.0
Development:Roles and modules
Roles and permissions
Roles FAQ
Development:Roles use cases
S
Site administrators
Standard roles
Student role
Switch roles
T
Teacher role
U
User policies
Using roles

メインページ

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Moodle 3.9 マニュアル - PayPal登録

原文

PayPal登録

PayPalの登録プラグインは、ユーザーがコースの支払いをすることができますし、自動的に登録されます。

内容

1 PayPal側の設定
2 PayPalの登録を有効にする
3 PayPalのコース設定
3.1 コースにPayPalがあるかどうかの確認
3.2 コースの価格を設定する
3.3 新規ユーザーが見るもの
4 PayPalのケイパビリティ
5 関連項目

ペイパル側の設定
1. PayPalアカウントを作成する https://www.paypal.com
゜必須ではありませんが、アカウントを "Premier "ステータスにアップグレードして "Verified "を取得するのが賢明かもしれません。
2. エンコードをUTF-8に設定します。
゜プロフィール>プロフィールと設定>マイセラーツール>その他のセラーツール>PayPalボタンの言語エンコーディングにアクセスします。
゜ウェブサイトの言語が西ヨーロッパ言語に設定されていることを確認してください。
゜その他のオプション」ボタンをクリックします。
゜エンコーディングを「UTF-8」に設定し、IPNでも同じエンコーディングを使用するようにしてください。
3. 即時支払い通知(IPN)を有効にする
゜プロフィール > プロフィールと設定 > 私の販売ツール > 支払いを受けてリスクを管理 > 即時支払い通知 > 更新
゜IPNをオンにして、通知URLをあなたのサイトのenrol/paypal/ipn.phpに設定します。
あなたは、https://developer.paypal.com/developer/accounts/ にログインして、最初に PayPal のサンドボックスで実験することを望むかもしれません。そうする場合は、あなたのconfig.phpにこれを入れてください。

CFG->usepaypalsandbox = 1

PayPalは、より多くの詳細を提供することができますが、高レベルの概要として、あなたがします。

  1. テストに使用する「サンドボックス」アカウントを作成します。テストに使用する「サンドボックス」アカウントを作成します。
  2. これらのサンドボックスアカウントは、実際のPayPalビジネスアカウントの開発者アカウントに登録されます。
  3. テストを行う際には、上記の設定フラグに加えて、PayPalプラグイン設定ページの「PayPalビジネスメール」フィールドで「BUSINESS」タイプのサンドボックスアカウントのメールアドレスを使用することを忘れないでください。これは、あなたの本当のビジネスメールアドレスを使用する代わりに行ってください。偽のビジネスアカウントを使用しないと、エラーメッセージが表示されます。

2 PayPalの登録を有効にする

IMAGE ALT TEXT HERE
講座の支払い設定方法

管理者は以下のようにPayPalファイルの登録を有効にすることができます。

  1. サイト管理 > プラグイン > 登録 > プラグインの管理に移動し、PayPalの反対側の目のアイコンをクリックします。有効にすると、それはもはやグレーアウトされません。PayPalプラグインが必要なので、手動登録も有効にする必要があります。
  2. 設定リンクをクリックし、必要に応じて設定し(下記の設定の詳細を参照)、「変更を保存」ボタンをクリックします。 ・PayPalのビジネスメール - この設定は大文字と小文字を区別し、PayPalのそれと正確に一致している必要があります。 ・デフォルトのロール割り当て - これは新しいユーザーがアクセス権を購入したときに自動的にコース内で与えられるロールを意味します。他のロールを選択する特別な理由がない限り、通常は「学生」となります。他のデフォルト設定については、個々のコースで上書きすることができます。

ヒント: あなたのサイトでユーザーが自分のアカウントを作成できるようにしたい場合は、Eメールベースの自己登録を設定する必要があります。

3 PayPalのコース設定

3.1 コースにPayPalがあるかどうかの確認

  1. Boostテーマ:(翻訳準備中)を使用している場合は、参加者リンクからギアメニューをクリックし、登録方法をクリックします。別のテーマを使用している場合は、コース管理 > ユーザー > 登録方法を選択してください。
  2. もしPayPalが表示されていない場合は、プルダウンメニューの "Add method "からPayPalを選択してください。あなたがコースの先生の場合、あなたの管理者がこの方法を追加するためには、あなたの能力をenrol/Paypal:configに許可する必要があります。
  3. PayPalの「目」が開いていることを確認してください。 Paypalenrolmentmethod.png Paypalenrolmentmethod.png

注意: 自己登録が有効になっていないことを確認してください。何人かのユーザーに無料で自己登録してもらう必要がある場合は、自己登録の設定で登録キーを追加してください。

3.2 コースの価格を設定する

  1. コース管理 > ユーザー > 登録方法で、PayPalオプションの右にある編集/手/ペンのアイコンをクリックします。
  2. オプションです。カスタムインスタンス名」でこの登録方法に名前を付けることができます。
  3. PayPalでの登録を許可する」が「はい」に設定されていることを確認してください。
  4. Enrol cost "でコースの費用を入力し、"Currency "で通貨を選択してください。
  5. 通常は "ロールの割り当て "を "学生 "のままにしておくことが多いと思いますが、特別な理由がない限り、例えば教師の編集などのようにユーザーに登録させることができます
  6. 必要に応じて、登録期間および/または開始/終了日を選択してください。
  7. 変更を保存」ボタンをクリックします。 Paypalicon.png Paypalcoursesettings.png

3.3 新規ユーザーが見るもの

新規ユーザーがコースのリンクをクリックすると、コースへのアクセスを購入するためにPayPalへ行くように促すメッセージが表示されます。コースのリストでは、PayPalコースの横に「P」のアイコンが表示されています。
Paypalcoursesettings.png
PayPal経由での支払いを促すメッセージ
Paypaluserview.png
"P"アイコンが表示されているPayPalコース

4 PayPalのケイパビリティ

PayPalの登録インスタンスを設定する
登録ユーザーの管理
コースからユーザーの登録を解除する
自分をコースから外す

5 関連項目

PayPalサンドボックスでのPayPalプラグインのテスト

カテゴリ | 登録

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel8 CRUD処理を使った投稿アプリを作成する その5 投稿詳細画面の作成

目的

  • 投稿された内容の詳細を表示するページを作成する

実施環境

  • 筆者の実施環境を記載する。
  • ハードウェア環境
項目 情報
OS macOS Catalina(10.15.5)
ハードウェア MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports)
プロセッサ 2 GHz クアッドコアIntel Core i5
メモリ 32 GB 3733 MHz LPDDR4
グラフィックス Intel Iris Plus Graphics 1536 MB
  • ソフトウェア環境
項目 情報 備考
PHP バージョン 7.4.8 Homebrewを用いてこちらの方法で導入→Mac HomebrewでPHPをインストールする
Laravel バージョン 8.6.0 commposerを用いてこちらの方法で導入→Mac Laravelの環境構築を行う
MySQLバージョン 8.0.19 for osx10.13 on x86_64 Homwbrewを用いてこちらの方法で導入→Mac HomebrewでMySQLをインストールする

前提条件

  • その1の記事の内容が完了していること。

前提情報

概要

  1. ルーティング情報の記載
  2. コントローラファイルの記載
  3. ビューファイルの作成と記載
  4. 確認

詳細

  1. ルーティングの記載

    1. laravel8_crudディレクトリで下記コマンドを実行してルーティングファイルを開く。

      $ vi routes/web.php 
      
    2. 開いたファイルに下記の行を追記する。

      laravel8_crud/routes/web.php
      Route::get('/detail/{content_id}', [ContentController::class, 'detail'])->name('detail');
      
    3. 追記後のルーティングファイルの内容を下記に記載する。

      laravel8_crud/routes/web.php
      <?php
      
      use Illuminate\Support\Facades\Route;
      use App\Http\Controllers\ContentController;
      
      /*
      |--------------------------------------------------------------------------
      | Web Routes
      |--------------------------------------------------------------------------
      |
      | Here is where you can register web routes for your application. These
      | routes are loaded by the RouteServiceProvider within a group which
      | contains the "web" middleware group. Now create something great!
      |
      */
      
      Route::get('/', function () {
          return view('welcome');
      });
      
      Auth::routes();
      
      Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home');
      
      Route::get('/input', [ContentController::class, 'input'])->name('input');
      Route::post('/save', [ContentController::class, 'save'])->name('save');
      Route::get('/output', [ContentController::class, 'output'])->name('output');
      // 下記を追記する
      Route::get('/detail/{content_id}', [ContentController::class, 'detail'])->name('detail');
      
  2. コントローラファイルの記載

    1. laravel8_crudディレクトリで下記コマンドを実行して作成したコントローラファイルを開く。

      $ vi app/Http/Controllers/ContentController.php 
      
    2. 下記の内容をクラス内に追記する。

      laravel8_crud/app/Http/Controllers/ContentController.php
      public function detail($content_id)
      {
          $content_get_query = Content::select('*');
          $items = $content_get_query->find($content_id);
      
          return view('contents.detail', [
              'item' => $item,
          ]);
      }
      
    3. 追記後のコントローラファイルの内容を下記に記載する。

      laravel8_crud/app/Http/Controllers/ContentController.php
      <?php
      
      namespace App\Http\Controllers;
      
      use Illuminate\Http\Request;
      use App\Models\Content;
      
      class ContentController extends Controller
      {
          public function input()
          {
              return view('contents.input');
          }
      
          public function save(Request $request)
          {
              $input_content = new Content();
              $input_content->content = $request['content'];
              $input_content->save();
              return redirect(route('output'));
          }
      
          public function output()
          {
              $contents_get_query = Content::select('*');
              $items = $contents_get_query->get();
      
              return view('contents.output', [
                  'items' => $items,
              ]);
          }
      
          // 下記を追記する
          public function detail($content_id)
          {
              $content_get_query = Content::select('*');
              $items = $content_get_query->find($content_id);
      
              return view('contents.detail', [
                  'item' => $item,
              ]);
          }
          // 上記までを追記する
      }
      
  3. ビューファイルの作成と記載

    1. laravel8_crudディレクトリで下記コマンドを実行してビューファイルを作成する。

      vi resources/views/contents/detail.blade.php
      
    2. 作成して開いたビューファイルに下記の内容を記載する。

      laravel8_crud/resources/views/contents/output.blade.php
      <h1>detail</h1>
      
      <p>投稿ID: {{$item['id']}}</p>
      <p>投稿内容: {{$item['content']}}</p>
      <p>投稿時間: {{$item['created_at']}}</p>
      
    3. laravel8_credディレクトリで下記コマンドを実行して投稿内容の一覧ページのビューファイルを開く。

      $ vi resources/views/contents/output.blade.php 
      
    4. 開いたビューファイルの<p>{{$item['content']}}</p>の次の行に下記の内容を追記する。

      laravel8_crud/resources/views/contents/output.blade.php
      <a href="{{route('detail', ['content_id' => $item['id']])}}">詳細</a>
      
    5. 追記後のビューファイルの内容を下記に記載する。

      laravel8_crud/resources/views/contents/output.blade.php
      <h1>output</h1>
      
      @foreach ($items as $item)
          <hr>
          <p>{{$item['content']}}</p>
          {{-- 下記を追記する --}}
          <a href="{{route('detail', ['content_id' => $item['id']])}}">詳細</a>
      @endforeach
      
  4. 確認

    1. laravel8_crudディレクトリで下記コマンドを実行してローカルサーバを起動する。

      $ php artisan serve
      
    2. ブラウザで下記にアクセスする。

    3. 下記の様に投稿内容が表示され「詳細」のリンクがあることを確認する。(投稿内容は下記画像と一致しなくて良い)

      127_0_0_1_8000_output.png

    4. 「詳細」のリンクをクリックすると下記のページが開くこと、各種データが正常に表示されていることを確認する。問題無く表示されれば本記事の作業は完了である。

      127_0_0_1_8000_detail_2.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Moodle 3.9 マニュアル - フラットファイル

原文

フラットファイル

フラットファイル登録プラグインは、CSVファイルを介して既存コースの既存ユーザーの一括登録管理(登録・抹消)を可能にします。

ファイルはフラットファイル登録同期スケジュールタスク:(翻訳準備中)で処理された後、削除されます。

ファイルには、アクション、ロール、ユーザーID番号、コースID番号が含まれている必要があります。ファイル形式の詳細は、フラットファイル設定ページの「サイト管理」>「プラグイン」>「登録」>「フラットファイル(CSV)」に記載されています。

フラットファイル登録を有効にする

管理者は以下のようにフラットファイルの登録を有効にすることができます。

  1. サイト管理 > プラグイン > 登録 > プラグインの管理に移動し、フラットファイル(CSV)の反対側の目のアイコンをクリックします。有効にするとグレーアウトされなくなります。
  2. 設定リンクをクリックし、必要に応じて設定し(下記の設定の詳細を参照)、「変更を保存」ボタンをクリックします。

ファイルの場所

アップロードファイルの絶対パスを指定する必要があります(例:/var/moodledata/enrolments.txt)。ファイルは処理後に自動的に削除されます。

ファイルのエンコーディング

必ず同じエンコーディングで保存してください。

通知

あなたは、ファイルが処理されたときに、管理者、教師および/または学生に通知するための電子メールを送信することを選択することができます。

登録解除アクション

・"コースからユーザーを削除する" ユーザーが外部ソースから消えると、登録は完全に削除され、すべてのロールが削除されます。これは、コースの登録解除中に一部のユーザーデータと設定がコースから削除されることを意味します (通常は成績、アクティビティの試行などを含みます)。
・"ユーザーの登録を維持する」 ユーザーが外部ソースから姿を消した場合、登録はそのまま維持され、ユーザーはコースに入ってアクティビティを実行したり、リソースにアクセスしたりすることができます。これは "何もしない "オプションです。
・"コース登録を無効にしてロールを削除する" ユーザーが外部ソースから姿を消すと、登録は中断され、登録インスタンスに割り当てられたロールが削除されます。成績表などからユーザーが「消える」場合がありますのでご注意ください。

何か質問はありますか?

moodle.org の登録フォーラムに投稿してください。

関連項目

ユーザーのアップロード
バルクユーザーアクション - サイトユーザー情報(ユーザーIDを含む)をダウンロードする方法
フラットファイル登録 - 組織ではどのように一般的に使用されているのでしょうか?フォーラムディスカッション

カテゴリ | 登録

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Moodle 3.9 マニュアル - LDAP登録

原文

LDAP登録

目次
1 LDAP登録の設定方法
1.1 前提条件
1.2 コース設定
1.3 LDAPコンテナの設定
1.4 MoodleにおけるLDAP登録設定
1.5 コースの自動作成
1.6 注意事項
2 その他のLDAPレイアウト
3 関連情報

1 LDAP登録の設定方法

ここでは、MoodleでLDAP (Lightweight Directory Access Protocol) 登録:翻訳準備中を設定する方法について説明します (最初の記述はLars Jensenによるものです)。LDAP登録はLDAP認証と組み合わせて使用するとMoodleで最も効果的に機能します。

1.1 前提条件

  1. あなたは最新バージョンのMoodleを実行しています。
  2. あなたは主要な認証方法としてLDAP認証を使用しています。
  3. 各ユーザはユーザのLDAPレコードにuid属性を持ち、同じユーザのMoodleプロファイルのID番号と一致しています (これはMoodle LDAP認証設定ページで簡単にマッピングすることができます - Active Directoryの場合、引用符なしで'distinguishedName'を使用してください)。

1.2 コース設定

私たちの設定には、以下のコースとユーザー定義が含まれています。

・2つのコース、Math101とEng201。
・2人の教師、TeacherAとTeacherB
・3人の学生、StudentD、StudentE、StudentF。
・StudentDとStudentEはMath101の学生として登録されており、TeacherAはMath101の教師として登録されている。StudentEとStudentFはEng201の学生として登録され、TeacherAとTeacherBはEng201の教師として登録されています。

1.3 LDAPコンテナの設定

  1. 2 つの LDAP コンテナ ou=StudentEnrollment と ou=TeacherEnrollment を定義します。
  2. 各コースについて、StudentEnrollment および TeacherEnrollment コンテナに LDAP グループ エントリ(例:posixGroup エントリ)を定義します。したがって、StudentEnrollment の下に Math101 posixGroup を定義し、TeacherEnrollment の下に Math101 posixGroup を定義します。2つのEng201グループも同様に定義します。posixGroupの名前はMoodleコースのコースID番号と一致している必要があるので注意してください。コースの短縮名を使用しないでください。(Windows 2000以前のグループ名ウィンドウでグループ名を少し変更することで、MS-ADで同じ名前の2つのセキュリティグループを持つことができます)
  3. 先ほど定義したLDAP-groupsのメンバーとして学生と教師を登録します。これは、関連するグループの memberUid 属性に users uid 属性 (idnumber) を入力することで行います。 ゜TeacherAはTeacherEnrollmentの下のMath101グループのメンバーです。 ゜StudentD と StudentE は StudentEnrollment の下の Math101 グループのメンバーです。 ゜TeacherAとTeacherBは、TeacherEnrollmentの下のEng201グループのメンバーです。 ゜StudentEとStudentFはStudentEnrollmentのEng201グループのメンバーです。

1.4 MoodleにおけるLDAP登録設定

上記の設定に対応するMoodleのLDAP登録設定は以下の通りです。

LDAP登録変数: 値:
{enrol_ldap_student_contexts: ou=StudentEnrollment,dc=ldapserver,dc=tmcc,dc=edu
enrol_ldap_student_memberattribute: memberUid (Active Directoryの場合は'member'を使用 -引用符は含まない)
enrol_ldap_teacher_contexts: ou=TeacherEnrollment,dc=ldapserver,dc=tmcc,dc=edu
enrol_ldap_teacher_memberattribute: memberUid (Active Directoryの場合は引用符なしの'member'を使用)
enrol_ldap_objectclass: posixGroup (Active Directoryの場合は'group' (引用符なし)を使用)
enrol_ldap_course_idnumber: cn
enrol_ldap_course_shortname: cn
enrol_ldap_course_fullname: cn
enrol_ldap_autocreate: はい

さらに、あなたはLDAP認証を使用しているので、ユーザの「ID番号」をユーザのLDAPエントリの「uid」にマッピングしてください。これはMoodle LDAP認証ページで行います (LDAP登録ページではありません)。

1.5 コースの自動作成

Moodleにまだ存在しないコースへのLDAP登録がある場合、コースを自動的に作成することができます。これを有効にするには、enrol_ldap_autocreateYesに設定してください。
enrol_ldap_categoryフィールドは自動的に作成されるコースのカテゴリを設定します。
enrol_ldap_templateフィールドには自動コース作成でテンプレートとして使用されるコースの短縮名を含めることができます。
開始日やフォーマットなどの基本設定のみがテンプレートコースからコピーされます。
コンテンツやブロック設定はコピーされません。

1.6 注意事項

  1. Moodleで手動でコースを作成する必要はありません。コースが存在しない場合、最初に登録したユーザがログインしたときに作成されます。
  2. ユーザのLDAPレコードに同じ文字列cnとuidを使用しています。これは必要ないと思います。ただし、異なる値を使用する場合は、LDAP認証の設定でldap_user_attributeをuidに定義する必要があります。
  3. 上記のLDAPコンテナセットアップのステップ2でグループに対して定義されたグループID番号(gidNumber)の値は重要ではありません。この設定では使用しません。
  4. 添付の .ldif ファイルは、ユーザーが LDAP の ou=People コンテナにいることを前提としています。これを反映させるためにLDAP認証の設定をする必要があります(ldap_contexts変数)。
  5. この設定のためのユーザーパスワードは、添付の .ldif ファイルで定義されています。
  6. 添付の.ldifファイルを使用する場合は、LDAPサーバ情報(「dn=」行)を編集する必要があります。

2 その他のLDAPレイアウト

私は新しいLDAPオブジェクト、例えばmoodleCourseを作成することを提案します。

属性型 ( oidAttrBase:44 NAME ( 'teacherUid' ) SUP memberUid
        DESC「このコースの講師は誰ですか?
    )


objectclass ( oidObjRoot:14 NAME 'moodleCourse' SUP top STRUCTURAL
        DESC 'Moodleで利用可能なコース'
        MUST ( cn )
        MAY ( owner $ gn $ sn $ seeAlso $ description $ memberUid $ teacherUid )
        )

注意: Openldap 2.xでは以下のようなものが必要です。

attributetype ( 1.2.1.1.1.1.1.1.2.1 NAME 'teacherUid'
                SUPメンバーUID
                DESC「このコースの講師は誰ですか?
                EQUALITY caseExactIA5Match
                SUBSTR caseExactIA5SubstringsMatch
                SYNTAX 1.3.6.1.4.1.1.1466.115.121.1.26 )

objectclass ( 1.2.1.1.1.1.1.1.1)
                名前 'moodleCourse'
                SUPトップSTRUCTURAL
                DESC 'Moodleで利用可能なコース'
                MUST ( cn )
                MAY ( owner $ gn $ sn $ seeAlso $ description $ memberUid $ teacherUid )
                )

設定は以下のようになっています。太字では必要な変更点が、イタリック体では便利な変更点が表示されています。

LDAP 登録変数:
enrol_ldap_student_contexts: ou=moodle, ou=groups,dc=ldapserver,dc=tmcc,dc=edu
enrol_ldap_student_memberattribute: memberUid
enrol_ldap_teacher_contexts: ou=moodle, ou=groups, dc=ldapserver, dc=tmcc, dc=edu
enrol_ldap_teacher_memberattribute: teacherUid
enrol_ldap_objectclass: moodleGroup
enrol_ldap_course_idnumber: cn
enrol_ldap_course_shortname: 与えられた名前
enrol_ldap_course_fullname: sn
enrol_ldap_course_summary: 説明

enrol_ldap_autocreate. はい
注意: enrol_ldap_course_idnumber (私の設定ではcn)はLDAP登録スクリプトでコースを識別するために使用され、データベースはMoodle v1.8ではINTEGER数値を使用します。あなたが

以下のコマンドを実行することで、 同じID番号のコースを更新します。

cd enrol/ldap/ && php -f enrol_ldap_sync.php

これはLDAP同期のために非常に重要であり、一意である必要があります。

moodleCourse LDAPオブジェクトのサンプル。

dn: cn=851,ou=moodle,ou=groups,dc=ldapserver,dc=tmcc,dc=edu
objectClass: moodleCourse
cn: 851
givenName: LV851
sn: 2007S/Introduction to Moodle
description: Jahr: 2007 Sommer, <A TARGET=_blank HREF="https://other_server/display/851">Announcement</A>
teacherUid: userA
memberUid: user1

同じ方法で、他のすべてのロールマッピングを追加することができます。

3 関連項目

LDAP認証と登録のセットアップガイド(PDF 227KB)

Moodleフォーラムのディスカッション

Lars Jensenの2005年の投稿によるLDAP登録HOWTO
LDAP自動登録
LDAPの悪夢 パート2
Moodle + AD + LDAP = 混乱 - ヘルプが必要で提供されています。

LDAPに関するウィキペディア: Moodleの文脈を超えた多くの情報

カテゴリ | 登録 | 更新を必要とするページ:(翻訳準備中)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Moodle 3.9 マニュアル - ゲストアクセス

原文

ゲストアクセス

ゲストアクセス機能はゲストロールを持つユーザがコースのコンテンツを閲覧することを可能にします。これは例えば、Moodleサイトが特定のコースが一般公開された情報を含むウェブサイトとして機能している場合や、商用のMoodleサイトでゲストアクセス機能を持つコースが購入可能なコースの「試食」を提供している場合などに使用されます。(ゲストはいかなる活動にも参加することができず、コンテンツを閲覧することしかできません。)

内容

1 ゲストアクセスのコース設定
2 ゲストアクセスの管理者設定
2.1 ゲストアクセスのデフォルト設定
2.2 ゲストの自動ログイン
3 関連項目

1 ゲストアクセスのコース設定

video
ゲストをコースに入れる方法

  1. Boostテーマの場合は、左側のナビゲーションドロワーから「参加者」をクリックし、右側の歯車メニューから「登録方法>ゲストアクセス」をクリックします。その他のテーマの場合は、「管理」→「コース管理」→「ユーザー」→「登録方法」→「ゲストアクセス」の順にクリックします。
  2. ゲストアクセスを有効にするには、「目」のアイコンをクリックするか、「メソッドの追加」ドロップダウンメニューで選択します。
  3. パスワードを設定したい場合は、設定アイコンをクリックして、ここにパスワードを入力してください。

2 ゲストアクセスの管理者設定

video

あなたのMoodleサイトへのゲストのアクセスを許可する方法

・管理 > サイト管理 > プラグイン > 登録 > プラグインの管理 > 登録プラグインの管理で、ゲストアクセスが有効になっていることを確認してください(目が開いている)これは、ゲストアクセスを有効にします。
・管理 > サイト管理 > プラグイン > 認証 > 認証の管理で、フロントページにボタンを表示する場合は、ゲストログインボタンを表示に設定します。
・また、ゲストアカウントをログに記録することができます - Administration > Site administration > Plugins > Logging > Log guest access settingをチェックしてください。
・ゲスト用のサイトポリシーはサイト管理 > セキュリティ > サイトポリシーで設定することができます。ゲストは、ゲストアクセスでコースにアクセスする前にサイトポリシーに同意する必要があります。

2.1 ゲストアクセスのデフォルト設定

・管理 > サイト管理 > プラグイン > 登録 > ゲストアクセスをクリックすると、管理者がコース内のゲストアクセスのデフォルト設定ができる画面が表示されます。
゜ゲストアクセスを許可する」の隣にある「詳細設定」ボタンをクリックすると、コース内のこの設定が非表示になり、代わりに「詳細を表示」リンクが表示され、クリックして設定にアクセスすることができます。
゜ゲストアクセスはすべての新規コースでデフォルトでオンにすることができます。
゜ゲストアクセスを持つ各コースにゲスト用のパスワードを設定するように要求することもできます。(注意: これは要件を認識していない教師を混乱させる可能性があります。)
ゲストアクセスパスワードには、あなたのMoodleの標準パスワードポリシーを使用するか無視してください。
゜ヒントとしてパスワードの最初の文字を必要に応じて提供しています。

2.2 ゲストの自動ログイン

・管理 > サイト管理 > ユーザー > アクセス権 > ユーザーポリシーで、ゲストアクセスのあるコースにアクセスした際に、訪問者が自動的にゲストとしてログインするようにチェックを入れることができます(つまり、「ゲストとしてログイン」ボタンをクリックする必要がありません)。
・管理 > サイト管理 > プラグイン > 認証 > 認証の管理で、「ゲストログインボタン」を「表示」に設定する必要があります。
・管理>サイト管理>セキュリティ>サイトポリシーで、「Googleに公開」の設定にチェックを入れることで、Google検索ロボットがゲストとしてあなたのサイトに入ることができるようになります。また、Google検索でサイトに入ってきた人は自動的にゲストとしてログインします。

3 関連項目

ゲストロール:(翻訳準備中)
Re. コースセクションへのゲストアクセス!フォーラム投稿
トラッカーディスカッション 'Auto-login guests not working' MDLSITE-4903

カテゴリ | 登録

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Moodle 3.9 マニュアル - カテゴリ:先生

原文

教員向けの資料ページのインデックス。

サブカテゴリ
このカテゴリには、全15件のうち、次の15件のサブカテゴリがあります。

B
Blog
C
Course
D
Database activity module
Discipline-specific Moodling
G
Glossary
H
Hotpot
M
Mathematics
N
Notes
Q
Questions
Quiz
R
Restrict access
S
SCORM
Survey
W
Wiki
Workshop

カテゴリー「先生」のページ
全32ページ中、このカテゴリには以下のページがあります。

A
Adding/editing a questionnaire
Ajax marking block
Autoattendance block
Autoattendance module
C
Can not log in
Chemistry/Biochemistry
E
Edit page order (Lesson)
Editing Questionnaire questions
Elgg
J
Jumps
L
Language teaching
Lesson score
M
Mathematics
Mathematics tools FAQ
mod/referentiel/activite
mod/referentiel/bareme
mod/referentiel/certificat
mod/referentiel/export
mod/referentiel/import instance
mod/referentiel/task
mod/referentiel/view
mod/techproject/view
Multianswer question type
Multiple choice question (Lesson)
P
Portable recording devices
Q
Question types
Questionnaire question types
Quiz Time Limit
S
Setting up a questionnaire
U
Using Moodle book
V
Viewing Feedback responses
W
WebDAV Connect

メインページ

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Moodle 3.9 マニュアル - フロントページの変更

原文

内容

1 サイトホーム
2 サイト名とコース情報の変更
3 中央エリアにサイト概要を追加
4 ログイン時のランディングページ
5 役に立つ動画
6 詳細はこちら

1 サイトホーム

・あなたのMoodleフロントページはサイトホームとして知られています。
・MoodleCloudサイトでは、あなたがログインするまでログインページを表示するだけです。

2 サイト名とコース情報の変更

  1. 管理者アカウントでログイン
  2. 左側のパネル(「ナビゲーション」ドロワー)から、サイト管理をクリックします。
  3. フロントページセクションまでスクロールして、フロントページの設定をクリックします。
  4. ここでサイト名の長短を変更します。
  5. 2つのドロップダウンから、ログインしていないユーザーとログインしているユーザーに表示する項目を決定します。
  6. 変更を保存をクリックします。

3 中央エリアにサイト概要を追加

  1. 管理者アカウントでログインして、フロントページ/サイトホームに移動します。
  2. 右上の cog/Edit アイコンをクリックして編集をオンにします。
  3. 左側のcog/Editアイコンをクリックすると、サイト情報を追加できるテキストエディタが表示されます。

4 ログイン時のランディングページ

・ デフォルトでは、ユーザーがログインすると、個人用のダッシュボードページが表示されます。このページには、ユーザーが登録しているコースに関する情報が表示されます。
・ これを変更して、ユーザーがサイトのホーム(フロントページ)に移動するようにすることもできます。

  1. 管理者アカウントでログインします。
  2. 左側のパネル(ナビゲーションの引き出し)から、「サイト管理」をクリックします。
  3. 外観 タブをクリックします。
  4. ナビゲーションをクリック
  5. ユーザーのホームページを「サイト」に変更します。

5 お役立ち動画

動画の埋め込みはこちら

6 詳細はこちら

カテゴリ | 管理者の基礎

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Moodle 3.9 マニュアル - カテゴリ:管理者の基礎

原文

管理者の基本をカバーするページのインデックス。
カテゴリー「管理者の基礎」のページ

全8ページ中、以下の8ページがこのカテゴリに含まれています。

フロントページの変更

A

Add course content
Add new users
Add teachers and students

C

Change your front page (日本語訳:フロントページの変更)
Create a course

E

Enable course sign up

M

Manage users

O

Organise your courses

カテゴリ | 管理者

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む