【Laravel】【ホテル予約管理】ユーザーアカウントにユーザー情報を含める

前回までの状況はこちら

最新ソースはこちら(gitHub)

https://github.com/takishita2nd/hotel-mng

さて、これからどんな形にしていこうかというと、

  • ユーザー登録時にユーザー情報を入力する(フルネーム、住所、電話番号)
  • 予約登録時にはログインユーザーの情報を使用するので、ユーザー情報の入力を省く
  • 部屋ごとに利用できる(空きのある)日と、利用できない(ほかユーザーが予約済み)日をわかるようにする

というのが必要かなと。

まずは、ユーザー登録処理を修正しましょうか。

というわけで、データベースのカラムを追加します。

$ php artisan make:migration move_column_name_address_phone_to_users_table --table=users
class MoveColumnNameAddressPhoneToUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->string('fullname')->after('email');
            $table->string('address')->after('fullname');
            $table->string('phone')->after('address');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->dropColumn('fullname');
            $table->dropColumn('address');
            $table->dropColumn('phone');
        });
    }
}
$ php artisan migrate

これで、usersテーブルにフルネーム、住所、電話番号のカラムが作成されました。

Viewを書き換えます。

                        <div class="form-group{{ $errors->has('fullname') ? ' has-error' : '' }}">
                            <label for="fullname" class="col-md-4 control-label">Full Name</label>

                            <div class="col-md-6">
                                <input id="fullname" type="text" class="form-control" name="fullname" value="{{ old('fullname') }}" required autofocus>

                                @if ($errors->has('fullname'))
                                    <span class="help-block">
                                        <strong>{{ $errors->first('fullname') }}</strong>
                                    </span>
                                @endif
                            </div>
                        </div>

                        <div class="form-group{{ $errors->has('address') ? ' has-error' : '' }}">
                            <label for="address" class="col-md-4 control-label">Address</label>

                            <div class="col-md-6">
                                <input id="address" type="text" class="form-control" name="address" value="{{ old('address') }}" required autofocus>

                                @if ($errors->has('address'))
                                    <span class="help-block">
                                        <strong>{{ $errors->first('address') }}</strong>
                                    </span>
                                @endif
                            </div>
                        </div>

                        <div class="form-group{{ $errors->has('phone') ? ' has-error' : '' }}">
                            <label for="phone" class="col-md-4 control-label">phone</label>

                            <div class="col-md-6">
                                <input id="phone" type="text" class="form-control" name="phone" value="{{ old('phone') }}" required autofocus>

                                @if ($errors->has('phone'))
                                    <span class="help-block">
                                        <strong>{{ $errors->first('phone') }}</strong>
                                    </span>
                                @endif
                            </div>
                        </div>

register.blade.phpに上の部分を書き足しました。

登録処理も書き換えます。

app/User.phpを以下のように書き換えます。

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'fullname', 'address', 'phone', 'email', 'password',
    ];

これは、usersテーブルのカラムを設定している箇所です。

これを実際のカラム名に合わせなければ、正しくデータベースに反映されません。

次に、パラメータチェックです。

registerController.phpのバリデートルールを書き足します。

    protected function validator(array $data)
    {
        return Validator::make($data, [
            'name' => 'required|string|max:255',
            'fullname' => 'required|string|max:255',
            'address' => 'required|string|max:255',
            'phone' => 'required|digits:11',
            'email' => 'required|string|email|max:255|unique:users',
            'password' => 'required|string|min:6|confirmed',
        ]);
    }

そして、実際にユーザーを作る処理。

    protected function create(array $data)
    {
        return User::create([
            'name' => $data['name'],
            'fullname' => $data['fullname'],
            'address' => $data['address'],
            'phone' => $data['phone'],
            'email' => $data['email'],
            'password' => bcrypt($data['password']),
        ]);
    }

これで、ユーザー情報を追加することができました。

【Laravel】【ホテル予約管理】ユーザーの権限管理を行う

最新ソースはこちら(gitHub)

https://github.com/takishita2nd/hotel-mng

さて、お次の課題は、

  • 一般ユーザーからでも予約登録ができる
  • レスポンシブ対応にする

です。

