F1大好きな、インチキ技術者の日記

F1大好きなインチキ技術者が情報を発信して、自分を変えようとしている日記です

gpgでパスフレーズを聞かれずにファイルを復号化する方法

バッチファイルなどからgpgを使うには*1

簡単で、以下の通りのコマンドでOK

echo 【復号化パスフレーズ】| gpg --passphrase-fd 0 --decrypt --batch --no-secmem-warning 【復号化したいgpgファイル】

「--passphrase-fd 0」と「--batch」オプションを用いて、標準出力でパスフレーズを渡す方法でとっても簡単です。

なお、「--no-secmem-warning」は「gpg: Warning: using insecure memory!」のエラーが出ないようにするおまじないです。

*1:2014年08月26日にQiitaに投稿した記事です。

x64 Windows で Poderosa のターミナルをタブで次々と開く方法(解決編)

.NET Frameworkアプリを32bitで動作するようにする*1

前回(調査編)、64bitと32bitの違いで動作に問題があることがわかりました。 となるとOSSPoderosaでとれる対応は2つありそうです。

対応策

  • ソースに手を入れてWin32 APIの所を改修する
  • 32bitモードで動かすようにする

手抜きな僕は、後者を選択しました(^_^)

Visual Studioの操作手順

環境

ソースをDLして開く!

  • poderosa.sln をダブルクリック、プロジェクトの変換が必要だが全部お任せ

構成マネージャからx86ビルドを追加する

  • 右のソリューションエクスプローラーを右クリック、「構成マネージャー」を選択 1.png  

  • 構成マネージャーの「アクティブ ソリューション プラットフォーム」から「<新規作成..>」を選択するスクリーンショット 2014-08-25 18.45.19.png  

  • 新しいプラットフォームの選択で「x86」を選択してOK! スクリーンショット 2014-08-25 18.45.40.png  

  • プラットフォームがx86になります! スクリーンショット 2014-08-25 18.45.45.png

 

  • 後はビルド!!! おそらく問題なくビルドできると思います!  

  • ビルドができたら、「Poderosa-4.3.8b\Executable\obj\x86\Release」の中に「Poderosa.exe」があるのでいつも使っているPoderosa.exeに上書き! (バックアップはお忘れなく!)  

  • 後は32bitプロセスで動いているのか確認! スクリーンショット 2014-08-25 18.55.02.png

晴れて、Poderosaが64bitモードで動きました! Poderosa(x64).exeが今回ビルドしたの64bit版で動くPoderosaです! 通常のPoderosa.exeは32bitで動いています。

ここまでやると、こちらのバッチファイルでポンポンと新しいタブで開く元の挙動になりました!

あとがき

今回はPoderosaでしたが.NETのアプリケーションには同じような問題があるかもしれない。 .NETアプリすべてを32bitで動かすような設定もあるようなので確認したい

*1:2014年09月03日にQiitaに投稿した記事です。

x64 Windows で Poderosa のターミナルをタブで次々と開く方法(調査編)

たくさんのサーバに一挙ログイン!してたのに・・・*1

Windows7(x86)からWindows8.1(x64)にアップグレードしたら、Poderosaの「-open」オプションを使ってひとつのPoderosaプロセスで複数のタブが起動できなくなった。

元々batファイルで以下の様に指定してた。 D:\soft\PoderosaPoderosa本体がインストールされています D:\soft\Poderosa\gtsgtsファイルが複数置いてあります

とあるディレクトリにあるgtsファイルを読み込んで一気に開くbatファイルは以下の通り用意してました

set PODEROSA_ROOT=D:\soft\Poderosa\
set PODEROSA_GTS=D:\soft\Poderosa\gts\

set PODEROSA_EXE=%PODEROSA_ROOT%Poderosa.exe
set PODEROSA_CONF=%PODEROSA_GTS%conf

start "Poderosa" /D %PODEROSA_ROOT% %PODEROSA_EXE%

Rem 以下の2秒は環境による。ウィンドウができ終わるまで待つのがみそ。
timeout 2

Rem dirかまして*.gtsを全部PoderosaでOpenする!
for /f %%i in ('dir /b %PODEROSA_GTS%*.gts') do "%PODEROSA_EXE%" -open "%PODEROSA_GTS%%%i"

でも、これがWindows8.1(x64)に移行したら動かなくなりました。。。 batファイルは動くのですが、gtsファイルの分だけPoderosa.exeが起動してしまい タブにならず、たくさんのウィンドウが表示されるようになってしまいました。

当初は、Windows7からWindows8.1に移行したためだと考えていたのですが、調査したところx86からx64になったため挙動が変わったって事だったのですが、気がつくまでの顛末を書いておきたいと思いました。

Poderosaのソースをみてみる

