会社へのヘイトを糧に独学で学び始めて約1年たった奴の成果

あらすじ ※長いので飛ばし推奨

私の会社はアミューズメント機器(仮)の開発会社だった。

入社する前は、いや、入社して仕事に慣れるまでは

会社で働く人たちが雲の上の存在に感じた。

そんな期待と憧れいっぱいで働いている私はとても幸せ者だった。

そんな会社で働きだして早3年。

それなりに任される立場になった私には1つの想いが強く宿るようになった

こいつら全く開発してねぇや

私の会社は全く結果を出せていなかった。

当たり前だろう。そもそも私の関わる業界は、業界全体が斜陽産業と呼ばれる

超絶落ち目の業界の中、他メーカーは最新の技術を取り入れて

失敗と成功を繰り返している。新しいことに挑戦しているのだ。

なのに我が社ときたら、、、

開発会議をしても他人の意見を一切受け入れないくせに何も案を出さない奴と、

周りから批判されるのが嫌だから他人の意見を適当に採用して責任を持たない奴。

こんな奴らが集まって他メーカーみたいな商品を目指して(真似して)物を作る。。。

誰もが身近な周りの評価ばかり気にしてユーザーの評価を気にしていない開発。

こんなものは開発じゃねぇ、ただの作業だよ。

こんな奴らと一緒の考え方になったら私の好きだった、憧れた開発なんか出来ない。

それどころか郷に入らば郷に従え理論で、自分も脳死して開発(笑)を

肯定的する人間になってしまう。そんなのはやだった。

だから私は会社で開発することをあきらめて、自分で開発しようと思った。

幸い、脳死開発なだけあって、会社の仕事は

アプリで自動化すれば圧倒的に時間短縮ができる作業が多く、

会社の仕事は周り以上に行うことで実績を残しながら、

空いた時間に独学で新しいことを勉強することができた。

そんな、自分勝手に挫折して自分勝手に勉強した奴の約1年間の成果を紹介します。

 

 

【成果①】Androidアプリ作ってみた

勉強した成果の大きなものは、Androidアプリでしょう。

私の開発欲求をぶつけれるのは無限の可能性を秘めたゲーム作りしかない!

そう思って、参考書を買いあさって死ぬほどネットサーフィンして

C#、Unityを勉強しました。その成果をアプリと広告費でご紹介!

脳トレ! マッチde計算

play.google.com

ダウンロード数:50~100

記念すべき1作目のアプリ。

Unityの使い方を学びながら、デザインってムズ! 

とゲーム作りの難しさをこれでもかと思い知らされた作品でした。

すいません降ります 

ダウンロード数:50~100

電車を出るために人混みを避けるスクロール避けゲー

このゲームでUI管理、Animation管理が板についてきた気がします。

