「技術」カテゴリーアーカイブ

【自作PC】どうしてもメモリ4枚挿して動かしたい。

前回の様子はこちら。

前回の様子から、電力不足ではないか、と推測して、電源ユニットを購入しました。

玄人志向のATX電源ユニット750W。6200円。

電源容量が400Wから約2倍になりました。

マザーとCPUの電源以外はリバーシブルになっています。

必要ないところは取り外すことができるんですね。

設置。

各線を接続しました。

元々の電源ケーブルが長かったので、延長ケーブルは取り外しました。

メモリも4枚挿してます。

では動作確認。

・・・何も表示されず。

んー、せっかくメモリ2セット買ったのに、もったいない。

いろいろググってみたりして、BIOSの設定(メモリ仕様からタイミングの設定値を調整してみたり、動作周波数を落としてみたり)とかも弄ってみたけど、動く気配無し。

2枚なら動くんですけどね。

こうなったら、4枚挿しは諦めるしかあるまい。

16GBのメモリを2枚購入しましょうかw

32GBは遠いなぁ。

とにもかくにも、電源容量が増えたので、今後も拡張しやすくなったと思います。

現在の構成。

パーツ型番価格
CPURyzen 5 3400G20680
マザーボードPRIME A320M-A7544
メモリHX426C16FW2K2/16 6980
電源KRPW-L5-750W/80+6256
ケースCC-9011086-WW5099
SSDGH-SSDR2SA1202178
M.2SSDSCKKW480H6X15980
グラフィックボードSAPPHIRE PULSE RADEON RX 570 8G GDDR514800
DVDドライブIHAS324-17/A2020
OSWindows 10 Pro3259
電源ユニットネジ200
合計74998

iPadをサブディスプレイに使いたい

2台目のディスプレイを買おうかどうか、悩んでました。

これがオイラのホームポジションの風景。

セカンドディスプレイを設置すると、テレビが見えなくなるのです。

そこで、ふと思いました。

このiPad Proをサブディスプレイにすれば良いのでは?

調べてみると、このアプリを使用すると、iPadをサブディスプレイ化できるようです。

https://ja.duetdisplay.com/

有料アプリで1220円しますが、ディスプレイをもう一台買うに比べれば安い物です。

Windows側にも公式サイトからアプリをダウンロードしてインストールします。

アプリのインストールが終わったら、USBで接続してiPad側のアプリを立ち上げればOK。

自動的にiPadを認識してセカンドディスプレイが現れます。

完全にサブディスプレイです。

しかも、iPad Proって2Kぐらいの解像度にできるんですよ。

文字が小さくて読めないよ。

さらに課金すれば無線LANでサブディスプレイ化できちゃいます。

ワイヤレスにすれば、充電しながらの使用も可能です。

まぁ、有線でも十分ですけどね。

いやでもこれホント便利。

1220円の投資なんて安い物です。

【Laravel】【Vue.js】【ホテル予約管理】予約詳細をダイアログに表示させる

前回までの状況はこちら

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

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

この一覧の行をクリックすると、モーダルダイアログを出して、予約詳細を表示するように作り変えます。

必要な情報はすでに予約一覧で取得しているので、それをダイアログに表示させる、という手法で行きます。

        <div id="overlay" v-show="showContent" @click="closeModal">
            <div id="content">
                <table class="edit">
                    <tbody>
                        <tr>
                            <th>名前</th>
                            <td>{{ contents.name }}</td>
                        </tr>
                        <tr>
                            <th>住所</th>
                            <td>{{ contents.address }}</td>
                        </tr>
                        <tr>
                            <th>電話番号</th>
                            <td>{{ contents.phone }}</td>
                        </tr>
                        <tr>
                            <th>人数</th>
                            <td>{{ contents.num }}</td>
                        </tr>
                        <tr>
                            <th>宿泊部屋</th>
                            <td>{{ contents.room }}</td>
                        </tr>
                        <tr>
                            <th>宿泊日数</th>
                            <td>{{ contents.days }}</td>
                        </tr>
                        <tr>
                            <th>宿泊日</th>
                            <td>{{ contents.start_day }}</td>
                        </tr>
                        <tr>
                            <th>チェックアウト</th>
                            <td>{{ contents.checkout }}</td>
                        </tr>
                    </tbody>
                </table>
            <p><button @click="closeModal">close</button></p>
            </div>
        </div>
