原因判明

Microsoft Edge がまともに設定できない件 の原因がやっと分かった。

僕はてっきり、コントロールパネルの「インターネット オプション」は、旧デフォルトブラウザ 『Internet Explorer 11 』の専用の設定だと思い込んでいた・・・。Windows10デフォルトのブラウザ Microsoft Edge もこの「インターネットオプション」を参照してるのね・・・OMG!!!

んで、Edgeの設定やら動作不良の原因が、どうやら、「インターネット一時ファイル」が破損しているのが原因やった・・・というのがオチ。
Windows7 のとき、この「インターネット一時ファイル」を置くフォルダを、Lightroomのキャッシュや各種一時ファイル(要するにドライブが壊れてしまっても構わないファイル)専用に購入したSSDドライブ(ジャンクに近い状態の格安商品)に設定していました。
たぶんこのドライブのACL(セキュリティー設定)をいいかげんに設定してたせいか、Windows10にアップグレードする過程で、おそらく このドライブのフォルダに Microsoft Edge がちゃんと書き込めるように適切な設定が為されていない状態だったようだ・・・推測ですけどね・・・。

インターネットのプロパティー ⇒ 閲覧の履歴 設定 ⇒ フォルダーの移動 をクリックして、デフォルトの状態に戻したら、あっけなく解決した。。。
あああ、結局のところ、僕が悪かった。こういうトラブルは往々にして自分が変なカスタマイズしてトラブルを起こすことが多い。

Microsoft Edge 様、「できない奴」呼ばわりして責任転嫁して、ごめんなさいっッッッッッ!

Microsoft Edge がまともに設定できない件

2016年5月12日
解決できました。。。


Windows7からWindows10にアップグレードしたパソコン。アカウントのタイプはローカルアカウント。
プライバシー設定をデフォルトからガシガシ変えたせいなのかどうか分かりませんが、Edgeが思うようにならない。

1つ目。
Edgeで既定の検索エンジンをGoogleに変えようと、ちゃんと手順に従って変えようとしたんですが、下記のようなメッセージが出て設定できない!!!
edge-settings
ちゃんと後でやり直したけど、同じだった。。。

2つ目
Windows7 + IE11で正常に動作していたスクリプトがエラーになってしまった。window.localStorageにアクセスすると、問答無用でエラーになってしまう。。。分からないのは、inPrivateタブで開くとちゃんと動くところ・・・。なんで??? ちなみにWindows10に残っている Internet Explorer 11では正常に動く。
edge-debug
※注記) window[storage] っていうところは、window[‘localStorage’]と読みかえてね・・・

たぶんなんかの設定が引っかかっているせいだと思うんですが・・・ググっても解決方法どころか、同じような現象が検索にほとんど引っかからない。

不思議なことですが、おなじWindows10でも Surface3で稼働しているWindows10は、上記2つの現象は出ていない。設定もほとんど同じにしているはずなんですが・・・。違うところは、Surface3はマイクロソフトアカウントで運用している事ぐらい。

