パソコンを使用していると気持悪くなる。それ、VDT症候群かも。

例えば、長時間パソコン作業をしていると、耳鳴りがしたり、頭のあたりが押さえつけられるような感じがしたり、気分が悪くなったりすることはないだろうか?

まさしく自分がそうで。

特に最近症状がひどい。

また老眼が進んでしまったのかと。

いや、老眼とも関係してくるんですけど。

調べてみると、VDT症候群という病気がありまして、

https://fastdoctor.jp/vdt症候群の特徴・症状と治療法について【医師監/

直接の原因は眼精疲労。

治療法も予防策しかなくて、

  • パソコン作業を1時間毎に10分程度休憩する。
  • ブルーライトカットのフィルターなどを使用する。
  • ディスプレイの明るさを暗くする。
  • 肩こり、首こりをほぐす。
  • 姿勢を正しくする。

今、スマホのタイマーを、1時間のタイマーと10分のタイマーをセットしてまして、

1時間のタイマーでパソコン使用後に、10分のタイマーで休憩する、というやり方を試しています。

休憩中はパソコンの画面を一切見ない。

さらに言うと、目を休ませる方法としては、

  • 目を温める。
  • 遠くを見つめる。
  • 目を動かす(ストレッチ)

やっぱり、パソコン作業ができないと、オイラ、何もできないので、

きついっす。

でも、老化はどうやっても回復することはできないので、

今後はこの老化とどうやって付き合っていくかを考えなくちゃ行けません。

今、最善の方法を模索中です。

マジきついっす。

【ラズパイ】カメラモジュールを使ってみる。

カメラモジュール買いました。

装着。

今回は足つきで固定できるタイプの物を買いました。

フラットケーブルで接続したので、ラズパイの設定でカメラを有効にすれば使用できるはずです。

カメラで静止画を撮影するには以下のコマンドを入力します。

$ raspistill -o image.jpg

モニターにプレビューが表示され、それが閉じるのと同時に、カレントディレクトリにimage.jpgが保存されます。

動画を撮影するときは以下のコマンドを入力します。

$ raspivid -t 5000 -o test.h264

プレビューのみの時は以下です。

$ raspivid --demo 5000

ただこれだけできても面白くない。

次回はプログラムから画像データを扱ってみたいと思います。

老眼の進行が止まらない模様。

前回はメガネを新調した!と書きましたが、

あれからまた老眼が進行したみたいで、

新しいメガネを使用していると再び耳鳴りがするようになってしまいました。

まだ1ヶ月もたってねーよ!

今はお金が無いので、来月、障害年金が入ったら眼科を受診しようと思っているけど、

また短期間に体に異常が出てきたら、もうメガネ諦めようかななんて思ってみたり。

メガネがないと何が困るかというと、

パソコン作業しているとき姿勢が悪くなるし、

ガルパの譜面を見えないし(ここ重要!)

老眼はなってしまうと回復することはないので、

辛い。

身体的にも、お財布的にも。

【ダイエット支援】【食事管理】目標カロリーを計算する

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

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

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

やっぱり、前回書いたとおり、きちんと目標となるカロリーを計算しないと、正しいグラフ書けない、ということで、ダイアログを追加します。

<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="number" v-model="inputParameter.height" /></td>
                        </tr>
                        <tr>
                            <td>体重</td>
                            <td><input type="number" v-model="inputParameter.weight" /></td>
                        </tr>
                        <tr>
                            <td>年齢</td>
                            <td><input type="number" v-model="inputParameter.age" /></td>
                        </tr>
                        <tr>
                            <td>アクティブ度</td>
                            <td>
                                <select name="active" v-model="inputParameter.active">
                                    <option value="1" selected>低</option>
                                    <option value="2">中</option>
                                    <option value="3">高</option>
                                </select>
                            </td>
                        </tr>
                        <tr>
                            <td>目的</td>
                            <td>
                                <select name="target" v-model="inputParameter.target">
                                    <option value="1" selected>維持</option>
                                    <option value="2">減量</option>
                                    <option value="3">増量</option>
                                </select>
                            </td>
                        </tr>
                    </tbody>
                </table>
                <p />
                <table class="edit">
                    <tbody>
                        <tr>
                            <td>目標カロリー</td>
                            <td>{{calorie}} cal</td>
                        </tr>
                        <tr>
                            <td>タンパク質</td>
                            <td>{{protein}} g</td>
                        </tr>
                        <tr>
                            <td>脂質</td>
                            <td>{{liquid}} g</td>
                        </tr>
                        <tr>
                            <td>炭水化物</td>
                            <td>{{carbo}} g</td>
                        </tr>
                    </tbody>
                </table>
                <p id="command">
                    <button @click="clickAdd">入力</button>
                    <button @click="closeModal">閉じる</button>
                </p>
            </div>
        </div>
    </div>