で、そのために必要になるのが、ユーザーの権限管理というものです。

具体的には、管理者用のアカウントを登録して、管理者アカウントからは今までのフル機能が使用できる。

その一方で、通常ユーザーの場合は、一部の機能だけが使用できる、という感じです。

Laravelの権限管理の方法は色々あるようですが、今回は一番簡単なGATEを使用した方法を採用しようと思います。

この方法なら、新たに特別なプラグインを使用する必要がないためです。

では、Userテーブルに還元を管理するカラムroleを追加します。

$ php artisan make:migration add_column_role_users_table --table=users
class AddColumnRoleUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->tinyInteger('role')->default(0)->after('password');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->dropColumn('role');
        });
    }
}
$ php artisan migrate

単純にrole=0が一般ユーザー、role=1が管理者アカウントとします。

では、Seederを使用して、管理者アカウントを予め追加しておきます。

(これを行わないと、管理者権限を与えるユーザーが存在しないことになるので、運用できません!)

$ php artisan make:seeder UsersTableSeeder
class UsersTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        DB::table('users')->insert([
            'name' => 'manager',
            'email' => 'manager@gmail.com',
            'password' => bcrypt('manager'),
            'role' => 1,
        ]);
    }
}
$ composer dump-autoload
$ php artisan db:seed --class=UsersTableSeeder

登録できました。

次は、AuthServiceProviderのboot()に処理を追加して、GATEによる権限の定義を記入します。

    public function boot()
    {
        $this->registerPolicies();

        Gate::define('manager', function ($user) {
            return ($user->role == 1);
        });
        Gate::define('user', function ($user) {
            return ($user->role == 0);
        });
    }

これで、role=1(manager)、role=0(user)がGATEによって定義されました。

では、Viewを書き換えて、一般ユーザーには不要なメニューを表示させないようにします。

<div class="panel-body">
    <detail-component></detail-component>
    <div>{{ Html::Link('/management/create', '追加', ['class' => 'btn']) }}</div>
</div>
@can('manager')
<div>{{ Html::link('/management/schedule', 'スケジュール', ['class' => 'btn']) }}</div>
<div>{{ Html::link('/management/total', '集計', ['class' => 'btn']) }}</div>
<div>{{ Html::link('/room', '部屋一覧へ', ['class' => 'btn']) }}</div>
<div>{{ Html::link('/management/checkout', '本日のチェックアウト', ['class' => 'btn']) }}</div>
@endcan

ポイントは@can(権限)〜@canend。

@can(権限)に権限の名前を入れることで、ユーザーの権限に対して@can(権限)〜@canendの表示を切り替えることができます。

manager権限

一般ユーザー

こんな感じで、表示の切り替えができました。

では、次回からは一般ユーザーの使い勝手がいいように修正していきましょうか。

ゲーム・ワールドフリッパーを辞めた理由

最初はピンボールを元にできたゲームとして、おっ、新しいな、と思って、楽しんでプレイしていました。

しかーし。

どうしても許せない欠点がありまして。

それは、協力プレイのマッチングが全然成立しない、と言うことです。

このゲームのマッチングシステムはというと、

まず、プレイヤーがルームを作成します。

これだけでは他のプレイヤーはそのルームに入ることはできません。

なので、ルームの建て主が他のプレイヤーを「招待」する必要があります。

招待対象はフォロワー、ランダムなどありますが、

招待を受けたプレイヤーはゲームのプレイ中に割り込み通知があり、参加するかどうかを選択できます。

このシステムがよろしくない。

結局招待できるプレイヤーが少ないから全然人が集まらないし、招待された側も自分の都合があるから断られることが多い。

なので、ルームに人が集まらず、協力プレイができない。

これは重大なシステムの欠陥と言えます。

そして、デイリーミッションに「協力プレイをする」というのが含まれています。

デイリーミッション完了できません。

運営はマッチング成功率とかのデータを取っていないのだろうか。

これじゃあ、ただのオート周回放置ゲーじゃないですか。

それに気づいて、アプリを消しました。

終了。

Ps4のリモートプレイを試す(PC編)

こちらではiOSの場合についてまとめたんですが、

