Visual Studio 2017 Community のインストーラーが死んで死亡

Visual Studio 2017 Community をメインPCにぶち込むぜ!ヒャッハー!! …ハイテンションwktk全裸でインストーラを実行しましたが、エラーが出てインストールできませんでした…。 が、問題が解決できたのでその報告。

原因

インストーラーを実行すると、次のメッセージが表示されインストールプロセスを実行できません。

インストール ファイルをダウンロードできません。インターネット接続を確認してやり直してください。

http://hdimg.ir9.jp/hd17/0430_00.png

条件

  • Windows10
  • インターネッツには問題なく接続できている
  • 他のマシンではインストーラーが起動する
    • オフラインインストール用にファイルも拾ってこれる
  • オフラインインストールしても同じメッセージが出る。おめーネットからファイル拾ってきて無ぇじゃん!
    • オフラインインストール用証明書もインストールした
      • ここの "オフライン インストール フォルダーからのインストール" を参照

対策

  1. 服を着用します
  2. TSUTAYA で DOG DAYS の DVD をレンタルしてきます
  3. Windowsサービス "CNG Key Isolation" を起動させます。
  4. Visual Studio 2017 のインストーラーを起動します。
  5. 借りてきたDVDを鑑賞しながらインストール完了を待ちます

…というわけで "CNG Key Isolation" のサービスが起動していなかった事が原因でした。

調査方法

%tmp%dd_bootstrapper_*.log なんてログが出力されます。 その中には次のような文言がありました。

VisualStudio Bootstrapper:2017/04/30 16:15:21: Caught Exception: Type = CryptographicException, Message = エンドポイント マッパーから使用できるエンドポイントはこれ以上ありません。
, StackTrace =    場所 System.Security.Cryptography.NCryptNative.OpenStorageProvider(String providerName)
   場所 System.Security.Cryptography.CngKey.Create(CngAlgorithm algorithm, String keyName, CngKeyCreationParameters creationParameters)
   場所 System.Security.Cryptography.RSACng.get_Key()
   場所 System.Security.Cryptography.RSACng.Encrypt(Byte data, RSAEncryptionPadding padding)
   場所 System.Security.Cryptography.RSAPKCS1KeyExchangeFormatter.CreateKeyExchange(Byte rgbData)
   場所 System.Security.Cryptography.CngLightup.DetectRsaCngSupport()

あー、署名周りで死んでるねーと。

…で、ググってみたりもしたんですが、Firewall だか WindowsUpdate だか ActiveDirectory とかが引っかかってなんか違う感。 ぶっちゃけよくわからねぇ(ぉ 仕方ないのでノリでサービス周りだろうなぁという直感を元に一覧から crypt に関係するサービスを起動させてみたらなんか上手くいきました! やったねタエちゃん!! また一つ無駄に Visual Studio が増えるよ!!

VS2015 を1回起動しただけで VS2017 をぶち込んでる程度の能力

gawk「cmd. line:1: (FILENAME=- FNR=1) fatal: print to "standard output" failed (No space left on device)」で死亡

コマンドプロンプトGow に収録されている gawkGNU Awk 3.1.0) を使用すると、以下のメッセージを吐きグズりはじめることがあります。 どうやら日本語を吐こうとすると死ぬ模様。 粗相

gawk: cmd. line:1: (FILENAME=- FNR=1) fatal: print to "standard output" failed (No space left on device)

対策

http://www.hinadori.atnifty.com/~wills/ さんで配布されている、マルチバイト対応の gawk を使用しましょう。 GNU Awk 3.0.6 ベースとちょっと古いですが何とかなるでしょううん(他人事

文字列比較を == して死亡どころか大爆死

public boolena empty(String s)
{
  return (s == null) || (s == "");
}

なんてJavaで書いちゃって死亡。 後者は "".equals(s) が正しいですね。すいませんマジすいませんでした。おのれJava!!



とはいえ、JUnitでテストした関数だったんですよ。 問題ないじゃーんと。

assertTrue(empty(null)); // OK!
assertTrue(empty(""));   // OK!

ですが、この empty() を本番コードで以下のように使っていました(イメージ)

final String   csvData = ",,,"; // テストで空カラムデータを投げた
final String[] cols    = csvData.split(",");
if(empty(cols[0])) return false;
if(empty(cols[1])) return false;
if(empty(cols[2])) return false;
  :
  :

ステップオーバーで if() を素通りする姿に 10秒ぐらい頭真っ白になったね! そうだよね! コード直書きの空文字 "" のインスタンスは同じ可能性があるけど、split() して誕生した空文字 "" はインスタンスまず別だよね! そりゃ false だよね!

…いやーもうなんか恥ずかしい。 おのれJava!!

yaccで死亡

正確には ply の yacc ですけどももも