原因不明のポリシー違反で削除中。。。(´;ω;`)

ジョギング用音楽プレーヤー RUNテンポプレーヤー

play.google.com

ダウンロード数:50~100

再生する音楽を、自分の走るテンポに合わせたリズムに変化させる音楽プレーヤー

ジョギングした時に、走るテンポと曲のサビが一致した時の

グルーブ感(適当)が最高だったので作ってみました。

機能は新しいと思ったので受けるかなと思ったのですが、

やっぱり音楽プレーヤーは凄いいいものばっかりあるので伸びなかったです。

お手軽!対戦ミニゲーム

play.google.com

ダウンロード数:500~1000

みんなで遊べるパーティーゲームを詰め合わせたものです。

正直、作ったとにしょうもな。。。と思ってお蔵にしようと思ったのですが、

出すだけ出してみたらそれなりにダウンロードされて嬉しかったのを覚えています。

沖ドキ モード予測

play.google.com

ダウンロード数:500~1000

一番開発に時間がかかっていないのに、

一番評価が高かった(収益が高かった)アプリです。

やっぱり自分が欲しいものは一定数の需要があるんだな。と思いました。

スロット 特化ゾーン プレーヤー ONLINE

play.google.com

 ダウンロード数:500~1000

このアプリは、私の勉強したものの集大成でした。

オンラインスコア、3Dオブジェクト作成、キャラアニメーション作成、

エフェクト、オブジェクトデザイン作成、動画広告などなど、

プログラミング以外のアプリ制作に必要な要素を頑張りまくった一品でした。

出来た時は自分の成長を感じてすごく嬉しかったし、

レビューで高評価をもらった時はもっと嬉しかったです。

ライムまにあ リズムゲーとクイズの融合

play.google.com

ダウンロード数:0! 笑

つい最近公開したアプリです。

リズムゲーにクイズの要素を追加したらリズムゲー下手な私でも楽しめるかな?

と思って作ったアプリです。よかったらぜひプレイしてみてください

その他載せる価値のないアプリ2品

その他2品のアプリを含む、計9個 が公開できるまで作成できたアプリ達です。

こいつらの陰にはたくさんの未完成アプリの屍があるのですが、

頑張った証が残っているのはそれだけでやる気が出ます。

一年間の広告収益

直近一年間で作成したアプリの広告収益ですが、

ちゃんと調べてみたら、5万円でした。

※3か月ぐらい謎のポリシー違反でアカウント凍結くらって広告収益0円だったので、

実際は「 2019 / 8月 ~ 2020 / 5月 」までの収益になります。

全然ダウンロード数は無かったのですが、意外と貰えたほうだなぁと思いました。

(時給に換算するとえげつない低収入ですが・・・笑)

副業といえるにはおこがましい収入ですが、

会社では実感できないユーザーに向けた開発を目指して成長できる。

という事が私には得難いことなので個人的には満足な結果です。

 【成果②】テックブログやってみた

こっちは収入とかじゃないんですが、完全に暇つぶしです。

きっかけは、Androidアプリに広告を付けるには

プライバシーポリシーのリンクが必要でした。

そのためにブログを開設してサイトを作ったのですが、

ついでに自分の備忘録として使ってみるかーという事で始めたブログです。

アクセス解析

f:id:apuridasuo:20200529141528p:plain

図:ブログアクセス解析

 総記事37、総アクセス数2186

多いのか少ないのかは分かりませんが、

記事数は改めてみると少ないなー!という感想でした。。。

なぜなら、こんなクソブログでも記事1つまともに書くのにすっごい大変です。

ソース、画像、構成etc素人なりに色々考えて記事にしてるので、

この1年で、結構ブログ書いたよなー。って思っていたのですが

まさかこんなに少なかったとは。。。

まぁブログにするほどのことがあまりない日常が悪いですね!

【感想】独学の限界を感じ始めてる今日この頃

この1年、がむしゃらに勉強して色々な知識を浅く広く学んでいったのですが、

独学で学ぶという事の難しさ、というか幼稚さを思い知りました。

自分で考えて開発する。という事はとても自由度のあることだと思います。

しかし、私一人の発想力の殻をいつまでも破れない、狭い自由でした。

どれだけゲーム作りで成長しても、

この成長はちゃんとアプリの会社で働いてる人達の

成長に比べたらゴミなんだろうなぁ・・・という事実。

「こんなアプリが作りたい!」という発想はあっても

一人でデザインから音から何から何まで作成しなければならないため、

どうしても規模が小さくなってしまう歯がゆさ。

会社というしがらみから抜け出した開発は、色々な壁が見えてきた開発でした。

しかし、それこそが開発の奥深さであり楽しさだと思ってます。

現状は一人では打破できない課題ばっかりでてんやわんやですが、

その壁を越えられないと私の開発欲求を満たせる私の作りたいゲームが作れないので

色々な方向から勉強させていただき、ゆっくり進んでいこうと思います。

新たな一歩・・・SNSやってみよう

とりあえず新たな一歩として、

自分の発想の外側の人たちの感性がすごい知りたくなりました。

そこで、アカウントだけ作って放置してたSNSを始めようかなーと思ってます。

正直、ネットで人とつながるとかよく分からないし好きじゃないのですが、

食わず嫌いではよくないと思ったので、

積極的に似たような立場の方々とかかわってみようと思います。

右上のプロフィール欄にTwitterアカウント乗ってるので、

良かったらフォロー?リツイート?してやってください!!

 

本来はこういった自分語りをネットに書くのは好きじゃないんですが、

その辺のネクラ気質も直していきたいので、1年後くらいにまた成果報告という名の

自分語りやっていきたいなーと思ってます。

【C#】ネットワーク共有フォルダへの接続待ち対策

会社でツールを作っていると結構起こる問題だと思ったのですが、
意外とネットに乗ってなかったので自己解決した内容をまとめます。

ネットワークフォルダにアクセスできなかったらどうなる?

C#で指定のフォルダにアクセスする際に、必ずフォルダ存在判定を行うと思います。 System.IO.Directory.Exists()
この関数を使うのが一般的だと思いますが、Exists関数に限らず(System.IO)クラスの
メソッドでフォルダにアクセスすると、厄介な挙動をします。

Exists関数で様々な条件のフォルダを判定した時の挙動

A)ローカルフォルダ
→ 存在する=true、存在しない=false を返す
B)ネットワークフォルダ ※アクセス可の状況
→ 存在する=true、存在しない=false を返す
C)ネットワークフォルダ ※アクセス不可の状況
20秒以上接続待機(停止)し、エラーを返す
厄介な挙動はもちろんC)の状況ですね。
これではアクセス待機のせいで処理が以上に遅くなってしまいます。
今回は、この接続待ちの時間を短縮させて
ネットワークフォルダのアクセス可否判定を行う方法をご紹介します。

並列処理で時間を計って勝手にタイムアウト判定を行う

接続待ちの時間を短縮させる方法は調べても見つかりませんでした!
ですので、並列処理を使って
自分で指定の時間が過ぎたら処理を中止させる関数を作りました。

/// <summary>
/// フォルダ存在判定【タイムアウト付き】
/// </summary>
/// <param name="path">検索されるフォルダパス</param>
/// <returns>検索結果( True = 存在する )</returns>
public static bool IsFolderSonzai_Out(string path)
{
    int i_Wait = 150;   // この値【ms】だけ処理待ち
    bool exists = true;
    Thread t = new Thread
    (
        new ThreadStart(delegate ()
        {
            exists = Directory.Exists(path);
        })
    );
    t.Start();
    bool completed = t.Join(i_Wait);
    if (!completed)
    {
        exists = false;
        t.Abort();
    }
    return exists;
}

上記関数がタイムアウト付きのフォルダ存在判定処理です。
1.別スレッド(t)でフォルダ存在判定を行う
2.指定時間(i_Wait )の時間だけスレッドの完了待ちを行う
3.指定時間経過後(もしくは処理終了後)、スレッド(t)が終了していなかったら
  スレッドを強制終了。アクセス不可と判定して「false」を返す

こんな感じの処理を行う関数になってます。

以上です。 並列処理は高速化でよく使われますが、今回のように
処理待ちのタイムアウト判定で使う事もできるので、より深く理解すると
組み込みの幅が広がる感覚があって楽しくなります。

【Unity】Androidアプリの起動が遅い時の対処

ちびちび作ってたアプリがようやく完成間近の段階になってブラッシュアップ中の事。
改善必須の厄介な現象につかまりました。
検索しても出てこなかったので色々試行錯誤して、やっと解決したのでまとめます

環境と現象

Androidアプリでの現象
実機デバッグを行った際に、起動後に「Unityロゴ」が出てから
タイトル画面の表示が描画されるまでに「15秒」もかかった

f:id:apuridasuo:20200512150908p:plain
図:表示するタイトル画面の構成
今回は、上記の遅すぎる起動をどのように解決したかまとめていきます
※今回は、対応としては設定1つの変更で解決したのですが、
解決までの過程で色々対応してどんな効果があったのか、ためになったので紹介します。
※解決法だけ知りたい方は以下の「解決法(結論)」の項目だけお読みください

解決法(結論)サウンドの読み込みによる遅延

遅延の原因は、オブジェクトの描画でも、Startイベントで行っている
オブジェクトキャッシュ処理でもありませんでした。
アプリ起動時にサウンドデータを読み込む処理が遅かっただけでした。
サウンドデータをバックグラウンドで読み込むことで解決します

f:id:apuridasuo:20200512152019p:plain
図:サウンドデータの設定方法
上図のように、サウンドデータを選択して、
「Load In Background」にチェックするだけ!
これで起動が「 15秒 → 1秒未満 」に改善されました
音ゲー作ってたので大量の音データの読み込みに時間がかかってたみたいです。。。

※タイトル画面で使用する音(すぐに出力するBGM等)は、
チェックを入れると音の出力が遅れてしまうのでチェックを入れないように!!

(過程)以外と起動の遅延には関係なかった者たち

遅延と聞いて原因を予想する時、何を考えるでしょうか?
今回の様に、サウンドデータのことを思いつく人なんて天才かよ!?って感じです。
私はまず「Startイベントのキャッシュ処理」「3Dオブジェクトの描画」
この2点が原因で起こった遅延だと思っていました。
(そのせいで、解決するまでクソほど遠回りしちゃいました泣)
そこで行った対応が以下になります
・3dオブジェクトを非表示にしてビルド
・3dオブジェクトを削除してビルド
・Startイベントを全てコメントアウトしてビルド

この3つの対応をすれば、とりあえず起動は早くなるだろうから
そこから原因を深堀していけばいいや・・・と思っていました。
結果は、起動時間は全く変わりませんでした
以外だったのは、少しも速くならなかったことです。

◆Startイベントって起動の遅延に影響ないの?

改めて、Startイベントのタイミングを調べてみたのですが、
Unity - マニュアル: イベント関数の実行順
上記サイトの記入では
▼ Startイベントのタイミング
スクリプトインスタンスが有効になると、最初のフレームのアップデート前に呼ぶ
との事でした。
最初のフレームのアップデート前という事は、
やはりStartイベントの内容は描画前に呼ばれているイベントだと思います。
実際はキャッシュ処理で起動が遅くなっているのでしょうが、
まったく気にしなくていいぐらいの遅延だったのでしょう。
以外とキャッシュ処理って起動に影響しないんだ。。。とビックリしました

◆3Dオブジェクト大量においても遅延ないの?

3Dオブジェクトの描画で起動時間が遅れることはないのか!?
気になったので、今のタイトル画面にUnityちゃんを102体設定してビルドしてみました

f:id:apuridasuo:20200512155954j:plain
図:51vs51のラップバトル
実際のタイトル画面です。ラップバトルをイメージしたタイトル画面なのに
ちょっとした戦争ものみたいになっちゃいましたw
実際に起動したときの挙動は、
・起動時間は0.5秒→3秒ぐらいに長くなった(遅延した)
・起動の遅延よりも起動後の操作遅延がえぐかった
・0.5秒でBGMはなったので、Startイベントの処理は描画の遅延に関わらず終わった
こんな感じでした。
やはり、3Dオブジェクトの描画は起動の遅延にも影響があるみたいですね
ただ、オブジェクトの描画による遅延は今回のデータ読み込み遅延と違って
Startのイベントはすぐに完了する
という部分が大事だと思いました。
処理的には終わってるけど描画が追い付いていないって感じなんでしょうね
A. Startイベントはすぐ終わる起動遅延=オブジェクト描画が原因
B. Startイベント終わってない起動遅延=データ読み込み等の他の原因

こんな感じで、起動遅延の原因追及がなんとなく調べやすくなりました!!

以上です、アプリが出来たら下にリンク張るので是非遊んでね!

この問題を経て作ったアプリ

やっとやっとできたので紹介します!
リズムゲームの要素で、押すボタンがクイズになってる感じです。
操作自体は簡単なので、ぜひプレイしてみてください。
play.google.com

今後、実写映像化して欲しいコミック紹介

最近仕事が忙しくて全然アプリ作れてない

 →アプリ作れてないから新しい発見が無い

  →発見無いから記事書くことない

   →じゃあマンガ紹介するか!

という事で今回は、実写で映像化して欲しいコミックの紹介です。

最近多くなってきたコミック、ラノベの実写化ですが、

全体的にあまりいい評判を聞かないですね・・・

今回は、実写化について思うところがあるので

酔っぱらいジジイがごとく物申しながらコミック紹介したいと思います。

 

実写が批判されるのは二番煎じだからだろ!

これは常々思ってました!

コミックが映像化されるのはアニメ、実写それぞれに良さがあるはずです。

しかし最近の実写系はアニメで受けが良かった作品の実写化が多い!

アニメで受けがいい=アニメで良さが出る版権という事なので

実写で良さが出る作品とは限らないのです!

しかも、後追いするせいで二番煎じ感が出るし

ブームも終息し始めた頃の発表になってしまうので

見る前からコレジャナイ感がもの凄い印象になってしまいます!

そんなもんどれだけ版権が良くて面白くても初動が伸びるわけない!

どうせ実写化するなら、新鮮な版権を自分たちで見つけ出して

ブームを作る側になって欲しい!実写だって面白いんだから。。。

と、いうわけで以下から

アニメ化よりも実写化してほしい作品紹介していきます

 

しおりエクスペリエンス【 続14巻 】

 ・ジャンル 

バンドもの、登場人物みんな好きになる、アツコメ(熱い話だけどコメディもあるよ)

 ・あらすじ

地味な高校教師のシオリ(27)に、ある日幽霊がとりついた!

その幽霊はなんとジミーヘンドリクス!!!

ジミーに憑りつかれたシオリ(27)はある呪いにかかっていた。。。

「27歳が終わるまでに音楽で伝説を残さなければ死ぬ」

この物語は、地味な先生がジミーの呪いを糧に、

様々な思いを抱える生徒たちと伝説のバンドを目指す物語。

 ・感想 

この漫画はそもそもの設定がギャグなのでギャグマンガだと思ってしまいがちです。

(実際、1巻だけ見たらギャグ系かなー?って思っちゃいます)

しかしながら実際は登場人物全員に厚い人間ドラマがあり、

熱い成長ドラマがしっかり描写されたアツコメ成長物語でした。

音楽系のマンガで大事になるのは演奏描写です。

この漫画はシオリたちが成長していく話に合わせた描写を行っているので

ストーリーに感動した心をぐっと引き込む演奏描写になっています。

また、この漫画の大きな特徴だと思うのが

登場人物全員に分厚いストーリーがあり、それをきちんと描写している。

さらに、そのストーリーをシオリたちの成長に絡ませるすごい構成力です。

伏線単体で感動できるのに、それを回収しちゃうの!?と思って

出てくる人みんなに感情移入してみんなに感動しちゃいます。

実写に似合うなと思ったところは、

人間ドラマと演奏描写はアニメよりも実写で見たいから!

  

シネマこんぷれっくす【 続5巻 】 

 ・ジャンル 

高校日常もの、映画ウンチクつめこみました

 ・あらすじ 

映画が好きで、映画みたいに熱い青春を送りたがっている高校入学したてのガクト。

そこに現れたのは映画オタクたちが集う映画研究会の面々。

ガクトは映画を語りたいんじゃなくて映画みたいな青春を送りたい!

この物語は、映研に無理やり入部させられたガクトが

映画馬鹿たちに翻弄されながらも面白おかしな非日常な青春をお送りする物語

 ・感想 

この作品は、作者の趣味を漫画にした作品なのですが新しいです!

普通は、キャンプ趣味を漫画にしたらキャンプ漫画。

釣りの趣味を マンガにしたら釣り漫画になるでしょう。。。

では、映画趣味を漫画にしたこの作品はどうなるのか?

この作品は、キャラたちが色々な映画のテーマに沿った行動を起こすのです!

ホラー作品を語るときはゴーストバスターやったり!

ジャッキー語りたかったらカンフーやったり!!

任侠語りたかったら極道生徒会長でてきたり!!

映画という一つの趣味から色々なジャンルに派生するので

見ていて飽きない。常に新しくて面白いことをやってるのに、

映画ウンチクは欠かさず入っているから芯がぶれてないオリジナリティーです。

実写に似合うなと思ったところは、

・他作品の紹介が必須なので、実写なら何とかなる

・この作品を見ると、色々な映画が見たくなる紹介物として人気が出そう

 

特攻の拓【 終27巻 】

特攻の拓 新装版 コミック 1-27巻セット (ヤングマガジンKC)
 

 ・ジャンル 

ヤンキーもの、友情・努力・勝利?の究極完全体

 ・あらすじ 

いじめられっ子の拓は転校してきた最強ヤンキーの秀人に出会う。

いじめっ子とは違った男気のある秀人に憧れた拓。

秀人に関わったせいでボコボコにされたのに、

それでも秀人を裏切らなかった拓を見て秀人も拓に惹かれたのだった。

拓と秀人は転校して離れ離れになったが、秀人に教わったヤンキー魂を胸に、

新たな場所で様々な仲間と出会い、真の漢を目指す物語

 ・感想 

知名度はそれなりに高いけどネタ漫画扱いされがちなこの作品です。

この漫画の大事なところは、狂気じみた性格と強さのヤンキーたちが

バチバチにぶつかり合うのですが、話がめちゃくちゃになってないんです。

ちゃんとそれぞれに背負うものがあり、

それを拓のお人よしが何とかしようともがいてスッキリ話がまとまってくれるので

読んでいて気持ちがいいです。

昔のマンガらしく、ご都合主義がつまっていますが

ギャグとシリアスの混ぜ具合が絶妙なので読んでると全然ご都合感は感じません。

(だからこそ、一部だけ切り取るとネタ感満載の作品なんです・・・)

ヤンキー漫画ってファンタジーよりよっぽどベタベタな「友情・努力・勝利」

やってると思うので子供にも受けがいいと思うんですよね

実写に似合うなと思ったところは、

・それなりに知名度が高いから見たくなる人は多そう

・ヤンキーのカッコよさは実写でこそ光る!

・ベタベタ友情物語ってドラマ見る層に受けがよさそう

 

以上です。

私は普段、ドラマもアニメもあまり見ない、映画ばっかり見ているのですが

この作品が実写化したらみたいなと思うものを挙げました。

(本当は、シオリエクスペリエンスみて感動しすぎて、

映像化して欲しいと思った衝動をぶつけただけです。。。)

萌え脳死日常ものは一番相性悪いと思うんです。

熱くて非ファンタジーな物こそ実写化して欲しいです!

【C#】定義名に日本語使っていいって知ってた?

最近、知り合いにC#を教えていたのですが、
C#の定義名に日本語を使ってもいいという事をさらっと話したらビックリされました。
日本語表記はデメリットが目立つので毛嫌いされがちです。
しかし、使いどころを間違えなければ個人開発なら便利だという事を
組み込みルールや使い方例などを使ってまとめてみました。
※私個人の使い方ですのであくまで参考程度に・・・

C#は定義名に日本語を使ってもOK

変数やクラス、メソッド名に日本語を使ってもお問題ないです。
以下にソース例を載せておきます

        private void 日本語チェック()
        {
            int 数値 = 1;
            string 文字 = "TEST";
            Console.Write(数値.ToString() + 文字);
        }

こんな感じで、メソッド名や変数名を日本語表記にしても問題なく動きます。

日本語表記は意外とデメリットが多くて推奨されてない

定義名に日本語を使い事のメリットは誰でも分かると思いますが、
実際に日本語表記を使ってみると、意外とデメリットが多いことに気づきます。

・変数名が長くなりがち(日本語だと詳細までかけちゃうから・・・)
・呼び出すときにいちいち
 日本語入力に切り替えて書かないといけない(これはクソだるい!)
・コードの中にチラチラ日本語が混ざると、
 コードが頭に入りずらい(私だけでしょうか?)
・ここは英語でいこうかな?
 みたいなバカみたいな迷いが生じてしまう(私だけ)

初めて使用した時に感じたことはこんなものでしょうか。
皆さんも使ってみるとこんな感覚なんじゃないかなと思います。
ルールを考えずに日本語表記を使うなら、使わない方が断然マシです!
上記のデメリットと向き合い、
日本語表記と上手く向き合うと分かりやすくソースが組めるようになります。
私個人の日本語表記ルールを以下にまとめます。

ルール:日本語は英語を先頭において使う

まずは定義例をご覧ください。

        // 変数定義
        public static int _Quiz_正答率;
        public static int _Quiz_中央値;
        // 定数定義
        public const int Df_Time_ノード消去時間 = 50;
        public const int Df_Pt_リズム_悪 = 0;
        public const int Df_Pt_リズム_並 = 3;
        public const int Df_Pt_リズム_高 = 5;
        // 関数定義
        private bool Is_数値である(){}
        private string Get_今日の日付文字列(){}

こんな感じで定義名を記入します。
グローバル変数には先頭に「 _ 」
・定数には先頭に「 Df_ 」
・判定関数(戻り値がbool)の物には先頭に「 Is_ 」
・値取得関数(戻り値がbool以外)には「 Get_ 」

など、自分でルールを決めて定義名の先頭に英語表記を記入しましょう。
要は、先頭にその定義のカテゴリを英語で表記するということです。
日本語と違い、英語は短い文字で分かりやすいカテゴリを作れます。
この表記法で定義名を見るだけで大雑把説明と詳細説明の2つを行うことができます。
また、最大の利点は日本語入力に切り替えなくても呼びだせます!
呼び出し方法は、先頭の文字を記入してインテリジェンス機能を使えば一発です。
【例】
「Df_Pt_リズム_悪」を呼び出したいときは、
「Df_Pt_」までを記入してインテリジェンス機能を使って呼び出す。
※インテリジェンス機能が分からない方は、
 「 自分の使っているエディター名 インテリジェンス 」で検索!

この表記法によって、呼び出しも簡単になり
インテリジェンス機能を使った組み込みに慣れることもできて一石二鳥です。

日本語もいいけど英語も慣れていかなきゃ・・・

上記にルールを書いておいてなんですが、
私は定数の末尾にしか日本語表記を使っていません。
その理由は、英語使わないと一生覚えれないからです。
定義名を決めるときに、役割に対応する英語を調べるのは英語の勉強になると思います。
関数や変数は、定数と違って汎用的な役割を持っていることが多いです。
よく使う役割に対応する英語ぐらい覚えておきたいので、
日本語表記を使いすぎない!という事も大事だと思います。

以上です。
今回は、集団開発から見たデメリットは一切書いてません!
(だって集団開発なら、規約で日本語なんか確実に禁止になってるから意味ないもん)
個人開発なら日本語表記は全然便利だよ。という話でした。

【ココナラ】スロット出玉サイトのスクレイピングをツール化してみた

Pythonスクレイピングをやっていて、
暇つぶしと実益を兼ねてスロットの出玉情報の取得・解析を行う
ツールを作ってみました。

オプションとしてソースの公開も行ってますので
広告させていただきます。

作ってみて思ったことは、
意外と曜日の癖ってあるんだなぁ~ということでした。

興味のある方は無料版を配布しますのでココナラからご連絡ください。

スロット出玉データサイトのスクレイピング行います 誰でも簡単!ツールで一発!好きなホールの出玉データを収集解析

【C#】クラス型変数をコピーする方法

C#で変数をコピーしたとき、
自分の想定では値をコピーしたものだと思っていたのに
いざ結果を見てみると、
コピーした変数の値を変更したら
コピー元の変数の値も変わっていた!

という経験が誰しもあると思います。
私だけじゃないと思います・・・たぶん
という事で、今回は参照型変数についての話と
参照型になるクラスの値をコピーする方法のご紹介です

参照型とは?intやstringとは違うの?

参照型と値型の違いについては別記事で語ってます。
以下のリンクをご確認ください
apuridasuo.hatenablog.com

参照型の変数を普通にコピーした時

では実際に参照型となる自作クラスをコピーしてみます

        /*******************************************
           コピーする自作クラス
        ********************************************/
        public class TestClass
        {
            public int _Id;
            public string _Name;
            public string[] _Array01;
            //=========================
            // 通常のコンストラクタ
            //=========================
            public TestClass()
            {
                _Id = 0;
                _Name = "";
                _Array01 = new string[2] { "", "" };
            }
        }

        /*******************************************
           コピー処理を行う関数
        ********************************************/
        private void Main()
        {
            // コピーする変数を作成
            TestClass TestClassBef = new TestClass();
            TestClassBef._Id = 1;
            TestClassBef._Name = "コピー前";
            TestClassBef._Array01[0] = "ま";
            TestClassBef._Array01[1] = "え";
            // コピーしてコピー後の変数の値を変えてみる
            TestClass TestClassCopy = TestClassBef;
            TestClassCopy._Id = 2;
            TestClassCopy._Name = "コピー後";
            TestClassCopy._Array01[0] = "あ";
            TestClassCopy._Array01[1] = "と";
        }

こちらが自作クラス「TestClass 」の型の変数「TestClassBef 」を作成後、
別の変数「TestClassCopy 」にコピーして、値を変更するソースです。
処理後の変数の中身をメッセージ出力した結果が以下になります

            // コピー前の変数の中身
            TestClassBef._Id = 2
            TestClassBef._Name = "コピー後"
            TestClassBef._Array01[0] = "あ"
            TestClassBef._Array01[1] = "と"
            // コピー後の変数の中身
            TestClassCopy._Id = 2
            TestClassCopy._Name = "コピー後"
            TestClassCopy._Array01[0] = "あ"
            TestClassCopy._Array01[1] = "と"

コピー前の変数も値が変わってしまっていますね。
これが参照型変数の特徴なんです。

クラス型の変数を別変数としてコピーする方法

コピー後の変数を変更しても、
コピー前の変数に影響を与えない方法をご紹介します。
自作クラスのコンストラクタを追加します!

        /****************************
           コピーしたいクラス
        *****************************/
        public class TestClass
        {
            public int _Id;
            public string _Name;
            public string[] _Array01;
            //====================
            // 通常のコンストラクタ
            //====================
            public TestClass()
            {
                _Id = 0;
                _Name = "";
                _Array01 = new string[2] { "", "" };
            }
            //====================
            // コピー用コンストラクタ
            //====================
            public TestClass(TestClass CopyClass)
            {
                _Id = CopyClass._Id;
                _Name = CopyClass._Name;
                _Array01 = new string[2] { "", "" };
                Array.Copy(CopyClass._Array01, _Array01, CopyClass._Array01.Length);
            }
        }

        /*******************************************
           呼び出す関数
        ********************************************/
        private void Main()
        {
            TestClass TestClassBef = new TestClass();
            TestClassBef._Id = 1;
            TestClassBef._Name = "コピー前";
            TestClassBef._Array01[0] = "ま";
            TestClassBef._Array01[1] = "え";
            // コンストラクタを使って変数をコピーする
            TestClass TestClassCopy = new TestClass(TestClassBef);
            TestClassCopy._Id = 2;
            TestClassCopy._Name = "コピー後";
            TestClassCopy._Array01[0] = "あ";
            TestClassCopy._Array01[1] = "と";
        }

以上がソースになります。
通常コピーで書いたソースと見比べてみてください。
まず自作クラスの方にコンストラクタを追加しています。
※1つのクラスに、引数を変えれば複数のコンストラクタを作成できます
自分のクラス型を引数にしたコンストラクタです。
このコンストラクタの中で、
コピー元の変数の中身を取得する処理を記入しましょう!
そして、コピーする変数「TestClassCopy」作成時の記述も変わってます
「new TestClass(TestClassBef);」と定義することで、
コピー前と違ったアドレスを持った空の変数ができます。
そして、作成したコンストラクタによってコピー前の中身を持ってきます。
ソースの実行結果が以下になります

            // コピー前の変数の中身
            TestClassBef._Id = 1
            TestClassBef._Name = "コピー前"
            TestClassBef._Array01[0] = "ま"
            TestClassBef._Array01[1] = "え"
            // コピー後の変数の中身
            TestClassCopy._Id = 2
            TestClassCopy._Name = "コピー後"
            TestClassCopy._Array01[0] = "あ"
            TestClassCopy._Array01[1] = "と"

ちゃんとコピー後変数の変更がコピー前の変数に影響を与えていません。
このように、
参照型の変数は手順を踏んでコピーを行わないと
簡単に想定外の不具合が起きます!

私のコピーの仕方はほんの一例でしかありません。
参照型というものは不具合に遭遇して経験を積まないと
ぱっと理解できるものじゃないと思います。
今後もバグらせまくると思いますので、
変なバグをやっちゃったらまとめたいと思います。