チラシ配りのお仕事、1日やってみて思ったこと。

昨日のお昼に、実際にチラシ配りやってきました。

戸建てのお宅の郵便ポストにチラシを入れるお仕事です。

配るエリアは決められていて、1週間かけてエリア内配り終われば、その週のお仕事完了です。

チラシは火曜日の午前に佐川急便から送られてきまして、

1週間分500枚程度、2週間分届きました。

チラシのサイズはA4サイズぐらい。

で、実際やってみた感想としては。

思った以上に疲れる。

時間的には1時間ちょっとなんですが、

歩数以上に体力を使います。

なぜかというと、玄関まで階段があったりするので。

戸建てで、しかも坂道の多いエリアなので仕方が無いとも言えますが。

そして、ほとんどの郵便ポスト投函口は、A4サイズには大きすぎる。

こういう場合は二つ折りにすると言うふうに言われていたのですが、

ほとんどのお宅が二つ折りにしないと入らないので、

昨日の夜、あらかじめチラシを二つに折っておきました。

(こういったもくもく作業が得意なもので。)

配った枚数もカウントして覚えておかないと行けないのもめんどくさい。

なんか良い方法無いっすか?

まぁ、ドラクエウォークのレベル上げも兼ねて、今日も行ってきます。

【北海道大戦】リソースファイルをパッケージ化

使用しているライブラリ、Altseedには、リソースファイルを一つのファイルにパッケージ化するツールが用意されていて、

これを使えば、大量のファイルでかさばることもないし、勝手にデータを書き換えることもできなくなります。

使用する場合は、こんな感じでエンジンに登録するだけ。

            asd.Engine.File.AddRootPackage("hokkaido.pack");

で、フォントやテクスチャ画像は、ソースを変更する必要は無いのですが、

マップデータを記述しているjsonファイルは標準機能で読み出しているので、

これに関してはちょっと細工が必要になります。

        private const string _filename = "hokkaido.json";
        public static MapData Load()
        {
            string str = string.Empty;
            asd.StreamFile stream = asd.Engine.File.CreateStreamFile(_filename);
            List<byte> buffer = new List<byte>();
            stream.Read(buffer, stream.Size);
            string json = Encoding.UTF8.GetString(buffer.ToArray());
            return JsonConvert.DeserializeObject<MapData>(json);
        }

CreateStreamFileでjsonファイルを取り出し、

readメソッドでデータをバイトのリストで取得。

これをjsonに変換するには、さらにbyte配列に変換して、文字列に変換して

これでようやくjsonからオブジェクトに変換出来ます。

めんどくさい。

でも、これだけで動いたからまだマシな方だと思うけど。

【ラズパイ】リモコンの赤外線を受信してみる。

赤外線受信モジュールの出力をGPIO21番に接続し、

以下の様にプログラムを組んでみました。

import RPi.GPIO as GPIO
import time
import datetime

def __main__():
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(21,GPIO.IN)
    GPIO.add_event_detect(21, GPIO.BOTH, callback=callback)
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        GPIO.cleanup()

def callback(channel):
    print(str(GPIO.input(21)) + " " + datetime.datetime.now().isoformat())

__main__()

GPIO21の信号が変わったタイミングで割り込みを発生し、そのときの出力値と時間を標準出力で表示させます。

ただ、このテレビのリモコン、電源ボタンを押しっぱなしにしないと信号が出ないみたいで、

で、なおかつ、押しっぱなしにすると信号が出続けるもので。

