読者です 読者をやめる 読者になる 読者になる

ほげほげー

C#メインで困ったことや面白く感じたことをメモしていきます。

Visual Studio 2015 と Unity と

Visual Studio 2015 が Go Live になってもう結構経ちますね。

まぁでもどうせ Unity では C# の新機能使えないしなー関係ないね。
なんてことは無くて、今回の C# 6.0 で追加された機能は割とUnityでも使えちゃいます。

何故使えるのかは後述するとして、今回は Unity で C# 6.0 を使う方法を簡単にまとめていきたいと思います。

はじめに

C# 6.0 について知らないと話にならないですね。
詳しくは他のサイト見て頂くのが早いとは思いますが、一応簡単にまとめておきます。

それぞれの和訳は他のサイトに倣っています。(タブン)

C# 6.0

Null条件演算子(Null-Condition Operator)

昔はNull伝搬演算子(Null-Propagation Operator)と呼ばれていたヤツです。*1

. の代わりに ?. を使う事でnullチェックを行った上でメソッドやプロパティの呼び出しができるようになりました。
言葉で説明しても分かりにくいと思うので、コードを見てみましょう。

// 従来
if (hoge == null) return null;
return hoge.Hoge();

// C# 6.0
return hoge?.Hoge();

これらがほぼ同義になります。
元の変数がnullならそれが伝搬してnullを返却するようになります。

自動実装プロパティ初期化子(Auto-property initialization)

今までプロパティの初期化はコンストラクタ内で値をセットするか、
または private field を別途用意して予め値を入れておく必要がありました。

C# 6.0 ではそれがフィールドと同じように簡単に書けるようになりました。

これもやっぱりコードで。

まずは初期値を設定したプロパティ。

// 従来
private string _hoge = "default";
public string Hoge
{
    get { return _hoge; }
    set { _hoge = value; }
}

// もしくは
public string Hoge { get; set; }
public Constructor()
{
    Hoge = "default";
}

// C# 6.0
public string Hoge { get; private set; } = "default";

次に getter のみの自動実装プロパティ。

// 従来
public string Hoge { get { return _hoge; } }
private readonly string _hoge = "hoge";

// C# 6.0
public string Hoge { get; } = "hoge";

定型的で面倒くさいコードが若干シンプルになりますね。

本体が式の関数メンバ(Expression-bodied function members)

もっといい感じな言い回しは無いかしら。
名は体をちゃんとしっかり表現していますが。

さて、これは本体が1つの式で書ける関数、及びプロパティに利用可能な記法です。

コードを見て行きましょう。

// 従来
public string Hoge
{
    get { return Request["hoge"]; }
}

// C# 6.0
public string Hoge { get; } => Request["hoge"];

さっきの 自動実装プロパティ初期化子ラムダ式になっただけです。
が、これは関数にも適用可能なので若干違いますね。

また、自動実装プロパティ初期化子 ではプロパティに設定したインスタンスが保持されますが、
本体が式の関数メンバでは呼び出す度に記述した処理が実行されるので、
評価が一度で済むものに関しては前述の自動実装プロパティ初期化子を使うように。

そもそも役割が違いますし。

nameof 演算子

コード見たら一瞬。

// 従来
var className = "HogeClass";
var propertyName = "HogeProperty";
var fieldName = "hogeField";
var methodName = "HogeMethod";

// C# 6.0
var className = nameof(HogeClass);
var propertyName = nameof(HogeProperty);
var fieldName = nameof(hogeField);
var methodName = nameof(HogeMethod);
  1. typo の心配がなくなる
  2. Refactor による変更でいっしょに変わる
  3. コード解析の対象になる

シンプルなメリット。

文字列の挿入

スクリプト系の言語では割とよくある文字列内での式展開です。

今まではstring.Formatを使っていましたが、挿入箇所と挿入する変数の場所が離れるため、可読性に難がありました。

