ゲームエフェクトデザイナーのブログ | A Real-Time VFX Artist's Blog

About Making Materials on UE, Making Tools with C#, etc

C# リスト管理できるテキストエディタ「List Fusen」を制作&リリース

C#の勉強を兼ねて、複数のテキストをリスト上で切り替えながら編集できたらなあと思って作ったツール「List Fusen」を制作しました。

実行ファイルをzipにしてこちらにアップしています。
よろしければお使いになってみてください。

GitHubにも実行ファイルとソリューション一式をアップしています。
ライセンスは MIT License です。

f:id:moko_03_25:20171105190026j:plain

 2017.11/12
  Ctrl + A や Ctrl + S を入力時にシステム音が鳴る不具合を修正

 2017.11/15(ver.1.01)
  リストとテキストエディタの間をドラッグで分割サイズ変更可能に
  リスト上をF2またはダブルクリックでアイテムのリネーム
  リストアイテム削除時にダイアログ表示
  10分間隔でのオートセーブ

 2017.11/20(ver.1.02)
  リストアイテム追加時にテキストボックス内でのEnterで確定
  テキストを右端で折り返さない設定に変更
  ウインドウの分割位置を保存
  リストとテキストのフォントの設定の変更・保存に対応
  オートセーブ関連の設定の変更・保存に対応

 2017.11/23(ver.1.03)
  タブスペースに対応
  プログラムアイコンを設定

 2017.11/24(ver.1.04)
  タスクバーのアイコンとツール名表示に対応
  上記対応のためにフォームの枠を取り払ってツールのサイズ変更を実装

 2017.11/27(ver.1.05)
  ツール設定でテキストを右端で折り返す設定に対応
  二重起動を禁止していたのを解除

 2017.11/28(ver.1.06)
  テキストに変更があった際にDirtyマークを表示

 2018.1/22(ver.1.06)
  ツール上部のバージョン表記が間違っていたので修正

 2018.5/8(ver.1.07)
  ツールのアクセントカラーがオプションで変更可能に
  それに伴いアイコンのアクティブ時の色を修正
f:id:moko_03_25:20180509010345j:plain

 2018.5/9(ver.1.08)
  パネルのアクセントカラーが初期化されない不具合を修正
  オプション設定での変更がその場ですぐ反映されるよう対応

続きを読む

「ドラゴンクエストXIへの道~The “L”oad to DRAGONQUEST~」の講演メモ

UNREAL FEST 2017 横浜のセッション
ドラゴンクエストXIへの道~The “L”oad to DRAGONQUEST~」
の講演内容のメモ。

続きを読む

「ドラゴンクエストXIへの道~グラフィックスの作り方~」講演メモ

Unreal Fest 2017 横浜のセッション
ドラゴンクエストXIへの道~グラフィックスの作り方~」
の講演内容のメモになります。

続きを読む

Photoshopのスクリプトを書いてみる

Photoshopにはアクションという便利な機能がありますが、かゆいところに手が届きません。
そういう場合に手作業を挟んでましたが、JavaScriptスクリプトを書けばアクションではやりにくいこと(変数を使うようなこととか)も可能です。

こちら、思いのほかお手軽だったのでメモっておきます。

ちなみに 赤めがねさんより色々と情報をいただきましたので、追記しました。
ありがとうございます!

続きを読む

ノートPC「X205TA」に 仮想HDDを利用して Visual Studio Community を入れてみた

メモするためだけに買った格安ノートPC「X205TA」ですが、身軽なサイズ・1Kgの軽さ・10時間ほど持つ駆動時間・色やデザインと全てにおいて気に入っており、購入直後から今もずっと愛用し続けています。

ただ、購入時から分かってはいたことですがストレージが 32GB しかなく、Officeを入れたため残り 9GB ほどしか残っておらず、これ以上容量を圧迫できない状態です。

しかしC#の勉強を始めてから「Visual Studio Community 2017」を入れたくなりました。ただしこいつはインストール時のコンポーネントでモバイル開発などをONにすると合計30GBほどのサイズに膨れ上がってしまいます。