0 2020-11-24T10:14:30.712150
1 2020-11-24T10:14:30.718138
0 2020-11-24T10:14:30.765131
1 2020-11-24T10:14:30.765352
0 2020-11-24T10:14:30.804348
1 2020-11-24T10:14:30.812659
0 2020-11-24T10:14:30.817313
1 2020-11-24T10:14:30.817765
0 2020-11-24T10:14:30.818497
1 2020-11-24T10:14:30.818897
0 2020-11-24T10:14:30.819593
1 2020-11-24T10:14:30.820053
0 2020-11-24T10:14:30.820533
1 2020-11-24T10:14:30.821233
0 2020-11-24T10:14:30.821634
1 2020-11-24T10:14:30.822347
0 2020-11-24T10:14:30.822964
1 2020-11-24T10:14:30.823503
0 2020-11-24T10:14:30.824101
1 2020-11-24T10:14:30.824575
0 2020-11-24T10:14:30.826361
1 2020-11-24T10:14:30.826822
0 2020-11-24T10:14:30.827364
1 2020-11-24T10:14:30.827968
0 2020-11-24T10:14:30.829730
1 2020-11-24T10:14:30.830241
0 2020-11-24T10:14:30.832033
1 2020-11-24T10:14:30.832501
0 2020-11-24T10:14:30.834314
1 2020-11-24T10:14:30.834766
0 2020-11-24T10:14:30.836554
1 2020-11-24T10:14:30.837033
0 2020-11-24T10:14:30.838794
1 2020-11-24T10:14:30.839353
0 2020-11-24T10:14:30.841086
1 2020-11-24T10:14:30.841601
0 2020-11-24T10:14:30.842042
1 2020-11-24T10:14:30.842722
0 2020-11-24T10:14:30.844382
1 2020-11-24T10:14:30.845010
0 2020-11-24T10:14:30.845743
1 2020-11-24T10:14:30.846213
0 2020-11-24T10:14:30.847861
1 2020-11-24T10:14:30.848455
0 2020-11-24T10:14:30.849055
1 2020-11-24T10:14:30.849573
0 2020-11-24T10:14:30.850183
1 2020-11-24T10:14:30.850725
0 2020-11-24T10:14:30.852405
1 2020-11-24T10:14:30.852972
0 2020-11-24T10:14:30.853503
1 2020-11-24T10:14:30.854129
0 2020-11-24T10:14:30.854628
1 2020-11-24T10:14:30.855277
0 2020-11-24T10:14:30.855717
1 2020-11-24T10:14:30.856376
0 2020-11-24T10:14:30.858106
1 2020-11-24T10:14:30.858635
0 2020-11-24T10:14:30.859222
1 2020-11-24T10:14:30.859775
0 2020-11-24T10:14:30.861550
1 2020-11-24T10:14:30.862049
0 2020-11-24T10:14:30.863799
1 2020-11-24T10:14:30.864357
0 2020-11-24T10:14:30.864821
1 2020-11-24T10:14:30.865492
0 2020-11-24T10:14:30.867127
1 2020-11-24T10:14:30.867739
0 2020-11-24T10:14:30.869522
1 2020-11-24T10:14:30.870102
0 2020-11-24T10:14:30.871770
1 2020-11-24T10:14:30.872296
0 2020-11-24T10:14:30.912677
1 2020-11-24T10:14:30.921864
0 2020-11-24T10:14:30.923867
1 2020-11-24T10:14:30.924497
0 2020-11-24T10:14:30.972354
1 2020-11-24T10:14:30.981305
0 2020-11-24T10:14:30.985768
1 2020-11-24T10:14:30.986297
0 2020-11-24T10:14:30.986901
1 2020-11-24T10:14:30.987434
0 2020-11-24T10:14:30.987902
1 2020-11-24T10:14:30.988581
0 2020-11-24T10:14:30.989105
1 2020-11-24T10:14:30.989750
0 2020-11-24T10:14:30.990292
1 2020-11-24T10:14:30.990898
0 2020-11-24T10:14:30.991490
1 2020-11-24T10:14:30.992017
0 2020-11-24T10:14:30.992618
1 2020-11-24T10:14:30.993143
0 2020-11-24T10:14:30.994968
1 2020-11-24T10:14:30.995415
0 2020-11-24T10:14:30.995996
1 2020-11-24T10:14:30.996558
0 2020-11-24T10:14:30.998247
1 2020-11-24T10:14:30.998835
0 2020-11-24T10:14:31.000531
1 2020-11-24T10:14:31.001089
0 2020-11-24T10:14:31.002897
1 2020-11-24T10:14:31.003358
0 2020-11-24T10:14:31.005463
1 2020-11-24T10:14:31.005794
0 2020-11-24T10:14:31.007627
1 2020-11-24T10:14:31.007885
0 2020-11-24T10:14:31.009823
1 2020-11-24T10:14:31.010188
0 2020-11-24T10:14:31.010786
1 2020-11-24T10:14:31.011313
0 2020-11-24T10:14:31.013177
1 2020-11-24T10:14:31.013577
0 2020-11-24T10:14:31.014196
1 2020-11-24T10:14:31.014723
0 2020-11-24T10:14:31.016505
1 2020-11-24T10:14:31.016988
0 2020-11-24T10:14:31.017615
1 2020-11-24T10:14:31.018132
0 2020-11-24T10:14:31.018801
1 2020-11-24T10:14:31.019244
0 2020-11-24T10:14:31.021049
1 2020-11-24T10:14:31.021532
0 2020-11-24T10:14:31.022264
1 2020-11-24T10:14:31.022711
0 2020-11-24T10:14:31.023231
1 2020-11-24T10:14:31.023825
0 2020-11-24T10:14:31.024497
1 2020-11-24T10:14:31.024954
0 2020-11-24T10:14:31.026808
1 2020-11-24T10:14:31.027232
0 2020-11-24T10:14:31.027891
1 2020-11-24T10:14:31.028356
0 2020-11-24T10:14:31.030251
1 2020-11-24T10:14:31.030616
0 2020-11-24T10:14:31.032629
1 2020-11-24T10:14:31.032920
0 2020-11-24T10:14:31.033644
1 2020-11-24T10:14:31.034099
0 2020-11-24T10:14:31.035998
1 2020-11-24T10:14:31.036321
0 2020-11-24T10:14:31.038409
1 2020-11-24T10:14:31.038591
0 2020-11-24T10:14:31.040637
1 2020-11-24T10:14:31.040889
0 2020-11-24T10:14:31.085001
1 2020-11-24T10:14:31.090315
0 2020-11-24T10:14:31.142103
1 2020-11-24T10:14:31.143617
0 2020-11-24T10:14:31.317687
1 2020-11-24T10:14:31.317986
0 2020-11-24T10:14:31.320925
1 2020-11-24T10:14:31.321246
0 2020-11-24T10:14:31.321999
1 2020-11-24T10:14:31.322382
0 2020-11-24T10:14:31.324284
1 2020-11-24T10:14:31.324646
0 2020-11-24T10:14:31.325373
1 2020-11-24T10:14:31.325785
0 2020-11-24T10:14:31.326453
1 2020-11-24T10:14:31.326927
0 2020-11-24T10:14:31.327589
1 2020-11-24T10:14:31.328064
0 2020-11-24T10:14:31.329898
1 2020-11-24T10:14:31.330335
0 2020-11-24T10:14:31.330809
1 2020-11-24T10:14:31.331572
0 2020-11-24T10:14:31.333278
1 2020-11-24T10:14:31.333753
0 2020-11-24T10:14:31.335543
1 2020-11-24T10:14:31.336043
0 2020-11-24T10:14:31.336674
1 2020-11-24T10:14:31.337190
0 2020-11-24T10:14:31.338941
1 2020-11-24T10:14:31.339489
0 2020-11-24T10:14:31.341160
1 2020-11-24T10:14:31.341743
0 2020-11-24T10:14:31.343484
1 2020-11-24T10:14:31.343990

