HPCメモ

HPC(High Performance Computing)に関連したりしなかったりすることのメモ書き

最適化の限界

昨日ついったーで面白い実験をみかけたので、ちょっと考察してみました。

lpha-z.hatenablog.com

元記事の方は、JuliaとCで同じ処理を行うプログラム書いて性能を比較されてたんですが、 私としてはJuliaとの比較ではなくHWスペックに対してC言語の実験結果が異様に遅いことに興味をひかれました。

使われていたプログラムは、1000要素の倍精度の配列の値を10000000足し合わせるというもので、 Intel(R) Xeon(R) CPU E5-2603 v3 @ 1.60GHzで測定されたとのことです。

とりあえず、メモリネックなのか演算ネックなのか確認したいので、HWのB/Fを計算してみましょう。

こちらにあるようにE5-2603 V3はHaswell世代の6コアのCPUですが、今回は1コアしか使ってないようなのでHW的には1コア分の性能だけを見ます。

ark.intel.com

L1Dキャッシュは、32KBなので、1000要素の配列なら全データがオンキャッシュで動作します。初回アクセス時にキャッシュミスは発生しますが、 1千万回も繰り返しているので性能に与える影響はほぼ無視できるはずです。Haswel世代のL1Dキャッシュは、load時は64Bytes/cycleとのことなので、この値をメモリアクセス性能とします*1

演算性能は、1コアで256bit幅のFMA2基ですが今回は加算しか演算が無いのでただの加算器が2つと考えて、8Flop/cycleとします。

したがって、この場合のHWのB/F値は8となります。

一方、プログラム側のB/F値は8Byteロードに対して1演算なので8B/Fとなります。

ということは、このプログラムは1コア内の加算器を限界まで使えるので、理論上の性能の限界は2x4x1.6 = 12.8GFlops となります。 演算数から時間を逆算すると、1000x10000000/(12.8x10003) = 0.78 sec ですね。

こちらのツイートで示されている、Juliaでまっとうな書き方をした時の性能が0.89secということなので、もし同じようなCPUでの測定結果であれば 少なくともこのケースに限ってはJuliaの最適化は優秀と言えそうです。

さて、C言語の方ですが、元記事ではgccで-O3でコンパイルして18.8secという結果だったそうです。

アセンブリも示されているのでまずそちらを見ると、加算命令としてaddsd命令が使われていることがわかります。 つまり、SIMD演算を使っておらず8Byteづつ加算している状態です。 また、twitterで元の記事を書かれた方から指摘をいただいて気付いたんですが、配列の先頭から順に加算するため、 せっかく2ポートで同時に加算命令が発行できるのにこの機能も使えません。 したがって、さきほど計算した理論性能と比較すると、SIMDが使えないことで1/4さらに命令発行が1命令/cycleとなることで1/2になり合わせて1/8の性能しか使えません。

そうすると実行時間で考えるとだいた6.4秒くらいですね。 実測値は、18.8秒なのでさらに3倍近く遅いのですが、おそらくこれは、ADDSD命令のlatencyとThroughputの差と思われます。

これまで1cycle毎に命令が行なわれる*2前提で考えてきたので、1演算あたり1cycleとしていましたが、先行する加算命令の結果を書かれたレジスタから値を読んで後続の加算命令が行なわれているので、ここはlatencyである3cycleが1演算あたり必要な状態と考えるべきです。*3 したがって、さらに3倍遅くて19秒くらい(なんかちょっと多いな・・・)という計算で辻褄が合いそうです。

最適化

さて、ここまで、性能低下の要因を色々とみてきましたが原因は全部同じで、「1要素づつしか加算していない」ということにつきます。*4 じゃ、どうすりゃ良いのかというと

for(i =0; i<1000; i++){
 s += a[i];
}

というような最内ループをストリップマイニングして

for(i=0; i<1000; i+=8){
 s0 += a[i];
 s1 += a[i+1];
 s2 += a[i+2];
 s3 += a[i+3];
 s4 += a[i+4];
 s5 += a[i+5];
 s6 += a[i+6];
 s7 += a[i+7];
}
s=s0+s1+s2+s3+s4+s5+s6+s7

