Code for final

ふぁいなる向けのコード置き場です。すでにコードじゃないこともいっぱい。

Rubyのhttps通信で"certificate verify failed (OpenSSL::SSL::SSLError)"というエラーが出たが、証明書を設定するのが面倒でとりあえず動かしたいとき。

Rubyで'net/https'を使ってHTTPS通信を行ったとき、以下のエラーがでました。

C:/Ruby23-x64/lib/ruby/2.3.0/net/http.rb:933:in `connect_nonblock': SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (OpenSSL::SSL::SSLError)

どうやらSSLの検証に引っかかっているみたいです。

とりあえず動かしたい!ってときは以下のようにverify_modeの指定を追加して検証しないというように設定すればOKです。

        https = Net::HTTP.new('xxx.xxx.xxx',443)
        https.use_ssl = true

        # これを追加
        https.verify_mode = OpenSSL::SSL::VERIFY_NONE

        https.start{
        
        }

以下のマニュアルにはデフォルトはVERIFY_NONEって書いてありますけど、追加しないと動きませんでした。

instance method Net::HTTP#verify_mode= (Ruby 2.3.0)

正しく対処するには証明書をダウンロードして明示的に指定する必要があるらしいですが、とりあえず動かしたいときはこれだけでOKですね。

"gitignore.io" 管理したいソースに対応した.gitignoreを自動で生成してくれるサービス。

gitになれるとなんでもgitで管理したくなりますが、面倒なのがgitの除外設定です。

gitignore.io管理するソースに対応した.gitignoreのテンプレートを出力してくれるサービスです。

VisualStudioやEclipseってキーワードをいれるだけで生成されます。

便利なことに複合することもできます。

こりゃ便利!

www.gitignore.io

f:id:finalstream:20160827195843p:plain

C#で動的にコンテキストメニューを作成したとき、初回だけ表示されないときはOpeningイベントでe.Cancelにfalseを設定するべし。

ExplorerWindowsCleanerにデスクトップをダブルクリックでコンテキストメニュー(右クリックメニュー)を表示するように 実装したんですけど、なぜか初回のダブルクリックだけ表示されませんでした。

2回目以降のダブルクリックで表示されるので、しばらくそのまま使っていたのですが、なんか気になったので調べてみることに。

デバッグしてみるとContextMenuStrip.Show()は実行されているみたいです。

ぐぐってみるとドンピシャな以下のエントリーを発見。

stackoverflow.com

このエントリーにとOpeningイベントでe.Cancelにfalseを設定すればいいよ的なことがかいてあったのでそのとおりにやってみる。

            _contextMenuShortcuts = new ContextMenuStrip();
            _contextMenuShortcuts.Opening += (sender, e) =>
            {
                _contextMenuShortcuts.Items.Clear();
                _contextMenuShortcuts.Items.Add("Explorer", null, (o, eventArgs) => _explorerCleaner.OpenExplorer(""));
                _contextMenuShortcuts.Items.Add(new ToolStripSeparator());

                var closedExplorers = _explorerCleaner.ClosedExplorers.OrderByDescending(x => x.IsFavorited)
                    .ThenByDescending(x => x.LastUpdateDateTime).Take(10);

                foreach (var closedExplorer in closedExplorers)
                {
                    var item = new ToolStripMenuItem(closedExplorer.LocationPath);
                    item.Image = closedExplorer.IsFavorited ? Resources.favorite : null;
                    item.Click += (o, eventArgs) => _explorerCleaner.OpenExplorer(closedExplorer);
                    _contextMenuShortcuts.Items.Add(item);
                }

                if (_shortcuts.Length > 0)
                {
                    _contextMenuShortcuts.Items.Add(new ToolStripSeparator());
                    foreach (var shortcutItem in _shortcuts)
                    {
                        _contextMenuShortcuts.Items.Add(shortcutItem.Name, null,
                            (o, eventArgs) => shortcutItem.Exec());
                    }
                }

                // これを追加
                e.Cancel = false;
            };

e.Cancel = falseを追加するだけで、すると初回から表示されました。

つまり、コンテキストメニューをプログラム上で生成して、中のメニューをOpeningイベントでのみ設定している場合は、最初はメニューが空なのでコンテキストメニューを表示しないようにe.Cancelがtrueで呼ばれるというわけですな。

MSDNの以下のエントリーにも書いてありますね。わかりにくいですけど。

How to: Add ToolStrip Items Dynamically

理由がわかってスッキリスッキリ。