札幌市民が東京都民へ伝えるべきこと

コロナウイルス感染拡大を受けて、

東京都も今週末の不要不急の外出を避けるように通知されました。

こんなことを言う前に、札幌、というか、北海道では、道知事の緊急事態宣言をうけて、およそ2~3週間、外出自粛要請を受けました。

このような状況の中、札幌市民が東京都民へ伝えるべきことを伝えます。

今週末は部屋に篭もろう。

北海道に比べて、東京都は人口密度か桁違いです。

理想は他人との接触をできるだけ避けることですが、これだけ人口密度が違うと、札幌のように、「換気の良い外出は大丈夫」とは言えないです。

ここは大人しく、室内で篭もりましょう。

我々(札幌市民)だって、2週間、室内で篭もってたのですから。

デリバリーやテイクアウトをうまく活用しましょう。

札幌に比べれば、東京都内なんて、デリバリーやネットスーパーが発達していると思います。

これを最大限に活用しましょう。

我々札幌市民の場合、ネットスーパーがあったので、これでだいぶ助かりました。

東京都だったらUber EATSがあるらしいよねぇ???

いいなぁ、うらやましいなぁ。

これらを上手に活用することで、感染リスクをかなり下げることができます。

遠慮無く活用しましょう。

外出は買い物だけにしましょう。

自分は、緊急事態宣言状況下での外出は、コンビニかスーパーだけでした。

東京都でも、外出はコンビニかスーパーだけにするべきです。

同時に、県外からの人員移動も防ぐべきです。

埼玉、千葉、神奈川の皆さん、東京都内に行くことは控えましょう。

この困難を克服するためには、日本全国民がコロナウイルスに対して警戒するべきです。

この困難を克服できた、最初の国になることを願っています。

全国民の皆さん、ご協力をお願いします。

結局、ネット回線引越し代行はお得だったのか?

今回の引越しで、引越し業者から紹介されたネット回線引越し代行の業者にネット回線引越しをお願いしたのですが、

結果から言うと、「今回の場合は」正解でした。

「今回の場合は」というのは、

宅内回線工事の費用です。

元々光回線が引かれていない物件だったので、宅内回線工事にこれだけの費用が掛かりました。

今回の契約では、この費用は丸々業者持ちで、こちらの負担はありません。

通常の回線引っ越しの場合は、おそらく自己負担になると思うので、そう考えると、ラッキーだったのかもしれません。

それプラス、引っ越し前の回線解約違約金と20000円キャッシュバックもついてくるし。

回線速度には多少不満はあるけどね。

一度回線を引いてしまえば、プロバイダー乗り換えでも同じフレッツ光なら工事費用は掛からないハズ。

ネット回線引っ越し代行の利用を検討する場合は、引っ越し先の状態を確認するのが良いと思います。

すでに光回線が引かれている場合は、利用しないほうがいいかもしれません。

あと、実際に開通するまでにかなり時間がかかりますので、その間をどうするかも考えておいたほうがいいかもしれません。

モバイルルータにするという選択肢もありますが、やはり光回線に慣れちゃったら、遅いっすよ。

それに、おいらの場合はひかりTVも利用しているので、光回線以外に選択肢はありません。

なんにせよ、ケースバイケースでお得かどうかは変わってくると思うので物件の設備とユースケースを十分考慮して選択するといいと思います。

【C#】【数独】数独解析プログラム完成

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

前回の修正でほぼほぼ解析ロジックは完成したので、もうちょっと使い勝手が良いように、ファイル入出力とエラー処理に手を加えます。

まずは、いままで出力ファイル名が固定化されていたので、コマンドの第二パラメータに出力ファイルを入力するようにします。

具体的には、ファイル入出力が一つのstaticクラスで行っていたのを分割します。

入力ファイルの読み込みは、最初の1回しか実行しないので、staticクラスで、出力ファイルは何度も使用するので、通常のクラスで定義し直します。