という形に書き換えるようにコンパイラに指示すれば良いわけです。 gccの場合はその名もずばりの-floop-strip-mineというのがあるので、これと(SIMD化のために)-march=haswellを指定してコンパイルすればたぶん最適化してくれるでしょう。

実際に(全体をコンパイルすると読むのが面倒なので)次のような2重ループの関数を作って、-Sでアセンブリを吐いてみます。

#include <stddef.h>
double sum(double* a){
  double s=0;
  for(size_t j=0; j<10000000;j++){
    for(size_t i =0; i<1000; i++){
       s += a[i];
    }
  }
  return s;
}

-O3だけの時

> docker run -it --rm -w /usr/src -v ${PWD}:/usr/src gcc:9.1.0 gcc -S -O3 test.c -o test_O3.s
> cat test_O3.s
        .file   "test.c"
        .text
        .p2align 4
        .globl  sum
        .type   sum, @function
sum:
.LFB0:
        .cfi_startproc
        movq    %rdi, %rsi
        movl    $10000000, %ecx
        pxor    %xmm0, %xmm0
        leaq    8000(%rdi), %rdx
.L2:
        movq    %rsi, %rax
        .p2align 4,,10
        .p2align 3
.L3:
        movsd   (%rax), %xmm1
        addq    $16, %rax
        addsd   %xmm0, %xmm1
        movsd   -8(%rax), %xmm0
        addsd   %xmm1, %xmm0
        cmpq    %rax, %rdx
        jne     .L3
        subq    $1, %rcx
        jne     .L2
        ret
        .cfi_endproc
.LFE0:
        .size   sum, .-sum
        .ident  "GCC: (GNU) 9.1.0"
        .section        .note.GNU-stack,"",@progbits

-march=haswellと-floop-strip-mineをつけると

> docker run -it --rm -w /usr/src -v ${PWD}:/usr/src gcc:9.1.0  gcc -S -O3 -march=haswell -floop-strip-mine test.c -o test_O3_haswell_stripmine.s
> cat test_O3_haswell_stripmine.s
        .file   "test.c"
        .text
        .section        .text.unlikely,"ax",@progbits
.LCOLDB1:
        .text
.LHOTB1:
        .p2align 4
        .globl  sum
        .type   sum, @function
sum:
.LFB0:
        .cfi_startproc
        movq    %rdi, %rax
        vxorpd  %xmm1, %xmm1, %xmm1
        leaq    8000(%rdi), %rsi
        xorl    %ecx, %ecx
.L3:
        movq    %rax, %rdx
.L2:
        vmovupd (%rdx), %xmm2
        vmovupd (%rdx), %ymm3
        addq    $32, %rdx
        vaddsd  %xmm1, %xmm2, %xmm1
        vunpckhpd       %xmm2, %xmm2, %xmm2
        vextractf128    $0x1, %ymm3, %xmm0
        vaddsd  %xmm2, %xmm1, %xmm1
        vaddsd  %xmm0, %xmm1, %xmm1
        vunpckhpd       %xmm0, %xmm0, %xmm0
        vaddsd  %xmm0, %xmm1, %xmm1
        cmpq    %rdx, %rsi
        jne     .L2
        incl    %ecx
        cmpl    $10000000, %ecx
        je      .L6
        jmp     .L3
        .cfi_endproc
        .section        .text.unlikely
        .cfi_startproc
        .type   sum.cold, @function
sum.cold:
.LFSB0:
.L6:
        vmovapd %xmm1, %xmm0
        vzeroupper
        ret
        .cfi_endproc
.LFE0:
        .text
        .size   sum, .-sum
        .section        .text.unlikely
        .size   sum.cold, .-sum.cold
.LCOLDE1:
        .text
.LHOTE1:
        .ident  "GCC: (GNU) 9.1.0"
        .section        .note.GNU-stack,"",@progbits

