○進数を○進数に変換する関数
私の会社は16進数のデータをいじくりまわすことがある。
いちいち「Convert」を使って変換するのもめんどくさいので
各進数を別の進数に変換する関数を作成しました。
ソースコード
/// <summary> /// 進数変換モード /// </summary> public enum Md_Conv { c10to2 = 0, c10to16, c16to2, c16to10, c2to10, c2to16 }; /// <summary> /// ○進数を○進数に変換 /// </summary> /// <param name="Mode">進数変換モード</param> /// <param name="SetWord">変換文字</param> /// <returns>変換後の文字※桁合わせしてる</returns> public static string Get_ConvertNum(Md_Conv Mode, string SetWord) { string setNumOff = SetWord.Trim(); string cnv = ""; switch (Mode) { case Md_Conv.c10to2: cnv = Convert.ToString(int.Parse(setNumOff), 2); cnv = cnv.PadLeft(8, '0'); break; case Md_Conv.c10to16: cnv = Convert.ToString(int.Parse(setNumOff), 16); cnv = "0x" + cnv.PadLeft(2, '0').ToUpper(); break; case Md_Conv.c16to10: cnv = Convert.ToInt32(setNumOff, 16).ToString(); break; case Md_Conv.c2to10: cnv = Convert.ToInt32(setNumOff, 2).ToString(); break; case Md_Conv.c16to2: cnv = Convert.ToInt32(setNumOff, 16).ToString(); cnv = Convert.ToString(int.Parse(cnv), 2); cnv = cnv.PadLeft(8, '0'); break; case Md_Conv.c2to16: cnv = Convert.ToInt32(setNumOff, 2).ToString(); cnv = Convert.ToString(int.Parse(cnv), 16); cnv = "0x" + cnv.PadLeft(2, '0').ToUpper(); break; } return cnv; }
使用例
▼ テストソース
// テスト用変数作成 int Num_10sin = 4095; string Num_2sin = "0111"; string Num_16sin = "FFFF"; string Num_16sin2 = "0x00FF"; // 各進数表記に変換 string Result = ""; Result = "◆ 10進数「Num_10sin ("+ Num_10sin + ")」を変換\r\n"; Result += "16進数:" + Get_ConvertNum(Md_Conv.c10to16, Num_10sin.ToString()) + "\r\n"; Result += " 2進数:" + Get_ConvertNum(Md_Conv.c10to2, Num_10sin.ToString()) + "\r\n"; Result += "◆ 2進数「Num_2sin (" + Num_2sin + ")」を変換\r\n"; Result += "16進数:" + Get_ConvertNum(Md_Conv.c2to16, Num_2sin) + "\r\n"; Result += "10進数:" + Get_ConvertNum(Md_Conv.c2to10, Num_2sin) + "\r\n"; Result += "◆ 16進数「Num_16sin (" + Num_16sin + ")」を変換\r\n"; Result += "10進数:" + Get_ConvertNum(Md_Conv.c16to10, Num_16sin) + "\r\n"; Result += " 2進数:" + Get_ConvertNum(Md_Conv.c16to2, Num_16sin) + "\r\n"; Result += "◆ 16進数「Num_16sin2 (" + Num_16sin2 + ")」を変換\r\n"; Result += "10進数:" + Get_ConvertNum(Md_Conv.c16to10, Num_16sin2) + "\r\n"; Result += " 2進数:" + Get_ConvertNum(Md_Conv.c16to2, Num_16sin2) + "\r\n"; MessageBox.Show(Result, "出力結果");
▼ 出力結果
関数概要
上記の感じで「16・10・2」進数の相互変換を行うことができます。
注意点としては、
10進数だろうが何だろうが文字列型でやり取りしている点です。
なので、数値型を引数として渡す場合はテストデータのように「ToString()」で文字列に直してください。
また、16進数の戻り値の表記は「0x」が頭について大文字になってます。
また、関数内の「cnv.PadLeft」の引数で0埋めの桁数を調節できます。
Scroll View内に高さが可変のノードを作る
ScrollViewの要素の高さを可変にしたい!
ScrollViewの要素にScrollViewを入れたい!という方にオススメ
設定を変えるだけで意外と簡単にできたので方法をまとめておきます
ヒエラルキーの内容
下図の感じでオブジェクトを設定します
「Scrl_Parent -> Content_P」の中にノード(P)を追加していくスクロールがあり、
そのノード(P)の中に、ノード(C)を追加していく。という仕様になります。
高さが可変のノードとは
ノード(C)が追加されるたびにノード(P)の高さが調節されるという仕様です。
スクロールのノードの高さがノードごとに可変であるという事がポイントです。
各オブジェクトの 設定
まずは、いつも通りScrollViewを作ってください。
その上で変更のある点は下記の2点です。
・親スクロールのContentオブジェクトの「○○ Layout Group」の
「Control Child Size」にチェックを入れる
・親スクロールに追加するノードに「○○ Layout Group」を追加する
▼ 下図の設定は「ヒエラルキーの内容」項目のオブジェクト名と
照らし合わせて参考にしてください
以上で、ScrollView内のノードに高さが可変のノードを作成することができます。
NCMBとGoogleAdMobの競合によるビルドエラー解決法【2019年10月】
何番煎じか分からない項目なのですが、
シャキッとした答えが見つからなかった。
バージョンの違いで対応が違っていたので
現バージョンのパッケージで解決した方法をまとめときます。
パッケージのバージョン
・GoogleMobileAds・・・v4.0.0
・NCMB・・・v4.0.3
ビルドエラー時の状況
・NCMBパッケージを先にインポートする
→たぶんこれがビルドエラーの原因
・GoogleMobileAdsパッケージをインポートしてビルド
▼下図のエラー発生
UnityEditor.BuildPlayerWindow+BuildMethodException: 528 errors
CommandInvokationFailure: Gradle build failed.
今回行った対処法
NCMBパッケージでインポートした「Plugins -> Android」内のファイルを削除
ビルドエラーの原因は、ライブラリの競合にあるので
NCMBパッケージでインポートした
Pluginフォルダ内のファイルを削除して競合しないようにします。
◆削除するファイル名
・firebase-analytics-impl-16.0.0
・firebase-common-16.0.0
・firebase-iid-16.2.0
・firebase-iid-interop-16.0.0
・firebase-messaging-17.1.0
・play-services-base-15.0.1
・play-services-basement-15.0.1
・play-services-measurement-base-15.0.0
・play-services-tasks-15.0.1
・support-compat-26.0.2
・support-core-utils-26.0.2
・support-v4-26.0.2
ビルドしてみる
これで上手くビルドが出来ているはずです。
ビルドエラーが発生したとき、
パッケージを複数インポートした場合は
ライブラリの競合が発生している可能性が多々あると思います。
そういった場合は、
1.検証用に新規プロジェクト(AAA)を作る
2.エラーの出るプロジェクトに入れたパッケージを(AAA)に入れる
3.インポートした「Plugins」フォルダのファイルを
パッケージごとに消していきエラーが回復するか確認する
このやり方で、競合するファイルが何か判別できると思います。
teratailで質問する前にやっておくべき事
teratailを質問者として利用してばかりじゃ申し訳ないと思い、
若輩者なりに回答者としていくつか回答してみました。
その中で、質問者として最低限行ってほしいと思ったことをまとめます。
※必ずしろ!というわけではなく、してもらえると回答シヤスイナーです
- teratailとは?
- ソースコードを貼るときはタグで囲む
- エラーの内容でググる
- 自分の書いたソースを理解してから質問する
- 質問したいこと、求めている回答を明確にした質問をする
- 自分でソースの状況を把握しておく
- 質問しない!
teratailとは?
プログラム実装で詰まったら質問できるサイトです。
私のように教わる人のいない状況で勉強している方には非常に便利なサイトになります。
teratail.com
ソースコードを貼るときはタグで囲む
これは必ず行って下さい。利用する方でできていない方が結構います。
teratailは、ソースコードをタグで囲むことで見やすくする機能があります。記入方法を以下にまとめるので知らない方は必ず確認して下さい!この書き方でソースコードを記入すれば、背景色も変わり、
コメントや変数などの色付けもされてとても見やすい表示になります。
エラーの内容でググる
バグが発生して何が間違っているのかわからない場合、
ログにエラーが出ていないか確認してみて下さい。
そして、エラーの文字をコピーしてググってみましょう。
意外とネットには解決方法が載っているので質問する前に解決できます。
自分の書いたソースを理解してから質問する
ソースコードをコピペしてバグって訳がわからない!ということがあった場合、
そのまま質問しても、回答者の回答が何を言っているのか分からないと思います。
コピペしたコードを部分的にググってみて、
自分の書いたソースの内容をある程度勉強して下さい。
そうすれば、バグの原因がわからないとしても、
回答者が何をいっているのか理解することができると思います。
質問したいこと、求めている回答を明確にした質問をする
何が分からないか分からないという状況で質問しないよう気をつけましょう
・何を目的としたコードを組んでいるか
・現在の挙動はどうなっているか
・何を回答してほしいか
以上の項目は自分で考えて、明確にしてから質問しましょう。
自分でソースの状況を把握しておく
ソースの組み込みを行う上で、
プログラムの実行中に一時停止を行って変数の内容などを確認たりします。
そういったデバッグ方法をいくつかご紹介します。
※実装環境でやり方は異なるので、「VisualStudio ブレーク 方法」
のように検索していただけると方法が出てくると思います。
- ブレーク(ポイント)
ブレークは、設定した場所で処理を一時停止させる機能です。
ブレークポイントを設定した状態でプログラムを実行すると
設定した場所に処理が到達した時点でプログラムが一時停止します。
ブレークポイントを設定することを「ブレークを貼る」ということがあります。
【使用例】
・if文等の分岐でブレークを貼ってどの分岐が通っているか調べる
・問題のある処理でブレークを貼って、その時の変数の値などを確認する
・反応しない関数を呼ぶ処理にブレークを貼ってその処理が通っているか調べる
- ログ(メッセージ)
ログは、処理の中で指定した文字をコンソール等の、
実際には影響のない部分に出力させる機能です。
【使用例】
・if文等の分岐で通ってはいけない場所にログを実装して「ログ出力=バグ」とする
・変数設定後に変数の内容をログで出力する事で見えない変数の内容を把握する
これらのデバッグ方法を使って質問の前に
不具合の原因を探してみてある程度の目星をつけておくと
回答者とのやり取りが非常にスムーズになります。
質問しない!
上記のデバッグ方法とネットの力を駆使したら
メジャーな問題はたいてい解決できます。
まずは自力で解決する!これが良い質問をする最大のコツだと思います。
自力で解決する努力を行うことで問題への理解が深まり、
質問する際に相手に伝えるべき項目をまとめて質問することができます。
また、回答者は専門的な用語を踏まえて回答をくれるときが多いですが
調べることに慣れていると戸惑わずに対応できると思います。
以上になります。
回答者の方々はきちんと対応すれば良い方ばかりです。
変な感じになったな~と思ったら大体自分の対応が悪かったと思って
めげずに頑張って下さい。
今後アニメ化されそうなコミック紹介
あまりに暇なので、完全に趣味ですが
Amazon商品紹介機能を試しに使ってみたいと思います。
今後、アニメ化確実のおもしろ漫画をご紹介
暇なときに本ばっかり読んでたら結構な数になっていました。
しかも、最近私が読んでる本がことごとくアニメ化されていたことを知り、
私が読んで面白かった本は全部アニメ化される理論で面白かったものをご紹介します。
あらすじも私が適当に書いてるので変なとこあったらご勘弁を!
あやかしこ【現6巻】
・アニメ化される度
★★★★★【5/5】
・ジャンル
ほのぼの日常系、絵が綺麗、非4コマ
・あらすじ
主人公はちょっと引っ込み思案な女子高生マホロ。
そんなマホロが住む家「あやかし荘」には3人の妖が住んでます。
引っ込み思案なマホロが唯一自分らしく接することが出来る妖たち。
個性豊かな妖たちとのドタバタコメディーや、
妖を通じて成長するマホロの人間ドラマを描いた作品。
・感想
絵もきれいでキャラに個性があってちゃんと話に落ちがある。
ストーリーが進むにつれてマホロの世界も広がっていって
新しい面白さがどんどん押し寄せてくるので飽きることがない。
パワプロで言ったらオールA評価なぐらいバランス良く全部良い作品です。
1巻読んでから「確実に人気出るしアニメ化されるわー」と思ってたら
全然アニメ化されないからもどかしい気持ちでいっぱいです。
じけんじゃけん【現6巻】
・アニメ化される度
★★★★☆【4/5】
・ジャンル
ギャグ、学園もの、推理?もの、非4コマ
・あらすじ
舞台はある高校の同好会「ミステリ研究会」。
ミステリが絡むと真っ直ぐな馬鹿になる会長ゆりこと、
ゆりこに探偵の才能を認められた、唯一の会員にしてミステリ素人といり。
学校の日常もユリコにかかれば謎となる!
時にはユリコが死体となって謎を作っちゃう突拍子もないアホな行動に
翻弄されるといり達を描く探偵?コメディー
・感想
ユリコが突拍子もない事をやるけど、読んでて「こいつならやるわぁ~」
と納得できるぐらいちゃんと各キャラの人間性を描いてくれている。
日常に潜むアホを丁寧に描写しているので要所要所で腹抱えて笑える。
アニメ化しそうだなと思った理由は、
キャラの決め台詞が決まっていてバズりそう。
ちょいちょい作者の性癖が垣間見えるエロ要素がある。
ので、アニメ化したら人気が出そうだなと思ったからです。
スライム倒して300年、知らないうちにレベルMAXになってました 【現5巻】
スライム倒して300年、知らないうちにレベルMAXになってました 1巻 (デジタル版ガンガンコミックスONLINE)
- 作者: 森田季節(GAノベル/SBクリエイティブ刊),シバユウスケ,紅緒
- 出版社/メーカー: スクウェア・エニックス
- 発売日: 2018/01/12
- メディア: Kindle版
- この商品を含むブログを見る
・アニメ化される度
★★★★☆【4/5】
・ジャンル
異世界転生もの、ほのぼの日常、非4コマ
・あらすじ
過労で死んじゃったけど不老不死の力を手に入れて異世界に転生したアズサ。
現世でできなかったスローライフを300年送っていたアズサだが、
日課としていたスライム退治のおかげでLvMaxの最強魔女に!?
だけど別に冒険しません。ゆったりほのぼの異世界を楽しみます。
普通じゃない最強魔女の、普通な日常を楽しく描いた作品。
・感想
今流行というかお腹いっぱいの異世界転生ものだけど、
中身がしっかり面白いから関係なく楽しめる作品。
アズサが「現世での実体験」からスローライフ意識をちゃんと持ってるからこそ、
異世界の人たちと交流を深めていく過程で
「周りをしっかり巻き込んでほのぼのさせる努力をする」ので
皆が周りのことを考えるようになる優しい成長がしっかり見れる面白さがあります。
原作はラノベなのですが、原作も面白いのでぜひ読んでみて下さい。
どうせ異世界転生ものばっかりアニメ化するなら早いところこの作品をアニメ化してほしいです。
まとめ
まだまだ紹介したかったのですが、あらすじと感想書くのだるいです!
2作品目で完全に飽きました・・・(泣)
また暇なときに書いてみたいと思います。
クラス配列作成時に要素がnullになるのを防ぐ方法
最近、Listばっかり野郎から、配列も使ってやろうに変化したのですが、
クラス型の配列を作成した時の問題と対応をまとめておきます。
配列定義時の中身が・・・
適当なクラスの配列を作成してみます。
// 適当クラス public class TestClass { public int _Id = 0; public string _Name = ""; } // 起動時イベント void Start() { TestClass[] a_TestClass; a_TestClass= new TestClass[10]; // ↓↓変数に値を設定しようとするとエラーになる↓↓ a_TestClass[0]._Id = 1; }
こんな感じでクラス配列を作成した後、
要素のクラスに変数を設定しようとするとエラーになるはずです。
この理由は、
「クラス型の配列作成時、要素は全てnullになっている!」からです。
なので、すべての要素にインスタンスを作成する処理
a_TestClass[0]= new TestClass();
この処理を行わないと変数の設定ができません。。。
LINQをつかって一気にやってしまおう!
インスタンス作成処理をfor文で回してもいいのですが、
ただの配列作成処理なんだからスッキリさせたいです。
こんな時に重宝するのがLINQです。
配列作成の処理にSelect文をつかって1行で完結させましょう
// 起動時イベント void Start() { TestClass[] a_TestClass; a_TestClass= new TestClass[10].Select(x => { return new TestClass(); }).ToArray(); // ↓↓エラーにならない!↓↓ a_TestClass[0]._Id = 1; }
こんな感じで配列作成と要素にインスタンス作成の処理を1行でできます。
配列を使うメリットって何だろう?
最近、なんとなくですがListの必要がないものは
なるべく配列で組み込むようにしているのですが、
まぁまぁ良かったことをまとめときます
◆ 良かったこと
- 配列は作成した瞬間から要素が出来ているので、一時的にクラスを作る必要がない
- 高さが変動しないので、範囲外系のエラー時の原因追及がしやすい
- ToLinq、ToArrayがあるのでそこまで自由度が低くなることはそんなにない
- 「高さが変わらないなら配列」という明確なルールを持ってListと使い分けることで、型を見ただけで自分の意図が分かるからコードを読み返すときに楽
以上です
今更ですが配列は配列できっちりしていて好きになりました。
UnityでNuGetパッケージを使用してIL2CPPを使用した時の参照エラー対策
初めてUnityでNuGetパッケージを使用してみたのですが、
IL2CPPでビルドした場合のみでバグが発生してしまいました。
今回、解決までの四苦八苦をまとめておきます。
NuGetパッケージ導入方法
この記事を参考にNuGetパッケージを導入しました。
「Scropting Backend」の設定をIL2CPPではなく、Monoで
ビルドを行った際には何も問題なく動いていました。
エラー内容
公開前に、いざ64bitに対応させようと思いIL2CPPに切り替えてビルドした結果、
実機でデバッグした際に上手く動かない!
今回、私はNuGetパッケージから「Taglib」というパッケージを導入していました。
その中のクラスが見つからない。。。という参照エラーが発生していました。
対応内容
1. Projectの「Assets」フォルダ内に「link.xml」という名前のファイルを追加
※「Assets」フォルダ以下ならどこでもOKらしい・・・
2.「 link.xml 」に以下のコードを記入
対応は以上です。あとはいつも通りビルドしていただければ
参照エラーは直っています。
エラー原因
上記の参考サイトにも書いているのですが、
自分なりにかみ砕いた解釈をまとめると・・・(間違ってたらすみません)
IL2CPPでビルドすると、ユーザーが手動で追加したdllは削除される。
だから、「link.xml」で手動追加dllの削除・保持を指定する必要がある。
※.厳密には、手動追加かつGameObjectに設定したスプリクトファイルの
コードが呼び出していないクラスが削除される。と書いてましたが、
ちゃんと呼び出すようにコードを変更しても意味が無かったので
何をしても手動dllは削除される。という考えで対策することにしました。
最後に
今回出したアプリは、公開前に
「AppBundle」と今回の件で2つの初エラーが急に来たので
めちゃくちゃ泣きそうでした・・・
そんな直前に苦しめてくれたAndroidアプリ!
通常の音楽プレーヤーに、
再生楽曲のテンポをあなたの走るテンポに合わせる!
という面白機能を合わせてみました。
皆さんぜひ、ダウンロードして色々文句言ってください!
個人製作でロクに宣伝もできないので入れてみました・・・