PowerShellでCSVファイル編集
労働中に、大量のCSVファイルを作る必要があった。
行、列を微妙にずらしながら、値を変えていくにはどうしたら良いか。
私はシェルスクリプトを良く触るので、Linuxコマンドでどうにかできないかまず考えた。
結論から言うと、CSVファイルからデータを抜き出すことはできても、行列を指定した値の編集には向いていないようだった。
抜き出し方はいろいろあるが、どれも1行ずつファイルを読み込み、区切り文字を指定して列の値を取得する方法になる。
CSVファイルの列数が少ない場合は、以下はおすすめ。
while IFS=, read C1 C2 C3 do echo "1列目は"${C1} echo "2列目は"${C2} echo "3列目は"${C3} done < ${csv_file}
行番号の指定はできないので、ループ回数をカウントアップしていく必要がある。
で、任意の行の任意の列の値を取得したところで、これを編集する術がわからなかった。
あるとしたら、取得した値と編集後の値に区切り文字を付与し、1からファイルに書き出していくことになるだろう。
そんなやり方では処理が遅そうだし美しくないし、別の方法を考えた。
それは、PowerShellを用いる方法である。
# CSV読み込み $csv_data = Import-Csv $before_csv -Encoding Default -Header @(1..3) # 1行目の「1」列の値をhogeに変換 $csv_data[1].1 = "hoge" # CSV出力 $csv_data | Export-Csv -NoTypeInformation $tmp_csv -Encoding Default # CSVフォーマット調整(ヘッダ削除、ダブルクォート削除) Get-Content $tmp_csv | Select-Object -Skip 1 | foreach { $_ -replace '"', '' } | Out-File -FilePath $after_csv -Encoding Default
コマンドレット Import-Csv を用いて、CSVオブジェクトにCSVファイルのデータをインポートする。
その後は、行と列を配列のように指定して、値を取り出したり、値を代入したりできる。
そのままではPSオブジェクト上のデータが書き換わっただけになるので、編集後は
コマンドレット Export-Csv を用いてファイルに出力する。
CSVオブジェクトには、必ずヘッダが必要らしい。
ヘッダつきのCSVファイルを用いる場合は気にしなくて良いが、ヘッダがない場合は -Header オプションで列名を指定する。
@(1..3) で、1~3の数字を列名として順番に指定できる。
ここでヘッダを付与したため、Export-Csv でファイル出力した際、ヘッダも含めて出力されてしまう。
そのため、一度ファイル出力したあとに、わざわざヘッダを削除している(Select-Object -Skip 1)。
さらに、すべての値がダブルクォーテーションで囲われてしまうので、 文字列置換をしてダブルクォーテーションを削除(foreach { $_ -replace '"', '' })。
…あまり美しくはない。
けれど、オブジェクトを介して非常に簡易に値の編集ができるのはすばらしい。
以上。
Linuxコマンドでバイナリファイルを文字列置換
フォーマットに沿ったバイナリファイルを作った!
よし、これでテストができるぞ!
と思ったつかの間、フォーマットの認識を一部間違えていて、
まともにテストができない状態になってしまった。
すでにデータはすべて作り終え、テスト用の環境に配置し終えた後。
バイナリエディタで手作業で直していくのは現実的ではない。
労働先のPCなので勝手に便利ツールなどもインストールできないし、
どうしたものかと考える。
今回の自分のミスは、以下のような状態だった。
・バイナリファイルに誤って書き込んだ値がわかっている
・訂正後の値もわかっている
・その値は12バイトなので、ファイル内の関係ない箇所と値は重複しない
そのため、文字列置換を実施できれば御の字。
実施内容は以下の通り。
1.xxd でバイナリファイルを16進数でダンプし、テキストとして扱えるようにする。
2.sedで文字列置換を行う。
3.xxdで置換後のテキストを再びバイナリ化する。
4.バイナリデータをファイル出力。
xxd -p -g 0 -c 100000000000000 before.bin | sed s/${before}/${after}/g | xxd -p -r > after.bin
1.xxd でバイナリファイルを16進数でダンプし、テキストとして扱えるようにする。
xxd -p -g 0 -c 100000000000000 before.bin
- p で、プレーン形式でダンプできる。
バイナリエディタの左隅に表示される、行頭のアドレスみたいなのを表示させない。
- g で、バイトごとに空白をいれるか指定。0指定なので、空白無し。
- c で、1行に表示させる桁数を指定。
デフォルトは16、最小1、最大256らしいが、-pを併せて設定することで256より大きな値を設定できるという裏技を見つけた。
これで、バイナリファイルの中身を16進数一行のテキストとして扱えるようになった。
2.sedで文字列置換を行う。
sed s/${before}/${after}/g
${before}の文字列を${after}へ置換。
わざわざ一行のテキストに整形したのは、空白や行端が混じって、${before}が見つけられなくなる可能性があるため。
3.xxdで置換後のテキストを再びバイナリ化する。
4.バイナリデータをファイル出力。
xxd -p -r > after.bin
- r で、16進ダンプをバイナリに変換。
ダンプ時に-p をつけた際は、バイナリ変換時にも-pが必須。
実際には、以下のようなシェルスクリプトを作成し、テスト環境下のデータを一気に変換していった。
置換前と置換後の文字列の組み合わせ一覧をテキストファイルにまとめ、
テスト用の環境の中から変換対象のバイナリファイルををfindで探し、
xargsで最初のxxd(16進ダンプ用)に渡す。
テキストを読み込み、置換対象の文字列を順番に探す。
以上。
Unity上でVRMモデルを動かす
モデルをVRM形式にエクスポート
以前の記事でモデルを作るところまではできたので、今度はモデルをUnityに取り込み、動かしてみるところまで進めていきます。
まず、VroidStudioの 撮影・エクスポート > エクスポートを選択。タイトル欄や作者欄を入力し、「OK」ボタン押下すると、指定したフォルダに [タイトル].vrm の形式でモデルが出力される。
これをUnityに取り込んでいく。
UnityにUniVRMをインポート
Unity上でVRM形式のファイルを扱うには、「UniVRM」というパッケージが必要になる。githubから、UniVRMのunitypackageをダウンロードする。
Unityで新規プロジェクトを作成し、メニューバーから Assets > Import Package > Custom package と進み、先ほどダウンロードしたunitypackageを選択。unitypackage内のすべてのファイルにチェックが入っていることを確認し、「import」ボタン押下プロジェクトウィンドウを見ると、Assets配下に「VRM」のディレクトリが生成されていることが確認できるはず。
Unityにモデルをインポート
VroidStudioからエクスポートしたVRMファイルを、プロジェクトウィンドウ上のAssetsディレクトリにドラッグアンドドロップ。少し待つと、VRMのファイル名に関連するいくつかのファイルがAssetsディレクトリ上に生成される。VRM本体や、マテリアルファイル、テクスチャファイルなど。
その中に、「[タイトル].prefab」が存在する。このprefabをヒエラルキーウィンドウにドラッグアンドドロップすると、シーンウィンドウにモデルが出現する。
これで、UnityにVRM形式のモデルを取り込むことができた。
アニメーションをつけて動かす
このままだとTポーズのモデルが佇むだけなので、何かアニメーションをつけて動かしてみよう。何を使用してもいいのだが、私は下図のフリーパッケージを使用することが多い。
Assets Storeから「Idle MoCap」をインポートすると、Assets配下に同名のディレクトリが生成される。
ヒエラルキーウィンドウでモデルのprefabを選択すると、インスペクターウィンドウにモデルに付与されているさまざまな属性が表示される。その中の「Animetor」を見ると、ContlloerがNoneになっているはず。
Contlloerは、プロジェクトウィンドウ上の任意の箇所で右クリックし、Create > Animator Controller を選択し、空のContlloerを作成する。Contlloerをダブルクリックすると、Animatorウィンドウが開く。
Animatorウィンドウの網掛けになっている部分で右クリック、Create State > Emptyを選択。網掛け部分に新たに追加されたオレンジ色のStateを選択し、インスペクターウィンドウを開く。
Motion欄の右側にある丸いボタンを押下すると、先ほどインポートした「Idle MoCap」に含まれているモーションが一覧表示される。お好みのモーションを選択する。今回は「Nod_Straight」に。
最後に、もう一度モデルのインスペクターウィンドウを表示し、AnimatorのContlloerに先ほど作成したAnimator Contlloerを設定する。
あとはカメラの向き等を調整し、再生すると、モデルが指定したモーションで動く。
以上。
VS2017でVC++新規プロジェクト作成すると発生する文字コード関連のエラー
文字コード関連のエラー
自宅でC++を触ってみたときのこと。 Visual Studio2017を起動し、Visual C++Windowsコンソールアプリケーションの新規プロジェクトを作成。 ひとまず、coutでコンソールに文字列を出力してみるかと、ざざっとコードを記述。
#include "stdafx.h" #include <string> #include <iostream> using namespace std; int main(){ string name = "枝豆太郎"; cout << "名前は " << name << "です。" << endl; return 0; }
ビルドすると……何かエラーが発生している。
「定数が2行目に続いています。」 「構文エラー:';'が○○の前に必要です。」
これだけシンプルなソースコードに、コーディングミスがあるわけもない。
「ファイルをUnicode形式で保存してください。」と警告が出ているので、文字コードあたりが悪いのだとはわかる。 Visual Studio2017でファイルの文字コードを変更する方法を調べたところ、2015等は勝手が変わっていたようだった。
エンコードして保存
ファイル > 名前をつけて○○を保存 を選択。 ファイル保存ダイアログの右下に、ファイルの保存方法に関するプルダウンが存在している。 「エンコード付きで保存」を選択すると、エンコードの種類の一覧が表示される。 デフォルトだと「Unicode(UTF-8 シグネチャなし)」が選択されているので、一覧の上の方へ遡り、「Unicode(UTF-8 シグネチャ付き)」を選択して上書き保存。
再度ビルドするとエラーはなく、無事デバッグ実行ができた。
シグネチャはBOMのことで、BOM付きUTF-8で保存すれば動くとわかった。 今回はC++単独でしかも個人開発なのでいいのだが、やぱりUTF-8で統一したいところだ。
おまけ
ちなみに、上記のソースコードだと文字列表示後にコンソールがすぐ閉じてしまうので、returnの前にgetchar();を追加すると、キー入力があるまでコンソールを開いたままにしてくれる。
以上。
VroidStudioでモデル作成
はじめに
労働先で少しだけUnityを触ったので、興味を持っていた顔検出技術と組み合わせて何かできないかなと考えたとき、VTuberの仕組みのようなものを作れるのではないかと考えました。
まずはモデルを作る工程について、記録に残します。
Vroid Studio
初心者でも簡単にモデルを作れないか調査したところ、Vroid Studioが良さそうだとわかりました。
Vroidでは、すでにヒトガタのモデルが用意されていて、各部位のパラメタを変更することで独自のモデルを作成できます。
ペンタブを使用するとさらに自由度が上がりますが、私はトラックボールマウスで操作し、自分好みの女性モデルを作成しました。
従来のモデル作成では、専門的な知識とそれなりのスペックのマシンが必要でしたが、Vroidは非常に単純にモデル作成可能で軽量なアプリです。
先ほどのURLからVroid Studioをダウンロードし起動すると、「サンプルモデル」が数体表示されます。
「あなたのモデル」の+ボタンを押下すると、12ミリくらいの坊主頭のヒトガタモデルを元に作りこんでいけます。
「サンプルモデル」の「Sendagaya_Shibu」さんが好みに近いので、今回はこの方をベースに改変を加えていく方針にします。
顔編集 → すべて → パラメータ
ここから、画面右側にある顔各部位のパラメタを調整すると……
こんな風に顔つきが変化します。
私は少しつんとした表情の女性が好みのため、目をつり気味にしました。
この後は、配色や髪型、衣装や体型を調整していきます。
目の色変更
目の色変更は、全面的にこちらの記事を参考にしました。
顔編集 → テクスチャ → 目 の順に辿り、「デフォルト画像」を表示させた状態で+ボタンを押下すると、レイヤーが追加されます。
デフォルトの目画像の上から、新しい色を重ねていきます。
色を塗る際は、右上にあるボタンを押下して「ミラーリング」の設定にしておくと、左右対称に作業ができるのでおすすめです。
ぺたぺたと色を塗るため、ペンタブがあるとより細やかな表現が可能になります。
こういった場面では、配色に悩みがちです。
私はこちらのサイトを活用し、いい感じにおしゃれな配色を探して、その色をベースにモデルの色変更を行っています。
「探索」タブの検索欄に、今回は「水色」を入力して検索しました。
トーン等がきれいに統制された、バランスのいい数色のセットがいくつも表示され、カラーコードも取得できます。
アイラインやまつげ等も、先のカラーコードに併せて色を変更しました。
肌の色変更
続いて、肌の色を変更します。
といってもベースとなる肌の色は特に変えず、チークやハイライトなどを追加して、立体感を付与します。
ブラシの「不透明度」は1がおすすめです。
目の場合は、完全に新しい色を重ねていきましたが、このようなお化粧の場合は、うっすら肌が透けている方が不自然無くなじみます。
右側のテクスチャ画像上で、頬らしい箇所にピンク色を重ねてチークを表現します。
ハイライトは、Tゾーン(眉上、眉間、鼻筋、顎先)と頬の一番高い場所に、白色を重ねます。
(これもレイヤーを追加して作業した方が良かったのですが、失念していました。)
なんとなく、顔立ちが大人っぽくなりました。
髪型変更
髪型は、デフォルトでついているヘアアクセサリーを外し、代わりに前髪を増やします。
髪型編集 → デザイン
矢印ツールでヘアアクセサリーを選択すると、画面左側の「ヘアーリスト」で選択対象がどのグループに属しているかがわかります。
ヘアアクセサリーは「手描きグループ5」に属していました。
「ヘアーリスト」の「ヘアー」は、一つ一つがレイヤーのような扱いで、表示非表示を切り替えられます。
今回は、「手描きグループ5」ごと非表示にします。
ヘアアクセサリーを非表示にすると、向かって右側の額が妙に目立ってしまうので、前髪を追加します。
ブラシツールで前髪を手描きしても良いのですが、個人的に髪の扱いが未だ下手なので、既存の前髪を複製して、位置を調整する方針にしました。
「手描きグループ4」の前髪を複製し、制御点を編集して位置を調整します。
複製元の「ヘアー」を右クリックするとコンテキストメニューが表示されるので、そこで複製を選択すると、複製が可能です。
複製した髪は、複製元とぴったり重なる位置に表示されます。
制御点編集ツールで、任意の位置まで制御点を移動させると、髪自体もその制御点に従って移動します。
無事に前髪を追加した後は、追加した前髪のボーン設定を行います。
ボーン設定では、モデルが動いた際の髪の揺れ方を設定できます。
髪型編集 → 揺れもの
先ほど追加した前髪一つ一つを選択し、「ボーングループを作成」を押下します。
まとめて選択して一つのボーングループを作成してしまうと、おそらくまとめて揺れてしまうので、手間ですが、それぞれ独立したボーングループとします。
ボーングループを選択すると、右側でボーン設定が可能になります。
付近の前髪を真似して、同じような値でパラメタを調整します。
その他
特に解説はしませんが、「体型編集」「衣装編集」で、体型と衣装を編集します。
少し身長を高くし、ほっそりしたOL風にしてみました。
完成
か、かわいい~~!
次回は、このモデルをUnityに取り込んで動かしてみる工程に入ります。
以上。
はじめに
はじめまして。
私は零細IT企業で労働する、システムエンジニアです。
文系大学院に在籍していましたが、卒業後未経験で現在の労働先に入社しました。
文化とか教養とかにあぐらをかく専攻分野に嫌気がさし、少なくとも将来性があり、比較的容易に手に職をつけられるこの業界に魅力を感じたためです。
労働先検討期間中に感じた魅力は、数年経過した現在もそれなりに光ったり曇ったりしながら存在し続けています。
この業界での労働の面白さは、手軽にモノづくりが体験できることです。
想定通りにプログラムが動作した喜び、上手く動作しなかった悔しさは、毎日のように発生します。
その中で、もっとこの技術に強くなりたい、労働先では触る機会のないあの技術を扱ってみたい、といった気持ちがわき、時折自宅でもプログラミングをするようになりました。
いまいち方向性を考慮しないままブログを開設してしまいましたが、基本的にはIT関連を中心に、トライしてみた内容の記録を残していこうかと思っています。
以上。