読者です 読者をやめる 読者になる 読者になる

Code for final

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

Git(SourceTree)でブランチを切り替えただけなのにエラーになって元のブランチに戻れなくなった場合

SourceTreeでmasterの変更をdevelopにマージ(普通は逆)しようと思って

masterに変更(コミット漏れ)がないことを確認してdevelopに切り替えて

masterを選択して右クリックメニューから"現在のブランチにmasterをマージ"を選んでマージしようとすると以下のエラーが…。

f:id:finalstream:20160917202114p:plain

git -c diff.mnemonicprefix=false -c core.quotepath=false merge master
Updating 41add75..b1b180a

error: Your local changes to the following files would be overwritten by merge:
    ExplorerWindowCleaner/Actions/AddFavoriteAction.cs
    ExplorerWindowCleaner/Actions/SwitchPinAction.cs
    ExplorerWindowCleaner/App.xaml.cs
    ExplorerWindowCleaner/AppUtils.cs
    ExplorerWindowCleaner/Explorer.cs
    ExplorerWindowCleaner/ExplorerCleaner.cs
    ExplorerWindowCleaner/MainWindow.xaml.cs
    ExplorerWindowCleaner/NotifyIconContainer.Designer.cs
    ExplorerWindowCleaner/NotifyIconContainer.cs
    ExplorerWindowCleaner/Properties/AssemblyInfo.cs
    ExplorerWindowCleaner/Properties/Resources.Designer.cs
    ExplorerWindowCleaner/Properties/Settings.Designer.cs
    ExplorerWindowCleaner/SpecialFolderManager.cs
Please, commit your changes or stash them before you can merge.
Aborting

ただブランチ切り替えただけなのになんで変更が…?
なんかよくわからないので一旦masterに戻って落ち着こうと思って

masterに切り替え(クリーンにチェックをいれた状態で)ようとすると以下のエラーが…。

f:id:finalstream:20160917202039p:plain

git -c diff.mnemonicprefix=false -c core.quotepath=false reset -q --hard HEAD --

git -c diff.mnemonicprefix=false -c core.quotepath=false checkout master
error: Your local changes to the following files would be overwritten by checkout:
    ExplorerWindowCleaner/Actions/AddFavoriteAction.cs
    ExplorerWindowCleaner/Actions/SwitchPinAction.cs
    ExplorerWindowCleaner/App.xaml.cs
    ExplorerWindowCleaner/AppUtils.cs

    ExplorerWindowCleaner/Explorer.cs
    ExplorerWindowCleaner/ExplorerCleaner.cs
    ExplorerWindowCleaner/MainWindow.xaml.cs
    ExplorerWindowCleaner/NotifyIconContainer.Designer.cs
    ExplorerWindowCleaner/NotifyIconContainer.cs
    ExplorerWindowCleaner/Properties/AssemblyInfo.cs
    ExplorerWindowCleaner/Properties/Resources.Designer.cs
    ExplorerWindowCleaner/Properties/Settings.Designer.cs
    ExplorerWindowCleaner/SpecialFolderManager.cs
Please, commit your changes or stash them before you can switch branches.
Aborting

え、ナニコレ、Gitこわい。

自動で破棄できなかったら手動で破棄しようということで以下のように 手動で破棄を選択しても消えない。破棄されない。

f:id:finalstream:20160917202011p:plain

詰んだ。。。

しばらく落ち着いてからいろいろと見渡すと破棄というメニューの中に 全てリセットという危険なボタンがあることを発見。
全て?どこから??と思いつつ、念のため、フォルダのバックアップを取って 思い切って実行してみた。

f:id:finalstream:20160917202926p:plain

f:id:finalstream:20160917203211p:plain

念押しで聞いてくるメッセージが出て、危険な行為をしていることを自覚した。

数分悩んだけどもこれしかないのでOKを押すと…。

f:id:finalstream:20160917203549p:plain

コミットされていない変更がありますという表示が消えていない。
嫌な予感がしつう、もっかいmasterをチェックアウトをしようとしたがエラーが変わっていない。
何も変わってない。

ほんとに詰んだ。。。