</template>
<script>
export default {
    props: ['show'],
    data() {
        return {
            errors: [],
            error_flg: [],
            param: {},
            inputParameter: {
                height: 0,
                weight: 0,
                age: 0,
                active: 1,
                target: 1,
            },
            contents: {
                calorie: 0,
                protein: 0,
                liquid: 0,
                carbo: 0,
            },
        };
    },
    created: function() {
        this.clear();
    },
    methods: {
        clickAdd: function() {
            var self = this;
            this.param.contents = this.contents;
            axios.post('/api/eating/settarget', this.param).then(function(response){
            }).catch(function(error){
                self.error_flg = true;
                self.errors = error.response.data.errors;
            });
        },
        closeModal: function() {
            this.$parent.showCalcCalorieContent = false;
        },
        clear: function() {
            this.inputParameter.height = 0;
            this.inputParameter.weight = 0;
            this.inputParameter.age = 0;
            this.inputParameter.active = "1";
            this.inputParameter.target = "1";
            this.contents.calorie = 0;
            this.contents.protein = 0;
            this.contents.liquid = 0;
            this.contents.carbo = 0;
            this.error_flg = false;
            this.errors = [];
        }
    }
}
</script>

ボタンはここに配置ました。

身長、体重、年齢と、アクティブ度と目標を入力してもらって、目標となるカロリーと摂取栄養素の量を計算します。

計算式はそんなに難しくないので、フロントエンド側で計算して表示させちゃいます。

    computed: {
        calorie: function() {
            var cal = 10 * this.inputParameter.weight + 6.25 * this.inputParameter.height - 5 * this.inputParameter.age + 5;
            var k = 1;
            // アクティブ度の計算
            switch(this.inputParameter.active){
                case "1": k = 1.2; break;
                case "2": k = 1.55; break;
                case "3": k = 1.725; break;
            }
            cal = cal * k;
            // 目標の計算
            switch(this.inputParameter.target){
                case "1": k = 1; break;
                case "2": k = 0.8; break;
                case "3": k = 1.2; break;
            }
            this.contents.calorie = Math.ceil(cal * k);
            return this.contents.calorie;
        },
        protein: function() {
            this.contents.protein = this.inputParameter.weight * 2;
            return this.contents.protein;
        },
        liquid: function() {
            this.contents.liquid = Math.ceil(this.contents.calorie * 0.25 / 9);
            return this.contents.liquid;
        },
        carbo: function() {
            this.contents.carbo = Math.ceil((this.contents.calorie - this.contents.protein * 4 - this.contents.liquid * 9) / 4);
            return this.contents.carbo;
        },
    },

まず、computedに記載することで、入力パラメータからすぐさま計算処理を行い、結果を反映してくれます。

カロリーの計算式は、

10×体重(g)+6.25×身長(cm)-5×年齢(歳)+5

これにアクティブ度と目的に合わせて係数を掛けます。

アクティブ度

  • 低 カロリー×1.2
  • 中 カロリー×1.55
  • 高 カロリー×1.725

目的

  • 減量 カロリー×0.8
  • 維持 カロリー×1
  • 増量 カロリー×1.2

これらは以下で紹介した本の中にあります。

フロントエンド側はこれで完成。

次はこの計算結果を保持するデータベース周りのバックエンド側を作成していきます。

クラフトピアというやばいゲーム。

Steamでリリースされたクラフトピアとかいうゲーム。

アーリーアクセス版リリース前から知っていたけど、

実際にプレイしたらすごかった。

一頃では表現難しいけど、マインクラフトとマインクラフトダンジョンズを一緒にしたようなもの。

うん、これじゃよく分からない。

マインクラフト的要素

このゲームは裸(下着のみ)でスタートし、フィールドにある資源を破壊して収集、それらからいろんなアイテムや設備を作成して生き延びます。

作れる物は食料だったり、設備だったり、建築物だったり、装備だったり。

建築はフォートナイトのイメージに近いかもしれない。

マインクラフトダンジョンズ(ハスクラ)的要素