実はリモートプレイって、PCでもできるんですね。

対応OSはWindowsとMacOSです。

https://remoteplay.dl.playstation.net/remoteplay/lang/jp/

やり方は上のサイトからアプリをダウンロード、インストールして、アプリを起動して、PSアカウントでログインする。

ここはiOSと同じ。

PC版で何が違うかというと、PS4のコントローラーはUSBケーブルで優先接続できるというところ。

PS4本体じゃないですよ、PC本体にですよ。

(逆にPCにコントローラーを接続しないと操作ができない)

もちろん、PCにBluetoothのレシーバがあればBluetoothでも接続できるのですが、ペアリングすると、iOSと同じようなペアリング問題が発生します。

でもPCに優先接続なら、優先接続中はPCに、ケーブルを外せばPS4本体に接続されます。

なので、ペアリング問題とは無縁。

まぁ、ネットワークを通じて画面を転送しているので、フレームレートが落ちるので、動きはなめらかじゃないですけどね。

でも、無双OROCHI3とかは問題なくプレイできた。

いいね。悪くない。

PS4のリモートプレイを試す(iOS編)

PS4のリモートプレイは、元々Xperia端末のみで可能でしたが、ちょっと前のアップデートで、他の端末でも利用可能になりました。

しかも、Android端末だけで無く、iOSやPCでも可能になっています。

というのは、今自分はPixel3を使用しているのですが、Pixel3でリモートプレイをしようと思ったら、画面縦置き固定でゲーム画面は上1/3以下のサイズで、画面タップでプレイする、というものでした。

たぶん、PS4コントローラーをベアリングすれば使えると思いますが。

でももっと大きな画面でプレイしたい。

Androidタブレットだとどうなるんですかね?

そもそもAndroidタブレットって、いまそんなに需要無い?(しらんけど)

オイラはiPad Proを持っているので、これに表示できれば、まだマシになるんじゃないかと思いました。

なので、検索。

ありました。

仕組みは、Androidのリモートプレイと同じで、LAN/Wifi経由で画面を表示させます。

アプリを起動して、PSアカウントでログインすると、自動的にネットワーク上のPS4を探してくれます。

ゲーム画面がほぼ全画面に表示され、コントローラーと同じ位置に、各ボタンに対応するタッチエリアがあります。

しかも、PS4コントローラーをBluetoothでiPadとペアリングすれば、PS4コントローラーでプレイできます。

リモートプレイを使用すると、PS4とペアリングしているコントローラーは切断されて使用できないので、コントローラーをiPadとペアリングして使用する必要があります。

ただ、これを元に戻すのが面倒で、まず、iPad側からペアリングを削除する必要があり(コントローラーの電源を入れると、勝手にiPadに接続されます)、PS4とペアリングするにはUSBケーブルで接続する必要があります。

この接続が面倒で、純正ケーブルか、充電・通信ケーブルを使用する必要があります。(充電専用ケーブルではPS4本体とペアリングできない)

まぁ、充電専用ケーブルはケーブル自体が細いから、ケーブルの太さで区別はできるのですが。

まぁ、ややこしい、ということです。

まぁ、こういうリモートプレイもできるんだぞってことで。

Wifi経由で画面に表示させているので、フレームレートはちょっと低い感じがします。

反日種族主義を読んで

Kindleを使用していたら、Amazonにオススメされたので、思い切って購入してしまいました。

いやー読み応えありましたね。

オイラは10年以上前に韓国人の先生に韓国語を教わって貰ったりとか、個人で韓国旅行もしていました。

そして、そのうち、日韓関係の問題にも関心を持つようになりました。

いろいろモヤモヤーとしていることも沢山ありました。

その答えがこの本の中にありました。

この本のすごいところは、それら日韓の問題に対して、いままで調査して集めた資料を基に、丁寧に解説しているところ。

さらに、なぜ今のような問題が発生してしまったのかを導き出している事。

そして、何よりも、これを書いたのが韓国人の歴史学者である事です。

著者は日本統治下の朝鮮の歴史だけで無く、その前後も含めた朝鮮史まで調べ上げ、さらに戦時中の日本のことも調べ上げています。

その中で数多くの資料を基に真実も導きされています。