もしかして、ローカルアカウントで運用しているのがダメなのかな~? う~む・・・(ーー;;;

まぁ、Microsoft Edge は常用しないのでさしあたって実害は無いのですが・・・何の設定が抜けているんだろうか・・・???

VAIO Z (VPCZ21 2011) + Windows10 Pro

残りあと100日も切ってしまった、Windows10への無料アップグレード。
メインPCのWindows7をWindows10にアップグレードするか、未だ、踏ん切りが付きません(ーー;;; マイクロソフトは無料アップグレード期間の延長は絶対無い、と言い切ってるし・・・。

ってなわけで、去年Surface3買ってから使わなくなって放置してたVAIO Z (Windows7 Pro版)を、試しにWindows10にアップグレードして、手順をおさらいしておこう、と。VAIOもSONYから放り出されてWindows10のサポートも無くなったので、この際どうなってもいいや、ってな感じ。

まずは、Windows7を立ち上げて、去年の10月頃からの膨大な量の Windows Update を適用しておく。ちなみにこれ、一晩かかりました(^^;;; 夜、仕掛けてから寝て、朝起きてもまだ終わっていない・・・orz。Windows Updateは溜めておくと地獄ですな・・・。

連休の終わりかけの今日(5/5)、タスクバーの通知エリアのWindows10アイコンをクリックしていざアップグレード開始。アップグレードの最終確認後、30分~1時間程放置してたら終わってました。

upgrade-to-windows10

気付いた点を今後のメインPCのWindows10アップグレード時のため、以下に列挙しておく。

  • Windows7の時に使っていたアプリやツール類はすべて元通りに使用できた。
  • 関連付け、アイコンなどは、一部を除いて設定がそのまま残った
  • システムの設定は、ほぼすべて引き継がれた。
  • Windows7で使用してたセキュリティ対策ソフト、Security Essentials が自動的に削除され、Windows Defender に引き継がれていた。
  • 英語キーボードをAXドライバで使用する設定(右ALTにIMEトグルを割り当てるため)などはちゃんと引き継がれた。
  • Windows7ではIMEをATOKにしてたんですが、Windows標準のIMEに初期化されていた。
  • xyzzyのキーバインド変更ツールは、ちゃんと使えた。ただし設定ダイアログに表示上の不具合発生。
  • タスクバーに登録していたアプリもそのまま残っていた。
  • Windows7のスタートメニューとWindows10のスタートメニューは根本的に違うので、スタートメニューはまっさら状態。よく使うアプリのスタートメニューへの登録をやりなおす必要がある。
  • 使用メモリが増えてる気が・・・最初だけ??? Windows7も使い始めはメモリ使用量多かったしな・・・
  • windows.old は速攻で削除。どうせもうWindows7には戻れないし・・・。
  • デスクトップPCでコルタナはOFFにするべし。(パソコンに音声アシストは必要か???)
  • Windows10のデフォルトのフォント、游ゴシックはやっぱりブサイク! なんでメイリオやめたん???
  • デフォルトでIISが起動して80番ポートを塞いでいるので、開発環境にapacheを使っているWebアプリ開発者は、IISのサービスを無効にするかアンインストールする必要がある。
    (追記:Visual Studio がインストールしてあるからなのかな~?という気がしてきた。)
  • デフォルトブラウザ Microsoft Edgeはデフォルトでループバックアドレス(localhost)にアクセスできないので、CheckNetIsolation.exeコマンドで別途許可する必要がある。
  • デスクトップPCでWindows10を使う場合、ローカルアカウントで運用した方がいい。
  • ストアアプリをPCで使う場合はマイクロソフトアカウントで運用しなければならない。が必要。(普通に考えてパソコンで制限のあるストアアプリなんて使わないと思うが・・・)
  • VAIOホームネットワークプレーヤー(レコーダーやNasneの録画番組を見るVAIO専用のアプリ)はライセンスの認証をやりなおし。
  • VAIO独自のハードウェアキーはほぼ全部使えた。
  • スピーカーのON/OFFに割り当てられた Fn + F2は効かなくなった(残念)

ほんとかどうかは定かでは無いけど、Windows10は、「入力データをマイクロソフトに送信しない」設定にしてても実際にはそういった入力情報は密かに?送られる!!! ようなことをネットで見かけます。まぁ、現実問題、一般人には確かめようがないっすよねぇ。

Visual Studioとか主要なアプリケーションの対応OSから Windows7 が除外された時点でアップグレードしようなかな~。うーん・・・。

SATA >>> USB3.0 変換コネクタ

古いマシン(Core2 Duo搭載 Lenovo PC)にCentOS入れて運用しているマシンに使っているHDD2台(500GBx2)が10年選手なので、いいかげん変えないとHDD突然死が怖い。

ってことで、新HDD(TOSHIBA製 500GB)を買ってきて空いているS-ATAポートに接続したのですが、なぜか、BIOS画面でフリーズ。古いHDDを外して、新HDDだけで電源投入すると、普通にブートする。 古いHDDと新HDDを混ぜるとブートシーケンスの途中でフリーズ。
???相性悪いんだな・・・と無理矢理自分を納得させ、会社近くの家電量販店に行き、S-ATA⇒USB変換コネクタを探しに行く(ーー;;;
で、たまたまあったのが、↓コレ。
IMG_1760

これもついでにレシート(領収書)を出して経費請求してもらおうかな・・・と思ったけど、意外と便利過ぎて、家で私用に使いたくなったので自腹に。。。

Windows専用って書いてあったけど・・・CentOS 6のシステム移行のため新しいHDDを接続したら、CentOS側で”/dev/sdc”としてちゃんと認識してくれた。

ただ・・・不満が1つ・・・ACアダプタ、おっきすぎるやんけ!!! 写真とちゃうやんけ!!! 誇大広告やんけ!!!

フォーム間の依存関係を最小限に

C#備忘ログ

C#でWindowsフォームを使うようなアプリケーションは殆ど書かないのであまり興味もなかったのですが、今回2つのフォームを使うツールを書いたときに困ったことがあった。

フォームA(class FormA : Form) / フォームB(class FormB : Form) の2つがあって、

1)フォームA内に配置したボタン(Button1)をクリックすると、フォームBを生成すると同時にフォームAは非表示へ。
2)フォームBを閉じると、フォームAを表示する。

通常ならたぶん、フォームAの button1の Clickイベントハンドラに フォームBをnewして Show()メソッドをコール。

//子フォームを生成して表示、自身は非表示にする
private void Button1_Click(object sender, EventArgs e)
{
  this.Hide();
  var formB = new FormB();
  formB.Show(this);
}

そしてフォームBを閉じたり、非表示になった時のイベントハンドラ(FormB_FormClosingとかFormB_VisibleChangeとか)でFormAのShow()メソッドをコール。

//親フォームを表示(復帰)
private void Form1_FormClosing(Object sender, FormClosingEventArgs e)
{
  this.Owner.Show();
}

のような感じになると思うんですが、フォームBを閉じたときに、フォームAを表示するだけじゃなくて、フォームA上のbutton1のTextプロパティの表示も変えたい!とか、button1のEnabledプロパティーを・・・とか、にしたいとき、FormA側にpublicなメソッドを一個追加してコールさせなければならない・・・。

つまり、フォームAの勝手な都合で、全然関係のないフォームBのソースも修正しなければならなくなる。フォームA,フォームBそれぞれがお互いのインスタンスを共有しなければならない、という非常に非効率な状態になる。2つのフォームだけならまだなんとかなるけど、フォーム10個とかになったときの事を考えると恐ろしい。。。

この場合の解決方法はやはり・・・フォームA側から直接フォームBのイベントに+= 演算子でラムダ式を注入するのが一番いい。Showメソッドで自分自身のインスタンスを渡す必要もない。フォームBのソースを汚染することもなくなる。

ま、ちゃんとメソッドを定義して・・・いう書き方の方がいいのか、インラインでラムダ式を放り込む方がいいのか、書き手側の好みの問題でしょうか。

//FormA
private void Button1_Click(object sender, EventArgs e)
{
  this.Hide();
  var formB = new FormB();
  formB.Show();

  //ラムダ式を注入
  formB.FormClosing += ( bs, be ) => {  Show(); button1.Text = "フォームBは閉じられた!";  };
  //デリゲートを追加
  formB.FormClosing += formBClosed; 
}
private void formBClosed(object sender, FormClosedEventArgs e)
{
    Show();
    button1.Text = "フォームBは閉じられた!";
}

また、FormBの子コントロールの特定のイベントにイベントハンドラを注入したければ、子コントロールにもフォームA側からイベントハンドラを注入してあげればいいが、フォームの子コントロールのアクセスレベルは private なので、単純に子コントロールへはアクセスできない。
そういうときは、フォームBのControlsプロパティから目的の子コントロールを得られる。

//FormA 
private void Button1_Click(object sender, EventArgs e)
{
  this.Hide();
  var formB = new FormB();
  formB.FormClosing += ( bs, be ) => {  Show();  };
  formB.Show();
  var ctrl = formB.Controls["button2"]);
  ctrl.Click += (bs,be) => button1.Text = "クリックされたよ";
}
//エラー処理はしていないよ

メインフォーム ⇔ 子フォーム間の依存関係はできるだけ避けたいし、子フォーム間同士の依存関係もできるだけ避けたい。お互いのフォームがお互いのインスタンス(正確にはインスタンスへの参照)を持ってコードを書くとフォームが増えるに従って グチャグチャになってしまう気がする。。。
気をつけよう。