#overlay {
    z-index:1;
  
    position:fixed;
    top:0;
    left:0;
    width:100%;
    height:100%;
    background-color:rgba(0,0,0,0.5);
  
    display: flex;
    align-items: center;
    justify-content: center;
    
    #content{
        z-index:2;
        width:50%;
        padding: 1em;
        background:#fff;
    }
}

ダイアログとして表示する部分です。

overlayというのはダイアログのバックに表示するグレー表示のことです。

横と縦にでっかいdiv要素をtop0,left0に表示させる、というイメージですね。

その中にさらにdivを追加して詳細を表示を表示させます。

        data() {
            return {

        // 中略

                showContent: false,
                contents: {
                    name: "",
                    address: "",
                    phone: "",
                    num: 0,
                    room: "",
                    days: 0,
                    start_day: "",
                    checkout: "",
                }

contentsは実際に予約詳細のダイアログに表示するデータです。

showContentはoverlayのv-showとバインドさせて、ダイアログの表示・非表示を切り替えるフラグです。

            openModal: function(id){
                for(var i = 0; i< this.registers.length; i++){
                    if(this.registers[i].id == id){
                        this.contents.name = this.registers[i].name;
                        this.contents.address = this.registers[i].address;
                        this.contents.phone = this.registers[i].phone;
                        this.contents.num = this.registers[i].num;
                        this.contents.room = this.registers[i].room;
                        this.contents.days = this.registers[i].days;
                        this.contents.start_day = this.registers[i].start_day;
                        this.contents.checkout = this.registers[i].checkout;
                        break;
                    }
                }
                this.showContent = true
            },
            closeModal: function(){
                this.showContent = false
            }

ダイアログ表示処理とクローズ処理です。

やっていることは、基本的にデータを設定して、フラグをON、閉じるときはフラグをOFFにする、というだけです。

こんな感じに仕上がります。

次回はここから編集・削除を行いたいと思います。

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

前回は

見事にPCが動かない、メモリを新しい物に交換しても動かないという結果でした。

と言うことで、

買ってきました。

型番が、HX426C16FB2K2/16。今使用しているやるの完全に色違いの物です。

ちなみに、前回買って、動かなかったメモリの型番は HX426C16FB3K2/16でした。

2と3で何が違うんですかね?

知っている人教えて欲しい。

開封。

装着。

そして電源ON。

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

まじか。

念のため、新しい方のメモリのみを挿して動かしてみました。

・・・動いた。

新しい方でも動いたと言うことはメモリ自体に不具合はないようです。

となると、電源の容量が足りない?

今使用しているヤツが、400Wの電源です。(低価格で購入しました。)

まぁ、少ない方です(安いので)。

確か、昨日ツクモに行ったら6000円ぐらいで650Wの電源あったような気がする。

それに交換してみよう。

ちなみに、動かないメモリはツクモで4200円で買い取って貰いました。

やっぱりメモリは一番相性云々が出てくるところなので、店頭で相性保証付けて貰うのが一番いいね。

【Laravel】【Vue.js】【ホテル予約管理】予約一覧を表示する

前回までの状況はこちら

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

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

さて、前回はフィルタの部分を作りましたが、今回は実際に予約一覧を取得して、表示させます。

まずは、予約一覧を取得するAPIを作ります。

ルーティング

Route::post('/api/registers', 'ApiController@registers');

コントローラー

    public function registers(Request $request)
    {
        return response()->json(['registerLists' => $this->registerManagement->getListByMonth(
            $request->year,
            $request->month,
            $request->room
        )]);
    }

コントローラで受け取るのは、前回作ったフィルタのパラメータをPOSTで受け取る、というやり方です。

そして、結果をJsonで返すという感じになります。

ではVueの実装です。

<template>
    <div>
        <table>
            <tbody>
                <tr>
                    <td>
                        <select v-model="selectYear" @click="getRegisters">
                            <option v-for="year in years" v-bind:value="year.value">{{ year.text }}</option>
                        </select>
                    </td>
                    <td>年</td>
                    <td>
                        <select v-model="selectMonth" @click="getRegisters">
                            <option v-for="month in months" v-bind:value="month.value">{{ month.text }}</option>
                        </select>
                    </td>
                    <td>月</td>
                        <select v-model="selectRoom" @click="getRegisters">
                            <option v-for="room in rooms" v-bind:value="room.id">{{ room.name }}</option>
                        </select>
                    </td>
                </tr>
            </tbody>
        </table>
        <table class="management">
            <tbody>
                <tr>
                    <th class="name">名前</th>
                    <th class="date">宿泊日</th>
                    <th class="checkout">チェックアウト</th>
                </tr>
                <tr v-for="register in registers">
                    <td class="name">{{ register.name }}</td>
                    <td class="date">{{ register.start_day }}</td>
                    <td class="checkout">{{ register.checkout }}</td>
                </tr>
            </tbody>
        </table>
    </div>
</template>

まず、フィルタの方は、コントロールを選択すると、予約一覧を取得する処理が走るようにしています。@click=”getRegisters”の部分です。

では、実際の処理。

<script>
    export default {
        data() {
            return {
                selectYear: 2019,
                years:[ 
                    {text:'2019',value:2019},
                    {text:'2020',value:2020},
                ],
                selectMonth: 1,
                months:[ 
                    {text:'1',value:1},
                    {text:'2',value:2},
                    {text:'3',value:3},
                    {text:'4',value:4},
                    {text:'5',value:5},
                    {text:'6',value:6},
                    {text:'7',value:7},
                    {text:'8',value:8},
                    {text:'9',value:9},
                    {text:'10',value:10},
                    {text:'11',value:11},
                    {text:'12',value:12},
                ],
                selectRoom: 0,
                rooms: [],
                result: [],
                param: {
                    year: 2019,
                    month: 1,
                    room: 1
                },
                registers: []
            }
        },
        created: function() {
            this.getRooms();
        },
        methods: {
            getRooms: function() {
                var self = this;
                axios.post('/api/rooms').then(function(response){
                    response.data.roomLists.forEach(element => {
                        self.rooms.push({id:element.id, name:element.name});
                    });
                }).catch(function(error){
                    console.log("失敗しました");
                });
            },
            getRegisters: function() {
                var self = this;
                this.param.year = this.selectYear;
                this.param.month = this.selectMonth;
                this.param.room = this.selectRoom;
                axios.post('/api/registers', this.param).then(function(response){
                    self.registers = [];
                    response.data.registerLists.forEach(element => {
                        self.registers.push(
                            {
                                id:element.id, 
                                name:element.name, 
                                start_day:element.start_day, 
                                checkout:element.checkout
                            }
                        );
                    });
                }).catch(function(error){
                    console.log("失敗しました");
                });
            }
        }
    }
</script>

getRegisters()が呼ばれると、フィルタの条件を取得し、POSTパラメータに設定して、POSTリクエストを投げます。

その結果をregistersに設定して、その結果をテンプレート側のtrタグのv-forでリスト表示させていく、という動きになります。

リンクを作って編集・削除もやりたかっかけど、なんかうまく行かないので、Ajaxゴリゴリの方法に作り変えます。

【Laravel】【Vue.js】【ホテル予約管理】Vue.jsで実装する

最新ソースはこちら。

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

この画面を見て、思ったのは、

すげぇ窮屈だな、と。

この一覧画面に表示するのは、簡単な情報だけにして、それ以外の情報は、詳細画面へのリンクをクリックすることで表示させよう、と思ったのです。

やはり避けて通れない、Vue.jsの実装。

Laravelプログラマーの宿命。

まずは、部屋一覧を取得するWebAPIを実装します。

まずはルーティング。

Route::post('/api/rooms', 'ApiController@rooms');

コントローラー。

use Illuminate\Http\Request;
use App\Repository\RoomRepository;

class ApiController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
        $this->room = new RoomRepository();
    }

    public function rooms(Request $request)
    {
        return response()->json(['roomLists' => $this->room->getList()]);
    }
}

