布団が俺を呼んでいる

丘山大一のぶろぐ

管理者ユーザなのにexeファイルのファイル操作できなくなる現象

exeファイルのプロパティのセキュリティにアクセスできなくなる現象とも。
実害が出るレベルではまりました。


現象

ファイルを削除しようとすると、
「このファイルを削除するには管理者の権限が必要です」→「続行」→
「この操作を実行するアクセス許可が必要です」→「再試行」→
以降ループするので「キャンセル」せざるをえなくなる

リネームしようとすると、
「このファイルの名前を変更するには管理者の権限が必要です」→「続行」→
「この操作を実行するアクセス許可が必要です」→「再試行」→
以降ループするので「キャンセル」せざるをえなくなる

実行しようとすると、
「指定されたデバイス、パス、またはファイルにアクセスできません。これらの項目にアクセスするための適切なアクセス許可がない可能性があります」
で、メッセージ内容から「セキュリティが変なのか……」と考えファイルのプロパティからセキュリティを
開くと、たしかに権限がふられていない。ファイルの所有者の所有者も見えない。
しかし、権限をふろうとしても権限をふれない。

どういうこっちゃねん。


原因

他のユーザがexeファイルをロードしている状態で、さらに別ユーザがexeファイルを削除していたため。


原因詳細

エクセルファイルなんかで「別のプログラムがファイルを開いているので操作を完了できません」を見ることがあった人も
多いと思いますが、その複雑版です。共有フォルダに配置した、複数のユーザがたたくexeファイルで起きました。
登場人物は下記。

  • Aユーザ:exeファイルを実行していた人
  • Bユーザ:exeファイルを先に削除した人
  • Cユーザ:管理者であり、exeファイルを削除したい人

Aユーザは、Cユーザのマシン内の共有フォルダに入ったexeファイルを実行しています。起動後なので、exeはロードが終わった状態です。
続いて Bユーザは、そのexeファイルを削除します。Aがexe実行中でもファイル削除できます(Bのエクスプローラからは消える)
最後にCユーザが共有フォルダに入ったexeファイルを削除を実施しますが上記「現象」にはまり何もできなくなります。
Cマシン内の共有フォルダにあるexeは、Bによって削除された亡霊みたいな状態。


対応

exeにアクセスしている人を強制的に全部切断すれば解消されます。
というか先に切断しておきましょう。


泣き言

これWindowsのバグでは、という気がしなくもない。けど何かしら事情があってこうなっている気もする。

フォルダ名の末尾に全角スペースを入れると色々不便

ググってみたところ、有名な話らしい。
以下、Windows10 で確認。

概要

エクスプローラで、「あいうえお  」のように末尾に全角スペースを入れるフォルダを作る。
その後、末尾の全角スペースを削除しようとすると「送り側と受け側のファイル名が同じです。」と怒られる。
もちろん、
  • 「あいうえお」
  • 「あいうえお 」
  • 「あいうえお  」
は別物。


コマンド操作

どれでも問題なくリネーム可能。
cmd
mkdir "あいうえお  " あいうえお

powershell
Rename-Item "あいうえお  " -NewName あいうえお

ubuntu(WSL)
mv "あいうえお  " あいうえお

ようはエクスプローラのバグ仕様ってことなのかな。


対策

そもそも全角スペースを入れるなよ、というお話。

コクヨ 個別フォルダークラフト紙 A4 100枚

新品価格
¥2,592から
(2018/1/24 21:42時点)

ブルスク!(NVIDIA)への対応 wushowhide

自分メモ。
ブルスクはいかんともし難い。

トラブル

時間が空いたので、解決したかな~と思ったがダメだった。
やっぱりNVIDIA のグラフィックドライバが入るとBSODする。

対応

wushowhideを使うと、WIndows 10 でもアップデートの一部を止められるようになる。
使い方含め、上記リンクを見てもらうのが一番かと。




背景布 クロマキー 写真撮影用 Happyjoy ブルー 1.6x3m 大サイズ 厚地 青 画像合成

新品価格
¥1,611から
(2017/7/21 21:56時点)

Microsoft To-Do が起動しなくなった

なんか解決した。

経緯

Windows 10 Mobile で入力中にクラッシュ。
起動できなくなる(起動しても、勝手に終了してしまう)。
PC側でアプリを起動しても、起動後フリーズ。


対応