出力クラスのコンストラクタで出力ファイル名を指定します。

    class FileOutput
    {
        private string _filename;
        public FileOutput(string filename)
        {
            _filename = filename;
            if (File.Exists(_filename) == true)
            {
                File.Delete(_filename);
            }
        }

        public void Output(Square[,] sq)
        {
            using (var stream = new StreamWriter(_filename, true))
            {
                for (int row = 0; row < 9; row++)
                {
                    for (int col = 0; col < 9; col++)
                    {
                        stream.Write(sq[row, col].GetValue());
                    }
                    stream.Write("\r\n");
                }
                stream.Write("\r\n");
            }
        }

        public void Output(bool[,] sq)
        {
            using (var stream = new StreamWriter(_filename, true))
            {
                for (int row = 0; row < 9; row++)
                {
                    for (int col = 0; col < 9; col++)
                    {
                        if (sq[row, col] == true)
                        {
                            stream.Write(1);
                        }
                        else
                        {
                            stream.Write(0);
                        }
                    }
                    stream.Write("\r\n");
                }
                stream.Write("\r\n");
            }
        }

        public void Output(int row, int col, int value)
        {
            using (var stream = new StreamWriter(_filename, true))
            {
                stream.Write("[{0},{1}] => {2}\r\n", row, col, value);
            }
        }

        public void Output(string text)
        {
            using (var stream = new StreamWriter(_filename, true))
            {
                stream.Write("{0}\r\n", text);
            }
        }

        public void Output(List<Square> list)
        {
            using (var stream = new StreamWriter(_filename, true))
            {
                stream.Write("候補 ");
                foreach (Square s in list)
                {
                    stream.Write("[{0},{1}]", s.Row, s.Col);
                }
                stream.Write("\r\n");
            }
        }
    }

メイン関数で出力ファイル名を取得します。

第二パラメータが無かった場合は、自動的に入力ファイイル名.outputというファイル名で出力させます。

        static void Main(string[] args)
        {
            // パラメータチェック
            if (args.Length < 1)
            {
                Console.WriteLine("usage : sudoku.exe [input file] [output file]");
                return;
            }

            // ファイルの存在を確認
            string filePath = Environment.CurrentDirectory + "\\" + args[0];
            if (File.Exists(filePath) == false)
            {
                Console.WriteLine("File not found.");
                return;
            }

            // 出力ファイル名
            string outfile = null;
            if (args.Length == 2)
            {
                outfile = Environment.CurrentDirectory + "\\" + args[1];
            }
            else
            {
                outfile = filePath + ".output";
            }

            var sq = FileRead.OpenFile(filePath);
            if(sq == null)
            {
                return;
            }

            Sudoku sudoku = new Sudoku(sq, outfile);
            sudoku.run();
        }

最後に、入力データのエラー処理を改善します。

具体的には、例えば、行と列が10以上あった場合、そして、数字以外の値が入っていた場合、数字が10以上入っていた場合はエラーで終了させます。

    static class FileRead
    {
        /**
         * ファイルからデータを取得する
         */
        public static Square[,] OpenFile(string filePath)
        {
            int[,] matrix = new int[9, 9];

            // ファイルを開く
            bool error = false;
            using (var stream = new StreamReader(filePath))
            {
                int row = 0;
                while (stream.EndOfStream == false)
                {
                    if (row >= 9)
                    {
                        error = true;
                        break;
                    }
                    string lineText = stream.ReadLine();
                    var val = lineText.Split(',');
                    if (val.Length > 9)
                    {
                        error = true;
                        break;
                    }
                    int col = 0;
                    foreach (var v in val)
                    {
                        int i;
                        if (int.TryParse(v, out i))
                        {
                            if(i >= 10)
                            {
                                error = true;
                                break;
                            }
                            matrix[row, col] = i;
                        }
                        else
                        {
                            error = true;
                            break;
                        }
                        col++;
                    }
                    if (error)
                    {
                        break;
                    }
                    row++;
                }
            }
            if (error)
            {
                Console.WriteLine("Illegal format.");
                return null;
            }

            Square[,] ret = new Square[9, 9];
            for (int row = 0; row < 9; row++)
            {
                for (int col = 0; col < 9; col++)
                {
                    Square sq = new Square(matrix[row, col], row, col);
                    ret[row, col] = sq;
                }
            }

            return ret;
        }
    }

そして、最終的にgitHubのようなソースになりました。

