【デザインパターン】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となるようです。

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

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

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

【ダイエット支援】【入力履歴機能】履歴検索して候補の表示

うまくスクショが取れなかった・・・

    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)
        {
            $result[] = $record->item;
        }
        foreach($records2 as $record)
        {
            $result[] = $record->item;
        }
        return $result;
    }
    public function search(Request $request)
    {
        return response()->json([
            'keywords' => $this->eatingManagement->searchKeyword($request->contents['item'], Auth::user()), 
            ]);
    }
Route::post('api/eating/search', 'Eating\ApiController@search');
                            <td><input type="search" v-model="contents.item" autocomplete="on" list="keyword" v-on:keydown="onChangeItem"/></td>
                            <datalist id="keyword">
                                <option v-for="keyword in keywords" v-bind:value="keyword" />
                            </datalist>
        onChangeItem: function() {
            if(this.contents.item!=""){
                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;
                });
            }
        }

まだコードは暫定ですが、

とりあえず、入力した文字からデータベースを検索して、入力候補表示までできました。

とりあえず、検索結果だけ。

検索結果から各パラメータを自動入力させるのはまた次回に。

チラシ配布のお仕事・・・

まぁ、おうちで何もしていないよりは、少しでもお金になれば良いかなと思って。

連絡を入れて、詳しいお話を聞いてきました。

あまりお金にはならないらしい。

月1万~2万程度の報酬とのこと。

お小遣い程度ですね。

地図を渡され、配布エリアと配布してはいけないお宅が解るようになっている。

地図自体はお仕事上の機密情報だし、個人情報も含まれているので見せられないのですが、

どこに配れば良いのかが解ります。

配ってはいけないところはクレーム対策としてやっているので、厳守。

あとで車で下見にも連れて行ってもらえるようです。

お仕事開始前とお仕事終了後に電話で報告。

月二回にFAXでお仕事の報告。

これを元に報酬が決まるので。

深夜はお仕事してはいけない。

不審者と思われるのを防ぐのと、ポストの位置とかが解りづらいため、ということです。

早朝や夕方にお仕事されている方が多いようですね。

滑り止めのゴム付き手袋がいいらしい。

というアドバイス。今度買ってきます。

あとは、住人に遭遇したら挨拶するといいですよ、とも言われました。

とにかく怪しまれないようにしないといけないね。

【COCOS2D-X】ステータス窓を配置

とりあえず、これが、ただ画像置いただけの画面。

これを背景画像の位置に合わせました。

    // ステータスウィンドウの配置
    auto xpos = (visibleSize.width - sprite->getContentSize().width * scaleRate) / 2.0;
    auto windowScale = (sprite->getContentSize().width * scaleRate) / (sprite->getContentSize().width * scaleRate) / 4.0;
    auto charaStatusWindow = Sprite::create("btn02_03_s_bl.png");
    if (charaStatusWindow == nullptr)
    {
        problemLoading("'btn02_03_s_bl.png'");
    }
    else
    {
        charaStatusWindow->setPosition(Vec2(xpos + origin.x,origin.y));
        charaStatusWindow->setAnchorPoint(Vec2(0,0));
        //charaStatusWindow->setScale(windowScale);

        this->addChild(charaStatusWindow, 1);
    }

ただ、これをピッチリ横に並べようとしたけど、スケールの計算がうまくできなくて、今日は諦めました。

縦に並べる???

その方が良いか。

次回やります。

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

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

package org.example.abstruct.factory.factory;

public abstract class AbstructProduct1 {
    public abstract void method1();
}
package org.example.abstruct.factory.factory;

public abstract class AbstructProduct2 {
    public abstract void method2();
}
package org.example.abstruct.factory.factory;