Microsoft To-Do はWeb 版もあるので、そちらからアクセスしてみた。
すると問題なし。
翌日になると、Windows 10 Mobile から起動できるようになっていた。
ただし、To-Do リストを見ようとするとフリーズ。
再度Web版の表示と比較すると、アプリ版とTo-Do の表示件数が異なっていることに気がついた。
Web版でTo-Do の一部を削除、完了とさせ、再度Windows 10 Mobile から起動すると、同期され無事に起動できるように。


推測とか

おそらく、クラッシュした際に壊れたデータができてしまい、それをサーバから取得して読み込もうとしてアプリが死んでしまったのかと。
翌日になると起動できるようになったのは、一定時間ごとにクリティカルな問題を持つサーバのデータをクリアするような機構があるから? でしょうか。
そうだとしても、同期にコケていたので、ちと中途半端ですが。
いくつかTo-Do を整理してから動作することを確認したので、どのTo-Doが問題だったのかはわかっていません。
ちゃんと一つずつ調べればよかった。


対策

動かなくなったら、一日待つ+Web版で操作してみよう!




Windows ストアギフトカード 1,000 円 (Windows/Xbox 360で利用可)|オンラインコード版

新品価格
¥1,000から
(2017/6/29 00:04時点)

ブルスク!(NVIDIA)

BSODをアニメのタイトルぽくして、絶望感を緩和してみる。


ネタバレ

主原因はNVIDIA グラフィックドライバのUpdate?


経緯

4月初旬、Creaters Update によりウィルスバスターが入らなくなる。
6月1日、そろそろ改善されたかなー、と思ってウィルスバスターを入れる。
     合わせて、裏でUpdateが走っていた。
6月3日、やたらとWIndows が落ちる。下手すると起動後10分くらいで落ちる。
6月頭、 直近でやったことってなんだっけ?と考えて、ウィルスバスター停止。それでもすぐ落ちる。
     アンインストールし、安定するように。
6月初旬、安定したといったな、あれは(略)
     起動後40~100分ほどでBSODするようになる。
     主にキーボード操作中にBSODする。


調査開始

ブログ書いている途中で落ちるならともかく、コード書いている途中に落ちるんじゃ何もできんわ。
というわけで、イベントログを覗くもめぼしいものは見つからず。
んで、メモリダンプを見てみたら、ちょくちょく「nvlddmkm.sys」で死んでいる模様。
どうやら、というか名前のままなのだがNVIDIA 関連。
調べてみると6月1日にUpdate が走っていた。
ここでウィルスバスターにマシンをバスターされたと思っていたが濡れ衣だった可能性に気が付く。
ごめんよバスター。
(でもバスターアンインストールしたらちょっと安定したのも事実なんだよなー)

一度ドライバをアンインストールしようかと思ったが、先に最新版のドライバを手動で入れなおしてみた。
ちょっと安定したものの、3時間ほど起動していたら死亡した。

こりゃだめだ、と日を改めて、NVIDIA のドライバーを片端からアンインストール。
アンインストール後、ちょっと放っておけばWindows Updateでもう一度キレイにドライバが入ります。
すると、なんということでしょう、LANケーブルを引っこ抜いただけでBSOD。
意味が分かりません。

といわけで、再びNVIDIAドライバを全削除。
今度はWindows Update を一時停止してドライバが落ちてこないようにしました。
3日ほど様子を見ましたが、安定しているようです。
犯人はこの子ということで。

今後

どうしようかなあ、と悩み中。
Updateもいつまでも止められないし、止めたくない。
アプリの整理もできていないし、そろそろOSごとクリーンインストールして仕切り直したいところ……。


濡れ衣への、お詫びがてらの広告↓

ウイルスバスター クラウド | 3年 3台版 | Win/Mac/iOS/Android対応

新品価格
¥10,603から
(2017/6/11 21:32時点)

Outlook 2016 が起動できない

風邪ひいていたんですが……やっべー、前回更新から超間が開いている。
適当な記事を書いてお茶を濁そう。

本業でoutlook 2016(Office 365)が起動できなくなるという事態がちょい前に発生しました。

現象

  • 前日まで通常どおり動作していた。
  • 朝、起動時(おそらくメールの受信後)に動作を停止するようになった。
  • Application Error 1000 OUTLOOK.EXE 障害が発生しているモジュール名 wwwlib.dll


失敗した対応

  • セーフモードでの起動→起動はするが、再度起動すると落ちる。
  • プロファイルの複製→変わらず。
  • 再インストール→変わらず。


成功した対応

セーフモードで起動後、最新で受け取ったメールを削除。

これだけ。


