全てに中途半端なお豆

なんじゃこりゃ

System.Text.Jsonでjsonのデシリアライズに失敗してしまう

はじめに

こんばんは。まめプロと申します。よろしくお願いします。
この記事は備忘録と検証作業が酷すぎた反省の意味を込めて書きます。
何か間違っていることや、「この表現まずいよ」みたいなことがあれば指摘していただけると助かります。
かなりバカなミスなので、その所はご了承願います。

jsonをデシリアライズしたい人生だった

今作っているシューティングゲームで、敵の出現時間だったり出現方法をステージごとでうまく管理する方法が無いかを考えていて、「jsonで管理すればいいのでは」という発想に至り1、練習がてらにC#で事前に準備したjsonファイルをデシリアライズ2するサンプルコードを書いてみた。
次が実際に書いたサンプルコード&jsonファイルです。

using System;
using System.Text.Json;
using System.Text; 
using System.IO;


namespace JsonTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            ReadJson("test.json", "utf-8");
        }
        static void ReadJson(string filePath, string encoding)
        {
            StreamReader streamReader = new StreamReader(filePath, Encoding.GetEncoding(encoding));
            string allLine = streamReader.ReadToEnd();
            streamReader.Close();
            Data data = JsonSerializer.Deserialize<Data>(allLine);
            Console.WriteLine(data.Id);
            Console.WriteLine(data.Name);
            Console.WriteLine(data.SpawnCount);
        }
    }
    class Data
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int SpawnCount { get; set; }
    }
}
{"id":11,"name":"NomalEnemy","spawncount":160}

実行結果

Hello World!
0

0

は?(は?)
なんで?(殺意)
0なんて数字、jsonで入れてないし、nameとして(出力の3行目には)「NomalEnemy」という単語が出てきてほしいのになんで?(殺意)
ちなみに期待していた出力結果は次の通り。

Hello World!
11
NomalEnemy
160

まじでなんで????

原因と解決策

というわけで、3時間ほど原因を調査したのですが、「調べてもよくわかりませんでした!来世に期待ですね!」でお馴染みの情報量0のまとめサイト状態になってしまった。
やけくそ気味で、jsonの変数名を次のように変更してみた。

{"Id":11,"Name":"NomalEnemy","SpawnCount":160}

変更点は、「Jsonデータを格納するクラス、Dataクラスのプロパティと同じようにJsonの変数名の最初を大文字に変更した」という点。
すると、実行結果が

Hello World!
11
NomalEnemy
160

となった。
というわけで、謎のバグの原因はどうやら「大文字小文字を区別する(=jsonの変数名とプロパティの名前を大文字小文字まで同じにしないといけない)」というルールが原因だったことが判明。

俺の3時間は何だったんだ。

反省

素早く先輩や同級生に質問すべきでした。
意地を張るのは良くない。

余談

ちなみに、NuGetパッケージにある「DynamicJson」では、大文字小文字は区別されないようで、上にあげた修正前のjsonファイルとサンプルコードでも期待通りの出力結果が得られます。
これが混乱を招いた原因の一つです。ちくしょう


  1. うまくいくかは知らない

  2. テキストデータなどのように1つにまとまっているデータから、複数の変数やオブジェクトを取り出すこと。このブログの例で言えば、jsonという1つのテキストデータから、「Id」「Name」「SpawnCount」という複数の値を取り出している。この逆の操作(複数の値やオブジェクトを1つのデータに格納すること)をシリアライズという(らしい)

半生と反省

この記事はCoins Advent Calender20日目の記事になります。

半生と反省

どうも。まめプロと申します。この記事では、完全なポエムを書こうと思います。
よろしくお願いします。

