【ラズパイ】raspberry PI4には冷却用ファンを取り付けよう!

人が触れない温度。

https://qiita.com/BearcubThaw/items/070be8be8dc14e5837f4

$ vcgencmd measure_temp

というコマンド、ラズパイ専用コマンドがありまして、

このコマンドでCPUの温度を出力することが出来ます。

上のスクショはファン無し、アイドル状態で放置した状態でコマンド打った結果。

この温度、お風呂だったら入れないね。

この状態のまま重たい処理を実行させると、さらにCPU温度が上がって、ラズパイは確実に壊れます。

なので、ラズパイ専用のファンを買いました。

ネジが一本どっか行ったけど気にするな。

こっちは老眼で小さい部品見えないんだよ。

部品の中にはヒートシンクも入っていました。

これをCPUに貼り付けると、熱を吸い取って、表面積の多い凸凹部分に熱を伝え、これをファンの風で冷却します。

ファンを回した結果はこちら。

37℃まで下がりました。

人肌レベルですね。

まぁ、ラズパイ4はお勉強用のマシンなので、常時起動しておくことは少ないと思いますが、これで安心です。

ちなみに。

ラズパイZeroの方ですが、

ちょっと温度高め?

触っても熱くないですが。

(ラズパイ4は明らかに手で触れないくらい熱かった。)

うーん、今走らせてるサービス処理、もう少し軽くするか。

こういった温度をWindows側でモニタリングするツールを作ってもいいね。

老眼が進行していって大変です。

ちょっと前までパソコン作業用のメガネを装着していると、

非常に目が疲れる、という事に気がついたのです。

目が疲れすぎて、少しディスプレイを眺めているだけで耳鳴りがする。

なんか、老眼って、40過ぎるとどんどん進行していくんで、その都度メガネを調整しなくちゃいけないらしいよ。

めんどくさい。

めんどくさいけど、このままじゃ何も出来ないので、仕方なく、前回老眼の診察をして貰った眼科に行って、もう少し度の弱いメガネを処方して貰いました。

そして、その処方箋を持って、札幌アピア地下一階のZoffでメガネを作成。

Zoffって、比較的早い時間(今回は30分で出来上がった)し、値段も安い(今回は5500円)ので、今後も早いサイクルでメガネを買い換える事を考えると、こっちの方がお金がかからないのかな、と思いました。

遠近両用メガネを作ったって、便利そうだけど、度が合わなくなったらまた作り直さなくちゃいけないんでしょ?

しらんけど。

メガネを付け替える必要がなくなるってだけで、度が変わったらレンズも変えなきゃいけないはず。

老眼の進行が止まってくれれば良いんだけど、実際問題どうなるか分からないし。

で、メガネ作りました。

調子は良いです。😄

ディスプレイも見やすくなったし、なにより耳鳴りもなくなりました。

そして、気がついたことがもう一つありまして、

裸眼の視力が0.08→0.3に上がった。👍

老眼になると、視力が回復するのって本当なんですね。

0.3では何も見えないがな!

正直なこと言うと、頻繁にメガネを付け替えなくちゃいけないので、めんどくさいです!

【ダイエット支援】【食事管理】データ編集ダイアログ処理を作成する。

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

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

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

データ編集処理を作成していきます。

やり方は、体重管理機能のものと同じです。

EatingEditDialogComponent.vue

<template>
    <div>
        <div id="overlay" v-show="show">
            <div id="content">
                <p v-if="error_flg == true" class="error">
                    <ui>
                        <li v-for="error in errors">{{ error }}</li>
                    </ui>
                </p>
                <table class="edit">
                    <tbody>
                        <tr>
                            <td>日付</td>
                            <td>
                                <input type="date" v-model="contents.date" v-if="datehold" readonly>
                                <input type="date" v-model="contents.date" v-else>
                            </td>
                        </tr>
                        <tr>
                            <td>品名</td>
                            <td><input type="text" v-model="contents.item" /></td>
                        </tr>
                        <tr>
                            <td>時間帯</td>
                            <td>
                                <select name="timezone" v-model="contents.timezone">
                                    <option value="1" selected>朝</option>
                                    <option value="2">昼</option>
                                    <option value="3">夜</option>
                                    <option value="4">間食</option>
                                </select>
                            </td>
                        </tr>
                        <tr>
                            <td>タンパク質</td>
                            <td><input type="number" v-model="contents.protein" /></td>
                        </tr>
                        <tr>
                            <td>脂質</td>
                            <td><input type="number" v-model="contents.liqid" /></td>
                        </tr>
                        <tr>
                            <td>炭水化物</td>
                            <td><input type="number" v-model="contents.carbo" /></td>
                        </tr>
                        <tr>
                            <td>カロリー</td>
                            <td><input type="number" v-model="contents.calorie" /></td>
                        </tr>
                    </tbody>
                </table>
                <p id="command">
                    <button @click="clickEdit">編集</button>
                    <button @click="closeModal">閉じる</button>
                </p>
            </div>
        </div>
    </div>