(・3・)あるぇ~?

3オペランド方式のvバージョンになっていますが、あいかわらずaddsdが使われているようです。

ちなみに、icc 19でデフォルトオプションだとこんな感じになります。

# mark_description "-std=c11 -S";
    .file "test.c"
    .text
..TXTST0:
.L_2__routine_start_sum_0:
# -- Begin  sum
    .text
# mark_begin;
       .align    16,0x90
    .globl sum
# --- sum(double *)
sum:
# parameter 1: %rdi
..B1.1:                         # Preds ..B1.0
                                # Execution count [0.00e+00]
    .cfi_startproc
..___tag_value_sum.1:
..L2:
                                                          #2.22
        xorl      %edx, %edx                                    #5.5
        pxor      %xmm0, %xmm0                                  #3.11
        pxor      %xmm1, %xmm1                                  #3.11
        xorl      %eax, %eax                                    #4.3
                                # LOE rdx rbx rbp rdi r12 r13 r14 r15 eax xmm0 xmm1
..B1.2:                         # Preds ..B1.4 ..B1.1
                                # Execution count [6.25e+05]
        movaps    %xmm1, %xmm10                                 #3.11
        movl      %eax, %ecx                                    #4.3
        movaps    %xmm10, %xmm9                                 #3.11
        movaps    %xmm9, %xmm8                                  #3.11
        movaps    %xmm8, %xmm7                                  #3.11
        movaps    %xmm7, %xmm6                                  #3.11
        movaps    %xmm6, %xmm5                                  #3.11
        movsd     (%rdi,%rdx,8), %xmm2                          #6.13
        movaps    %xmm5, %xmm4                                  #3.11
        unpcklpd  %xmm2, %xmm2                                  #6.13
        movaps    %xmm4, %xmm3                                  #3.11
                                # LOE rdx rbx rbp rdi r12 r13 r14 r15 eax ecx xmm0 xmm1 xmm2 xmm3 xmm4 xmm5 xmm6 xmm7 xmm8 xmm9 xmm10
..B1.3:                         # Preds ..B1.3 ..B1.2
                                # Execution count [6.25e+08]
        addl      $16, %ecx                                     #4.3
        addpd     %xmm2, %xmm10                                 #6.8
        addpd     %xmm2, %xmm9                                  #6.8
        addpd     %xmm2, %xmm8                                  #6.8
        addpd     %xmm2, %xmm7                                  #6.8
        addpd     %xmm2, %xmm6                                  #6.8
        addpd     %xmm2, %xmm5                                  #6.8
        addpd     %xmm2, %xmm4                                  #6.8
        addpd     %xmm2, %xmm3                                  #6.8
        cmpl      $10000000, %ecx                               #4.3
        jb        ..B1.3        # Prob 99%                      #4.3
                                # LOE rdx rbx rbp rdi r12 r13 r14 r15 eax ecx xmm0 xmm1 xmm2 xmm3 xmm4 xmm5 xmm6 xmm7 xmm8 xmm9 xmm10
..B1.4:                         # Preds ..B1.3
                                # Execution count [6.25e+05]
        addpd     %xmm9, %xmm10                                 #3.11
        addpd     %xmm7, %xmm8                                  #3.11
        addpd     %xmm5, %xmm6                                  #3.11
        addpd     %xmm3, %xmm4                                  #3.11
        addpd     %xmm8, %xmm10                                 #3.11
        addpd     %xmm4, %xmm6                                  #3.11
        addpd     %xmm6, %xmm10                                 #3.11
        movaps    %xmm10, %xmm2                                 #3.11
        incq      %rdx                                          #5.5
        unpckhpd  %xmm10, %xmm2                                 #3.11
        addsd     %xmm2, %xmm10                                 #3.11
        addsd     %xmm10, %xmm0                                 #3.11
        cmpq      $1000, %rdx                                   #5.5
        jb        ..B1.2        # Prob 99%                      #5.5
                                # LOE rdx rbx rbp rdi r12 r13 r14 r15 eax xmm0 xmm1
