ちりぬるお本舗制作日誌

同人ゲーム・同人コミックその他制作サークル「ちりぬるお本舗」の主催でありプリキュアヲタクの奇々浦ヌル夫がゲーム、ドット絵、その他色々な物を作るブログです

キュアジャン開発記録ーはじめにー

こんにちは。初めましての方もそうでない方もいらっしゃると思いますが、私は奇々浦ヌル夫という名前で、(主に二次創作の)同人マンガ活動や同人ゲーム開発を行っているものです。*1

 

 現在、開発しているゲームは、プリキュア*2と麻雀をミックスしたオリジナルゲームです。ゲームタイトルはキュアジャンと名付けました。

f:id:nulluo:20180924194325p:plain

ゲームの概要はこちらのゲーム紹介サイトで参照できます。(まだ書きかけのところもありますが…)↓

キュアジャン紹介ページ

 

開発言語はVB.NET(.NET Framework 4.5)です。

開発中のソースコードGitHubで管理しています。

開発状況としては、全体の7~8割は完了しており残り2~3割が実装できればリリース可能な状態になっています。

github.com

今後、当ブログでこのキュアジャンの記事を投稿するにあたって、書きたい内容は主に下記の3つです。

 

  1. 開発を通して得られた技術的知見のまとめ
  2. 開発中に直面した課題に対する(読者の皆さんへの)相談
  3. ゲームデザインに関する話題

1,2はソフトウェア開発面でのノウハウに関しての技術的なエントリ、3はソフトウェア開発技術とは直接関係ないゲーム自体に関するエントリとなります。

主に2がメインの内容となると思われますが、3のゲームデザインについても「ゲーム性を高めるためには、ゲームのルールや各種パラメータをどう設定するのが適切だろうか」といった相談をここに投稿する事があるかもしれません。

 

平たく言うと、一人でゲーム開発するのって大変なので…開発知識に長けた技術者の皆さまに指導してもらいたい、というのがこのブログにキュアジャンのことを書こうと思ったきっかけであります。

 

皆様、なにとぞご指導ご鞭撻いただけましたら幸いでございます。

*1:詳しいプロフィールは,ツイフィールを参照してください

*2:プリキュアシリーズ - Wikipedia

翻訳テキスト管理システム(その1)

f:id:nulluo:20160816204730p:plain

私はアメコミや洋画が好きなのでよく読んだり観たりしています。和訳されたテキストが出版されていない(もしくは出版していても入手困難な)場合は自分で翻訳する事もあります。しかし、翻訳した文章をどうやって管理するかしばし考えたところ、せっかくなのでDBシステム化してしまえば良いのではと思い至りました。

 

というわけで、勉強のために個人用システムを構築することにします。

メモとモチベ上げの意味を兼ねてこちらで進捗を報告していきます。

 

システム仕様

  • 個人的に翻訳した外国語の文章をデータベース化し、記録・管理する。
  • 翻訳する対象は、映画、ドラマ、コミック、曲、アニメ等とする。(Webページも対象にするか検討中)
  • 翻訳する言語は、英語や中国語から日本語への翻訳。

 上記の仕様からざっくりER図作りました。まだ追加すべきものがあるかもしれませんがとりあえずは今日はここまでとします。

f:id:nulluo:20160816204242p:plain

懸案事項

  • 翻訳文は「日本語」である前提で設計しちゃっていいものか・・・汎用的に作るなら任意の言語から任意の言語への翻訳を管理するのがよいけど…あと、ごく稀なケースだが「英語の文章の中にドイツ語が混ざる」のように、一つの作品の中に複数の言語が混在する事があり得るので、そういう場合、上記のDB設計では対応しきれない。かといって翻訳文に原文や訳文の言語が何かを表すフィールドを持たせるのは(必要になるのはごく稀なケースなので)ムダすぎると感じる。
  • 多分不要だと思うけど、同じ本だけど「英語版」と「中国語版」両方入手したような場合は同管理するか?(後者については、英語版と中国語版を別の作品としてマスタに登録すればよいか)

何か「ここもっとこうした方がいい」とか、設計について意見がありましたら、どしどしお寄せください。

仕事で時短を試みた結果、むしろ時短なんてしないほうがよかったという結果になった

プログラムのテスト中にふと思いついた・・・

今日、プログラムのテストをやってたんですが、単体テストで日付に関するテストってよくありますよね。今回のプログラムもその例にもれず、日付関係のテストが結構ありました。 Windows画面右下の時計をクリックして「日付と時刻の変更」画面を開いて、特定の日付を選んで・・・という動作を何度もやるのは地味に面倒くさい。 しかも、変更する日付はいくつかの日付に限定されている事が多いので、だったら 「日付選ぶ」→「実行」すると一発でWindowsのシステム日付を変更するツールを一回作っておけば、日付関係の単体テストの生産性が上がるんじゃね? 残業時間短縮できるんじゃね?ちょっとぐぐったら.NETでシステム日付の操作するの超簡単みたいだし・・・と思って作り始めた結果・・・ 余計なツールなんか作らずに、普通にテストやってた方が早く帰れてたよ・・・という時間になってしまった。

 