これは、ネットに転がっている嫌韓サイトの情報よりも非常にわかりやすくて納得のいく内容でした。

そして、現在の韓国人達のマインドを作り出してしまった、政治家、活動家、歴史学者の過ちにも指摘しています。

ただ単に日本の主張を裏付ける書籍と考えてはいけない。

韓国人も、日本人も、この本を読んで、何が真実で、何が誤りなのかを考える必要があると思います。

それができなければ、永遠に問題は解決できない。しようとしないのであれば、解決する意思が無いと言えるかもしれません。

とにかく、一人でも多くの人にこの本を読んで貰いたい。

そう思いました。

はーすっきりした。

モヤモヤが解放された気分です。

読んで良かった。

【laravel】【ホテル予約管理】チェックアウト時刻一覧の問題を解決する

本日から本気出す。

前回までの状況はこちら

最新ソースはこちら(gitHub)

https://github.com/takishita2nd/hotel-mng

実は、このリポジトリの処理には重大な問題があります。

    public function getCheckoutList()
    {
        $ret = array();
        $index = 0;
        $checkout = ReserveManagement::select('rooms.name as roomname', 'checkout')
                                    ->leftJoin('reserve_management_room', 'reserve_managements.id', '=', 'reserve_management_room.reserve_management_id')
                                    ->leftJoin('rooms', 'reserve_management_room.room_id', '=', 'rooms.id')
                                    ->get();
        date_default_timezone_set('Asia/Tokyo');
        $today = date("Y-m-d");
        foreach ($checkout as $value) {
            $str = explode(" ", $value->checkout);
            if($today == $str[0]) {
                $value->checkout = $str[1];
                $ret[$index] = $value;
                $index++;
            }
        }
        return $ret;
    }

全レコードを取得したあと、日付チェックをおこない、必要なデータのみを取得する、というやり方ですが、このやり方では、大量のデータをデータベースから取得し、PHPで処理する、というやり方なので、サーバに大きな負荷がかかります。

これを解消するには、データベースから取得するデータの量を度絞らなければなりません。

なので、以下のように修正します。

    public function getCheckoutList()
    {
        date_default_timezone_set('Asia/Tokyo');
        $today = date("Y-m-d 00:00:00");
        $tomorrow = date("Y-m-d 00:00:00", strtotime("tomorrow"));
        return ReserveManagement::select('rooms.name as roomname', 'checkout')
                                    ->leftJoin('reserve_management_room', 'reserve_managements.id', '=', 'reserve_management_room.reserve_management_id')
                                    ->leftJoin('rooms', 'reserve_management_room.room_id', '=', 'rooms.id')
                                    ->whereBetween('checkout', [$today, $tomorrow])
                                    ->get();
    }

クエリビルダにwhereBetween()を追加し、BETWEEN節を追加しました。範囲は、アクセス当日の0時から次の日の0時です。

これだけで必要なデータは全て取れましたので、それをそのまま返します。

動作結果は前回と同じになります。

うん、こっちのほうがコードもスッキリしていいですね。

【自作PC】32GBのメモリを使い切ってみよう

これを検証する前に、アイドル状態(Windowsを立ち上げてデスクトップを表示しているだけ)でどれだけメモリを使用しているかを見てみます。

とにかく、不要な常駐アプリも終了させて、こんな感じでした。

使用中のメモリサイズが3.5GBです。

4GBしか積んでいなかったら残りが0.5GBしかないので、これではすぐにページングが発生してしまうという事になりますね。

ページングが発生するとPC全体の処理速度が低下します。

ちなみに、自分の環境では常駐アプリも含めると、こんな感じになります。

3.9GBですね。

この状態から、Word、Excel、Acrobat Readerを開くと、こんな感じです。

4.7GB。メモリが4GBしか積んでいなかったらページングが発生しています。

さて、ここから本題に入りまして。

どんどん、アプリを起動して、32GBのメモリを使い切ってみよう。

ここで起動したアプリは、

  • マインクラフトBE版
  • マインクラフトJava版
  • DMM Games
  • Word
  • Excel
  • Acrobat Reader DC
  • Visual Studio 2019
  • Android Studio
  • Unity
  • Vivaldi
  • Google Chrome
  • Cyberlink PowerDirector