しばらく落ち着いて考えてみる。
コミットされていない変更がありますという言われているのだから言うとおりにコミットしてしまえばいいのではということでコミットをしてみることにした。

f:id:finalstream:20160917204411p:plain

そして再びmasterに切り替えてみると…

f:id:finalstream:20160917204648p:plain

戻れた。生還したー。

ブランチを切り替えて、変更を破棄しても破棄されず、元に戻れなくなった場合はコミットすればいいということですね。

破棄しても破棄されなかったのは何だったんだろう。。

"SQL Fiddle" ブラウザ上でいろいろなDBMSでSQLをテスト実行して、結果を確認することができるサービス。

いろいろなDBMSSQLの挙動を確認したいけど、環境構築するのが面倒な方に朗報です。

SQL Fiddleブラウザ上でDBMSを切り替えて、SQLを実行できるのでDBMSごとに異なるSQL関数の振る舞いの違いなどを簡単に確認できるサービスです。

2016/09/11現在、対応しているのは以下のDBMSで主要なものはすべてあるっぽいです。

使用方法は簡単です。

まず、以下のページにいきます。

sqlfiddle.com

以下の様な画面が表示されます。

f:id:finalstream:20160911181644p:plain

①左上のところでDBMSを選択します。

②左ペインの下にある"Build Schema"をクリック。

③右ペインが使用可能になるので、SQLを入力します。

④右ペインの下の"Run SQL"をクリック。

です。

こりゃ便利!

*1:なぜかエラーになりました

SQLite( or PostgreSQL)でファイルパスからファイル名だけを取得する。

SQLiteでファイルパスからファイル名を取得したくなったので調べてみました。

SQLiteにはlastIndexOfのようなものがないみたいです。

instr()で文字列の位置を検索できますが、最初の位置しか返さないのでファイル名取得には使用できません。
Oracleみたいにpositionを指定できてマイナスを指定したら文末からサーチしてくれればよかったんですけど。

困ったときはstackoverflowってことで調べてみました。

stackoverflow.com

ドンピシャなQuestionがありました。

これによると以下のようにすればOKということらしいです。

select replace(filepath, rtrim(filepath, replace(filepath, '\', '')), '') from table;

ほんとにとれました。
rtrimを使うなんて凡人にはできない発想ですね。
しかも1つずつ分解して考えてもどういうことなのかよくわからない。。
まー深くは考えないことにします。

rtrim?ほんまにとれるのーと疑っているそこのアナタ。
以下のページからSQLiteを選択して以下のSQLを実行してみてください。
びっくりすることにとれます。

sqlfiddle.com

select replace('c:\work\subwork\hogehoge.xls', rtrim('c:\work\subwork\hogehoge.xls', replace('c:\work\subwork\hogehoge.xls', '\', '')), '');

ちなみにPostgreSQLでも同じ方法でとれました。

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

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

C#でWin32 API(グローバルフック等)を使用してデバッグすると「指定されたモジュールが見つかりません」と表示されたとき。

ExplorerWindowCleanerにグローバルフックを実装しようとしてコードを書いてデバッグで起動すると

以下のエラーが…

System.ComponentModel.Win32Exception (0x80004005): 指定されたモジュールが見つかりません。

モジュールが見つからない???

Windows10では対応していないのかーと思い、いろいろググッて調べてみるけどそんな情報はどこにもない。

試しにビルドで生成されたexeをそのまま起動すると普通に動いた。

調べて見ると以下の設定にチェックが入っていると失敗するみたいなので、Visual Studio ホスティング プロセスを有効にする」チェックをはずすと普通に動いた。
それにしてもわかりにくいメッセージが出るんだなー。

f:id:finalstream:20160807184155p:plain

ちなみにVisual Studio ホスティング プロセスを無効にすることのデメリットは以下の3つらしいです。

  • .NET Framework アプリケーションのデバッグが始まるまでの時間が長くなる。
  • デザイン時の式評価が使用できなくなる。
  • 部分信頼デバッグが使用できなくなる。

うん、よくわからない。下の2つが。
けどそんなに問題なさそうな気がする。

詳細はMSDN
https://msdn.microsoft.com/ja-jp/library/ms185330.aspx