変な広告が届いていました。

これです。

札幌のいろんな家庭に配布されているらしい。

ちなみに、一言言っておくと、チラシに5Gと書かれていますが、5Gのサービスインは2020年以降なので、まだ5Gは使用できません。

このデバイス、どこかで見たなーと思ったら、これでした。

UQ WiMAXが提供しているWiMAX 2+を使用した無線WiFiルータですね。

この業者さんはUQ WiMAXの代理店さんなのだろうか?

WiMAX 2+ は大部分の都市部で使用可能で、もちろん札幌市も圏内に入ってます。

※しかし、念のため公式サイトで圏内チェックすることをオススメします。

https://www.uqwimax.jp/wimax/area/

で、このデバイスも比較的新しい物で、端末30台に接続できる他に有線LANのポートも2つ付いています。

物としては意外と悪くない。

むしろ、建築物の都合上光回線が使えない家庭向けのものですね。

うーん、実際に使ってみて比較するというのも面白そうだけど。

お金がもったいない。

公営住宅に引っ越すとしたら選択肢としてはアリですね。

【自作PC】メモリを増設してみた結果。。。

以前発注していたメモリが届きました。

たぶん同じ型だと思う。色は違うけど。

※その当時のレシートを無くしてもうた。

装着。

で、電源ON。

・・・画面に何も表示されません。

ここでやるべき事は、問題の切り分けです。

まず、メモリを全て取り外し、新しく買ってきたメモリだけを指します。

これで動作確認。

ふむ、電源が入らないケースと画面になにも表示されないケース(上と同じ症状)が発生しています。

この状況から推測すると、やはり新しく追加したメモリに問題がありそうだ。

とりあえず、メモリは元の状態に戻して、問題無く動くことを確認。

そして、ショップに問い合わせ。

さーて、どうなることやら。

ぶっちゃけ、ツクモ店頭で購入して、相性保証付けて貰った方が良かったな。

明日サツエキに行く予定があるからついでに寄ってみようか。

【マインクラフト】VPSに統合版マインクラフトサーバを立ててみた

お金を支払って使用するRealmsではない、自前のVPSでマインクラフト統合版のサーバを作成してしまいました。

別に、利用期限が切れて、お金払うのがもったいないわけではありませんが。

まずは、公式から統合版マイクラサーバをダウンロードします。(VPSなので、サーバのOSはubuntu使用しています。)

https://www.minecraft.net/ja-jp/download/server/bedrock/

これをVPSに設置して、プログラムを実行して、ファイアーウォール(iptable)を開放すれば完成。

展開する場所は実行できる場所であれば、どこでもOK。

適当なフォルダを作成して、そこにzipファイルを展開します。

展開したフォルダで以下のコマンドを実行。

LD_LIBRARY_PATH=. ./bedrock_server

ここまではマニュアルどおりですな。

$ LD_LIBRARY_PATH=. ./bedrock_server
NO LOG FILE! - setting up server logging...
[2019-12-19 19:14:12 INFO] Starting Server
[2019-12-19 19:14:12 INFO] Version 1.14.1.4
[2019-12-19 19:14:12 INFO] Session ID 33eced1a-7577-414d-b987-76524f997544
[2019-12-19 19:14:12 INFO] Level Name: Bedrock level
[2019-12-19 19:14:12 INFO] Game mode: 0 Survival
[2019-12-19 19:14:12 INFO] Difficulty: 2 NORMAL
[2019-12-19 19:14:15 INFO] IPv4 supported, port: 19132
[2019-12-19 19:14:15 INFO] IPv6 supported, port: 19133
[2019-12-19 19:14:15 INFO] IPv4 supported, port: 49148
[2019-12-19 19:14:15 INFO] IPv6 supported, port: 52245
[2019-12-19 19:14:17 INFO] Server started.

実行が確認できたら、ctrl+cで一旦終了します。

iptablesの設定

サーバ実行中に

$ netstat -ltup4

を実行すると、統合版マインクラフトサーバはUDPのポート番号19132を使用していることがわかります。

udp        0      0 0.0.0.0:19132           0.0.0.0:*                           15680/./bedrock_ser 

※もう一つポートを使用していますが、ランダムで決められている上に使用しなくても問題ないので、無視して構いません。

なので、UDPの19132を開放します。

$ sudo iptables -A INPUT -p udp -m udp --dport 19132 -j ACCEPT

この状態で、再び統合版マインクラフトサーバを起動し、クライアントのサーバー一覧からサーバーアドレスを指定してログインできること確認。

※ここで最初躓いたのは内緒。