リポジトリは既存のものを使います。

違うのは、返信するデータはJsonであること。

Laravelでは一発でJsonに変換できるんですね。便利。

Viewの実装。

                    <detail-component></detail-component>

とりえあず、テンプレートの実態はVue.js側に書くので、ここではVueのテンプレートを配置するタグを書きます。

そして、Vueに追加したコンポーネントを有効化します。

Vue.component('detail-component', require('./components/DetailComponent.vue'));

resource/assets/js/app.jsに追加します。

こうすることで、npm run devで追加したコンポーネントもビルドに含めてくれます。

さぁ、ここからが本番だ。

まずはテンプレートの部分

<template>
    <div class="details">
        <table>
            <tr>
                <td>
                    <select v-model="selectYear">
                        <option v-for="year in years" v-bind:value="year.value">{{ year.text }}</option>
                    </select>
                </td>
                <td>年</td>
                <td>
                    <select v-model="selectMonth">
                        <option v-for="month in months" v-bind:value="month.value">{{ month.text }}</option>
                    </select>
                </td>
                <td>月</td>
                    <select v-model="selectRoom">
                        <option v-for="room in rooms" v-bind:value="room.id">{{ room.name }}</option>
                    </select>
                </td>
            </tr>
        </table>
    </div>
</template>