これを専用の構文を使うことで文字列内に直接挿入することが出来るようになるので、
積極的に利用していきたいですね。

// 従来
return string.Format("'{0}': '{1:D3}'", hoge.Key, hoge.Value);
return string.Format("'{0}': '{1}'", "key", dic["key"]);
return string.Format("{0}{{0}}", "hoge"); //=> "hoge{0}"
return string.Format(@"{0}
{1}", one, two);

// C# 6.0
return $"'{hoge.Key}': '{hoge.Value:D3}'}"; // フォーマット指定可能
return $"'key': '{dic["key"]}'}"; // 文字列リテラルも埋め込み可能
return $"{"hoge"}{{0}}"; // エスケープの仕方は同じ
return $@"{one}
{two}";

間には式も入れる事ができるので、単純な式は入れてみてもいいかも。

using static

static class を using することでクラス名を省略できるようになりました。

// 従来
System.Console.WriteLine("hoge");

// C# 6.0
using System.Console;
~ 中略 ~
WriteLine("hoge");

アナライザー

こいつ。

f:id:tyhe:20150610225751p:plain

Roslynを使ってコード解析したり整えたり定型的な何かを実施したり。

を、自前で実装することが出来るっぽいヤツです。

今まで挙げた機能の中で一番の目玉ですが全く調べて無い上に
それだけで記事がひとつ書けちゃうレベルな気がするので今回は紹介だけ。

具体的にはこんなの(from neuecc 先生)

www.slideshare.net

その他

めんどくさくなったので後は目次だけ。

インデックス初期化子

拡張メソッドのAddでコレクションを初期化

何故 C# 6.0 が Unity で使えるのか

今回導入された機能は全て今までの書き方を楽にするための糖衣構文なだけ、だからです。

つまり、コンパイル時に暗黙的に何らかの型に置き換わったり、
はたまた生成される中間言語に新しい命令が加わって居たり、
などということは無く、出力される中間言語としては今までと何ら変わらないからです。

ちなみに async/await も同様なので、async/await が使いたい方はこちらの記事も併せてお読み下さい。

[http://tyheeeee.hateblo.jp/entry/2016/04/05/Unity%E3%81%A7%E3%81%AE%E9%96%8B%E7%99%BA%E3%81%A7%E3%82%82_async/await%E3%82%92%E4%BD%BF%E3%81%8A%E3%81%86:embed:cite]

本題 Unity で C# 6.0 を使う

ようやく本題です。

Unity で C# 6.0 を使うには

C# 6.0 を使うには、Unity が生成するソリューション・プロジェクト内ではなく、
外部プロジェクトとしてプロジェクトを作り、そこで開発をします。
そのプロジェクト内に限り、C# 6.0 は利用可能です。

開発したものを使うには、ビルドして生成された dll を

/project/Assets/Dlls

配下に入れるだけです。

こうすることで、Unity が生成するソリューション・プロジェクト内から参照可能になります。

以上デス。(本題短い)

また何か思いついたことがあれば追記するかも。

次の記事は VS2015 と Unity を組み合わせた場合の落とし穴 の予定。

嘘つきましたすみません><

*1:個人的にはこっちの方がしっくり来るんですが。

株式会社はてなに入社しました

株式会社はてなに入社しました

株式会社はてなに入社しました - hitode909の日記

Visual Studio Tools for Unity のつかいかた。

Unity 5がリリースされました。
それに伴い、ほとんどの機能が無料で利用できるようになりました。

早速家のパソコンに入れて使ってみようという方も多いのでは無いでしょうか?

そこで、Windows環境に限った話とはなりますが Visual Studio Tools for Unity の簡単な紹介をしていきます。つかいかたとか言いつつほぼほぼインストールの仕方ですが、そこが必要なんだ、そこという方はどうぞ。

本題に入る前に

Visual Studio 使いたくない方

お帰りください。

Visual Studio 使ってみたいけど持ってないよ!な人

ついこの間までは拡張機能のインストールが出来なかったので使えなかったのですが、先日 Visual Studio Community の提供が開始され、それにより無償でProfessional相当の機能が利用できるようになりました。

Professional相当ということはつまり拡張機能のインストールが出来ます。何はともあれインストールしましょう。これさえあればなにもいらない

ダウンロードはこちらから。

Visual Studio Community 2013 - Visual Studio


本題

Visual Studio Tools for Unity とは?

(面倒なので以下 VSTU) Unityのプロジェクトは通常のVisual Studioでは扱えない形式ですが、
それをVisual Studioを使ってプロジェクト管理できるようにする拡張機能です。

ただし、それだけではなく、Visual Studioからデバッグが出来るようになったりとかなんとか。
割といろいろあるようで。
詳しくはコチラ

Visual Studio Tools for Unity

インストールする

まずはここからインストール済みのVisual Studioに対応したVSTUをダウンロードします。

Visual Studio Tools for Unity | MSDN

Visual Studio と Unity が起動済みの場合は閉じます。
そしておもむろにダブルクリックして指示に従いインストールします。
何事もなくインストールが完了するかと思います。

Unity で VSTU のパッケージをインポートする

VSTUをインストールしたからと言って何もせずにUnityから連携できるわけではありません。
使うためにはプロジェクトごとに VSTU のパッケージをインポートする必要があります。
既存のプロジェクトに機能を追加する場合は以下の手順を実施してください。

インポート方法は、メニューバー
Assets > Import Package > Custom Package
から。

f:id:tyhe:20150423001314p:plain

これで少し待つ(待てない方はUnityを再起動する)とメニューバーに Visual Studio Tools の項目が!
後はそこでGenerate Project FilesをしてからOpen in Visual Studioをすると、Visual Studio で Unity のプロジェクトが触れます。
ついでに File > Build Settings... で Script Debugging にチェックを入れておきましょう。

f:id:tyhe:20150306001930p:plain

また、新規でプロジェクトを作成する場合は [Asset packages...] で Visual Studio 2013 Tools を選択してからプロジェクトを作成してください。

f:id:tyhe:20150423001607p:plain

f:id:tyhe:20150423001617p:plain

これで Visual Studio を使ってゲーム開発ができます。
外部DLLのデバッグも可能になります。
他にもUnity ならではの機能も Visual Studio に追加されているので色々使ってみてはいかがでしょうか!

とらぶるしゅーてぃんぐ

なんかうまくうごかなくなった

なんかへん

あばばばばばば

慌てずに VSTU の最新版インストーラーをダウンロード、起動して Repair してみましょう。

ファイル移動したら||名前変えたらmetaが再生成されたかなしみ

Unity上で操作しましょう。

なんか警告なはずなのにエラーになってる・・・

ReSharperが入ってると起こりやすいようです。
Unityを再起動すると大抵治ります。

再起動が面倒な方は Build Settings > Player Setting からDefine Symbolsに文字を入れてフォーカスを外すなどして強制的に解析させると動くことがあります。

f:id:tyhe:20150306002156p:plain

Visual Studio上だとコンパイルできるのにUnityでコンパイルできない!

ユニティちゃんは型推論がうまく出来なかったり複雑なラムダ式を上手く理解できないことがあります。
そんな時は優しく型を指定してあげるときっと喜んでくれますよ。

ユニティちゃんライセンス

このコンテンツは、『ユニティちゃんライセンス』で提供されています

C#で作られたプログラムをデコンパイルしてみよう

この記事はC#アドベントカレンダー2014の15日目の記事です。

C# Advent Calendar 2014 - Qiita

デコンパイルとは

大雑把に言うと、コンパイルされたプログラム(exe, dllなど)から、元のコードを復元する行為のことです。

特にC#Javaの様に中間言語に翻訳された状態でコンパイルされるような言語の場合は
元のコードにかなり忠実に復元されます。

本記事ではC#に限らず、.NETに関わる言語全般のデコンパイルをする方法を書いていきます。*1*2

中間言語(IL)

C#(や、VB.NETなど)では、コンパイル時に直接ネイティブコードにするのではなく、
一旦中間言語(以下、IL)という形にし、実行時にネイティブコードを生成するJITコンパイル方式を採用しています。
事前コンパイルという手段も用意されていますが基本的にはILを出力します。

f:id:tyhe:20141214230923p:plain

ところで、ネイティブコンパイルをしないということは、JITコンパイラが存在する環境でさえあれば、
実行する環境を選ばないというメリットがあります。

今まではWindows環境で実行されることが殆どだったのであまり気にするする機会はありませんでしたが、
最近のDocker隆盛も相まって、Linux環境で実行する機会も増えており、
遂にJITコンパイル形式の強みが本当の意味で生かされることになりそうです。

閑話休題。ILはバイトコードのため、そのままでは人間が読む事ができませんが、
Visual Studioに付属しているildasm.exeを使うことでアセンブリ言語を高級にしたような形式で確認することができます。

アセンブル:IL(バイトコード)から人が読める形のILへ

本題のデコンパイルに入ります。 まずはIL(バイトコード)から人が読める形に出力する、逆アセンブルについての紹介です。

ildasm.exe

先ほど挙げたVisual Studioに付属している逆アセンブラー。
dllやexeに対して使用する事でILをテキストとして出力できます。

ildasm.exeはSDK内に存在しています。

C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin
C:\Program Files\Microsoft SDKs\Windows\v7.0A\x64\bin
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\x64\bin

試しに起動してみるとこのようなウィンドウが表示されます。

f:id:tyhe:20141214024228p:plain

今回はGUIで操作をしますが、コマンドラインからも実行できるので、一括で処理したい場合などはそちらをご利用ください。

Ildasm.exe (IL 逆アセンブラー)

それでは試しに適当なコードを書いてコンパイルしたものをildasm.exeに通してみましょう。

namespace Hogehogee
{
    public class SampleClass
    {
        public string HelloHogehoge(string[] args)
        {
            var word = args[0];
            return string.Format("Hello {0}", word);
        }
    }
}

これを作成してDebugビルド。生成されたdllを先ほどのウィンドウで開いてみましょう。

すると以下の様に展開されます。

f:id:tyhe:20141214024808p:plain

上から順に名前空間、クラス名、クラス情報(.class)、コンストラクタ情報(.ctor)、HelloHogehogeメソッドの情報です。
それぞれをダブルクリックすることで中身をさらっと見ることができます。*3

クラス名の配下にある情報について見ていきます。

まずは.class。

.class public auto ansi beforefieldinit Hogehogee.SampleClass
       extends [mscorlib]System.Object
{
} // end of class Hogehogee.SampleClass

普段あまり気にしませんが、ちゃんと仕様通りSystem.Objectが暗黙的に継承されている事が見て取れます。

次に.ctor。

.method public hidebysig specialname rtspecialname 
        instance void  .ctor() cil managed
{
  // コード サイズ       7 (0x7)
  .maxstack  8
  IL_0000:  ldarg.0
  IL_0001:  call       instance void [mscorlib]System.Object::.ctor()
  IL_0006:  ret
} // end of method SampleClass::.ctor

こちらも暗黙的に基底クラス(System.Object)のデフォルトコンストラクタが呼ばれている事がなんとなくわかります。
C#の仕様で、スーパークラスのデフォルトコンストラクタが暗黙的に呼ばれるという仕様通りです。

最後にHelloHogehogeメソッド

.method public hidebysig instance string 
        HelloHogehoge(string[] args) cil managed
{
  // コード サイズ       21 (0x15)
  .maxstack  2
  .locals init ([0] string word,
           [1] string CS$1$0000)
  IL_0000:  nop
  IL_0001:  ldarg.1
  IL_0002:  ldc.i4.0
  IL_0003:  ldelem.ref
  IL_0004:  stloc.0
  IL_0005:  ldstr      "Hello {0}"
  IL_000a:  ldloc.0
  IL_000b:  call       string [mscorlib]System.String::Format(string,
                                                              object)
  IL_0010:  stloc.1
  IL_0011:  br.s       IL_0013
  IL_0013:  ldloc.1
  IL_0014:  ret
} // end of method SampleClass::HelloHogehoge

ちゃんとしたコードが書かれるともうILについてちゃんと知らないと何が何やら。
しかしなんとなく"Hello {0}"文字列を使ってstring.Format()を呼び出している様に見えます。
そしてなんとなくですがwordって変数っぽいものが見えます。*4

なんとなーくわかりますね。ただ、C#のコードからはかなり程遠いものが出てきます。
ILの仕様を理解しないと、たったこれだけでも割と四苦八苦してしまいそうです。
実際のプロダクトのコードを全部ILで読もうとしたら辛さしかありません。

しかし、後述するように、C#のコードそのものを復元するデコンパイラも開発されていますので、
コードからは読み取れないような謎の動きを解析する場合以外はこちらを使うことはあまり無いかもしれません。

LINQPad

少し趣向は違いますが、LINQPadでも人が読める形式のILを確認することができます。

こちらはdllやexeをデコンパイルするのではなく、コードを書いて、それによって生成されるILを確認する事ができます。

当ブログでも過去に少しだけ使っているのでそちらを見て頂ければと思います。

ItemクラスにIndexerが存在出来ない理由がILを眺めるとわかります。*5

C#におけるIndexer詳説(ポロリもあるよ!) - ほげほげー

ILを確認する以外の超絶便利な使い方はアドベントカレンダー 6日目の
takeshik せんせーの記事をご参照ください。

今日からはじめる LINQPad - TAKESHIK.ORG

デコンパイル:IL(マシン語)から元のコードを復元

さて、ここからが本記事の本題です。

前述のように、人に読める形でILを出力してくれるのもそれはそれで便利ですが、
やはり通常のC#のコードとして読めたほうが早いし嬉しいですよね。

そこで、ILを解釈してC#のコードを出力してくれる素敵なデコンパイラの出番です。

.NET Reflector に始まり dotPeek, ILSpy, etc...

大体の場合はこれらを使うことでかなり読みやすいコードが出力されます。
変数名の情報(誤ってDebugビルドで提供されていない限り)は残っていないので、
str1, str2などとなりますが、それは仕方ないので我慢しましょう。

以下にいくつかのデコンパイラを記載しますので、色々試してみて頂ければと思います。

.NET Reflector

以前はこちらが無償提供されていたのでこれ一択でした。

豊富なプラグインがあり、今でも愛好家が多いようです。

2011年の3月に有償化され、気軽には使えなくなりましたが、
その際いくつかの競合プロダクトが無償化、公開されました。

以下にそれら競合プロダクトを挙げていきます。

dotPeek

Free .NET decompiler :: JetBrains dotPeek JetBrains社製のデコンパイラReSharperに付属していて、定義へ移動する際にdotPeekを通してデコンパイルしたものを表示したりしてくれます。

UIがVisual Studioライクでかなり馴染みやすいのではないでしょうか。

ILSpy

ILSpy

MITライセンスで公開されているオープンソースです。

スタンドアロンで利用できるため、普段はもっぱらこちらを利用しています。

試しに最初に作ったdllをこれを使ってデコンパイルした結果を載せておきます。

// Debug ビルド版
using System;
namespace Hogehogee
{
    public class SampleClass
    {
        public string HelloHogehoge(string[] args)
        {
            string word = args[0];
            return string.Format("Hello {0}", word);
        }
    }
}
// Release ビルド版(pdbファイル有)
using System;
namespace Hogehogee
{
    public class SampleClass
    {
        public string HelloHogehoge(string[] args)
        {
            string word = args[0];
            return string.Format("Hello {0}", word);
        }
    }
}
// Release ビルド版(pdbファイル無)
using System;
namespace Hogehogee
{
    public class SampleClass
    {
        public string HelloHogehoge(string[] args)
        {
            string arg = args[0];
            return string.Format("Hello {0}", arg);
        }
    }
}

Release ビルドでpdbファイルが削除されたもの以外では暗黙的に付与されるusing System;が明示されただけで
最初に書いたものとほぼ同等のものが出力されました。

非常に便利ですね。

ここまで見事に戻されると、センシティブな情報をコード内に埋め込むことは非常に怖い、
という所も容易に理解できるかと思います。

プログラムを提供する際にはお気をつけ下さい。

その他

Telerik JustDecompiler free .NET decompiler

CodeReflect Free .NET Decompiler

まとめ

オープンソースなプロダクトも増えてきているので活用の機会は多少減っていますが、
まだまだ.NETでクローズドなプロダクトを扱うことは多々あります。むしろそのほうが多いですよね。

その際には規約を良く読み、問題が無ければじゃんじゃん使っていきましょう。
勉強にもなりますしね。

今回は取り上げていませんが、VB.NETの生成物からC#C#の生成物からVB.NET、F#の生成物からC#なんてことも出来ますので、
興味があればお試しください。
F#をC#VB.NETに変換すると、F#がどのようにしてパターンマッチを実現しているのかが分かったりして面白いですね。

明日は「oika」さんです。よろしく!

*1:デコンパイルによるリバースエンジニアリングが禁止されているアプリケーションには使用しないようにしましょう

*2:EUでは法的に何があろうとデコンパイルOKらしい? 逆コンパイラ - Wikipedia http://ja.wikipedia.org/wiki/%E9%80%86%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9

*3:DUMPもできますが今回は取り上げません

*4:今回はDebugビルドだったのでメソッド内で宣言した変数名の情報が残っています。興味がある方は試しにReleaseビルドにして結果の違いを確認してみてください。

*5:MSDNにもしれっと書かれていましたが

連続したデータを纏める処理の実装が面白そうだったので試してみた

こんな話題が見えたので自分も試してみた。

ちょっと無理矢理感あるけどなんとか出来た気がしないでもない。
もっと上手いやり方無いかしらんー。

Azureの仮想マシンへリモートでコマンドを投げる

Azureの仮想マシンでPSRemotingによる接続をする場合、SSLでの接続が必要なので証明書のインストールが必要です。
SSLでの接続はムッシュせんせーが書いて下さってたのでご参照くだされー。

Azure 仮想マシンに 5985 を使用して PowerShell で接続 | SE の雑記

久々に触ると手順を毎回忘れるので覚書。

仮想マシンを作成する

# Add-AzureAccount
Select-AzureSubscription -SubscriptionName $subscriptinName
Set-AzureSubscription -SubscriptionName $subscriptinName -CurrentStorageAccountName $storageAccountName

$imageName = (Get-AzureVMImage| `
    where Label -Like "*Windows Server 2012 R2 Datacenter*" | `
    sort PublishedDate -Descending | `
    select -First 1).ImageName

New-AzureVMConfig -Name $vmName -InstanceSize Small -ImageName $imageName | `
    Add-AzureProvisioningConfig -Windows -AdminUsername $userName -Password $password | `
    New-AzureVM -Location "Japan West" -WaitForBoot -ServiceName $serviceName

証明書をインストールする

念のため2種類の手順を書いておく。

その1:ブラウザ経由

Chromeでのやり方。
ChromePowerShellのポートを指定して開く。

f:id:tyhe:20141015010945p:plain

鍵マークをクリックして証明書の詳細を表示する。

f:id:tyhe:20141015012041p:plain

詳細タブでファイルにコピーボタンをクリックする。

f:id:tyhe:20141015013103p:plain

証明書のエクスポートウィザードが立ち上がるので「次へ」を連打。
保存するパスを指定して次へ。そして完了。

C:\Users\user\Desktop\hoge.cer

保存したcerファイルをダブルクリック → 証明書のインストール
現在のユーザーかローカルコンピュータ好きな方を選択。
証明書をすべて次のストアに配置するを選択して「信頼されたルート証明書」を選択。
インストール完了。

これでEnter-PSSession とかが使えるように。 -UseSSL オプションを忘れずに。

その2:PowerShell

$WinRMCertificateThumbprint = (Get-AzureVM -ServiceName $vmName -Name $vmName | Select-Object -ExpandProperty VM).DefaultWinRMCertificateThumbprint
(Get-AzureCertificate -ServiceName $vmName -Thumbprint $WinRMCertificateThumbprint -ThumbprintAlgorithm SHA1).Data | Out-File "${env:TEMP}\CloudService.tmp"
 
$X509Object = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 "$env:TEMP\CloudService.tmp"
$X509Store = New-Object System.Security.Cryptography.X509Certificates.X509Store "Root", "LocalMachine"
$X509Store.Open([System.Security.Cryptography.X509Certificates.OpenFlags]::ReadWrite)
$X509Store.Add($X509Object)
$X509Store.Close()

Remove-Item "$env:TEMP\CloudService.tmp"

おまけ:もろもろ有効にする

Windows Server 2012 R2より前のものを使う場合はいろいろ有効化しないといけないです。
が、色々と罠があったりして面倒なのでぎたぱそせんせーのValentiaを使いましょふ。
まだvalentiaをインストールしていない方は以下をおもむろに

# @Visual Studioのパッケージ マネージャー コンソール
Install-Package valentia

もしくは

# @コマンドプロンプト OR PowerShellコンソール OR PowerShell ISE
powershell -NoProfile -ExecutionPolicy unrestricted -Command 'iex ([Text.Encoding]::UTF8.GetString([Convert]::FromBase64String((irm "https://api.github.com/repos/guitarrapc/valentia/contents/valentia/Tools/RemoteInstall.ps1").Content))).Remove(0,1)'

を入力してEnterキーを軽快に叩きましょう。

ここでエラーが発生する場合はPowerShellへの信仰心が足りません。精進しましょう。
おそらく引数が空の文字列であるため、パラメーター 'Path' にバインドできません。的なエラーが出ているのではないでしょうか。
PowerShellの仕様なのかなんなのか、なぜか$env:PSModulePathにマイドキュメントへのパスが載らないことがあるようです。
おとなしくマイドキュメントへのパスを環境変数に追加しましょう。

$path = [System.Environment]::GetEnvironmentVariable("PSModulePath", "Machine")
$path += ";$([System.Environment]::GetFolderPath("MyDocument"))\"
[System.Environment]::SetEnvironmentVariable("PSModulePath", "Machine")

PowerShellコンソール(OR ISE)を立ち上げて、モジュールを読み込みましょう。

Import-Module valentia

ここまで終わったら後は以下のコマンドレットを叩くだけ。*1

Initialize-ValentiaEnvironment -NoOSUser -NoPassSave -NoReboot

色々と善きに計らってくれます。OSを日本語化してても大丈夫です。
ぎたぱそせんせー is GOD

Initialize-ValentiaEnvironmentに失敗したらvalentia.ps1の中身を修正して対応しませう。

Valentiaは少しづつ触っているけど、ちゃんと機能を使えたらとても便利そう。

*1:Valentiaの機能をフル活用する時はNoOSUserとかを必要に応じて外すこと

PowerShell 勉強会でセッションしてきました。

ついったーには書かないでおこ(

C#erがPowerShell始めてみた

PowerShellチートシート的な感じになってるので初心者の方は是非。 そのうちしれっとサンプルコードとかの追記するかもです。

初セッションだったのでとても疲れましたが楽しかったのでまた機会があればやりたいですね。

緊張しいなので場数踏まないと声が出ませんですはい。


そして

ふぇぇ・・・