..B1.5:                         # Preds ..B1.4
                                # Execution count [7.63e-02]
        ret                                                     #9.10
        .align    16,0x90
                                # LOE
    .cfi_endproc
# mark_end;
    .type   sum,@function
    .size   sum,.-sum
..LNsum.0:
    .data
# -- End  sum
    .data
    .section .note.GNU-stack, ""
# End

なんかめっちゃアンロールしてますね。 -qopt-report=5で出力される最適化レポートを見ると

ループの開始 test.c(5,5)
   リマーク #25444: ループの入れ子の交換: ( 1 2 ) --> ( 2 1 )
   リマーク #15542: ループ はベクトル化されませんでした: 内部ループがすでにベクトル化されています。   [ test.c(5,5) ]

   ループの開始 test.c(4,3)
      リマーク #15305: ベクトル化のサポート: ベクトル長 2
      リマーク #15399: ベクトル化のサポート: アンロールファクターが 8 に設定されます。
      リマーク #15309: ベクトル化のサポート: 正規化されたベクトル化のオーバーヘッド 0.525
      リマーク #15301: 変換されたループ がベクトル化されました。
      リマーク #15475: --- ベクトルのコストサマリー開始 ---
      リマーク #15476: スカラーのコスト: 6 
      リマーク #15477: ベクトルのコスト: 2.500 
      リマーク #15478: スピードアップの期待値: 2.390 
      リマーク #15488: --- ベクトルのコストサマリー終了 ---
      リマーク #25015: ループの最大トリップカウントの予測=625000
   ループの終了
ループの終了

あ、入れ替えられてる・・・そらそうかorz

*1:もちろんここではキャッシュにしかアクセスしてませんが要するにB/F値の分子という意味で捉えてください

*2:正確に言うとリタイアするですが

*3:要するにバブルでパイプラインがすっかすかの状態

*4:3つの壁のうちの1つ、命令レベルの並列性の壁ですね

auth0のサンプルコードで遊ぶ(その1)

ちょっと前にauth0のウェビナーに参加したんですが、その後放置しててすっかり内容を忘れたので、先日のうどんもくもく会に参加した時に改めてサンプルコードを動かして遊んでみました。

udonmokumoku.connpass.com

ユーザ作成とかは、終わってたのですっとばして、まずはauth0のトップページからログインします。

auth0.com

ログインすると、ダッシュボード画面に遷移するので、"Getting Started"メニューから

"Create Application"

"Regular web app"

と選んで、"CREATE"ボタンをクリックします。

次に、"What technology are you using for your project?"という質問が出てくるので、"node.js"を選ぶと

こんな感じでサンプルコードをダウンロードできる画面が表示されます。

この画面で下にスクロールしていくか、"I want to integrate with my app"と書かれた下の各リンクを辿っていくと 既存のwebアプリにauth0を使った認証を組込む方法が書かれてるんですが、とりあえず今はDownload sampleを選んでサンプルコードを取ってきます。

ダウンロード画面で指示されている通りに、auth0のapplication setting画面で、"Allowed Callback URLs"にhttp://localhost:3000/callbackを "Allowed Logout URLs"にhttp://localhost:3000を設定します。

ここでうっかり、両方にhttp://localhost:3000と設定してしまったために、私は小一時間ほどはまりましたorz

あと、画面のほとんど一番下にある"SAVE CHANGES"ボタンを押さないと設定が反映されないので気をつけましょう。 こっちも最初気付かないでsaveボタンを探しまわってましたo...rz

なお、application setting画面へは、ちょっと上へスクロールして"Settings"からリンクを辿って移動することもできるし、 ダウンロード画面の説明文の中にもリンクが貼られてるので、こちらからでも行けます。

もし、うっかりダウンロード画面を閉じちゃったって時は、ダッシュボードの"Applications"メニューから作成したアプリを選ぶと設定画面に行けて、 その画面の上部にある"Quick Start"をクリックするとサンプルをダウンロードする画面に戻れます。