たぶん、この中に電源の信号パターンがあり、繰り返し送信されているものかと。

それと、この信号を再現させるために、大体0.1ミリ秒ごとに0/1のパターンデータを作成して、送信するっていう形の方が良いのかな。

ちょっとこれを元に考えてみます。

【ダイエット支援】【入力履歴機能】履歴からデータを入力

なかなかいい感じに仕上がっております。

    public function searchKeyword($keyword, $user)
    {
        $result = [];
        $records1 = EatingTemplateItem::where('item', 'like', "%$keyword%")->get();
        $records2 = $user->EatingHistoryItems()->where('item', 'like', "%$keyword%")->get();
        if(count($records1) + count($records2) >= 10 )
        {
            return [];
        }
        foreach($records1 as $record)
        {
            $obj = new \stdClass();
            foreach($this->templateParamNames as $paramName)
            {
                $obj->$paramName = $record->$paramName;
            }
            $result[] = $obj;
        }
        foreach($records2 as $record)
        {
            $obj = new \stdClass();
            foreach($this->templateParamNames as $paramName)
            {
                $obj->$paramName = $record->$paramName;
            }
            $result[] = $obj;
        }
        return $result;
    }
        onChangeItem: function() {
            if(this.contents.item!=""){
                var flg = this.setTemplete();
                if(flg == false) {
                    var self = this;
                    this.param.contents = this.contents;
                    axios.post('/api/eating/search', this.param).then(function(response){
                        self.keywords = [];
                        response.data.keywords.forEach(keyword => {
                            self.keywords.push(keyword);
                        });
                    }).catch(function(error){
                        self.error_flg = true;
                        self.errors = error.response.data.errors;
                    });
                }
            }else{
                this.keywords = [];
            }
        },
        setTemplete: function() {
            for (var index = 0; index < this.keywords.length; index++) {
                if(this.keywords[index].item == this.contents.item) {
                    this.contents.protein = this.keywords[index].protein;
                    this.contents.liqid = this.keywords[index].liqid;
                    this.contents.carbo = this.keywords[index].carbo;
                    this.contents.calorie = this.keywords[index].calorie;
                    return true;
                }
            }
            return false;
        }