…いやぁ全然概念が判らなくて大苦戦ですわ(苦笑




学習がてら、以下に合致するパーサーを作ろうかと思ったわけです。ドット区切りで要素3つまで。

  • a
  • b.a
  • c.b.a
  • 正規表現的にはこんな感じ → ((\w+\.)?\w\.)?\w+

イメージ的には foo.ir9.jp / ir9.jp / jp を解析するパーサーを作りたい的な。 で、こんな感じなの書きました

## lex
tokens = (
	"NAME",
	"PERIOD",
)

t_NAME   = r"\w+"
t_PERIOD = r"\."

## yacc
def p_host(p):
	"""
	host : NAME PERIOD NAME PERIOD NAME
	     | NAME PERIOD NAME
	     | NAME
	"""

	p[0] = ''.join(p[1:])

yacc.yacc()
print(yacc.parse("c.b.a"))	# c.b.a
print(yacc.parse("b.a"))	# b.a
print(yacc.parse("a"))		# a

動きました。良かったよかった!

…ではあるんですが、各NAMEの要素に名前というか意味合いを付けたほうがよいのかなと。今後各要素に適用できる文字の定義を変えるかもしれないし! …ってことで、次のように改修してみました。 "[ [sub . ] domain .] cont" というイメージ。

## lex
tokens = (
	"NAME",
	"PERIOD",
)

t_NAME   = r"\w+"
t_PERIOD = r"\."

## yacc
def p_host(p):
	"""
	host : domain PERIOD cunt
	     | NAME
	"""

	p[0] = ''.join(p[1:])

def p_cunt(p) :
	"""
	cunt : NAME
	"""
	p[0] = p[1]

def p_domain(p) :
	"""
	domain : sub PERIOD NAME
	       | NAME
	"""
	p[0] = ''.join(p[1:])

def p_sub(p) :
	"""
	sub : NAME
	"""
	p[0] = p[1]

yacc.yacc()
print(yacc.parse("c.b.a"))	# a // Syntax error at line 1, token=PERIOD
print(yacc.parse("b.a"))	# b.a
print(yacc.parse("a"))		# a

# WARNING: 1 reduce/reduce conflict
# WARNING: reduce/reduce conflict in state 3 resolved using rule (domain -> NAME)
# WARNING: rejected rule (sub -> NAME) in state 3
# WARNING: Rule (sub -> NAME) is never reduced

ダメだってさ!



…って所でめっちゃ詰まってます。 おそらく「スタックに NAME 積んだ後 PERIOD 来ると、domain なんだか sub なんだか判断つかねぇんだよ!2回死ね!それと便座カバー」って事だとは思っているんですが、いかんせん yacc の挙動・動作・考え方が解っていないため全く確信が持てず。 ついでに解決方法も良くわからん… そもそもコレ「右結合」なんじゃないのと思いつつ、それがどう記述に影響してくるのか・考え方にどう影響してくるのかとかもよくわからず… ぐぬぬ……

構文解析難しいわ…

xpathで死亡

例えば「id=foo の属性を持つノードを親・先祖に持たない a要素全て」を選択する xpath が書けぬ…

//*[@id!="foo"]//a

とか書いても、先祖に div#foo があるノードが抽出されてしまった…。 そりゃそうか。 仮に "/body/div#foo/span/a" と階層あったとして、body や span は id="foo" じゃないし…

ancestor とやらを使えばなんとかなりそうな気がしたものの、全く上手く扱えず死亡。

誰かボスケテ

pythonおじさん、JavaScriptの "this" で無事死亡

// jquery ロード済みとする

var CRozen = (function()
{
    var ctor = function(msg)
    {
        this.msg = msg;
    };
    
    var p = ctor.prototype;
    p.echo = function()
    {
        alert(this.msg);
    };
    
    return ctor;
})();

var kana = new CRozen("kashira!!");
$(kana.echo);   // onload 時にコールバック!

http://ir9.jp/hd16/1020_00.png

undefined …だと……?



thisがなんかおかしい…という事は、原因は $() の中身だろうということでちょっと書き換えた所、期待通りの動作に。

// jquery ロード済みとする

var CRozen = (function()
{
    var ctor = function(msg)
    {
        this.msg = msg;
    };
    
    var p = ctor.prototype;
    p.echo = function()
    {
        alert(this.msg);
    };
    
    return ctor;
})();

var kana = new CRozen("kashira!!");
$(function(){ kana.echo(); });   // onload 時にコールバック!

http://ir9.jp/hd16/1020_01.png

うむ。

JavaScriptの 関数オブジェクトは、this を自動で紐付けてくれないものなんですねぇおのれ…!!



python文化のおじさんなので、this(ってか self)を自動で引っ張ってくれるイメージがデフォだったんじゃ…!

class CRozen :
    def __init__(self, msg) :
        self.msg = msg
    
    def echo(self) :
        print(self.msg)

kana = CRozen("kashira!!")
fn   = kana.echo
fn()    # kashira!!

mercurialリポジトリをgitに変換しようと hg-fast-export.sh したら死亡

結論としては

変換元のhgリポジトリのコミッタとして "<>" が居ると死ぬらしい。

解決策

コミッタのマッピングファイルを作成して指定しましょう。端折ると死ぬ。

# マッピングファイルの例
<>=devnull <devnull@localhost>
# マッピングファイルを指定して変換
$ ../fast-export/hg-fast-export.sh -r ../editor_configs_hg/ -A ../authors

問題発生時のログとかポイントとか

  • -A を指定なしで実行
  • <> <devnull@localhost> でなんか死んでる
[ir9@hina-pc editor_config]$ ../fast-export/hg-fast-export.sh -r ../editor_configs_hg/
master: Exporting full revision 1/9 with 14/0/0 added/changed/removed files
master: Exporting simple delta revision 2/9 with 2/0/0 added/changed/removed files
master: Exporting simple delta revision 3/9 with 1/0/1 added/changed/removed files
master: Exporting simple delta revision 4/9 with 3/0/0 added/changed/removed files
master: Exporting simple delta revision 5/9 with 1/0/0 added/changed/removed files
master: Exporting simple delta revision 6/9 with 4/0/0 added/changed/removed files
fatal: Invalid raw date "<devnull@localhost> 1434525763 +0900" in ident:  <> <devnull@localhost> 1434525763 +0900
fast-import: dumping crash report to .git/fast_import_crash_11997
master: Exporting simple delta revision 7/9 with 3/0/0 added/changed/removed files
Traceback (most recent call last):
  File "../fast-export/hg-fast-export.py", line 427, in <module>
    options.statusfile,authors=a,sob=options.sob,force=options.force,hgtags=options.hgtags,notes=options.notes))
  File "../fast-export/hg-fast-export.py", line 357, in hg2git
    c=export_commit(ui,repo,rev,old_marks,max,c,authors,sob,brmap,hgtags,notes)
  File "../fast-export/hg-fast-export.py", line 218, in export_commit
    export_file_contents(ctx,man,added,hgtags)
  File "../fast-export/hg-fast-export.py", line 136, in export_file_contents
    wr(d)
  File "../fast-export/hg-fast-export.py", line 37, in wr
    wr_no_nl(msg)
  File "../fast-export/hg-fast-export.py", line 34, in wr_no_nl
    sys.stdout.write(msg)