ダウンロードして展開したディレクトリで、npm installしてからnpm startをするとウェブサーバが立ちあがるので、ブラウザを開いて、http://localhost:3000にアクセスしてください。 次のような画面が表示されたら成功です。

この画面の"Log In"という文字列のリンク先が、http://localhost:3000/loginになっていて、クリックするとauth0の認証画面へとリダイレクトされます。

下の方に表示されている"サインアップ"のリンクをクリックすると、新規ユーザ登録画面に遷移します。 ログイン画面とほとんど同じ作りで区別し難いのが残念なところですが、その辺は後で頑張ってカスタマイズしましょう。

このUI、ありがたいことにパスワードの入力欄に移ると、パスワードの要件が下ににょろっと表示されます。

実際にパスワードを入力していくと、要件を満たす毎にこんな感じでチェックがついていって有効なパスワードかどうかがすぐに分かるようになっています。

デフォルトではgoogleアカウントとの連携が有効になっているので、googleのログイン情報を使ってサインアップすることもできます。 ここでサインアップしたユーザの一覧は、auth0のダッシュボードから"Users & Roles" -> "Users" とたどると確認することができます。

無事にアカウントを作成してログインすると、webアプリが受け取ったユーザ情報をまるっと表示してくれるプロフィール画面に遷移するので、 ここで何の情報が見れるのかを確認することができます。が、あまりに消すところが多すぎるんでスクショは貼りませんw

とりあえず第一弾としてはここまでにしますが、単にログインするだけでもまだ色々と設定できるところはあるようなので、もうしばらくこれで遊んでみようと思います。

おまけ

callback URLの設定を間違った状態で認証画面に遷移すると、次のようなエラー画面が表示されます。

サンプルアプリをコピペして使ってたら、この機能までうっかり組み込みそうだなぁw

patch: **** malformed patch at line と言われたら見るとこ

10年ぶりくらい(もっとかも)で、パッチファイルを編集して適用するなんていう作業をしてたら、こんなエラーが出てきました。

patch: **** malformed patch at line 123: @@ -456,78 +901,23 @@

これを見て、「ははーん、旧ファイルの456行目からと新ファイルの901行目からのパッチが何かおかしいんだな。」

「malformedってってことはおおかた、hunkの行数(旧ファイルが78行、新ファイルが23行)を正しい値にしてやれば良いんだろ?」

「patch完全に理解したわw」

と思ったんですが、何回直しても同じエラーになります。

小一時間ほどぐぐりながら悩んでたんですが、この場合修正するべきなのはこれのひとつ前のhunkでしたorz



どういうことかと言うと、ひとつ前のhunkで差分の一部を削除していたのに行数を直していなかったため、 そちらを処理していたpatchコマンド君は

「指定された行数まで読んどらんのに次のhunkのヘッダ行(?)が出てきたがな。エラーメッセージ出しとこか」

この行なんか変やで> @@ -456,78 +901,23 @@

という挙動をしてくれているようです*1


紛らわしいわwww

llvmが(というかclangがというべきか?)出てきて、ようやくgccの意味不明なエラーメッセージが罪であるということが世間に広く認識されたわけですが*2GNUのこの辺のソフトも誰か1から書き直してくれないかなぁ?

*1:といっても別にpatchコマンドのソースを追い掛けたりしたわけじゃなくて、ネット上にあった他のmalformedエラーの例からの推測です

*2:異論は認める

cloud9の環境をVS onlineのself-hosted environmentとして使ってみる(その4)

諦めきれずに情報収集をしてたら、CLIインストールの記事があったので、ちょっと試してみました。

docs.microsoft.com

まずは、こちらのドキュメントに従ってCLIツールをインストールします。

docs.microsoft.com

うちはUbuntu 18の環境なので、コマンドだけ抜きだすとこんな感じになります。

> sudo curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
> sudo add-apt-repository https://packages.microsoft.com/ubuntu/18.04/prod/
> sudo apt-get update
> sudo apt-get install vso