えっ、なにそのメール

この対応方法だけ見ると、メールにとんでもない悪さをするものが潜んでいるんじゃないか疑惑です。
で他のメンバに聞いてみると、「一部文字化けしているメールだが、Outlook も メール自体も開ける」とのこと。
しかし怖いのでフルスキャンでウィルスチェック。


結局

何だったのだろうか。メールがトリガーなのは間違いないないですけど、原因究明しきれていません。
怖ひ怖ひ。



今すぐ使えるかんたん Outlook 完全ガイドブック 困った解決&便利技 [Outlook 2016/2013/2010対応版]

新品価格
¥1,706から
(2017/4/7 21:11時点)

Delphi でXMLファイルを作成しようとしてハマる

ね、ハマるでしょ?


環境

いつも通り、サポート切れのXE5。


基本構文

xmlファイルを新規作成します。

var
  XML : TXMLDocument;
  RootNode, ChildNode : IXMLNode;
begin
  XML := TXMLDocument.Create(nil);
  XML.Active := True;
  RootNode := XML.AddChild('Root');
  ChildNode := RootNode.AddChild('Child');
  ChildNode.Text := 'ガキ';
  XML.SaveToFile('D:\Doc.xml');
  XML.Active := False;
  FreeAndNil(FResultXML);
end;


ここでハマったよその1 別スレッドで上記を操作

こんなエラーが出ました。
「DOMException Microsoft MSXML がインストールされていません」
Microsoft MSXMLはTXMLDocumentでデフォルトで使用するものです。
当初、このエラーを素直に読み取ったので、
「あれ、コンポーネント配置してない(IDEのポトペタで作ってない)から、デフォルト値がうまく読み込めてないのかな?」
などと思い、
  XML.DOMVendor := MSXML_DOM;
を追記しました。
が、それでもエラーが解消されません。
「ということは、ポトペタ配置と他にもプロパティが違う場所があるのか、おまじないが必要なのか」
と探すも、それらしいものが見つからず。


結論:仕様です

下記の「エラーハンドリングおかしくね?」というページを発見。
さらにこんなページたちも。


原因と解決策

・エラーメッセージが微妙に意図しているところと違う。
・GUI経由、つまりはVCLフォームを表示しているメインスレッドならCOMは普通に呼び出せるが、
 別スレッドの場合はCoInitialize 、CoUninitialize を呼び出してやらなくてはならない。



ここでハマったよその2 TXMLDocumentインスタンスが勝手に破棄される

実際にプログラミングしたのは、上記基本構文よりもちょっとだけ複雑で、
Nodeを作るところ・そのためのデータをとってくるところや、SaveToFileするクラスは別に作っています。
そんなこんなで、SaveToFileしようとすると、「Activeでないよ」というエラーが発生するように。
あれ?
もしかして勝手にクローズしちゃうのかな?
と思って直前でActiveを活性化させても同じ。
なんでやねん、と思って追ってみるとTXMLDocumentインスタンスが死んでいる……
ウソみたいだろ、Freeしてないのに解放されているんだぜ。


結論:仕様です

「作成時に Owner が設定されていない TXMLDocument は、インターフェイス オブジェクトと同様の動作をします。 つまり、そのインターフェイスに対する参照がすべて解放されると、TXMLDocument インスタンスは自動的に解放されます。」
なんでそんな動作なんだよ(怒)
「インターフェイス オブジェクトと同様の動作」なんてさせるくらいなら最初からインターフェースで返せよ!分からんだろうが!


解決策

というわけで、Owner を設定してやれば解決します。
適当なTComponentインスタンスを生成してCreateの引数に渡してやりましょう。


総括:今回ハマったところを全部のせるとこんな感じ。


var
  XML : TXMLDocument;
  RootNode, ChildNode : IXMLNode;
  OwnerComponent : TComponent;
begin
  CoInitialize(nil);
  XML := TXMLDocument.Create(OwnerComponent);
  XML.Active := True;
  RootNode := XML.AddChild('Root');
  ChildNode := RootNode.AddChild('Child');
  ChildNode.Text := 'ガキ';
  XML.SaveToFile('D:\Doc.xml');
  XML.Active := False;
  FreeAndNil(FResultXML);
  FreeAndNil(OwnerComponent);
  CoUninitialize;
end;



Twitter に登録しようとした

ワタクシは全然SNSというものを使いません。
ですが、この度ちょっと事情がありまして、Tiwtter アカウントをとろうと思いました。


そして登録して10分ほどで