手を抜くために工夫したつもりが逆効果

時短のために、自動化などで工夫して、必要ならば仕事をするためのツールを自前で作ってしまうのが正しいプログラマの姿勢なはずなのに・・・はずなの に・・・!! ああ、本来は今日できてなきゃいけない単体テスト・・・しかも余計なツールなんか作らなければ今日の時点で終わってたはずの仕事が・・・終わってな い・・・バカだ!わたし!

 

敗因

  • 変更した日付を正しい日付に戻す処理が地味に面倒くさかった   (ユーザ設定ファイルに“正しい日付”を保持しておいてリセット時に呼び出すのとか・・・)
  • システム日時の変更には管理者権限が必要。   

    ⇒したがってデバッグのためには「開発環境を管理者権限で起動する」&「開発したPGを管理者権限で起動する」    という二重の手間が必要。これ意外とめんどかった

追伸

今は「時短しようと工夫するとかえって時間がかかる」という駄目な仕事っぷりでも、へこたれずにこういう工夫をする精神を忘れないでいれば、いつか本当 に自分の工夫で時短ができる・・・そんな開発者にわたしはなりたい

JavaScriptの勉強中

JavaScript、HTML、CSSの勉強をするためにブラウザゲームを作る事にしました。リンク先から遊べます。(注:プリキュアのマニア向けゲームです)

プリキュア誰かな?

まだいくつか実装したい機能がありますが、やりたいことは9割がた出来たので、ほぼこれで完成です。

 

JavaScriptは今までメインでやってきた言語(VB.NET)と全然違っているので戸惑いますが、やはり開発して即リリース、Twitterでシェアボタンつけて拡散してもらう~という一連の流れが非常に手軽にできるのがWebアプリの強みだなと実感しました。

 

開発を通じて理解したこと

 

忘れそうなのでメモっておくこと

  • id属性は同じページ内で重複できない(だからセレクタもidで指定するときは「親要素>id名」なんてしなくてよい。id名だけで適用先は一意に定まる)
  • スタイルに関するものは出来るだけclass指定をし、リンク先指定やJavaScriptで扱う必要がある場合はid指定するのが最近の主流とされている。idだけでやっても別にいいだろうという説もある。
  • 「==(等価演算子)」と「===(厳密等価演算子)」が異なる動きをするので注意

SQLをテストする方法がよく分からなくなったこと

PG中のSQLにバグがないことを検証する単体テストをしろって言われたんだけど、テストの設計はあまりやった事がないのでちょっと困った・・・

<テストの条件>
1.PGの機能は、元のデータベース(A)からSQLで取得したデータを
  別のデータベース(B)のテーブルに書き込む
  というもの

2.SQL複数のテーブルを結合していて
  それぞれにWHERE文で抽出条件を指定していて、やや複雑

3.テスト内容は、下記の形でPGの正当性を示せ、という物
 ①「PGを実行すると、データベースAからはN件のデータが取得されるはず」
 ②そして実際に実行してみると
  「データベースBにN件のデータが追加された」
 ③よってこのSQLは正しい


4.データベースAには本番データをもとに作ったテストデータが現在入っているが
  このデータは参照のみ許可されており、削除・編集してはならない
  データベースBのデータは好きにいじってよい(全部空にしちゃってもよい)


<考えた事>

データベースAの特定のデータ2,3件を抽出して
「このデータはBに書き込まれる」「このデータは書き込まれない」というのを
検証するのは簡単だ。私も今まではそういう風にテストしていた。

しかし、今回の指示はそう簡単ではない。
データベースAをのデータを一つ一つ見て行って
「このデータはBに書き込まれる」「このデータは書き込まれない」と調べていけば
原理的には検証可能だが、そんな全数調査できるほど小規模なデータ数ではない。

SQL中に出てくる各抽出条件すべてを総ナメするように
テストパターンを機械的に作って、それをデータベースAに入れたうえで
テストすれば、「N件出てくるはず」というテストはできるだろうが
今回の場合、データベースAの中身はいじるなと言われているのでそれはできない

かといって、他にどういう方法をとったとしても結局
 ① PG中で実行しているSQLを実行する→N件取得される
 ② PGを実際に実行する→N件取得される
①と②の件数が一致したのでテスト成功です!
という「お前、それ同じSQL流してるんだから当たり前じゃん」という
テストと等しい内容のテストしか思いつかなくて行き詰ってしまいました

<知りたい事>

1)何か上記の条件を満たすいいテスト方法はないでしょうか

2)そもそも、どんなテストも厳密に完全にPGの正当性を検証することはできない
 (同じPGを二回作って検証することになってしまう)
 と思うので、自分のアプローチ(もしくは上司からの指示)がそもそも間違っている気がします。

 この状況で全件数モレなく取得することを検証するテストを考えるのが無駄であるならば
 せめて、一般的にSQLの正しさを検証するテストにおける頻出チェックポイント
 みたいなものがあったら教えてください。
 

【SQL Server】固定長文字列と可変長文字列の比較について

今日DBをいじっていて気付いた事があったのでメモ。

 

【概要】

1)     固定長文字列変数に桁数いっぱいの文字列を入れる