とりあえず、フィルタを行う年月と部屋を表示する実装にしています。

いずれ、予約一覧もこの中に入れます。

まだ途中なので。

<script>
    export default {
        data() {
            return {
                selectYear: 2019,
                years:[ 
                    {text:'2019',value:2019},
                    {text:'2020',value:2020},
                ],
                selectMonth: 1,
                months:[ 
                    {text:'1',value:1},
                    {text:'2',value:2},
                    {text:'3',value:3},
                    {text:'4',value:4},
                    {text:'5',value:5},
                    {text:'6',value:6},
                    {text:'7',value:7},
                    {text:'8',value:8},
                    {text:'9',value:9},
                    {text:'10',value:10},
                    {text:'11',value:11},
                    {text:'12',value:12},
                ],
                selectRoom: 0,
                rooms: [],
                result: [],
            }
        },
        created: function() {
            this.getRooms();
        },
        methods: {
            getRooms: function() {
                var self = this;
                axios.post('/api/rooms').then(function(response){
                    response.data.roomLists.forEach(element => {
                        console.log(element.name)
                        self.rooms.push({id:element.id, name:element.name});
                    });
                }).catch(function(error){
                    console.log("失敗しました");
                });
            }
        }
    }
</script>

年月はベタ書きです。

リストデータを定義して、v-forでoptionタグに展開する仕組み、v-modelで選択した値をバインドさせています。

この画面が読み込まれたら、axiosを使ってAjaxでデータの取得を行います。

axiosはデフォルトで組み込まれているみたい。Ajaxを行うためのライブラリです。

POSTで指定したURLに送信し、正常に受信できればthenの処理に、何かしらエラーが発生した場合はcatchの処理に移ります。

thisをselfに設定しているのは、thenやcatchの中ではthis=Vueではないので、selfにVueを退避させて置かないと、then/catchの中でVueのデータにアクセスできないためです。

で、thenの中で、レスポンスからデータを取得して、リスト化。

そのリストをテンプレート側で参照してoptionタグを作成します。

下のフィルタが今回Vueで表示させたものです。

上の部分はあとで消します。

【自作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

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