まだアカウント登録しかしてないのに違反扱いされたでござる。
冤罪でござる! 殿、冤罪でござるぞ!


調べてみると

結構引っかかる人が多いみたいですね。
推測するに、アカウントがスパム扱いされたかな?
丘山大一で活動している時はoutlookアドレスだからスパム扱いされやすいだよね……。
そして丘山大一としての電話番号なんぞないので、自力解決不可能w


しゃーないので

サポートに連絡してみます。


しかし



電話番号がないから電話番号で解除できないよ、と送ったのにも関わらず、電話番号でやれと。
まあこのメール自体、自動返信なんでしょうね。
自動化対策を自動でやるのは合理的といわざるをえない。

まあもう面倒なのでTwitterは諦めますw


UWP Project が作成できない

UWPは、なんでこうもエラーが多いのだ(泣)
以下失敗談。対応方法だけ知りたい方は最後らへんだけどうぞ。

エラー内容

久々にUWPでアプリを組もうとしたところ、下記のエラーが発生。


調べると、どうやらSDKのインストールにコケている場合に出るらしい。

対応

SDKを拾ってきてスタンドアロンインストール
と思ったんですが。


先生、なんかエラーが出ます!

試しにVS2015のインストーラーからWIndows Software Developer Kit を入れなおしてみる。
玉砕。

う~ん、分からん。
と思ってコンパネを覗いてみたらなんかいる。


あれ? 14393を入れようとしているのに、なんで26624がいるんだ?
試しにアンインストールしてみる。
それでから、再度スタンドアロンインストール実行。

しかし無情なるエラー。
折れそうになる心。

でも、コンパネを見直すと14393が入っている。
ものは試しと「変更」→「Repair」を試してみる。
Visual Studio 起動……なんか使う予定がないPythonでエラーが出たぞ(汗)
VS2015のインストーラーをもう一回叩いて入れなおす。
Visual Studio 再起動……。う~ん、Python はエラーでなくなったけどUWPはまだダメ。

ちょっとここで仕切り直し。
コンパネから14393をアンインストール。OS再起動。
そしてスタンドアロンインストール実行……おおインストーラーが動いた!
これはいけた!……と思いきや、プロジェクト作成は失敗する。

再び折れそうになる心。

最終的に

こちらを参考にさせていただきました。
超感謝。
projectのテンプレートの一部をコメントアウトすることで対応。
私の場合、パスは下記。
C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\ProjectTemplates\CSharp\Windows Root\Windows UAP\1041\BlankApplication\BlankApplication.vstemplate

結果

・WIndows Software Developer Kit 10.0.26624 が妨害していたことはしていたと思う
・同じようにプロジェクトが作成できない方がいるということは、何か条件があるはず……ぐぬぬ。


かずきのUWP入門

Delphi プロジェクトファイルのコードの中で無名メソッドを使うとメモリリークが発生する

なんか Delphi 話多いなー。
無名メソッド、anonymous methods とか言われるヤツです。
正直、可読性が落ちると思っているのですが、サクッと書くときに便利なのでちょいちょい使います。

現象

下記のようなコードを書くと、メモリリークが発生します。
program Project1;
uses
  Vcl.Forms,
  Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
var
  b :Boolean;
begin
  ReportMemoryLeaksOnShutdown := True; // メモリリークを検出
  b :=
    (function : Boolean
    begin
      Result := True;
    end
  )();
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

対応

無名メソッドを使わないようにするしか思いつきませんでした……
program Project1;
uses
  Vcl.Forms,
  Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
function hoge : Boolean;
begin
  Result := True;
end;
var
  b :Boolean;
begin
  ReportMemoryLeaksOnShutdown := True; //メモリリークを検出
  b := hoge;
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

原因予想

全然分かりません。
・Delphiの無名メソッドはインターフェースでどうたかこうだか、
・インターフェースは参照カウントがどうたかこうだか、
・でもってインターフェースの破棄のタイミングはEnd 節の実行時でどうたかこうだか、
・でもプロジェクトファイルにあるのは「end.」(ピリオド)であって「end;」(セミコロン)じゃないなー
とか妄想してみた。

似たような事例はStackoverflow で見かけるので、きちんと探せば原因が分かると思うのですが。
探すのめんどい(ぇ)

若干ですが仕様という名のバグじゃないか疑惑もあったりなかったり。

え、無名メソッドを使うなって?

だって楽なんだもん。
特にメソッド名を考えなくて済むあたりが楽。
……命名苦手なんよ……