https://github.com/takishita2nd/sudoku

auの5Gも北海道で使えます。

auの公式情報に3月末からサービス開始される5Gの対応エリアが発表されました。

https://www.au.com/mobile/area/

北海道でも5Gが始まります。

対象エリアは

  • 北海道河西郡更別村字更南の一部
  • 北海道河西郡更別村字更別の一部

なぜ更別村。

人口の少ない、負荷が少ない環境からサービスを始めるのか。

もしくは、更別村は機械化農業を進めているので、5Gを農業に応用させる研究を行おうとしているのか。

北海道から始まる農業イノベーション。

いいねぇ。

ひかりTVを設置した。

申し込みをしてから1週間ぐらい経って、

チューナーが届きました。

早速セットアップ。

ケーブルをつないで電源をONにすると、フレッツ光のお客様番号を入力して利用開始。

録画用のHDDを接続。

引越し前に使用していたときに頂いたものをそのまま使用します。

前のデータは使用できないので、すべてフォーマットして使用できるようにしました。

これで、地上波、BS、CSの録画ができます。

次にやるのはホームサーバー化。

ホームサーバーにすれば、PCやスマホでひかりTVを視聴できます。

このときに忘れていけないのは、省電力設定を無効化すること。

こうしておけば、本体の電源をOFFにしていてもホームサーバー機能は維持できます。

問題は契約内容。

今のプランだと地上波、BS、CSと一部の無料動画しか見られなくて、

動画見放題も含めると、その一つ上の「お値打ちプラン」にする必要があって、およそ+1000円かかります。

今、ビデオをチェックすると、おぎはやぎのキャンプの番組と、ワカコ酒のシーズン5があるので、どうしようか悩んでいます。

よし、プラン変更しよう。

【C#】【数独】ログ出力を強化し不具合を探す

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

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

https://github.com/takishita2nd/sudoku

前回のソースでは、以下のような問題で解析が途中で失敗していました。

この原因を探るため、ログ出力を強化します。

まず、マスに値を入れるタイミングでログを出します。

次に、仮置きロジックを適用する時と、仮置き前に巻き戻しをする時に、それが分かるようにログを出します。

さらに、仮置きロジックを適用する場所をログに出力するようにします。

ここまでやって、 仮置きロジックを適用する場所を探す処理に不具合がある事が分かりました。

        /**
         * 仮置き対象のマスを抽出する
         *
         * squares マス
         */
        private List<Square> searchKariokiSquare(Square[,] squares)
        {
            List<Square> ret = null;
            for (int row = 0; row < 9; row += 3)
            {
                for (int col = 0; col < 9; col += 3)
                {
                    List<Square> temp = new List<Square>();
                    for (int i = 0; i < 3; i++)
                    {
                        for (int j = 0; j < 3; j++)
                        {
                            if (squares[row + i, col + j].isConfirmed() == false)
                            {
                                temp.Add(_square[row + i, col + j]);
                            }
                        }
                    }
                    if (ret != null) //←★ここ
                    {
                        if (ret.Count > temp.Count && temp.Count != 0)
                        {
                            ret = temp;
                        }
                    }
                    else
                    {
                        ret = temp;
                    }
                }
            }
            return ret;
        }

★の箇所で、ret=nullで、temp.Count = 0の時に、仮置きロジックを適用する箇所がない(ret.Count=0)となり、解析が終了していることが分かりました。

なので、★の箇所を修正します。

                    if (ret != null)
                    {
                        if (ret.Count > temp.Count && temp.Count != 0)
                        {
                            ret = temp;
                        }
                    }
                    else if(temp.Count != 0)
                    {
                        ret = temp;
                    }

解けました。

難易度★5の問題も解けるようになったので、大抵の問題は解けるようになりました。

もう少し動かしてみます。

【このファン】トロール襲来!~雪山パニック~

いきなりですが、

ボスバトル超級2に勝利しました。

このイベント、オイラの勝ちです。

イベント「リーン」をゲットしましたが、メインの主力は★3のメンバー。

それらをMAXまで鍛え上げました。

★4を一人鍛え上げるよりも、★3をたくさん鍛え上げた方がスタートダッシュが早いことが証明されました。