フィールドにはモブや敵モブが存在します。

彼らとの戦闘はマウスボタン押しっぱなしでひたすら殴る、というバトルスタイルです。

もちろん戦闘用スキルもあり、格闘攻撃だったり、魔法だったりを覚えて使用することが出来ます。

スキルはレベルが一つ上がると1ポイント獲得し、好きなスキルにポイントを振ることが出来ます。

また、ダンジョンの奥には強敵が存在し、そのボスを倒すと強力な装備が手に入る可能性があります。

最終目的は文明をもう一度一からやり直すこと。

祭壇に一定数のアイテムを納めると、文明レベルが上がり、作成できる物が増えます。

より出来ることが増えていきます。

マインクラフトのように自動化機構も出来ちゃうとか。

オイラはまだまだ序盤だけど面白いので、もうちょっとやり込んでみます。

アーリーアクセス版なので、いろいろバグが残っているようです。

地面を突き破っちゃいました。

【ANDROID】【実質北海道一周】残りの表示部分を実装する。【完成】

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

最新ソースはこちら

https://github.com/takishita2nd/AroundHokkaido

残りの、数字を表示する部分を作成していきます。

完成までもう少しです。

必要なデータは、

全体の距離(km)と現在位置(km)

区間の距離(km)と現在位置(km)

パーセンテージは上の数字があれば計算で出せます。

全体の距離はjsonを読み込んだときに計算して保持っておくのが良いでしょう。

全体の距離はすでに覚醒済み。

区間のデータはgetPosition()で取得させるのが良いでしょう。

class StartEndPosition(startCity: String, endCity: String, position: Double, segment: Double) {
val startCityName : String = startCity
val endCityName : String = endCity
val positionDistance: Double = position
val segmentDistance: Double = segment
}
    fun getPosition() : StartEndPosition {
var tempDistance = 0.0
var start : String = ""
var end : String = ""
var loop : Boolean = false
var segment: Double = 0.0
var aaa: Double = 0.0
run {
citylist.cityList.forEach{
if(loop){
end = it.city
return@run
}else{
tempDistance += it.distance
if(resultDistance < tempDistance){
start = it.city
aaa = resultDistance - (tempDistance - it.distance)
segment = it.distance
loop = true
}
}
}
}
return StartEndPosition(start, end, aaa, segment)
}
}
distanceFromStart.text = distancefromSapporoFormat.format(aroundHokkaido.getResultDistance(),
aroundHokkaido.getResultDistance() / aroundHokkaido.getTotalDistance() * 100)
distanceSection.text = distanceFormat.format(startEnd.positionDistance,
startEnd.positionDistance / startEnd.segmentDistance * 100)

とりあえず完成だけど、ぶっちゃけこのアプリ自体、そんなに面白くないなぁ。

まぁ、一通りどんな感じでコーディングするのか、それを経験するのには良かったのではないでしょうか。

これとは違うけど、別アプリも考えてみようと思います。

アサヒビール園のお食事券を買った話。

ネットのメール広告で、アサヒビール園のお食事券10000円分が8000円で購入できると聞いて。

今回このお食事券でアサヒビール園にご迷惑をかけてしまいまして。

というのは、このお食事券、

関東の人達をターゲットにした広告。

これをWebで購入後、チケット交換店舗に行って、お食事券に交換して貰って、初めてお食事が出来るというもので、

その交換可能な店舗が関東にしか無くて、北海道で購入したオイラはお食事券に引き換えできないという事態に陥ったのです。

結局どうなったかというと、白石のアサヒビール園はまなす館の偉い人が取り計らってくれて、お食事券を用意してくれました。

結局お得に出来たじゃねーか、という話もありますが、自分はそれ以上にめんどくさい事態になってしまったという思いです。

みんなには同じめんどくさい事態にならない様、購入する際は気をつけて欲しい。

以下、自分の愚痴です。

なんで関東向けの広告が北海道人に届くわけ?

アカウントの住所北海道に設定しているんだから北海道の広告を送りなさいよ。

関東でしか使えない広告は関東人にだけ送れ。

地域判定きちんとやってくれ。

頂いたチケットは大切に使わせて頂きます。

【cocos2d-x】プロジェクト作成直後のソースファイルを解析する。

Cocos2d-xの開発環境作成についてはこちらにまとめてあります。

https://qiita.com/takishita2nd/items/0b54af9860f54c65fd24

今回は、プロジェクト作成直後に作成されるソースファイルの中身を覗いてみます。