ログインできることを確認したら一旦ログアウトします。

ホワイトリストの登録

このままでは、サーバのURLがわかってしまうと誰でもログインできる状態になっているので、ホワイトリストを作って、登録したメンバーだけしかログインできないようにします。

サーバを設置したフォルダにserver.propertiesというファイルがあるので、これを開いて、以下を変更します。

white-list=true
# If true then all connected players must be listed in the separate whitelist.json file.
# Allowed values: "true" or "false"

white-list=trueに書き換えて保存することで、ホワイトリストが有効になります。

続いて、ホワイトリストの登録。

whitelist.jsonを開いて、以下のように書き加えます。

[
    {
        "ignoresPlayerLimit": false,
        "name": "ユーザー名"
    }
]

ignoresPlayerLimitというのは接続ユーザー数のリミットに関係なくログインさせるか、という設定です。

通常では最大接続ユーザー数は30なので、これはどちらでも関係ないと思います。

nameの項にマインクラフトアカウントのユーザー名を記入します。

この画面の真ん中に出てるじゃないですか。このアカウント名ですよ。

記入したら保存して、サーバを起動し、クライアントからログインできることを確認します。

プレイヤーに権限を付与する

このままでもゲームはプレイできますが、現在地の座標を表示したり、他プレイヤーをキックしたり、やりたい人によっては、チートしたいとかあると思いますが、このままではそれを変更できる権限がありません。

なので、ユーザーに権限を設定します。

編集するファイルはpermissions.jsonです。

こんな感じに書き加えます。

[
    {
        "permission": "operator",
        "xuid": "権限を与えるユーザーのxuid"
    }
]

ここで、ユーザーのxuidというのは、もう一度、whitelist.jsonを開いてもらえれば書き足されるのがわかると思いますが、ユーザー個別に与えられたID番号のようなものです。

これは自力で探るのは困難なので、一度ホワイトリストに登録し、ログインしてもらって、ホワイトリストに書き足されたxuidを確認したほうが早いです。

permissionの値は、通常(デフォルト)は”member”になっていますが、これを”operator”にすることで、ゲーム全体に対していろいろな設定を行う権限が与えられます。

なので、このユーザーは座標を表示することも、他ユーザーをkickすることも、チートすることも可能になります。

一度”operator”になってしまえば、ゲーム内からでも「/」キーでさまざまな設定を変更することが可能です。

ちなみに統合版で、座標を表示するには、operatorが以下のコマンド入力すれば表示されます。

/gamerule showcoordinates true

まぁ、今は統合版プレイする予定はないから、サーバは停止させておきますけどね。

【laravel】【ホテル予約管理】チェックアウト時間を追加する

最新ソースはこちら

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

さて、次の課題は、予約登録時にチェックアウト時間を登録し、日毎のチェックアウト時間と部屋を一覧に表示することです。

まずは、チェックアウト時間を登録する処理から作っていきます。

マイグレーションファイルを作成し、予約管理テーブルにチェックアウト時間を登録できるようにします。

class AddCheckout extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('reserve_managements', function (Blueprint $table) {
            $table->datetime('checkout')->nullable();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('reserve_managements', function (Blueprint $table) {
            $table->dropColumn('checkout');
        });
    }
}

次は、予約追加画面にチェックアウト時間を登録できるようにするのですが、30分おきにリストから選択する、という形式にしましょうか。

    /**
     * 時間一覧を30分おきにして返す
     */
    public function getTimeList()
    {
        $time = 0;
        $ret = array();
        for($i = 0; $i < 48; $i++)
        {
            $time = strtotime('00:00 + '.($i * 30).' minute') - strtotime('00:00');
            $ret[$time] = date('H:i', $time);
        }
        return $ret;
    }

これでarray[‘チックタイム’] = ’時間:分’というような形でリストを作成します。

これを表示します。

    public function create()
    {
        return view('register.create',
                    [
                        'rooms' => $this->roomRepository->getRoomList(),
                        'timelist' => $this->registerManagement->getTimeList()
                    ]
                );
    }
                    <tr>
                        <th>チェックアウト</th>
                        <td>{!! Form::select('checkout', $timelist) !!}</td>
                    </tr>
    public function store(ManagementRequest $request)
    {
        if($this->registerManagement->checkSchedule($request->start_day, 
                                                    $request->days, 
                                                    $request->room) == false)
        {
            return redirect('management/create')
                        ->with(['error' => 'スケジュールが重複します'])
                        ->withInput();
        }
        $param = $this->registerManagement->getParam();
        $this->registerManagement->add([
            $param[0] => $request->name,
            $param[1] => $request->address,
            $param[2] => $request->phone,
            $param[3] => $request->num,
            $param[4] => $request->days,
            $param[5] => $request->start_day,
            $param[6] => false,
            $param[7] => date('Y-m-d H:i', strtotime($request->start_day.'+'.$request->days.' day') + $request->checkout)
        ], $request->room);
        return redirect('management');
    }