なお、ドキュメントを見てもubuntudebianしか(つまりaptしか)対応していないっぽいです。 VS codeはsnapでインストールできるようになってるんで、そのうちこっちも対応してくれるといいですね。

続いて、self-hosted environmentをregisterするためにrootでvsoを実行します。*1

> sudo su -
# vso start --service

すると To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code XXXXXXXX to authenticate. みたいな表示が出るのでブラウザを開いてcodeを入力します。

ブラウザ側で正常にログインできたら環境の名前と、loginctl enable-lingerを使うか?って質問が表示されるのでそれぞれ入力すると

[2020-04-17 05:26:58.558 CLI I] Waiting for environment to become available...

からの

[2020-04-17 06:30:58.436 CLI E] [!ERROR] Error calling HTTP GET at 'https://online.visualstudio.com/api/v1/environments/XXXXXXXX' ErrorCode : Unauthorized

となりましたorz

/tmpの下にできるログを見てみるとこちらで報告されてる現象と同じっぽいので暫くアップデート待ちとなりそうです。

github.com

*1:sudoおすすめできないってドキュメントに書かれてたんでrootでやってますが、sudoでは検証してないです。

cloud9の環境をVS onlineのself-hosted environmentとして使ってみる(その3)

こちらのissueでself-hosted environmentに登録できなかった問題は解決したよ!って言われてたので、さっそく試してみました。

github.com

Azureへのログインなどは前々回のこちらの状況から変わってないので、せっせとhttpヘッダを見て、xdg-openします。

hpcmemo.hatenablog.com

remote explorer画面の"Register self-hosted environment..."をクリックすると上の方に名前をつけてねって表示がでるので、適当に名前をつけます。(ここまでは前回と同じ)

f:id:n_so5:20200409111348p:plain

名前を入力してenterを押すと、"Register as a service"か"Run as a process"を選べっていう選択肢が出てきました。

f:id:n_so5:20200409111544p:plain

マシンが再起動された後でも使うかどうかということなので、"Register as as service"を選ぶと、VS Code内のterminal画面でなにやらログが流れた後、 "Would you like us to run 'loginctl enable-linger' to enable services to run even when you're not logged on? [Y/n]" というメッセージが出てきて Yかnを入力しろといわれるので、とりあえずYにしてみます。

しかし、"Waiting for environment to become available..."と言われたまま先に進みません。 しばらく放置してましたが、最終的には1時間経って ErrorCode : Unauthorized と言われて終了しましたorz

$ /home/ubuntu/.vsonline/cli/VSOAgent_linux_3612700/vso --vso-uri "https://online.visualstudio.com/api/v1/" start --skip-prompts --name "cloud9" --plan-id "/subscriptions/5223c7e5-45a4-4676-8312-75ba489c76eb/resourceGroups/vso-rg-a741c73/providers/Microsoft.VSOnline/plans/vso-plan-southeastasia" --workspace-path "/home/ubuntu/environment/NPM/get-ami" --service
[2020-04-09 04:12:02.842 CLI I] vso v1.0.1954.49374 (pid: 4110)
[2020-04-09 04:12:03.271 CLI I] Using VSO URI: https://online.visualstudio.com/api/v1/
[2020-04-09 04:12:05.372 CLI I] Creating your environment...
[2020-04-09 04:12:08.954 CLI I] Saving local configurations...
[2020-04-09 04:12:09.779 CLI I] Authenticating...
[2020-04-09 04:12:10.067 CLI I] Starting agent...
[2020-04-09 04:12:10.068 CLI I] Creating service...
[2020-04-09 04:12:10.094 CLI I] Created service vso.service
[2020-04-09 04:12:10.094 CLI I] Starting service vso.service...
Would you like us to run 'loginctl enable-linger' to enable services to run even when you're not logged on? [Y/n]:Y
Running 'loginctl enable-linger'... success
[2020-04-09 04:12:13.030 CLI I] Waiting for environment to become available...
[2020-04-09 05:11:31.561 CLI E] [!ERROR] Error calling HTTP GET at 'https://online.visualstudio.com/api/v1/environments/4d8083f5-75af-4158-a297-e9996b2acf4d' ErrorCode : Unauthorized