たくさんのドキュメントを開いて、プログラミングしている途中でYouTubeなどを見ながらゲームをする、と言う設定です。

そんな使い方するヤツいねーよ!

結果はこうなりました。

メモリ半分使う前に、CPUが限界に達しました。

CPUの処理が追いついていないので、全体的にモッサリした動きになってました。

しかし、PowerDirectorでたくさんの動画ファイルを使用したりとか、VMWareなどの仮想環境を複数立ち上げていた場合だったら、32GBを使い切ることができるかもしれません。

たぶん、メモリ16GBを割り当てたLinux仮想環境を立ち上げても快適に動作するよ。

でも、逆に言えば、そんなヘビーな使い方をしない限りは、メモリ16GBあれば、十分ということになります。

そしてなにより、CPUも強化しないと、性能を生かすことができないということですね。

うーむ、贅沢な道楽。

でも次の収入があるまで我慢。

もっと体を大事にしたい

最近、ある体の変化に気がつきまして。

なんか、酒が抜けるのが遅い。

オイラはよくお昼に居酒屋とか、焼肉屋に行ってお酒を飲むのですが、まぁ、酒が抜けるのが遅い。

昔は、お昼に飲んでも、夕方には抜ける感じがするのですが、最近は、夜寝る前になってもお酒が残っているような、気分が悪い感じがします。

特に夜遅くにお酒を飲んで、そのまま寝ちゃうと、次の日は最悪です。昔のような二日酔いで頭痛い、というのは無いけど、とにかく気分が悪くてグロッキー状態で寝たまま一日潰れます。

調べてみると、加齢でお酒に弱くなると言うのは、実際にあり得るらしい。

肝臓の働きが弱くなるらしいのですね。

肝臓がアルコールを分解する能力が低下して、こんな感じでお酒が残るという。

目の疲れもひどくなって、眠りも浅くなって、酒にも弱くなるって。

何を楽しみに生活すれば良いのかわからないです。

いや、前から言っているけど、無理できない体やわ。

もっと体を大事にしないといけないね。

老いるって辛いわ。

くっそー

いっそうのこと、しばらくお酒止めてみましょうか。

それで痩せることができれば万々歳。

いつまで続くかわからないけど。

みんなも体を大事に。

いつまでも20代、30代のような生活ができると思うなよ???

おせちーで始める年末年始

明けましておめでとうございます。

今年もよろしくお願いします。

おせちー(大晦日に食べた)

楽天で8000円しました。

正月ぐらいは贅沢して良いよね。

そうですねー

今年の目標は、

ブログ収入を現金化できるレベルまで上げていきたいですね。

そのための時間はたっぷりありますし。

ネタもそこそこあります。

やっぱり、好きなことでお金を稼げるって楽しいですよ。

記事にするという手間はありますが、地道に続けていけば、成果は出る、というのが、ここ3ヶ月でブログを更新し続けてわかりました。

YouTuberと同じですよ。

YouTuberでお金を稼いでる人は、好きなことをやってそれを動画に撮って、編集して、としているので。

手段は違えど、やっていることは同じ。

そうだなー

自作PCはCPUをワンランクアップさせたいっすね。

ちょっとカッコイイパーツ使って変態PCにしても良いかもしれない。

もちろんプログラミングも続けていきます。一番大好きな分野ですからね。

お料理も続けていきます。まだネタがあるんですよ。

それと同時に動画の編集も勉強していきたい。

あと、本格的にダイエットしたい。

お腹の余計な贅肉を処理したい。

ただ、冬場は運動できる場所が限られているので、春が来るまで筋トレと食事、春になったらウォーキング・ランニングで脂肪を落としたい。

それもネタにしちゃう?

とりあえず、考えておく。

キャンプもやりたいですね。

まずはデイキャンから始めようか。やりたいことはたっぷりあって良いんだけど。

問題は資金面だね。

まぁ、まだ失業保険も障害年金も残っているので、なんとかします。

というわけで、今年もがんばります。

本日のおつまみ、中トロの刺身

自分、ぼっちですが何か?