チェックアウト時間は、宿泊日+宿泊日数+チェックアウト時間で計算します。

で、これを一覧表示。

    public function getList()
    {
        $select = ['reserve_managements.id as id', 'reserve_managements.name as name', 'address', 'phone', 'num', 'rooms.name as room', 'checkout', 'start_day'];
        return ReserveManagement::select($select)
                                    ->where('lodging', false)
                                    ->orderBy('start_day')
                                    ->leftJoin('reserve_management_room', 'reserve_managements.id', '=', 'reserve_management_room.reserve_management_id')
                                    ->leftJoin('rooms', 'reserve_management_room.room_id', '=', 'rooms.id')
                                    ->get();
    }
    public function getListByMonth($year, $month, $room)
    {
        $select = ['reserve_managements.id as id', 'reserve_managements.name as name', 'address', 'phone', 'num', 'rooms.name as room', 'checkout', 'start_day'];
        return ReserveManagement::select($select)
                                ->leftJoin('reserve_management_room', 'reserve_managements.id', '=', 'reserve_management_room.reserve_management_id')
                                ->leftJoin('rooms', 'reserve_management_room.room_id', '=', 'rooms.id')
                                ->where('start_day', '>=', date('Y-m-d', strtotime('first day of '.$year.'-'.$month)))
                                ->where('start_day', '<=', date('Y-m-d', strtotime('last day of '.$year.'-'.$month)))
                                ->where('reserve_management_room.room_id', $room)
                                ->where('lodging', false)
                                ->orderBy('start_day')
                                ->get();
    }

まぁ、やってることは、select句の中にcheckoutを追加しただけですが。

                    <table class="management">
                        <tr>
                            <th class="name">名前</th>
                            <th class="address">住所</th>
                            <th class="phone">電話番号</th>
                            <th class="num">人数</th>
                            <th class="room">部屋</th>
                            <th class="date">宿泊日</th>
                            <th class="checkout">チェックアウト</th>
                            <th class="command">編集</th>
                            <th class="command">削除</th>
                            <th class="command">宿泊</th>
                        </tr>
                    @foreach ($registerLists as $list)
                        <tr>
                            <td class="name">{{ $list->name }}</td>
                            <td class="address">{{ $list->address }}</td>
                            <td class="phone">{{ $list->phone }}</td>
                            <td class="num">{{ $list->num }}</td>
                            <td class="room">{{ $list->room }}</td>
                            <td class="date">{{ $list->start_day }}</td>
                            <td class="checkout">{{ $list->checkout }}</td>
                            <td class="command">{{ Html::link('/management/'.$list->id.'/edit', '編集') }}</td>
                            <td class="command">{{ Html::link('/management/'.$list->id.'/conform', '削除') }}</td>
                            <td class="command">
                            {!! Form::open(['url' => action('RegisterManagementController@lodging')]) !!}
                            {!! Form::hidden('id', $list->id) !!}
                            {!! Form::submit('宿泊') !!}
                            {!! Form::close() !!}
                            </td>
                        </tr>
                    @endforeach
                    </table>

宿泊日数のところをチェックアウト時間に置き換えました。

編集処理も同じように修正しています。

とりあえず、ここまで。

【Laravel】【ホテル予約管理】部屋ごとに集計する

前回までの状況はこちら。

最新ソースはこちら。(github)

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

最後は集計処理です。

今までは年月ごとに集計していましたが、今回はさらに部屋ごとに集計します。

さらに、部屋ごとに値段を自由に設定できるようにしたので、合計金額の算出処理も変更になります。

では、Viewに、部屋ごとにフィルタするコントロールを追加します。

                    {!! Form::open(['url' => action('RegisterManagementController@totalToMonthly')]) !!}
                    <table>
                        <tr>
                            <td>{!! Form::select('room', $rooms) !!}</td>
                            <td>{!! Form::submit('表示') !!}</td>
                        </tr>
                    </table>
                    {!! Form::close() !!}
                    <table class="total">
                        <tr>
                            <th class="yearmonth">年月</th>
                            <th class="name">部屋</th>
                            <th class="couont">件数</th>
                            <th class="total">売上</th>
                        </tr>
                    @foreach ($Lists as $list)
                        <tr>
                            <td class="yearmonth">{{ $list->yearmonth }}</td>
                            <td class="name">{{ $list->roomname }}</td>
                            <td class="couont">{{ $list->count }}</td>
                            <td class="total">{{ $list->total }}</td>

                        </tr>
                    @endforeach
                    </table>