とはいっても、いきなりソース解析も難しいので、こちらの初心者用の解説を見ながら確認していきました。

https://www.tuyano.com/index3?id=9496003

基本的に弄るソースはClassesの中だけです。

それ以外はCocos2d-xのライブラリ本体だったり、各プラットフォームのビルド環境なので、今後一切触る必要は無いと思います。

むしろ、書き換えたら正常に動く保証はない。

AppDelegateクラス

アプリケーション全体の設定を記述します。

タスク切り替え時の処理とかをここに書くことになります。

最初は弄ることは無いと思います。

HelloWorldクラス

上のリンクにあった初心者用テキストには、Layerクラスを継承してHelloWorldクラスを作成していると書いてありますが、実際にはSceneクラスを継承しています。

class HelloWorld : public cocos2d::Scene
{
public:
    static cocos2d::Scene* createScene();

    virtual bool init();
    
    // a selector callback
    void menuCloseCallback(cocos2d::Ref* pSender);
    
    // implement the "static create()" method manually
    CREATE_FUNC(HelloWorld);
};

Cocos2d-xの概念として、画面毎にシーンを作成し、その中に画面を構成するオブジェクトを配置する、というイメージのようです。

大きな差分はこれくらいかな。

init()で画面に配置する部品をオブジェクト化して配置しています。

青の部分はメニューになっていて、クリックするとアプリを終了するコールバックが呼ばれます。

赤い部分はフォントを読み込んでテキストを表示しています。

黄色の部分はResourceフォルダの中にある画像を表示させています。

でもイマイチ座標周りがよく分からん。

visibleSizeが画面のサイズで、

originがOpenGLの座標系?を表している?

画面の解像度が変わっても表示が崩れないように計算していると思うのだが。

でも、ここまでで、表示位置を変えることはできると思うぞ。

ほらできた。

【マインクラフト】ハードコアモードでサーバを立ち上げる方法(Java版のみ)

ハードコアモードって何ですか?

ゲームモードはサバイバルで、難易度ハード固定、しかも死んでしまったら終了、復活できない、という超ハードなモードです。

これはJava版にしか存在しないモードです。

統合版勢残念。

シングルモードでは、上の設定にすればハードコアモードでワールドが生成されますが、

これをサーバでやってしまいます。

とは言っても、やり方はそんなに難しくなくて、

server.propertiesファイルの中に、

hardcore=false

という項目があるので(わかりやすいですね)

hardcore=true

と書き換えてサーバを立ち上げればOK。

ハートのアイコンが上のように変わればハードコアモードです。

ここからはチートの話ですが。

死んでしまうと、ゲームモードをスペクテイターモードに変更するか、タイトルに戻るかを選択することが出来ます。

スペクテイターモードというのは、世界を眺めるだけのモード。

死後の世界を気の済むまで自由に眺めることが出来ます。

復帰することはできません。

死んだかどうかのフラグデータはworldフォルダーの中に入っているので、定期的にworldフォルダーのバックアップを取っておいて、死亡後にworldフォルダーをごっそり復元すれば復帰できます。

まぁ、そんなことやるくらいなら、最初から普通にハードモードでプレイすればいいんだけどね(めんどくさい)

やり直しがきかない世界だから面白いハードコアモード。

腕試しにいかがですか?

おいらのVSCodeで使用している拡張機能

VSCodeっていろんな拡張機能がありますよね。

拡張機能の追加で自分が使いやすいように、好きにカスタマイズできるのがVSCodeのもう一つの特徴でもあります。

あまり変わった物入れてないけど。

ctagsx

Laravel開発環境に入れています。

PHPってデフォルトだとタグジャンプできないんすよ。

でも、この拡張機能を入れて、コマンドでtagsファイルをプロジェクトのホームディレクトリに置いておくと、

ctrl+関数左クリックでタグジャンプ出来るようになります。

sftp sync extension for VS Code

これはラズパイのコーディングに使用しています。

ラズパイの指定フォルダとローカルPCのフォルダでソースファイルの同期を取り、ローカルPCで編集・保存したファイルを自動的にラズパイ側へ反映してくれます。

Linux環境での開発にも使えますよ。

VSCODE POWER MODE!!!

これは完全にお遊び系の拡張機能。

文字を入力するとエフェクトがかかります。

花火を打ち上げながらコンボを決めてコーディングするとテンション上がります。

言っていることがわからなければググってみてください。