Win32エラーコード一覧のページを更新しました!

Windowsのエラーコードを FormatMessage() で抽出しただけのページを更新しました! 忘れてないよ! 更新しようと思い続けてたんだよ!マジで! ちなみに前回は 2005年4月に更新していたらしので、実に12年ぶりの更新となりました。 …そんだけHP続けてるとかマジか…… そんだけ歳食ったとかマジグホァ(血

なお、次の環境で出力しています。

  • Win10 1703 Creators Update
  • VC2017

また、エラーコード一覧を C# / Java にも移植しましたので是非ともご利用しないでくださいC# / Java で WinAPI に用事があるようなコード書いちゃダメデショー!!

どうぞご利用ください (どっちやねん




… "死亡"してない記事書いたの久しぶりなきがするじぇ……

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!!