とりあえず"-open"の引数を処理しているところのソース追いかけてみた。

            //コマンドライン引数を読む
            int i = 0;
            while (i < args.Length) {
                string t = args[i];
                string v = i < args.Length - 1 ? args[i + 1] : "";
                switch (t) {
                    case "-p":
                    case "--profile":
                        preference_home = ResolveProfileDirectory(v);
                        i += 2;
                        break;
                    case "-a":
                    case "--addasm":
                        pm.AddAssembly(home_directory, v.Split(';'));
                        i += 2;
                        break;
                    case "-r":
                    case "--remasm":
                        pm.RemoveAssembly(home_directory, v.Split(';'));
                        i += 2;
                        break;
                    case "-open":
                        open_file = v;
                        i += 2;
                        break;
                    default:
                        i++;
                        break;
                }

            if (open_file != null && TryToSendOpenFileMessage(open_file))
                return null; //別インスタンスに送信

ふむふむ。。。どうやら、TryToSendOpenFileMessage()が何らかの理由で上手くいってないに違いない。 さらに調査を進めると・・・

        //別インスタンスへの送信を試みる。ショートカットを開いたときの多重起動に関するところで。
        private static bool TryToSendOpenFileMessage(string filename) {
            //ウィンドウを見つける
            unsafe {
                //find target
                IntPtr hwnd = Win32.FindWindowEx(IntPtr.Zero, IntPtr.Zero, null, null);
                char[] name = new char[256];
                char[] mf = new char[256];
                while (hwnd != IntPtr.Zero) {
                    int len = Win32.GetWindowText(hwnd, name, 256);
                    if (new string(name, 0, len).IndexOf("Poderosa") != -1) { //Window Classを確認するとか何とかすべきかも、だが
                        if (TryToSendOpenFileMessage(hwnd, filename))
                            return true;
                    }
                    hwnd = Win32.FindWindowEx(IntPtr.Zero, hwnd, null, null);
                }

                return false;
            }
        }

原因は64bitプロセス内でWin32 APIのFindWindowEx()を使っても64bitプロセスのウィンドウは見つからないこと!

ここのソース【Win32.FindWindowEx】を見たときに「ああ、OSのバージョンじゃなくて、x86をx64にしたせいだ!」ってひらめきました! ちょっと調べるとたくさん出てくる出てくる。 ● 32bit プロセスは 64bit プロセスを見つけられない - Life like a clown

.Net Frameworkで動くPoderosaは64bitで動いているので、Win32 APIであるFindWindowEx()ではウィンドウが見つからないため、新規に起動されていたわけですね。

やっと挙動に納得。次は対応策を検討せねば。。。

*1:2014年08月22日にQiitaに投稿した記事です。

ApacheでQueryString(URLパラメータ)の値によってBASIC認証をかけたい!

Apacheで特定のQueryString(URLパラメータ)に応じてBASIC認証をかける必要が出てきたのでRewriteを用いて対応しました。*1

設定したいこと

  • 「area=admin」がQueryStringに設定されている場合BASIC認証をかける。
  • 「area=admin」がない場合はそのまま表示できる。

当初は、 SetEnvIf を用いていけるかな?と考えていたけど、SetEnvIf の REQUEST_URIにはQueryStringは含まれていない。

「むー、こまった。」と途方に暮れていたらQueryStringを扱うにはRewriteを使いなさいと書いてあったので早速検討した。

「なんでBASIC認証かけるのにRewriteなんだよ。。。」ってブツブツ言いながら以下の設定をApacheに追加したら思ったとおりの挙動となりました。

Apacheの設定

RewriteEngine On
RewriteCond %{QUERY_STRING} area=admin
RewriteRule (.*) $1 [E=admin_access:1]

<Location />
    Order allow,deny
    Allow from All
    Deny from env=admin_access
    
    AuthUserFile /etc/httpd/conf/.htpasswd
    AuthGroupFile /dev/null
    AuthName "Administorator's Area"
    AuthType Basic
    require valid-user
    
    Satisfy Any
</Location>

やっぱり、ちょっと違和感あるな。。。(^_^) ほかに方法ないのかな~

参考にさせていただいたサイト

まとめサイト: SetEnvIf の Request_URI には Query String は含まれない wall-climb » 特定URLのみBASIC認証を除外する

*1:2014年08月22日にQiitaに投稿した記事です。

Redmineを4.0.5から4.1.0にアップデートした時の事

常に新しいRedmineを使いたいのでアップデートを率先してやっています。 業務で利用しているので、お昼休みの一時間だけでなんとかするミッションです🥺アップデートは、手順に従って実施するのみのはず。

いつも大変お世話になっている、こちらのサイトの通りにやっていきます。

guide.redmine.jp

4.0系から4.1系のアップデートなのでその部分のみ、svnコマンドを変更しました。

# svn sw ^/branches/4.1-stable

ここまでは問題なかった。 でも、問題が起きるのはいつもここからだ。DB migrateを実行すると今回もやっぱりエラーになった😅

その対応を忘れないうちに書き留めています。

プラグインをたくさん入れているので、手順通り実施してもエラーになるのは慣れっこです🤐

NoMethodError: undefined method `assets'

まず、こちらのエラーがでました😅

# bundle exec rake db:migrate RAILS_ENV=production
rake aborted!
NoMethodError: undefined method `assets' for #<Rails::Application::Configuration:0x000055a03c7ecb88>
Did you mean?  asset_host

調べたところ、対応策があった。これが正しいのかどうか判断できなかったが、やってみたら上手くいった。

Sprockets::Railtie::ManifestNeededError

もう一度 DB migrateを実施したところ今度は違うエラーになった😅

# bundle exec rake db:migrate RAILS_ENV=production
rake aborted!
Sprockets::Railtie::ManifestNeededError: Expected to find a manifest file in `app/assets/config/manifest.js`
But did not, please create this file and use it to link any assets that need
to be rendered by your app:

Example:
  //= link_tree ../images
  //= link_directory ../javascripts .js
  //= link_directory ../stylesheets .css
and restart your server

これは、指示通りファイルを作れば良いように見える。同じような対応をしている方もいた。 Exampleの通りファイルを作ったら問題なくなった。

Redmine 4.1 は新機能がいっぱい

Redmine 4.1は新しい機能がたくさん実装されました。個人的には、「通知メールの件名にステータスを含めない」と言うのがありがたいです😊

GmailOutlookを使っていると件名でスレッド化されますからね。 他にも便利な機能があるので、これから試していこうと思います。

動かないので外したプラグイン

お昼休みだけでは解決できなかったので今後継続対応を検討中。この機能は必須なんです、プロジェクトに癒やしを提供する大切な機能なのです😍

後日談

4.1対応済みのForkを教えていただきました!無事に動きました😍😍😍

ChromiumベースのMicrosoft Edgeで、IEモードで開くサイトを設定する

Microsoft Edgeが新しくなった!

ChromiumベースのMicrosoft Edgeがリリースされました、早速インストールしたらイタリア語になっていて若干笑ってしまいました。 インストール時の言語もそうでしたので、「わかってたよ」と言う感じでした😅 Microsoftさんの方で対応中らしいです。

その他の利用感は悪くないように思えます。と言うか普通に使っている分にはChromeと大差ないですね。

IEで開かなければならいシステムはまだある

Microsoft Edgeが新しくなっても、IEで開かないサイトは永久に不滅なのかもしれません・・・ そのためEdgeには特定のサイトをIEモードで開く機能が提供されています。 早速必要😥になったので、 Microsoft Edge を IE モードで使用する | Microsoft Docs をみて対応しましたが、どうにもサイト一覧を記載したXMLをすぐに読み込んでくれず困っていました。

サイト一覧のファイルをすぐに読み込ませるには

Edgeで edge://compat/enterprise にアクセスし「強制的に更新」ボタンを押すとすぐにサイトリストを読み込み直してくれます。

僕はそれまで毎度Edgeを再起動、それでもダメならOSを再起動してました・・・😢

【Google Cloud】外部IPアドレス利用料がかかるようになり急に予算の 90% に達しましたと通知が来た(でも無料みたい)

突然の「予算の 90% に達しました」メール

Google Cloud の無料枠を利用して、1台サーバーを利用しています。 Always Free プログラムが本当にありがたくて感謝しています。基本的には無料枠の中で運用していました。

ですが、急に「予算の 90% に達しました」というメールがGCPより送付されてきました。 f:id:hanamiche:20200110173338p:plain 内容を確認するとおよそ90円の利用料が発生しているが、-90円という表記もあり不気味に感じて調査しました。

原因は外部IPアドレスへの課金

GCPのコンソールから詳細を確認すると、「Compute Engine External IP Charge on a Standard VM」に料金がかかっていました、外部IPアドレスに対する料金です。 f:id:hanamiche:20200110174012p:plain 確か外部IPアドレスの利用も無料枠に入っていたはず・・・と思いながら過去の請求分を確認するとやはり請求されている形跡はありません。 VMが起動していないCompute Engineに割り当てた外部IPアドレスは有料になる仕様があったような気がしたので確認しましたがVMは起動していました。

調査の結果は、課金されるが値引きさ無料になる(はず)

IPv4は貴重なので無料枠では使えなくなったのかもしれないと考え、調べたら以下の記述がありました。

注: Google Cloud では、2020 年 1 月 1 日から VM インスタンスの外部 IP アドレスの使用に料金がかかります。 ただし、Google Cloud の無料枠では当月内の合計時間数と同等の時間数を使い切るまで、使用中の外部 IP アドレスを無料でご利用いただけます。

だから-90円されてたんだ!と納得がいきました。(同時に請求額に対してアラートを出して欲しいな・・・とも思ったり) とにかく、費用請求されることはなさそうですが、注意深く見守ろうと思います。