IOError: [Errno 32] Broken pipe

改修後の上手くいったログ例

  • -A を指定したところうまくいきました
[ir9@hina-pc editor_config]$ ../fast-export/hg-fast-export.sh -r ../editor_configs_hg/ -A ../authors
Loaded 1 authors
master: Exporting full revision 1/9 with 14/0/0 added/changed/removed files
master: Exporting simple delta revision 2/9 with 2/0/0 added/changed/removed files
master: Exporting simple delta revision 3/9 with 1/0/1 added/changed/removed files
master: Exporting simple delta revision 4/9 with 3/0/0 added/changed/removed files
master: Exporting simple delta revision 5/9 with 1/0/0 added/changed/removed files
master: Exporting simple delta revision 6/9 with 4/0/0 added/changed/removed files
master: Exporting simple delta revision 7/9 with 3/0/0 added/changed/removed files
master: Exporting simple delta revision 8/9 with 8/1/0 added/changed/removed files
master: Exporting thorough delta revision 9/9 with 15/1/0 added/changed/removed files
Issued 9 commands
git-fast-import statistics:
---------------------------------------------------------------------
Alloc'd objects:       5000
Total objects:           30 (        54 duplicates                  )
      blobs  :           14 (        39 duplicates          1 deltas of         14 attempts)
      trees  :           12 (        10 duplicates          4 deltas of         12 attempts)
      commits:            4 (         5 duplicates          0 deltas of          0 attempts)
      tags   :            0 (         0 duplicates          0 deltas of          0 attempts)
Total branches:           1 (         1 loads     )
      marks:           1024 (         9 unique    )
      atoms:             38
Memory total:          2344 KiB
       pools:          2110 KiB
     objects:           234 KiB
---------------------------------------------------------------------
pack_report: getpagesize()            =       4096
pack_report: core.packedGitWindowSize = 1073741824
pack_report: core.packedGitLimit      = 8589934592
pack_report: pack_used_ctr            =         44
pack_report: pack_mmap_calls          =          6
pack_report: pack_open_windows        =          2 /          2
pack_report: pack_mapped              =      48588 /      48588
---------------------------------------------------------------------