さらなる強化には★4も揃える必要がありましたが、イベント周回も効率よく行えるようになったので、イベント報酬もたくさんもらえるようになり、さらに強化することができるんです。

やっぱりスタートダッシュは大事。

これが分かればリセマラなんてやる必要は無いです。

【Laravel】【ホテル予約管理】解錠APIを追加する

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

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

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

さて、前回からだいぶ期間が空いてしまいましたが、

続きやります。(思い出すのに時間かかった)

今回は、前回メールに添付したQRコードに書かれた解錠コードを使って解錠する処理を実装するのですが、

実際に解錠を行うのは、外部のデバイスを使用する、という前提として考え、ここではデバイスに入力した解錠コードをサーバに送信し、照合結果を返すAPIを実装します。

このAPIのレスポンスをデバイスが受信して、デバイスが実際に解錠を行います。そういう想定で実装します。

まず、APIのルーティングを作成します。

routes配下のapi.phpに以下を追加します。

Route::group(['middleware' => ['api']], function(){
    Route::post('/unlock', 'Api2Controller@unlock');
});

なぜ、今までのようにweb.phpではないかというと、web.phpには

Auth::routes();

がかかれてあり、ログイン状態でアクセスしなければAPIは受け付けられません。

デバイス側にログイン状態というのは意識できないので、この制約が入らないルートに設定しなければなりません。

では、コントローラーを作成します。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use App\Repository\RegisterManagementRepository;
use App\Repository\RoomRepository;
use App\Repository\UserRepository;

class Api2Controller extends Controller
{
    public function __construct()
    {
        $this->registerManagement = new RegisterManagementRepository();
        $this->room = new RoomRepository();
        $this->user = new UserRepository();
    }

    public function unlock(Request $request)
    {
        \Log::debug(print_r($request->input('number'), true));
        \Log::debug(print_r($request->input('room'), true));

        $registers = $this->registerManagement->getItemsByDate(date('Y-m-d'));
        if(is_null($registers) == false)
        {
            foreach ($registers as $register)
            {
                $room = $register->rooms()->first();
                if(is_null($room) == false)
                {
                    if($room->id == $request->input('room') &&
                        strcmp($register->lock_number, $request->input('number')) == 0)
                    {
                        return response()->json(['result' => true]);
                    }
                }
            }
        }
        return response()->json(['result' => false]);
    }
}

Api2Controller.phpを追加しました。

ApiController.phpでは、コンストラクタに

        $this->middleware('auth');

と記述しているため、これも上記と同じ理由で使用できません。

入力は部屋番号と解錠コードをjsonで入力します。

現在の日付から予約情報を取得し、部屋番号を解錠コードの比較を行い、一致したときにtrue、一致しない場合はfalseを返します。

思ったように動いているようです。

ただし、このままだと誰でもアクセスできてしまうので、セキュリティ的にガバガバ状態です。

デバイス情報を登録して、それも入力情報に含めるようにしましょうか。

次回やります。

北海道でも5Gサービスが始まるらしい。

元ネタはこちら

https://k-tai.watch.impress.co.jp/docs/news/1241563.html

ドコモの公式発表によると、全国の特定スポットにて5Gサービスが提供されます。

https://www.nttdocomo.co.jp/area/5g/?icid=CRP_menu_to_CRP_AREA_5g

その中には北海道も含まれています。

しかし、本当にとあるポイント周辺に限られているので、いつでも5Gが使えるわけではありません。

では、北海道ではどこで5Gが使えるのか。

PDFファイルにも書いてあるのですが、

  • 札幌ドーム( 観客席、ドーム前広場周辺 )
  • JR札幌駅( 南口広場周辺、北口(東)周辺 )
  • 札幌駅前通地下広場 ( 北大通交差点広場(西)周辺 )
  • 大通公園西12丁目広場
  • 大通公園西9丁目広場
  • 一部のドコモショップ店内

本当に特定ポイントやね。

5Gを利用するためには、対応端末が必要です。(知ってると思うけど)

全国で使用できるには、少なくとも1年は待つ必要はあります。

なので、今焦って買う必要は無いと思います。

5G試せる人は一部のガジェットマニアぐらいか・・・

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