そこで「ストレージを換装するか」と思って調べてみたら、どうも「eMMC」とやらは基盤に直付けで容量によって形状も違うらしく、素人に交換できるようなシロモノでは無い模様。。

そこで次に「microSDにインストールできないか」と思って調べたところ、いくつか方法があることが分かりました。

こちらの記事ではそのままのインストールとシンボリックリンクについて解説されています。

ただ、もう少し調べてみると「仮想ハードディスク(Virtual Hard Disk / VHD)」を作成してインストールする方が良さそうと思い、下記の2つの記事を参考にこちらを試してみることにしました。


ちなみに購入したmicroSD価格.comで人気1位(2017年8月現在)のこちら。

速度タイプが「CLASS10」というもので今ではかなり遅いみたいですが、安くて大容量なのでこちらに決めました。

仮想HDD作成


上記サイトの手順を参考に進めていきますが、いくつか注意点があります。

仮想HDDの容量設定は少し余裕を持たせる必要があるっぽい
 ⇒ 先ほどの記事を参考に 104 GB に設定してみました

仮想HDD作成に1時間以上かかる
 ⇒ スリープが入らないように設定しておく

仮想HDDのボリュームラベルは分かりやすい名前が良さそう
 ⇒ VHDとかmicroSDとか

再起動で仮想HDDのマウントが外れる
 ⇒ 自動マウントの方法がいくつかあるっぽい(後述)


最初に仮想HDDを作成した際には、時間がかかるということで放置してたのですが、スリープしていたためか、後からロック画面を解除して確認したら作成されたVHDファイルが壊れていました(microSDのボリュームに割り当てられておらず、VHDに接続しようとすると”ファイルが壊れています”と表示される)。

そこでそのままVHDファイルを削除して作成し直しで問題なく進めました。

Visual Studio Community 2017 のインストール


さて、インストールですがインストーラーは1MBほどなので気にせずDLします。

インストーラーを実行したらコンポーネントを選択する画面になりますが、インストールサイズは以下のような感じでした。

・何も選択していない素の状態: 605MB

Windows
・.NET デスクトップ開発: 2.56GB
C++ によるデスクトップ開発: 4.44GB

<Web & クラウド
ASP.NET と Web 開発: 4.64GB
・Azure の開発: 6.18GB
Python 開発: 1.44GB
・Node.js 開発: 2.25GB
・データの保存と処理: 4.81GB
・データサイエンスと分析のアプリケーション: 1.61GB
・Offisce/SharePoint 開発: 3.62GB

<モバイル&ゲーム>
・.NET によるモバイル開発: 27.26GB
・Unity によるゲーム開発: 3.49GB
JavaScript によるモバイル開発: 1.44GB
C++ によるモバイル開発: 10.75GB
C++ によるゲーム開発: 4.08GB

<他のツールセット>
Visual Studio 拡張機能の開発: 2.26GB
C++ による Linux 開発: 1.1GB
・.NET Core クロスプラットフォーム開発: 4.07GB

・すべて選択: 46.44GB


.NET によるモバイル開発” が 27.26GB と巨大な容量ですね。。
こちらは着手してからのインストールで良いと思いパス。

3DCGアーティストなら Python は入れると良いかも知れないですね。
Unity はどのみちこのノートPCでは動かないだろうからパス。

結局 ”.NET デスクトップ開発” のみONにして 3.7GB ほどのインストールサイズになりました。

で、仮想HDDをマウントしているEドライブを指定してインストールしてみた訳ですが‥

蓋を開けば、EではなくCドライブの残容量が見事に 3GB 以上減っています‥Oh My God!!
C://Program Filsに色々と追加されていました。
Visual Studio関連ファイルを別ドライブへはインストールできないということでしょうか‥

Projectファイルもマイドキュメント内の中ですね。。
マイドキュメントはマイドキュメントのプロパティ>場所‥の設定でEドライブに移し替えました。

肝心の仮想HDDのEドライブにインストールされたファイルのサイズは 1.25GB でした。

‥という訳で完全に失敗です。みなさまもご注意ください。

仮想HDDの自動マウント


マウントするバッチファイルを作成してスタートアップに登録するといった方法もあるみたいですが、タスクスケジューラに登録する形で再起動を試してみて正常に動作しているのを確認。

