taki のすべての投稿

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

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

    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となるようです。

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

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

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

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

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

    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);
    }

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

縦に並べる???

その方が良いか。

次回やります。