taki のすべての投稿

【C#】【ALTSEED】【数独】ボタン作成

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

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

https://github.com/takishita2nd/sudokuGUI

処理を行うボタンを設置します。

作成するボタンは「解析開始」ボタンと、入力した数字を全部消去する「クリア」ボタンです。

まず、ボタンを配置するところから作ります。

ボタンを配置するためにボタン用のクラスを作成します。

しかし、すでに作成しているSquareObjectクラスと重複している部分があるので、新たにObjectBaseクラスを作成して、共通部分はこちらに書きます。

    class ObjectBase
    {
        protected int _x;
        protected int _y;
        protected asd.TextureObject2D _backTexture;
        protected asd.TextObject2D _valueText;
        protected int width;
        protected int height;

        public asd.TextureObject2D getBackTexture()
        {
            return _backTexture;
        }

        public asd.TextObject2D getTextObject()
        {
            return _valueText;
        }

        public bool isClick(asd.Vector2DF pos)
        {
            if (pos.X > _x && pos.X < _x + width
                && pos.Y > _y && pos.Y < _y + height)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }

そして、SquareObjectクラスと新たに作成するボタンクラスはこのObjectBaseクラスを継承します。

SquareObjectの記載は省略します。gitHubのソースを参照してください。

    class Button : ObjectBase
    {
        private string _text;
        private const int fontOffsetX = 39;
        private const int fontOffsetY = 9;

        public Button(int x, int y, string text)
        {
            width = 256;
            height = 64;
            _x = x;
            _y = y;
            _text = text;

            _backTexture = new asd.TextureObject2D();
            _backTexture.Position = new asd.Vector2DF(_x, _y);

            _valueText = new asd.TextObject2D();
            _valueText.Text = _text;
            _valueText.Font = Resource.getTextFont();
            _valueText.Position = new asd.Vector2DF(_x + fontOffsetX, _y + fontOffsetY);
        }

        public void updateTexture(asd.Vector2DF pos)
        {
            if (pos.X > _x && pos.X < _x + width
                && pos.Y > _y && pos.Y < _y + height)
            {
                _backTexture.Texture = Resource.getButtonTexture();
            }
            else
            {
                _backTexture.Texture = null;
            }
        }

        public virtual void onClick(SquareObject[,] squareObjects)
        {
            throw new NotImplementedException();
        }
    }

onClick()にクリック時の処理を記載します。

実際はこのクラスを継承して使用するので、ここでは未実装Exceptionを投げて例外を発生させます。

このクラスを継承して、まずはクリア処理を作成します。

    class ClearButton : Button
    {
        public ClearButton() : base(600, 500, "クリア")
        {

        }

        public override void onClick(SquareObject[,] squareObjects)
        {
            for (int row = 0; row < 9; row++)
            {
                for (int col = 0; col < 9; col++)
                {
                    squareObjects[row, col].setValue(0);
                }
            }
        }
    }

これを使用して、処理を作成します。

            // ボタン
            Button clear = new ClearButton();
            asd.Engine.AddObject2D(clear.getBackTexture());
            asd.Engine.AddObject2D(clear.getTextObject());

            Button start = new Button(600, 570, "解析開始");
            asd.Engine.AddObject2D(start.getBackTexture());
            asd.Engine.AddObject2D(start.getTextObject());

            // Altseedが進行可能かチェックする。
            while (asd.Engine.DoEvents())
            {
                asd.Vector2DF pos = asd.Engine.Mouse.Position;
                if (!mouseHold)
                {
                    for (int row = 0; row < 9; row++)
                    {
                        for (int col = 0; col < 9; col++)
                        {
                            squareObjects[row, col].updateTexture(pos);
                        }
                    }
                    clear.updateTexture(pos);
                    start.updateTexture(pos);
                }
                else
                {
                    palette.updateTexture(pos);
                }

                if (asd.Engine.Mouse.LeftButton.ButtonState == asd.ButtonState.Push)
                {
                    if (mouseHold)
                    {
                        if (!palette.isClick(pos))
                        {
                            palette.hide();
                            mouseHold = false;
                        }
                        else
                        {
                            int value = palette.getClickValue(pos);
                            if(clickedSquareObject != null)
                            {
                                clickedSquareObject.setValue(value);
                                palette.hide();
                                mouseHold = false;
                            }
                        }
                    }
                    else
                    {
                        if (clear.isClick(pos))
                        {
                            clear.onClick(squareObjects);
                        }
                        else
                        {
                            mouseHold = true;
                            palette.show(pos);
                            for (int row = 0; row < 9; row++)
                            {
                                for (int col = 0; col < 9; col++)
                                {
                                    if (squareObjects[row, col].isClick(pos) == true)
                                    {
                                        clickedSquareObject = squareObjects[row, col];
                                    }
                                }
                            }
                        }
                    }
                }

                // Altseedを更新する。
                asd.Engine.Update();
            }

実行結果はこんな感じ。

次回は解析処理を実装していきます。

【C#】【ALTSEED】【数独】パレットから数字を入力する

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

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

https://github.com/takishita2nd/sudokuGUI

今回でパレット処理を完成させます。

パレットの数字をクリックしたら、そのパレットマスの数字を取得して、パレットを消去し、マスに数字を入力します。

まずは、パレットのどのマスがクリックされたかを確認します。

これはSquareObjectに実装します。

    public bool isClick(asd.Vector2DF pos)
    {
        if (pos.X > _x && pos.X < _x + width
            && pos.Y > _y && pos.Y < _y + height)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

やっていることはupdateTexture()と同じで、マウスカーソルがマスの中にあるかどうかを判定して、true/falseを返します。

そしてもう一つ。

        public int getValue()
        {
            return _value;
        }

こっちは特に説明は入らないですよね。

これをPaletteクラスに実装します。

        public int getClickValue(asd.Vector2DF pos)
        {
            for (int row = 0; row < 3; row++)
            {
                for (int col = 0; col < 3; col++)
                {
                    if(paletteSquareObjects[row, col].isClick(pos) == true)
                    {
                        return paletteSquareObjects[row, col].getValue();
                    }
                }
            }
            if (PaletteBatsuSquareObject.isClick(pos))
            {
                return 0;
            }
            return 0;
        }

isClick()でマウスカーソルがマスの中にあるかを確認して、その中にあればgetValue()で値を取得します。

これを×にも実装し、こちらは空白を意味する0を返します。

これをsudokuUIに実装します。

            // Altseedが進行可能かチェックする。
            while (asd.Engine.DoEvents())
            {
                asd.Vector2DF pos = asd.Engine.Mouse.Position;
                if (!mouseHold)
                {
                    for (int row = 0; row < 9; row++)
                    {
                        for (int col = 0; col < 9; col++)
                        {
                            squareObjects[row, col].updateTexture(pos);
                            if(squareObjects[row, col].isClick(pos) == true)
                            {
                                clickedSquareObject = squareObjects[row, col];
                            }
                        }
                    }
                }
                else
                {
                    //palette.updateTexture(pos);
                }

                if (asd.Engine.Mouse.LeftButton.ButtonState == asd.ButtonState.Push)
                {
                    if (mouseHold)
                    {
                        if (!palette.isClick(pos))
                        {
                            palette.hide();
                            mouseHold = false;
                        }
                        else
                        {
                            int value = palette.getClickValue(pos);
                            if(clickedSquareObject != null)
                            {
                                clickedSquareObject.setValue(value);
                                palette.hide();
                                mouseHold = false;
                            }
                        }
                    }
                    else
                    {
                        mouseHold = true;
                        palette.show(pos);
                        for (int row = 0; row < 9; row++)
                        {
                            for (int col = 0; col < 9; col++)
                            {
                                if (squareObjects[row, col].isClick(pos) == true)
                                {
                                    clickedSquareObject = squareObjects[row, col];
                                }
                            }
                        }
                    }
                }

mouseHold==true(パレット表示中)で、パレットがクリックされた場合、先ほど実装したgetClickValue()を使用して、数値を取得します。

9×9のどこをクリックしたかを覚えておかなければならないため、パレットを表示する際に、どのマスをクリックされたかを覚えておきます。

この覚えたマスに対して、パレットから取得した数値を設定します。

ちなみに、palette.updateTexture(pos)をコメント化しているのは、パレットにもマウスカーソルでテクスチャを適用しようとすると、パレットを消したときにテクスチャが残ってしまうからです。

多分、エンジンのバグ。

なので、パレットにはマウスカーソルでテクスチャ適用は諦めました。

実行結果はこんな感じです。

だいぶ形になってきました。

完成まであと少しです。

購入。Kindle Paperwhite

届きました。

最新モデルのKindle Paperwhite。

世代で言うと第10世代で、Kindle Paperwhiteとしては4代目らしい。

これがリリースされたのが2018年だから2年前なのね。

左が本体。右がカバーです。

今まで使用していたのは、第7世代(Kindle Paperwhite3代目)。

左が今まで使用していたKindle。右が新品。

サイズはほんの少しだけ右の方がコンパクトになっているね。

サイズが変わっているので、カバーも一緒に買っておいて良かった。

Kindleはディスプレイ部分が衝撃に弱いので、手帳型のカバーを買っていた方が長持ちします。

実際に、1回ディスプレイ破れました。

無償で本体を交換してくれましたが。

それがあってから、スマホ・タブレットのケースは手帳型最強説を唱えています。

今回のKindleで何が変わったかというと、

一番大きなところで、防水仕様になりました。

見た目からして、ディスプレイがフラット仕様になっていますね。

お風呂の中での読書もはかどります。

最近半身浴で長時間お風呂に浸かっていることが多いので、防水のKindleが欲しかったんですよね。

あと、本体の容量が4GBから32GBになりました。

Kindleの本のデータサイズはかなり小さくなるように調整されていますが、それでも4GBはあっという間に埋まり、定期的にデータ削除とデータダウンロードを繰り返しています。

Kindleはデータダウンロード時に一番バッテリーを消費するらしいので、あらかじめWi-Fi環境下で充電しながらダウンロードしておくのが一番良いらしいですよ。

一度ダウンロード済ませておけば、ほとんどバッテリー消費すること無く読書を楽しむことができます。

古いKindleはメルカリで売ることにします。

分解するにはもったいないので。

まだまだ十分使えますし。

【C#】【ALTSEED】【数独】パレットに×を追加。

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

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

https://github.com/takishita2nd/sudokuGUI

引き続き、パレットの中身を実装していきます。

パレットに×を追加します。

×のフォントをフォントジェネレータで作成して実装します。

    static class Resource
    {
        private static asd.Font _fontBatsu = null;

        public static asd.Font getFontBatsu()
        {
            if (_fontBatsu == null)
            {
                _fontBatsu = asd.Engine.Graphics.CreateFont("batsu.aff");
            }
            return _fontBatsu;
        }

これを使用します。

クラスは・・・PaletteSquareObjectを拡張しましょうか。

    class PaletteBatsuSquareObject : PaletteSquareObject
    {
        public PaletteBatsuSquareObject(int row, int col) : base(row, col)
        {
            _valueText.Font = Resource.getFontBatsu();
        }

        public void showBatsu()
        {
            _valueText.Text = "×";
        }

        public new void setPosition(asd.Vector2DF pos)
        {
            _x = _row * width + (int)pos.X;
            _y = _col * height + (int)pos.Y;

            _backTexture.Position = new asd.Vector2DF(_x, _y);
            _valueText.Position = new asd.Vector2DF(_x + fontOffsetX - 8, _y + fontOffsetY);
        }
    }

コンストラクタで、フォントを追加した物に指定、showBatsu()で×を表示します。

また、×の表示位置を調整するため、setPosition()をオーバーライドしています。

    class SquareObject
    {

        public void hide()
        {
            _valueText.Text = "";
        }

SquareObjectクラスにhide()を追加しました。これでわかりやすく文字を消すことができます。

これらをPaletteクラスに実装します。

    class Palette
    {
        PaletteBatsuSquareObject PaletteBatsuSquareObject = new PaletteBatsuSquareObject(0, -1);

        public void setEngine()
        {
            asd.Engine.AddObject2D(_texture);
            for (int row = 0; row < 3; row++)
            {
                for (int col = 0; col < 3; col++)
                {
                    asd.Engine.AddObject2D(paletteSquareObjects[row, col].getBackTexture());
                    asd.Engine.AddObject2D(paletteSquareObjects[row, col].getTextObject());
                }
            }
            asd.Engine.AddObject2D(PaletteBatsuSquareObject.getBackTexture());
            asd.Engine.AddObject2D(PaletteBatsuSquareObject.getTextObject());
        }

        public void show(asd.Vector2DF pos)
        {
            palettePosition = new asd.Vector2DF(pos.X, pos.Y - 64);
            _texture.Position = palettePosition;
            _texture.Texture = Resource.getPalette();
            int value = 1;
            for (int row = 0; row < 3; row++)
            {
                for (int col = 0; col < 3; col++)
                {
                    paletteSquareObjects[row, col].setPosition(pos);
                    paletteSquareObjects[row, col].setValue(value);
                    value++;
                }
            }
            PaletteBatsuSquareObject.setPosition(pos);
            PaletteBatsuSquareObject.showBatsu();
        }

        public void hide()
        {
            _texture.Texture = null;
            for (int row = 0; row < 3; row++)
            {
                for (int col = 0; col < 3; col++)
                {
                    paletteSquareObjects[row, col].hide();
                }
            }
            PaletteBatsuSquareObject.hide();
        }

やることは他の文字と同じで、Altseedエンジンへの追加、表示、消去を行います。

実行結果はこんな感じです。

まあまあですかね。

新洗濯機到着。

新品っていいね。

ぶっちゃけ、洗濯機ってどれを買っても同じなんですよ。

要は、メーカーが気に入るかどうかの話で、搭載している機能にはほとんど差は無い。

そして、大抵はちゃんと洗濯してくれる。

メーカーだよ、メーカー。

メーカーで選べ。

あ、マニュアル見て知ったのですが、粘度の高い液体洗剤、柔軟剤は水で薄めて使うと挿入口で詰まらなくなるらしいぞ。

水で薄めても、投入する洗剤の量は変わらないからね。

【C#】【ALTSEED】【数独】パレットの作成

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

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

https://github.com/takishita2nd/sudokuGUI

パレットの中身を実装していきます。

まず、パレットに表示する数字ですが、これは、すでに作成しているSquareObjectを利用しましょうか。

これをこのまま使用できないので、継承して機能拡張を行います。

    class SquareObject
    {
        protected int _x;
        protected int _y;
        protected int _row;
        protected int _col;
        private int _value;
        protected asd.TextureObject2D _backTexture;
        protected asd.TextObject2D _valueText;
        protected const int offsetX = 10;
        protected const int offsetY = 10;
        protected const int fontOffsetX = 19;
        protected const int fontOffsetY = 9;
        protected const int width = 64;
        protected const int height = 64;

privateからprotectedに書き換えました。

こうしなければ拡張先で変数を参照することができません。

    class PaletteSquareObject : SquareObject
    {

        public PaletteSquareObject(int row, int col) : base(row, col)
        {
        }

        public void setPosition(asd.Vector2DF pos)
        {
            _x = _row * width + (int)pos.X;
            _y = _col * height + (int)pos.Y;

            _backTexture.Position = new asd.Vector2DF(_x, _y);
            _valueText.Position = new asd.Vector2DF(_x + fontOffsetX, _y + fontOffsetY);
        }
    }

パレットの数字はマウスの位置によってコロコロ変わるので、自由に表示位置を変更できるようにします。

このクラスをPaletteクラスで使用します。

    class Palette
    {
        private asd.Vector2DF palettePosition;
        private const int width = 192;
        private const int height = 256;
        private asd.TextureObject2D _texture;
        PaletteSquareObject[,] paletteSquareObjects = new PaletteSquareObject[3, 3];

        public Palette()
        {
            _texture = new asd.TextureObject2D();
            for(int row = 0; row < 3; row++)
            {
                for(int col = 0; col < 3; col++)
                {
                    paletteSquareObjects[row, col] = new PaletteSquareObject(row, col);
                }
            }
        }

        public void setEngine()
        {
            asd.Engine.AddObject2D(_texture);
            for (int row = 0; row < 3; row++)
            {
                for (int col = 0; col < 3; col++)
                {
                    asd.Engine.AddObject2D(paletteSquareObjects[row, col].getBackTexture());
                    asd.Engine.AddObject2D(paletteSquareObjects[row, col].getTextObject());
                }
            }
        }

        public void Show(asd.Vector2DF pos)
        {
            palettePosition = new asd.Vector2DF(pos.X, pos.Y - 64);
            _texture.Position = palettePosition;
            _texture.Texture = Resource.getPalette();
            int value = 1;
            for (int row = 0; row < 3; row++)
            {
                for (int col = 0; col < 3; col++)
                {
                    paletteSquareObjects[row, col].setPosition(pos);
                    paletteSquareObjects[row, col].setValue(value);
                    value++;
                }
            }
        }

        public void Hide()
        {
            _texture.Texture = null;
            for (int row = 0; row < 3; row++)
            {
                for (int col = 0; col < 3; col++)
                {
                    paletteSquareObjects[row, col].setValue(0);
                }
            }
        }

まず、コンストラクタでPaletteSquareObjectを3×3で作成します。

Show()でPaletteSquareObjectの座標設定と、数値設定(これで数字が表示される)、Hide()で数字を消します。

あと、Altseedエンジンにオブジェクトを追加する処理を書き換えました。全部Paletteクラスの中で直接追加した方が都合がいいと思いました。

実行結果はこうなりました。

だんだん形になってきましたね。

障害年金受給のデメリット?

元ネタはこちら(Yahoo!ニュース)。

https://headlines.yahoo.co.jp/hl?a=20200416-00010002-ffield-life

まぁ、自分の経験から、障害年金を受給した事によって、仕事復帰に問題があるかと言われると、

特に問題無かった。

特に、受給していたら働けないという縛りは無いので、受給しながら働くことは全く問題ありません。

ただ、(確か)年末調整のときに受給者証の提出を求められたような気がします。

まぁ働けるなら会社側とよく相談して働くと良いと思います。

しかし、唯一のデメリットとしては、休職しても傷病手当を受け取ることはできません。

障害年金も、傷病手当も、本来働けない人が受け取ることができるお金なので、両方取ったら二重取りになりますからね。

でも、傷病手当は持っていたら本当にいろいろと有利で、

例えば、退職して国民年金に切り替えた場合、納付が免除されることがあります。

国民年金の保険料は結構負担なので、これはマジ助かります。

障害年金を申請したい場合は、まずは窓口に相談するのが良いと思います。

国民年金だったら役所の窓口、厚生年金だったら年金事務所が窓口になります。

担当者に自分の症状を話して、障害年金を受け取る事ができるかどうか、相談することができます。

もし受給できる可能性があるなら、どのような手続きが必要か、全部説明してくれるし、申請書類の添削もしてくれます。

申請自体が診断書が必要だったりで結構金銭的な負担もあるので、いきなり申請するよりは、まずは窓口で相談しましょう。

福祉乗車証の更新に行こうと思ったのだが

そういえば、障害者手帳を交付して貰ったときに作成して頂いた、福祉乗車証。

このカードがあれば、札幌市内の地下鉄、市電、バスが乗り放題となるSAPICAのカードなんですが、

このカード、有効期限がありまして、

有効期限が切れる前に更新に行かないといけないなと思って白石区役所に行ってきました。

南郷通沿いに住んでいる人は非常に便利で、

白石区役所は地下鉄東西線白石駅に直結しているので、非常にアクセスが良いのです。

豊平区はバスを乗り継がなくちゃいけなかったので、冬に用事があるときは大変だった・・・

特に、去年は有効期限をすっぽかしていたので、GW中に突然使えなくなって大慌てした覚えがあります。

更新の際に必要になるのが、今使用している福祉乗車証と、障害者手帳、受け取り確認のための印鑑です。

これを持って窓口に行ってきたのですが、

障害者手帳の有効期限が5月で切れるため、更新できませんでした。

なので、まずは障害者手帳の更新をしなければならないという事態になりました。

まずいぞ、確実に福祉乗車証の期限が切れる。

とりあえず、まっすぐ窓口に行ったのですが、(窓口がすぐ隣だった)本来は病院の診断書が必要なんですが、オイラの場合は障害年金受給者証で障害者手帳を作成したので、障害年金受給者証が必要になります。

しかし、最近はいろいろとオンラインで資料の参照ができるようになっているので、障害年金受給者証が無くても手続きができました。

しかも、オンライン化されていることで、紙の書類が少なくなったので、審査も短くなるとのこと。

さすがに5月までには更新は難しいですが、それでもかなり早く更新の通知が届くとのことです。

オンラインはこんなに便利なんやで。

写真はフライパンで焼いた味付けジンギスカン。

冷蔵庫の余った野菜と一緒に焼くことで、肉汁で野菜が煮込まれ美味しくなります。

さらに、我が家ではうどんを入れるのが定番で、うどんに肉汁を吸わせると、とってもおいしくなります。

美味しかったー

冷蔵庫の野菜が余ったらまた作ろう。

【C#】【ALTSEED】【数独】パレットの表示、非表示

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

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

https://github.com/takishita2nd/sudokuGUI

今回はマウスクリックで数字を入力するためのパレットを表示させます。

パレットには、こんな画像を用意しました。

これをマウスをクリックした箇所に表示させます。

それと同時に、マウスカーソルが示すマスの色も固定させます。

そして、パレットの外をクリックすると、パレットを消してマスの色も元に戻します。

まず、パレットクラスを作成します。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace sudokuGUI
{
    class Palette
    {
        private asd.Vector2DF palettePosition;
        private const int width = 192;
        private const int height = 256;
        private asd.TextureObject2D _texture;

        public Palette()
        {
            _texture = new asd.TextureObject2D();
        }

        public asd.TextureObject2D getPaletteTexture()
        {
            return _texture;
        }

        public void Show(asd.Vector2DF pos)
        {
            palettePosition = new asd.Vector2DF(pos.X, pos.Y - 64);
            _texture.Position = palettePosition;
            _texture.Texture = Resource.getPalette();
        }

        public void Hide()
        {
            _texture.Texture = null;
        }

        public bool isClick(asd.Vector2DF pos)
        {
            if(pos.X > palettePosition.X && pos.X < palettePosition.X + width
                && pos.Y > palettePosition.Y && pos.Y < palettePosition.Y + height)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }
}

getPaletteTexture()では、Altseedエンジンに追加するオブジェクトを返します。

show()でマウスのポジションを渡し、その座標にオブジェクトを設定してテクスチャを表示させます。(座標の位置は少しカスタマイズしています。)

Hide()でオブジェクトのテクスチャを消します。

isClick()では、渡されたマウスの座標がテクスチャの範囲内かどうかを返します。

これを使用して実装します。

        private bool mouseHold;
        private Palette palette = null;

:

            // パレット
            palette = new Palette();
            asd.Engine.AddObject2D(palette.getPaletteTexture());

            // Altseedが進行可能かチェックする。
            while (asd.Engine.DoEvents())
            {
                asd.Vector2DF pos = asd.Engine.Mouse.Position;
                if (!mouseHold)
                {
                    for (int row = 0; row < 9; row++)
                    {
                        for (int col = 0; col < 9; col++)
                        {
                            squareObjects[row, col].updateTexture(pos);
                        }
                    }
                }

                if (asd.Engine.Mouse.LeftButton.ButtonState == asd.ButtonState.Push)
                {
                    if (mouseHold)
                    {
                        if (!palette.isClick(pos))
                        {
                            palette.Hide();
                            mouseHold = false;
                        }
                    }
                    else
                    {
                        mouseHold = true;
                        palette.Show(pos);
                    }
                }

                // Altseedを更新する。
                asd.Engine.Update();
            }

今までMain関数に実装していた処理はSudokuUIクラスに移しました。(あまりMain関数にあれこれ書くのは好きじゃ無い。)

mouseHoldはマウスをクリックした状態を保持し、trueの場合はマウスをクリックされている状態で、パレットを表示している状態を示しています。

そして、mouseHold=trueのときは、マスのテクスチャの色を変える処理を行わないようにしています。

動かしてみると、こんな感じになります。

かなり、形が見えてきましたね。

久しぶりの外出、洗濯機を買う。

今日は

障害年金が入ったので、札幌駅前のエスタにあるビックカメラに行ってきました。

混んでいない時間を狙って、朝10時のバスに乗ってきました。

目的の商品を見つけて購入手続き。

店頭価格からさらに2000円引きで約3万円のお買い物でした。

実際はそれプラス送料、設置料、リサイクル料金がかかり、今回は送料、設置料はサービスとなりましたので、リサイクル料金のみ4000円程度かかりました。

洗濯機はリサイクル法でリサイクルを義務化されているので、勝手に粗大ゴミに出して処分すると違法になります。

なので、無難にお買い上げしたお店の業者に任せてしまった方が安全です。

ネット通販で買う人はご注意を。

当然のごとくお持ち帰りでは運べないので、後日、配達して貰います。

到着は土曜日の午後。

楽しみー。

写真は本日のお昼。エスタの地下の食品街で購入したカレーザンギ&餃子弁当です。

カレーザンギ美味しかった。

価格も心なしか、安く感じました。

気のせいかもしれないけど。

自粛も長く続くと、おうちご飯も、コンビニ弁当も飽きてくるのよ。

こういうとき、こんな食事が助かるね。

もうちょっと自粛頑張ろう。