これで入力履歴からデータの入力ができました。

ついでに同じデータが二重で履歴に登録されないように細工します。

    /**
     * ヒストリにデータを1件追加する
     */
    public function addHistory($param, $user)
    {
        $record = $this->searchKeyword($param["item"], $user);
        if(count($record) != 0)
        {
            return;
        }
        $model = new EatingHistoryItem();
        foreach($this->templateParamNames as $name)
        {
            $model->$name = $param[$name];
        }
        $model->save();

        $this->attachToUser($model, $user);
    }

これである程度利便性が高まりましたね。

あとは管理画面か・・・。

他のユーザーから管理画面を表示できないようにしないと。

ファイナルギアがなかなか面白い

なかなか面白いゲーム作ってくれる。

女の子(パイロット)とメカのパーツを集めて敵と戦うゲームなのですが、

パーツにもレアリティがあり、これは課金しなくてもバトルや開発で獲得できる(課金ガチャでは無い)。

中にもキャラ戦用パーツというのもあり、4パーツ(武器、ボディ、レッグ、背部)をキャラ専用パーツで揃えると、変形して特殊効果が発動する。

なので、この専用パーツを効率よく集めることが攻略のポイントだったりする。

バトルはタクティカル要素とアクション要素があり、アクションは正直1人で操作できるものじゃないので、オートでも良い。

どっちかというと、タクティカル要素の方が重要で、チームの編成と、チームをどうやって動かすか、というのがポイントになる。

勿論チームの強化も。

キャラ自身を強化することも重要だし、パーツを強化することも重要。

そのため、一回のバトルが結構長いです。

それでも、戦況はリアルタイムに変わっていくので、完全放置は無理です。バトルが始まったら最後まで気は抜けない。

序盤の攻略のポイントはイブリンがメインヒロイン的存在なので、イブリンを中心に育てていけば良いです。

早い段階で専用パーツが揃うし、イベントにキャラエピソードも追加されているので、攻略していくとさらに強い専用パーツを入手できます。

何をやれば良いかがわからない場合は、とりあえず初心者ミッションを攻略していくといいでしょう。

自分も終わっていませんが。

【デザインパターン】Builerパターン

Builderパターンのコード例です。