下記の記事を参考にさせて頂きました。
(こちらのページ、自分の環境では画像が表示されませんがクリックすると表示されました)

X205TA、VHDを使って容量を更に確保する。VHDオートマウントも設定! | Appnote

使用感


数GBのファイルを書き込んだりするとかなり遅いですね。。
それもそのばす、転送速度はmicroSDのCLASS10で10MB/s・USB2.0で60MB/s・USB3.0で640MB/sとのことです。

とりあえず様子を見てみたいと思います。

肝心の Visual Studio の使用感についてはまだです。
後日使ってみたら追記予定。

C#でサブフォルダの総サイズのリストアップ(DataGridView編)

前回は同じ内容のツールでListBoxにリストアップする形でしたが、今回はDataGridViewにリストアップする方法を備忘録としてメモしておきます。

外観はこんな感じ。

f:id:moko_03_25:20170812222614j:plain

DataGridViewの扱いに慣れれば、後はCSV読み込みと書き出し、余力があればExelのデータを扱えるライブラリを導入して直接xlsxファイルで書き出すことができるようになれば、業務でのお役立ち度も一気に増して幸せになれそうな気がします。

さて、あるフォルダパス直下のサブフォルダ1つ1つのファイルサイズをリストアップするまでの記述は前回の記事とほとんど変わらないので、ここでは前回と違う部分だけピックアップしたいと思います。

サブフォルダ1つ1つの総ファイルサイズを配列で取得するメソッド


DataGridViewのやり取りの部分がまだよく分かっていないので、恐らくもっと楽な方法があると思うのですが、自分なりに調べて試してみたのは‥1つのサブフォルダに対して「フォルダ名」と「ファイルサイズ」の2つの要素を二次元配列に格納して、DataGridViewの一列目と二列目にそれぞれの要素を追加していく方法です。

//サブフォルダ1つ1つの総ファイルサイズを配列で取得
public string[,] GetSubFolderSize(string subFolders)
{
  //サブフォルダの数分の配列"size"と"sizeSt"を定義
  int el = subFolders.Length; //サブフォルダの要素数(element)
  long size = new long[el]; //整数の配列

  string[,] sizeSt = new string[el, 2]; //文字列の2次元配列
  string fn; //フォルダネームを一時的に保存する変数

  //配列の要素の数だけ処理
  for (int i = 0; i < el; i++)
  {
    //入力したパスのフォルダ名を取得
    fn = Path.GetFileName(subFolders[i]);

    //入力したパスをDIrectoryInfoクラスのオブジェクトに代入
    DirectoryInfo chkPath = new DirectoryInfo(subFolders[i]);
    //総ファイルサイズをMiB単位で配列"size"に代入
    size[i] = GetDirectorySize(chkPath) / 1024 / 1024;
    //文字列に変換して配列"sizeSt"に代入
    sizeSt[i, 0] = fn;
    sizeSt[i, 1] = size[i].ToString("D");
  }

  return sizeSt;
}


戻り値
と変数”sizeSt”をString型の二次元配列にして、フォルダ名ファイルサイズを別々に格納しています。

本当はフォルダ名はString型サイズはLong型で返したいところですが、とりあえず今回は勉強を兼ねて二次元配列でやってみた感じになります。

Enterでパスを取得してDataGridViewにリストアップ


Enterキーを入力した際の挙動の部分だけ抜粋しています。

列のヘッダーの表示名を設定して、ファイルサイズの列は右寄せに設定。
最後に各列に二次元配列の中身を追加していっています。

//サブフォルダのパスを全て取得
string[] subFolders = GetSubFolderPath(path);
//サブフォルダの要素数
int el = subFolders.Length;

//サブフォルダの数分の2次元配列"sizeSt"を定義
string[,] sizeSt = new string[el, 2];

//全てのサブフォルダごとの合計サイズを取得
sizeSt = GetSubFolderSize(subFolders);