この記事は何を含みますか?

  • 情報学(プログラミング等)に興味が出たきっかけ?
  • やらかしたこととその反省
  • 過度な自分語り
  • キモいポエム
  • オチの無い話(オチないので縁起がとてもいい)

    半生と反省と関係

    幼稚園時代におもしろフラッシュと出会ってしまった

    皆さんは、「おもしろフラッシュ(倉庫)」というサイトをご存知でしょうか?そのサイトには「FLASH黄金期」と呼ばれる時代に掲示板上のクリエイターたちが作った名作のflashがたくさん置いてあります。
    経緯は不明ですが、幼稚園児だった僕は、自宅のリビングに設置されていたデスクトップPCで、そのサイトへ頻繁に訪れてはflashを貪るように見るという生活をしてました。当時は2005年ぐらいですので丁度FLASH黄金期の末期あたりですね。
    ですので、当時の私は「恋のマイヤヒ」「ハゲの歌」「ドラえもんの絵描き歌」「沢先生のお料理教室」等々を知っているというとんでもない英才教育の施された幼稚園児でした。
    マイヤヒ〜
    恋のマイヤヒ
    今思えば、PCをいじっていたくせにプログラミングやPC自体に興味が向かなかったのが残念すぎます。(最高に残念です)
    おそらく、この経験は私がcoinsに入った原因の一つとして考えられます。そして、この英才教育のせいで、後述するアングラ界隈のネタに興味を示すようになってしまったのでしょう。

    小学校時代

    まだコミュ障じゃなかった時の時代です。この頃は、興味の対象がPCやアングラ系というよりゲーム機やゲームの方にあった気がします。

    ゲームを作りたいとなんとなく思うようになった

    小学校6年生の頃に、人生初の王道RPGとして「ドラゴンクエスト9」を初めてプレイしました。色々な敵を倒して、魔王(9のボスは魔王ではないのですが)と戦うのに当時とても感動して「ゲーム作ってみたいな」となんとなく思うようになりました。 ただ、当時我が家にはgoogleのトップページをを開くのに10秒以上かかるゴミカスネット回線1と動作がクッソカクカクのゴミカスノートPC2しか無かったので、「ゲームを作るにはどうすれば良いか」の情報はうまく収集できず、あくまで「思う」だけになってしまいました。
    そういう訳で、大学に入った今はゲームを作るサークルに所属しています。まるで進捗がないのですが・・・

中学時代

プログラミングと出会う

当時中1位だった私は3DSでモンハンやどうぶつの森をプレイしていたのですが、ふとNintendo e-shopで「プチコンMk-ll3」なるソフトに出会います。
真っ黒の画面に文字をガシガシ打ち込んで「ダンマクシューティング」と合成音声が喋った後にシューティングゲームが起動する、というe-shop内の紹介映像を見たときに「プロラミングってめっちゃかっけぇ!!」と感動し、即購入した記憶があります。

BASIC
プチコン4(mk-llの後継機版)
その後、チュートリアルサイトで、BASIC言語(プチコンに搭載されていたプログラミング言語)について学習を進め、初めて

PRINT "コンニチハ"