2)     可変長文字列変数に①と同じ文字列を格納する

 

 1)と2)を比較演算子で比べると結果はFalseとなる

 

【環境】

 SQL Server 2008 R2

 

【説明】

<コード例1>

  DECLARE @hoge as varchar

 SET @hoge = ‘A’

 と

  DECLARE @fuga as char(3)

 SET @fuga = ‘A’

 

であれば比較すると@hoge≠@fugaになるのは分かる。

Varcharは可変長でcharは固定長だから、上記の場合の変数@fugaには

‘A’の後に空白が2個付け足されて格納されるから、明らかに@hogeとは別物になるからだ。

 

しかし、次の場合はどうなると思います?

 

 

<コード例2>

  DECLARE @hoge as varchar

 SET @hoge = ‘ABC’

 と

  DECLARE @fuga as char(3)

 SET @fuga = ‘ABC’

 

 この場合は@fugaは文字列長最大まで文字が入力されているので、<コード例1>の場合と違って隙間を埋めるための空白は追加されない。だから@hoge=@fugaになるんじゃないかなーといい加減な考えでコードを書いていたら原因不明のエラーを生んでしまって原因究明まで結構な時間を無駄にしてしまった。

 

そう、実際には、<コード例2>の場合も@hoge≠@fugaになる。

 

 やっぱり型の違いには気を付けないといけないよね…という話。

 

 ※後でよくよく調べてみた。

MSDNを参照すると

 「varcharの格納サイズは、入力したデータの実際の長さ + 2 バイトとなります」

 って書いてある…

追加の2バイトがあるんだからcharとvarcharでは同じ文字列でも確保される領域サイズは違うんじゃないですか!

知らなかった!恥ずかしい!

 

参考:char および varchar (Transact-SQL)

 https://msdn.microsoft.com/ja-jp/library/ms176089(v=SQL.120).aspx

 

最近開発で困っているちょっとした事1

タイトルの通りです。開発言語はいずれもVB.NET

 

●ヌル参照エラーが発生した場合、どの変数がヌルだったのか正確にわからない

 デバッグ中に次のエラーが出たとします。

 「NullReferenceException: オブジェクト参照がオブジェクト インスタンスに設定されていません」 

 ソースコードのどの行でヌル参照エラーが起きたのかまではエラー情報からわかりますし、デバッグ実行中ならどの行で実行が止まったのか見ればすぐわかります。

 しかし、その行で複数の変数が使用されていた場合、どの変数がヌルだったのが原因でエラーになったのかは例外情報を見てもわかりません。

 何か確認する方法はあるのでしょうか・・・(それとも私が例外情報の見方を正しく理解していないだけで、本当は例外情報を読めばわかるのかなあ?)

 

あるプログラムAが別のプログラムBを呼び出している場合のBのデバッグについて

 プログラムA.exeはAの処理の内部で、プログラムB.exeを起動しています。

 そのため、Aをデバッグ実行した場合は、Aのソースコードのどこかの行でブレークすることはできますが

 Aから呼び出されたBのソースコードのどこかの行でブレークしたいと思っても

 ブレークで止めることはできません。Bの処理はデバッグ実行とは無関係で、普通にBを起動したときと同じように動作しているのと同じだからです。

 「じゃあ、AじゃなくてBをデバッグ実行で起動したらいいんじゃないか?」とおっしゃる方は当然いるでしょうが、自分が担当したプログラムではそれもできないのです。なぜなら、AはBを起動するときにコマンドライン引数で、とある変数を渡して起動しているからです。その変数を受け取ってからでないと Bは正しく動作しないので、B単独でデバッグ実行しても、適切な検証ができないのです。

 何かうまい方法はないものか・・・

 

Visual Studio でクラス図をもっともーっと実用的にしたい

 筆者の使用環境:Visual Studio 2010

 Visual Studioにはクラス図生成機能がありますが、これ、ぶっちゃけクラス図と呼ぶのもおこがましいしょぼい図しか生成できません。

 一番足りないと思うのは、「クラスAはクラスBを参照しているという”関連”を線で図示する機能」です。

 今開発してるプログラムで、前任者から引き継いだコードを読み解くのに苦労しています。

「どのクラスがどのクラスを使用しているのか、ソースコードからクラス図を一発で生成できたら便利なのになあ」

 とよく思います。(まあ、すべてのクラス間の関連が線で引かれたらそれはそれで見づらい図になったりするんですが・・・)

 しかし、Visual Studioのかゆい所に手が届かない部分を補強するアドインを見つけました!こちらのModelingPowerToysってやつです!↓ 

note.miyabis.jp

 

でも残念なことに・・・これでもまだ私の目的は満たされなかった・・・何がまずいかというと、このツールは・・・「クラスAはクラスBのリストをフィールドとして持つが、クラスAがクラスBのオブジェクトを直接持っているわけではない」場合には関連の線が引かれないようなのです!!

 

今私が解析したいプログラムは、あるクラスのフィールドが別クラスのリストであることが多いので、これでは役に立たない・・・がんばっていろいろ漁ったのに調べた時間が無駄になってしまった・・・