仕方がないので一回unregisterして"Run as process"の方で登録を進めてみます。 こっちは選択するとterminalが立ち上がることなくトーストの通知で"registering environment"というのが表示されて、10秒ほど待っていると"Self-hosted encironment registerd:"に変わりました。

これでようやくiPadからのアクセスを試すところまでこれたーと思ったんですが、iPadからVS onlineにアクセスしてここで作った環境にアクセスすると

となって、接続できませんでしたorz

Intel VTuneとAdvisorの単体版が無償公開されてる

IntelからのDMにあったwebinerのお知らせを見ていたら、最後の方にこんなことが書かれてました

f:id:n_so5:20200409122230p:plain

いやいや、VTuneとAdvisor買えったって単体でも数万円はするやないかーいってtwitterでツッコミを入れようとしてスクショを保存したんですが、その後リンク先を見に行ったらどちらも単体製品(with community support)はfreeになっているようです。*1

software.intel.com software.intel.com

どちらの製品も、Downloadボタンをクリックすると名前、メールアドレス等を入力するフォームに案内されるので、諸々入力するとメールでダウンロードURLのリンクが送られてきます。

VTuneの方はライセンスキーがついてくるけど、Advisorの方は無いという違いはありますが、どちらもリンク先へアクセスすると各プラットフォーム向けのアーカイブがダウンロードできます。

f:id:n_so5:20200409124030p:plain

以前から、学生、教員(授業用)、OSS開発者向けには Non-Commercial License というのがあったのですが、ライセンスマネジメントのページを見ると商用のNamed License(日本代理店のエクセルソフトさんの名称だと 特定ユーザ向けライセンス)が与えられているようです。

f:id:n_so5:20200409124308p:plain

さっそくインストールして使ってみましょう・・・と言いたいとこなんですがmacは残念ながら非対応なのでこれからwindowsのセットアップをしますorz

*1:サポート付きの単体有償製品も残っているようです

cloud9の環境をVS onlineのself-hosted environmentとして使ってみる(その2)

前回、Register Local Environment ってコマンドが無いってところで止まっていたんですが、試しに手元のMacVS codeとVS onlineのextentionをインストールして試してみました。

f:id:n_so5:20200323114317p:plain

やっぱりそんなコマンドは無いと言われます・・・orz

再びLinux側のVS codeに戻って、remote explorerのサイドバーのを見ていると、"Self-hosted environments"の下に"Register self-hosted environment..."というメニューが表示されていました。

f:id:n_so5:20200323114953p:plain

試しにクリックしてみたところ、Azure accountにサインインするように通知が出て、ブラウザで再度サインインすると今度は環境の名前を入力しろというダイアログが表示されました。*1

f:id:n_so5:20200323123541p:plain

適当に名前を付けて、enterを押すと"Register Self-hosted Environment: Sharing environment failed." と言われましたorz

f:id:n_so5:20200323115555p:plain

VS online側で見てみるとこんな感じでcreatingのまま先に進みません。

f:id:n_so5:20200323122246p:plain

同じ手順をmacで試してみたところ、数十秒くらいでmacのローカル環境がVS onlineから見え、ファイルの作成や編集をしたら相互に反映されていたので手順はこれで良さそうなんですが、まだ先は長そうです・・・

ここまで書いてから前回の記事でリンクしたこちらのドキュメントを見にいったら

docs.microsoft.com

Then use the VS Online: Register Self-hosted Environment command in the command palette:

ってなってたので、どうやら "Register Local Environment"は "Register Self-hosted Environment"に変更されたようですね。

*1:この時、ブラウザからVS codeに戻ってきたとこなので、すごく分かり難いです。モーダルのダイアログとかでデカデカと表示してくれたら良いのに・・・