public abstract class AbstructFactory {
    public static AbstructFactory getFactory(String className)
    {
        AbstructFactory factory = null;
        try {
            factory = (AbstructFactory)Class.forName(className).getDeclaredConstructor().newInstance();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return factory;
    }

    public abstract AbstructProduct1 createAbstructProduct1();
    public abstract AbstructProduct2 createAbstructProduct2();
}
package org.example.abstruct.factory.concrete;

import org.example.abstruct.factory.factory.AbstructProduct1;

public class concreteAbstructProduct1 extends AbstructProduct1 {
    @Override
    public void method1() {

    }
}
package org.example.abstruct.factory.concrete;

import org.example.abstruct.factory.factory.AbstructProduct2;

public class concreteAbstructProduct2 extends AbstructProduct2 {
    @Override
    public void method2() {

    }
}
package org.example.abstruct.factory.concrete;

import org.example.abstruct.factory.factory.AbstructFactory;
import org.example.abstruct.factory.factory.AbstructProduct1;
import org.example.abstruct.factory.factory.AbstructProduct2;

public class concreteAbstructFactory extends AbstructFactory {
    @Override
    public AbstructProduct1 createAbstructProduct1() {
        return new concreteAbstructProduct1();
    }

    @Override
    public AbstructProduct2 createAbstructProduct2() {
        return new concreteAbstructProduct2();
    }
}

Factoryパターンが1Productを作成していたのに対して、AbstructFactoryパターンは複数Productを作成できるようにしたパターンです。

factory作成時にクラス名の文字列からインスタンスを作る、と本に書いてありました。

このやり方はいろいろ応用できるかも。

ちなみに、(AbstructFactory)Class.forName(className).newInstance();と書くのは非推奨となっています。

問題点は、Productを追加した場合、すでに作成している全てのconcreteProductに実装が必要と言うことですね。

ビタミンB12を積極的に摂ったら耳鳴りが改善した。

ついこないだまで強烈な耳鳴りが一日中していたんですが、

これまでやってきたことと言うと、

  • 眼精疲労防止(蒸しタオルなど目のケア)
  • 肩こり首こりの改善

それでも耳鳴りがするものだから、別の要因があるんじゃ無いかと。

で、調べてみたら、ビタミンB12が足りていないという情報を見つけまして。

ビタミンB12ってどういう食材に含まれているかというと、

  • レバー
  • 魚介類
  • 海藻類

と、言うことなので、

おにぎり用に買ってあった焼き海苔をおつまみ感覚で食べたり、ビタミン系のサプリメントも飲んでみました。

そうすると、その次の日から、耳鳴りが気にならなくなってきました。

ここまで効果が出るのか。

どうやら、40代になると、ビタミンB系が不足して、体調不良を起こす人も多いらしく、

ドラッグストアに行くと、40代向けにビタミンB群を補充するためのサプリメントが売ってありましたし。

でも、ここまで効果がでるとは思わなかったので、

今後は味海苔とか韓国海苔とかも積極的に食べていこうと思います。

Googleフォトの容量無制限が2021年6月に終了すると聞いて

マジかよ。

いまGoogleには月250円支払って100GBのストレージが使用できるようになっているのですが、

それとは別に写真は、圧縮された状態で無制限にバックアップが取れるようになっていたのですが、

それが2021年6月に終わると言うことです。

その後はどうなるのかというと、

2021年6月までに保存したデータは容量関係無しに残されるが、

それ以降に保存される写真データは容量に上限があるよ、無料プランだと15GBまで保存できるよ、それ以上保存したかったら課金してね、と言うことらしいです。

突然のことなのでびっくりしているのですが。

今、オイラは写真のバックアップはGoogleフォトとoneDriveに保存しています。

oneDriveはフォルダから直接扱えるので、PCで使用するのに便利なのと、Microsoft365を契約しているので(Officeソフトが使いたい)そのついでに1TBのストレージが付いてきています。

でも、できれば分散してバックアップ取っておきたいので(今回のGoogleの件もあるので、いつサービスが終わるのか解らない)、いままではついでにGoogleフォトにも保存していたのですが、

今後はAmazonフォトを使います。

Amazon Prime会員なので、写真データが無圧縮で無制限に保存できます。

はじめからそっちの方が良かったかもしれない。

Amazonフォトもいつまで無制限にできるか解りませんけどね。

じゃあ、Google Oneも解約するかな。

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