とコードを書いて実行して、画面に「コンニチハ」と表示されたときは、自分が神になったかのようなとんでもない達成感を覚えました。
ここまでは順調な滑り出しだったのですが、私は当時、「配列変数」という概念が全く理解できず、挫折しました。(何をしてるのかわからんし、謎にエラーを吐かれまくってました。4
「なんもわからん」状態に陥った私は、「プログラミングから逃げる」という選択肢を選びます。
この出来事は、結構最悪で、「分からないものから逃げてしまう」という悪癖が染み付いてしまい、大学生になった今でもこの悪癖は健在です。

アングラやオカルト系に興味が出る

そういえば、中学生の時に無事陰キャになりまして、この当時からインターネット特有の語録やスラングを覚えて使うようになりました。(当時は、「m9」や「キボンヌ」、「wktk」など絶滅したネットスラングをチャットで使っている痛い化石人間でした。(例のアレには汚染されてませんでした)) 多分私が「(^∀^)」みたいな顔文字を好む理由は、 この時代が原因な気がします。
ところで、中学時代にあることをきっかけに「検索してはいけない言葉」というものに夢中になりまして・・・これを期にアングラ系やオカルト系に大変興味を持つようになりました。 中学時代は、貪るようにそういう話題のサイトを見まくっていたので未解決事件や検索してはいけない言葉などアングラ・オカルト系の話題の守備範囲は割と広めだと思います。
しかし、この趣味が役に立つことは有りませんでした。5
もっと実用的なことに興味が向けば良いんですが、残念ながらそうは行かず、どうでも良い知識ばかりが増えていくばかりです・・・(大学生になった今でも興味があるままになってしまった)

高校時代

闇の中学時代が終わったので、色々と楽でした。いい友人にも恵まれました。本当に友人には感謝しかないです。

例のアレのコンテンツに汚染される

きっかけは、ネットの掲示板上でしばしば登場していた「114514」という謎の数字について調べてしまったことです。一旦調べてしまうと、もう戻れません。例のあのコンテンツは不可逆的な認識汚染を引き起こすので、もう純粋なあの頃の心は取り戻せませんでした。
日常会話で自然に、ゲームのカードを落とすようになるし6、多分IQが50近く下がってる気がします。このコンテンツに足を踏み入れてはいけません。底なし沼です。
これに出会わなければ100時間くらいはもっと有意義な事に使えたでしょう。

プチコンにリベンジするも・・・

中学校の時に、逃げてしまった「プチコン」と向き合い、なんとか配列変数やループや条件分岐、再帰などプログラミングの基礎を習得しました。
そこで何を血迷ったか、唐突に「C#を勉強しよう!」と思い、C#の学習を始めました。
しかし、当時は若く、環境構築が一切できず(基本的なコンピュータ用語すら分かってない状態だった)また悪い癖で「逃げて」しまいました。
だめだこりゃ。

「学校の指示=大正義」の思考になる

これのおかげで、推薦入試の受験権利を得てcoinsに入れたのでなんとも言えないのですが、割と失敗な気がします。
所謂「学校の言うことを忠実に守ればいい!」という思考なのですが、この思考法色々とマズイです。
指示を出してくれる学校がある内は、この思考法で成績も上がるしできることも増えるのでいいのですが、いざその学校が消滅したとなると、途端に何もできなくなります。(体験済み)
これを一番実感したのが大学に入学したときです。大学は言わずもがな、生徒一人一人に指示を出すような甘い場所でありません。
自分のやりたいことを自分で見つけ、自分で学んで行く場所です。
ですが、私は「学校の指示」がないと何もできない人間へと成り下がってしまったので「自分が何をしたいか、何を学びたいのか、自分で学ぶ方法論」がさっぱり分からず、「やりたいこと迷子」の状態に陥りました。旅客機に乗っている途中に、乗務員から「今すぐ地上に降りて好きな場所に自分で移動してください」と急に言われ、旅客機から蹴り落とされて砂漠の真ん中に落下してしまった感じです。
そう言う訳で、「好きな場所に自分で移動する」ことを幼い時から実践してきたAC勢や、「好きな場所へ移動をし始めた」同級生や先輩方達には尊敬の念しかありません。
本当に私の周りの人は、すごい人ばかりです。すげえなぁ。

大学時代

大学に入って一番良かったことは、すごい友人達を持てたことだと本気で思ってます。 Java ScriptやOSS、Webの鬼、Kotlinのコントリビュータ、一人でWebのシステム全てを運営してるヤベーやつ、C++を完全に理解したお酒マニア、GBやBASICから税金や資格の情報までなんでも知ってる人間辞書、最近プログラミングやらWeb関係にメキメキと強くなっている決闘者、コンピュータ関係強すぎ問題のキズナアイ、プリン強いし普通に自主学習めちゃくちゃしてるゲーマー、普通に頭いいし知識が深すぎるキノコ博士やGPAで殺してくる人間、などなど(挙げたらキリがない)とんでもない人間 7が全員参戦!
coinsはスマブラSPですか??

サボり癖の出現と人間性との消失

大学生になって間違いなく堕落しました。
1限遅刻もするようになるし、「明日の自分に課題は任せればヨシ!」と、課題をリレーしまくって結局提出前日の自分が死にそうになるし、「めんどくさいことはやらなくてもええ!人生は冒険や!」という脱ロボット的思考8の境地に辿り着きもしました。
また、朝ごはんは食べないようになり、昼ごはんは220円のカップ焼きそば9で済ますようになり、徹夜は当たり前、24時間睡眠も数回達成するというように、私の中に存在していたはずの人間性が消滅しました。
また、「分からないことを自分でなんとかしようとする」10という悪癖も悪さをするようになり、多分私のプログラミングの学習を阻害している大きな要素の一つな気がします。
この辺は、なんとかしなければならないと思うので、なんとかしなければならないと思います。11

これからすべきこと

強強の友人に囲まれている状況で、何にも強みが持てないのはマズイし、焦りを覚えます。
とにかく今は自分が少しでも興味を持ったものに対して、試しに学習する、試しにコーディングしてみる、という「試しに」行動を起こすことが重要だと思います。
大学に入ってから、間違いなく学んだことは「行動をする人間は絶対に成長する」と言うことです。ソースは私の周りの友人達です。
私は、今まで何かと理由をつけては「逃げる」癖があったので、すぐに行動に移す、「試しにやってみる」ということを常に心掛けていきたいですね。
JUST DO IT(http://www.youtube.com/watch?v=IZmYn4ObRJc)

終わりに

こんな駄文を読んでいただきありがとうございました。完全な自己満足な記事です。
精進していきます。皆さんこれからもよろしくお願いします。
おしまい。

ししまい
ししまい


  1. 画面が凍りついたかのように全く動かないことがしばしば。wikipediaですら安定して読み込めませんでした。

  2. ブラウザを開くだけでPCから「フォォォォォォォォォォンンンンンwwwwww」みたいなすごいファンの音がしまくってました。(あと熱気がすごい)

  3. 詳しくはhttps://mamepsilon.hatenablog.com/entry/2019/12/03/204243を見てね!

  4. 見返したところ、エラーの原因は配列が3つしかないのに、A[3]という配列変数に値を突っ込もうとしてことが原因でした。(A[2]までしか存在しないので当然エラーが出る)

  5. 今までで、異性との会話で役に立ったことは有りませんし(こんな話題を使える訳ない)、話題が話題なので飯の席でも話せません。

  6. マァァァァァァァってやつ。

  7. 本当に人間か疑わしい

  8. 脱ロボットを達成できたので、僕はreCAPTUREに引っかかりません。

  9. これを「限界飯」といいます。

  10. これ本当に最悪です。でも結局、意地はって素直に聞けないので私はゴミです。素直な人間は生きているだけでエライ!!

  11. KOIZUMI構文。情報量が0であることが知られている。

Nintendo Switchでコーディングしよう!

この記事はJsys Advent Calender3日目の記事になります。

Nintendo Switchでコーディングしよう!

はじめに

皆さん、こんにちは。まめプロと申します。 公開がめちゃくちゃに遅れました。許してください。

突然ですが、1つ質問です。
Nintendo Switchは何をする為のものでしょう?
人気キャラクターを吹っ飛ばす為のものでしょうか。それともイカの姿のキャラクターでステージをインクで染め上げる為のものでしょうか。それともモンスターを育て、友人と対戦する為のものでしょうか。
否。 Switchはコーディングする為のものです。
というわけで、今回はNintendo Switchでプログラミングができるソフト「プチコン4」について紹介したいと思います。

プチコン4とは

プチコン4公式サイト
プチコン4とは、Smileboom社開発の「プチコン」シリーズの第5作目で、Nintendo Switchで販売されているダウンロード専用ソフト(3000円)です。たった3000円払うだけでで、Nintendo Switchで本格的なプログラミングが楽しめます。
(機能は限られてしまいますが、無料の体験版もあります) 是非皆さんも買いましょう。買え。
ちなみに、プチコン4では BASIC言語(厳密にはSmileBASICという言語)でのプログラミングが可能です。

BASIC言語って??

さて、BASIC言語について少し説明します。BASIC言語自体の歴史は非常に深く、なんと1964年に開発された言語です。その後、マイコンに搭載されたこともある言語で、その当時マイコンに熱中した人から絶大な支持があります。(?)別名おっさんホイホイという
と、言われてもピンとこない人もいるかもしれないので仕様についてもう少しだけ紹介します。

  • 手続き型言語
  • 高水準な言語
  • 基本的に1行ずつでプログラムを解釈する。そのため一部を除く命令(関数)の途中で改行することはできない。
  • プログラムの先頭から1行ずつ実行される
  • 実行モード(DIRECTモード)と編集モード(EDITモード)が存在し、編集モードではプログラムの記述、実行モードではプログラムのセーブ・ロード・実行の命令を主に記述する
  • 初心者向けの言語であり構文が簡単である

実行モード
実行モード(DIRECTモード)
編集モード
編集モード(EDITモード)*コードはプチコン4内のサンプルプログラムより
そうです。BASIC言語の一番大きな利点は初心者向けであることです。試しに画面に「Hello,world!」と表示するプログラムを書いてみましょう。 上にもある通り、実行したいプログラムコードは「編集モード」で記述します。

PRINT "Hello, world!"

簡単でしょう?ちなみに気づいたかもしれませんがBASIC言語では命令や関数は全て大文字で記述します。(小文字でも問題ないけど)
ですが、まだこれだけでは画面に「Hello,world!」と表示されません。
次に、「実行モード」で以下の命令を入力します。

RUN

RUN は「『編集モード』のプログラムを実行しろ」という意味の命令です。そして実行モードでRUNを実行することで、晴れて「Hello,world!」と画面に表示されます。

実際にコーディングしてみる

今回の記事では、BASIC言語 で簡単な数当てゲームを実装することを目指します。
数当てゲームの仕様は以下の通りとします。

  • 1.任意の自然数N(1≦N≦100)を最初に決定する。
  • 2.プレイヤーはNに当てはまる数を予想して入力する。
  • 3.プレイヤーが入力した数が正解か判断する。正解なら4、不正解なら5の手順を実行する。
  • 4.プレイヤーがこれまでに回答した回数を基に、評価コメントを表示する。
  • 5.入力された数がNより大きいか小さいかのヒントを表示する。その後2→3の手順を実行する。

では実際にコーディングしてみましょう。

'数当てゲーム('でコメントアウトできます)
'変数を初期化する
ACLS '画面に表示されているものすべてを削除する
COUNT = 0
ANSWER = RND(100)+1     ' RND(MAX)で0からMAX-1までの乱数を取得できます。
@MAINLOOP
INPUT "数を入力してね ", MYANSWER
IF MYANSWER > ANSWER THEN
    PRINT"数が大きいです!"
    ELSEIF   MYANSWER < ANSWER THEN
    PRINT"数が小さいです!"
    ELSE 
 PRINT"正解!"
 IF COUNT <10 THEN PRINT "君は天才!秀才!神!!!!!"
 END ’END命令でプログラムを終了させられます。
ENDIF
GOTO @MAINLOOP

これで完成です。実際に動かしてみると、以下のようになります。

f:id:mamepsilon:20191203204514j:plain
実行結果(漢字は使えるのですが使ってませんごめんなさい)
以下はコードの解説です。

INPUT命令

まず、ある変数にプレイヤーの入力した数や文字列を代入するにはINPUT命令を使います。
INPUT "ゴリラ",GORILLAとすることで、画面に「ゴリラ」と表示し、プレイヤーの入力した数を変数GORILLAに代入できます。 ちなみに、INPUT命令はプレイヤーが入力するまでプログラムの処理を一時停止させるので、数の入力を終えるまでINPUT "数を入力してね ", MYANSWER以下のコードは実行されません。

IF命令

次におなじみのIF命令ですが、C言語とかのような言語と書き方が異なります。
IF 条件文 THEN 実行したい処理
とBASIC言語では書きます。先にも書いた通りBASICでは命令や関数の途中で改行してはいけません。
つまり

PRINT "
ゴリラウホウホウッホホホ"

と書くと、エラーが出てしまうということです。 しかし、IF命令はTHENの部分で改行することができます。改行する場合、

IF 条件文 THEN
処理したい内容
ENDIF

とコードを書けばOKです。 また、複数条件がある時は

IF 条件文1 THEN
処理したい内容1
ELSEIF 条件文2 THEN
処理したい内容2
ELSE 処理したい内容3 
ENDIF

と書きます。

ラベル

数当てゲームのコード内に出てきた@MAINLOOPという謎の文字列ですが、この@から始まる文字列をラベルと言います。 BASICはプログラムの先頭から尻尾まで実行されるとプログラムが終了してしまいます。
例えば、数当てゲームのコードにあるGOTO @MAINLOOPを削除すると、数を一回入力するとプログラムが終了して数の入力ができないようになってしまいます。
今回の数当てゲームのような”特定の状況になるまでプログラムを実行させ続けたい”とい場合、このラベルをうまく作ってループ(ルーチン)を作ってあげる必要があります。そこで役に立つのがGOTO命令です。

GOTO @GORILLA

で実行するプログラムを強制的にラベルGORILLA以下のものにジャンプさせることができます。 以下の例で詳しく説明します。

A = 1
GOTO @HOGE
A = 2
@HOGE
PRINT A 'PRINT 変数名 で変数を表示できます。

実行結果

1

BASIC言語では、プログラムは先頭から1行ずつ実行されます。 つまり、

  • 1.変数Aに1を代入
  • 2.ラベルHOGEにジャンプ
  • 3.変数Aを表示
    の順番で実行されているということです。(A=2の行はスキップされている) これをうまく使うとループを作れるのです。
    もう一度、数当てゲームのコードを見てみましょう。
'数当てゲーム('でコメントアウトできます)
'変数を初期化する
ACLS '画面に表示されているものすべてを削除する
COUNT = 0
ANSWER = RND(100)+1     ' RND(MAX)で0からMAX-1までの乱数を取得できます。
@MAINLOOP
INPUT "数を入力してね ", MYANSWER
IF MYANSWER > ANSWER THEN
    PRINT"数が大きいです!"
    ELSEIF   MYANSWER < ANSWER THEN
    PRINT"数が小さいです!"
    ELSE 
 PRINT"正解!"
 IF COUNT <10 THEN PRINT "君は天才!秀才!神!!!!!"
 END ’END命令でプログラムを終了させられます。
ENDIF
GOTO @MAINLOOP

このプログラムの@MAINLOOP以降の実行順は以下のようになります。

  • 1.INPUT命令でで数の入力受付
  • 2.入力された数を判定(正解ならEND命令でプログラムが終了)
  • 3.GOTO @MAINLOOPで@MAINLOOPにジャンプ(つまり1の手順に戻っている)
    これで、正解の数が入力されるまでプログラムを実行し続けたままにできました。やったね!!

    終わりに

    BASIC言語はクラスとか色々難しい訳分からんやつはそんなにありません。めちゃくちゃ簡単です。 というわけで、皆さんもプチコン4を買ってNintendo Switchでコーディングして遊ぼうね!!
    おしまい。