//DataGridViewの項目名を指定
dataGridViewResult.Columns.Add("", "フォルダ名");
dataGridViewResult.Columns.Add("", "総サイズ(MB)");
//行ヘッダを非表示にする ※Formデザイナーのプロパティ内でも設定可能
dataGridViewResult.RowHeadersVisible = false;
//2列目を右寄せ表示にする
dataGridViewResult.Columns[1].DefaultCellStyle.Alignment =
  DataGridViewContentAlignment.MiddleRight;

//二次元配列を1列目と2列目に追加していく
for (int i = 0; i < el; i++)
{
  //行を追加
  dataGridViewResult.Rows.Add();
  //行の1列目にフォルダ名を入力
  dataGridViewResult.Rows[i].Cells[0].Value = sizeSt[i, 0];
  //行の2列目にサイズをLongに型変換して入力(ソート問題回避のため)
  dataGridViewResult.Rows[i].Cells[1].Value = long.Parse(sizeSt[i, 1]);
}


二次元配列は初めて試しましたが、一応うまくいっているようでホっ。
ファイルサイズをString型からLong型に変換している理由は後述しています。

下記の様々な記事を参考にさせて頂きました。

【C#】2次元配列の宣言・初期化・代入

【C# DataGridView】一次元配列を設定する | ITLAB51.COM

DataGridの一番下の新しい行(*行)が表示されないようにする: .NET Tips: C#, VB.NET

DataGridViewでの行の追加と削除 - 理想のユーザ・インターフェイスを求めて

文字列を数値に変換する、数値を文字列に変換する: .NET Tips: C#, VB.NET

DataGridViewの内容のクリップボードへのコピーとクリア


最後におまけです。
DataGridViewの内容を全てクリップボードへコピーする方法と、全て消去する方法です。

//「クリップボードへコピーする」ボタンの挙動
private void buttonCopy_Click(object sender, EventArgs e)
{
  //全ての列の全ての行を選択
  for (int i = 0; i < dataGridViewResult.ColumnCount; i++)
  {
    for (int j = 0; j < dataGridViewResult.RowCount; j++)
    {
      dataGridViewResult[i, j].Selected = true;
    }
  }
  //選択内容をクリップボードへコピーする
  //ヘッダを含めて同じ行のセル間はTab区切りにする
  dataGridViewResult.ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText;
  Clipboard.SetDataObject(dataGridViewResult.GetClipboardContent());
}

//「クリア」ボタンでDataGridViewの内容を消去
private void buttonClear_Click(object sender, EventArgs e)
{
  //全ての行の内容をクリア
  dataGridViewResult.Rows.Clear();
  //全ての列の内容をクリア
  dataGridViewResult.Columns.Clear();
} 


こちらも下記の様々な記事からにお世話になりました。

【C# DataGridView】内容をクリップボードにコピーする | ITLAB51.COM

DataGridViewで選択されたセルをクリップボードにコピーできるようにする: .NET Tips: C#, VB.NET

【C#】DataGridViewをプログラムで初期化、列編集する方法 – Output48

他には、Formデザイナーのプロパティの方に以下のような設定があります。

・AllowUser~~ 行や列のサイズ変更や追加/削除等を許可するか
・ClipboardCopyMode クリップボードにコピーする際の設定
・ColumnHeadersHeightSizeMode 列ヘッダーの高さの調整
・ReadOnly ユーザーのセルの編集を許可するか(Trueで編集不可)
・AutoSizeColumnsMode 可視列の自動サイズ調整の設定
・RowHeadersVisible 行ヘッダーを表示するかどうか


それから、DataGridView上で数値を文字列で扱っていると、ヘッダーをクリックして昇順/降順にソートすると正しく数字の大きさ順でソートしてくれません。
なのでファイルサイズはLong型に変換してからDataGridViewに入力した訳です。

下記の記事のような方法もあるようですが。。

DataGridViewの行の並び替えの方法を変更する: .NET Tips: C#, VB.NET

ADO.NET入門記-031 (DataTableにて文字列値の列を数値ソートする) - いろいろ備忘録日記

プロジェクトデータと実行ファイル


Googleドライブにアップしました。ライセンスはMITです。

MyTool_FolderSizeCheck_DataGridView.zip - Google ドライブ

binフォルダの中にexeが入っています。