</template>
<script>
export default {
    props: ['show', 'date', 'datehold'],
    data() {
        return {
            errors: [],
            error_flg: [],
            param: {},
            contents: {},
        };
    },
    methods: {
        dataSet: function(data) {
            this.contents = data;
        },
        clickEdit: function() {
            var self = this;
            this.param.contents = this.contents;
            axios.post('/api/eating/update', this.param).then(function(response){
                self.clear();
                self.closeModal();
                self.$emit('update');
            }).catch(function(error){
                self.error_flg = true;
                self.errors = error.response.data.errors;
            });
        },
        closeModal: function() {
            this.$parent.showEditDialogContent = false;
        },
        clear: function() {
            this.contents.date = this.date;
            this.contents.item = "";
            this.contents.timezone = 1;
            this.contents.protein = "";
            this.contents.liqid = "";
            this.contents.carbo = "";
            this.contents.calorie = "";
            this.error_flg = false;
            this.errors = [];
        }
    }
}
</script>
EatingDetailComponent.vue

        <eating-edit-dialog-component ref="editDialog" :show="showEditDialogContent" :date="date" :datehold=true @update="invokeUpdateList"></eating-edit-dialog-component>

        onClickEdit: function(timezone, id) {
            var editData = {};
            this.datalists[timezone].forEach(element => {
                if(element.id == id){
                    editData.id = id;
                    editData.date = this.date;
                    editData.item = element.item;
                    editData.timezone = timezone + 1;
                    editData.protein = element.protein;
                    editData.liqid = element.liqid;
                    editData.carbo = element.carbo;
                    editData.calorie = element.calorie;
                    return true;
                }
            });
            this.$refs.editDialog.dataSet(editData);
            this.showEditDialogContent = true;
        },

Editボタンをクリックすると、detail側でEditダイアログに表示するパラメータを作成し、Editダイアログに渡します。

refパラメータを使用することで、親から子のモジュールの関数を呼び出すことができるので、これを利用してパラメータ一式を子モジュールに渡します。

編集ダイアログで編集をクリックすると、APIを呼び出してデータの更新を行います。

ApiController.php

    /**
     * データを一件取得する
     */
    public function update(Request $request)
    {
        $paramNames = $this->eatingManagement->getParam();

        $param = [];
        foreach($paramNames as $name) {
            $param[$name] = $request->contents[$name];
        }

        $this->eatingManagement->update($param, Auth::user(),  $request->contents['id'], $request->contents['timezone']);
        
        return response()->json();
    }
EatingManagementRepository.php

    /**
     * データを一件取得する
     */
    public function update($param, $user, $id, $timezone)
    {
        $model = $user->EatingManagements()->where('id', $id)->first();
        foreach($this->paramNames as $name)
        {
            $model->$name = $param[$name];
        }
        $model->save();
        $oldtime = $model->timezones()->first();
        $newtime = Timezone::where('id', $timezone)->first();

        $this->detachToTimezone($model, $oldtime);
        $this->attachToTimezone($model, $newtime);
    }

データを更新するときは、IDからデータベースのデータを取得し、これのデータを上書きすることで更新できます。

ただ、時間帯の更新というのもありえるので、timezonesテーブルとのリンクを再構築しなければなりません。

いったん、リレーションからtimezonesとデタッチし、新しいtimezonesとアタッチします。

これが終わったら、入力と同様にダイアログを非表示にし、detail画面を更新します。

ちょっと表示に手間取ったけど、できました。