package org.example.builder;

public abstract class Builder {
    public abstract void buildPart1(Product product);
    public abstract void buildPart2(Product product);
}
package org.example.builder;

public class ConcreteBuilder extends Builder {
    private Product product;

    @Override
    public void buildPart1(Product product) {

    }

    @Override
    public void buildPart2(Product product) {

    }

    public Product getResult(){
        return product;
    }
}
package org.example.builder;

public class Director {
    private Builder builder;
    public Director(Builder builder)
    {
        super();
        this.builder = builder;
    }

    public void construct(Product product)
    {
        builder.buildPart1(product);
        builder.buildPart2(product);;
    }
}
package org.example.builder;

public class Main {
    public static void main(String[] args)
    {
        Product product = new Product();

        ConcreteBuilder concreteBuilder = new ConcreteBuilder();
        Director director = new Director(concreteBuilder);
        director.construct(product);
        Product result = concreteBuilder.getResult();
    }
}

処理に必要なデータを段階的に渡していき、最後に処理結果を取得するパターンです。

LaravelのSQLビルダがそれに近いですね。

Builderインターフェースを定義し、それをConcreteBuilderとして実装します。

DirectorのコンストラクタにConcreteBuilderを渡し、以後、Directorのconstructメソッドで必要なパラメータをBuilderに渡します。

結果はgetResultで取得します。

【北海道大戦】札幌強すぎ問題

マップを修正して。札幌を9区に分けてみました。

これで単純計算で札幌の戦力が1/9になったはずですが、

都市間のリンクがぐちゃぐちゃになりまして、それをできる限り修正してみたらかなりいびつな形になっちゃいました。

まあいいや。

今後はリアル北海道地図でやりたいなぁ。

楽天モバイルに切り替え完了

Nifmoから楽天モバイルにスマホの回線を切り替えました。

Pixel4aにはeSIMが内蔵されているので、すんなり切り替えができると思っていましたが、

そうではなかった。

まず、NifmoにMNP転出届を出して(Webから手続きできる)、届け出番号を取得する必要がある。

これに時間がかかるのは仕方が無いとして、

そのあと、楽天モバイル側に届け出番号と本人確認書類(今回は運転免許証表裏の画像)を提出し、本人確認完了後、郵送でeSIM設定用QRコードの付いた回線設定資料(上の写真)が送られてくる。

ここで2日かかった。

次に、My楽天アプリで回線開通処理を行うのですが、

これを実行すると、Nifmoの回線が不通となり、楽天モバイル側の回線が開通するまで待たなければならない。

このような説明がありますが、

嘘ついてんじゃねぇぞ。

実際は2時間経っても開通がおわらず、焼肉に行って帰ってきたら開通できるようになっていました(ステータスが変わってました)

これを確認するまで6時間かかってました。

まぁ、ここまで行けばマニュアル通りに設定を進めて、見事に開通できました。

一応、スピードテストをやってみる。

こないだギガぞうの件のときに計ったのがこんな感じだったので

やはり自前回線は違うね。

楽天モバイルは札幌市内が圏内ですが、まだ郊外の部分がパートナー回線(au)を使っているので、まだまだ不自由することがありますが、

まぁ、今のところ札幌市外に出る用事はないので良いでしょう。

今後もエリアが拡大されることを願ってます。

【ラズパイ】赤外線受信を試してみる。

前回は赤外線LED(送信側)を試しましたが、

今回は受信機側を試してみたいと思います。

ドキュメントにこう書いてありました。

受信部に向かって左から出力、GND、VCCということなので、

こういう回路を組んでみました。

出力に発行ダイオードと抵抗を繋げました。

この状態ではなにも信号は与えていませんが、

LEDが点灯しているのは、

この図を見ると、信号を受信したときに出力がHigh→Lowとなるようです。

試しに、エアコンのリモコンの信号を受信機に当ててみたいと思います。

微妙ですが変化があるようですね。

じゃあ、次はこの信号を読み取るプログラムを書いてみますか。