フィルタ処理は、他のフィルタ処理と同様に、POSTリクエストすると、クエリパラメータ付きのURLに変換して、GETリクエストにリダイレクトします。

    /**
     * 月毎の集計を表示
     */
    public function total(Request $request)
    {
        if(is_null($request->input('room')))
        {
            return view('register.total', 
                            [
                                'Lists' => $this->registerManagement->countByMonthly(),
                                'rooms' => $this->roomRepository->getRoomList()
                            ]);
        }
        else
        {
            return view('register.total', 
                            [
                                'Lists' => $this->registerManagement->countByMonthly($request->input('room')),
                                'rooms' => $this->roomRepository->getRoomList()
                            ]);
        }
    }

    /**
     * 月毎の集計を表示
     */
    public function totalToMonthly(Request $request)
    {
        return redirect('management/total?room='.$request->room);
    }

次にリポジトリの処理。

今回は集計処理を行うDBアクセスと、部屋の値段を取得するDBアクセスを行い、PHP側で金額を算出させます。

    /**
     * 月毎に集計する
     */
    public function countByMonthly($room = 1)
    {
        $lists = ReserveDayList::select(DB::raw('DATE_FORMAT(day, "%Y-%m") as yearmonth'), DB::raw('count(*) as count'), 'rooms.name as roomname')
                                ->leftJoin('reserve_day_list_reserve_management', 'reserve_day_lists.id', '=', 'reserve_day_list_reserve_management.reserve_day_list_id')
                                ->leftJoin('reserve_managements', 'reserve_day_list_reserve_management.reserve_management_id', '=', 'reserve_managements.id')
                                ->leftJoin('reserve_management_room', 'reserve_managements.id', '=', 'reserve_management_room.reserve_management_id')
                                ->leftJoin('rooms', 'reserve_management_room.room_id', '=', 'rooms.id')
                                ->where('reserve_managements.lodging', true)
                                ->where('rooms.id', $room)
                                ->groupby('yearmonth')
                                ->groupby('roomname')
                                ->get();

        $model3 = Room::where('id', $room)->first();

        $ret = array();
        $index = 0;
        foreach($lists as $list)
        {
            $list->total = $list->count * $model3->price;
            $ret[$index] = $list;
            $index++;
        }

        return $ret;
    }

テーブルはすべて結合。

年月と部屋名でグループ分けすることで、それごとのレコード数を取得することができます。

さらに、WHERE句で部屋IDを指定することによって、必要な部屋の情報だけを取得することができます。

この関数の引数は部屋ID=1で初期化してあります。

この関数を使用するときに、引数を入れなければ、値1として処理実行されます。

これは部屋IDが指定されない場合のデフォルト処理として使用します。

これで一通り必要な機能は実装できたはず。

最終確認して提出したいと思います。

バナークリックで応援よろしくお願いします。

【ジビエ】イノシシ肉のカルボナード(ビール煮)

イノシシ肉を、姿そのままで購入しました。

角煮を作ろうと思いましたが、思った以上にバラにお肉がなくて、 急遽、晩酌用のビールを使ってカルボナード(ビール煮)にしました。

お肉が箸で切れるぐらい柔らかく仕上がりました。

味付けは濃いめにした方が、お酒のあてとしては最高だと思います。

今回使わなかった部位は、後ほど食材として使用します。

ナレーション:ついなちゃん(VOICEROID2)


【バンドリ】【ガルパ】ティアドロップスの3連スライドを攻略するのです!

おそらく、レベル25の楽曲で一番難しいとされている曲「ティアドロップス」

難しいと言われている所以が、以下の3連スライドなのです。

ここでつまずく人が多い。(オイラも含めて)

まず、こういった、同じところでつまずく場合は、一度プレイ画面をキャプチャ録画して、どこでミスしているのかを確認した方が良いです。

上の動画では、二つ目のスライドの始点でミスしているのがわかりますね。

スライドは始点と終点の指の位置が合っていないとミスト判定される可能性が高いです。

始点と終点の指の位置が正確になるように、意識してプレイして見るとクリアできる確率が高くなりますよ。

最後に、オイラはフルコンしたという証拠を。

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