2020年11月28日土曜日

「マネージとネイティブの境界の前でハンドルされませんでした」という例外でハマった。

 開発中のDLLをデバッグしているときに、「型 'System.Runtime.InteropServices.COMException' の例外が XXX.dll で発生しましたが、マネージとネイティブの境界の前でハンドルされませんでした」
という例外が出るようになって、非常に困ったので、まとめ。



例外が出るのはいいとして、

□この種類の例外がスローされると中断します
のチェックボックスをOFFにしても、必ず中断されてしまうから困ったのです。

しかも、ですよ。
catch(Exception e){}のブロックに入ってくれない。
最もひどい状態では、同じ部分で延々と例外のダイアログが表示され続けるために
「デバッグの中止」
を使ってプロセスを落とすしかなくなるんです。

ちなみに開発環境は Visual Studio 2015 です。
開発しているのは、Office Outlook 用のアドインDLL
メールのヘッダに独自に設定している拡張ヘッダがあるかどうかを調べるコードです。
一般のメールにはそのヘッダはないので、「そんなヘッダはありません」という例外が出ます。(それはいい)
try{}catch{}ブロックでその例外を無視すればいいだけのコードです。

まず、「catch(Exception e){}のブロックに入ってくれない。」件に関しては、プロジェクトのProperies 設定の「デバッグ」で
□ネイティブコードのデバッグを有効にする
をチェックすることで、catch{}ブロックに入ってくるようになりました。


しか~し。
□この種類の例外がスローされると中断します
のチェックボックスをOFFにしても必ず例外で中断する現象は変わりません。

開発環境によってはこの問題が発生しないので、上手くいく環境といかない環境を比較しながら調べてみました。
結論:「ツール」-「オプション」-「デバッグ」で
□例外が AppDomain またはマネージ/ネイティブの境界を超える場合にブレークする(マネージのみ)
を OFF にします。



以上で例外での中断がなくなりました。
この問題の解決にもけっこうな日数かかりました。orz

2020年6月18日木曜日

Windows上でPerlの統合環境(Visual Studio Code + Strawberry Perl)

WEB上の情報を参考に、Windows上でPerlの統合環境を作れないか調べてみると、以下の組み合わせが便利そうだったので、構築してみました。

1.Visual Studio Code
2.Strawberry Perl
3.Perl Debugger

まずは Visual Studio Code (https://code.visualstudio.com/)のダウンロードとインストール。
使いやすいように、表記を日本語にしておきます。

次に Strawberry Perl のインストールです。
WEB上には PowerShell を使ってインストール、って紹介もあったけど、うちの環境ではうまくインストールできなかったので、公式サイト(http://strawberryperl.com/)からダウンロードしてインストールしました。
インストールだけで PATH も変更されたようです。

Perl Debugger は、VS Code を起動して、「表示」「拡張機能」で検索窓に perl って入力したら「Perl Debugger」が出てくるので、それをインストールしました。

これで準備完了。

さっそく sample.pl を作成。
#! /usr/bin/perl
use strict;

print "Hellow Perl\n";

exit;
  

print 行にブレークポイントを貼って実行すると、見事にブレークしてくれました。(^_^)v

さて、よくある問題の日本語表示を試してみましょう。
  print "Perl開発環境出来上がり\n";
に変更して実行してみます。

PS E:\TestDir\Perl\sample> cd 'E:\TestDir\Perl\sample/'; ${env:PERLDB_OPTS}='RemotePort=localhost:55237'; & 'perl' '-d' 'E:\TestDir\Perl\sample/first.pl'
Perl髢狗匱迺ー蠅・・縺ァ縺阪≠縺後j

文字化けしますね orz

use utf8;
を追加して実行してみました。

PS E:\TestDir\Perl\sample> cd 'E:\TestDir\Perl\sample/'; ${env:PERLDB_OPTS}='RemotePort=localhost:55237'; & 'perl' '-d' 'E:\TestDir\Perl\sample/first.pl'
Wide character in print at E:\TestDir\Perl\sample/first.pl line 6.
Perl髢狗匱迺ー蠅・・縺ァ縺阪≠縺後j

有名な、Wide character エラーまで出力されるようになってしまいました。

use utf8; の代わりに
use open IO => qw/:encoding(UTF-8) :std/;

を加えてみましょうか・・・
PS E:\TestDir\Perl\sample> cd 'E:\TestDir\Perl\sample/'; ${env:PERLDB_OPTS}='RemotePort=localhost:55242'; & 'perl' '-d' 'E:\TestDir\Perl\sample/first.pl'
Perlテゥツ鳴凝ァツ卍コテァツ陳ーテ・ツ「ツε」ツ・ョテ」ツ・ァテ」ツ・催」ツ・づ」ツ・古」ツつ・

Wide character エラーはなくなりましたが、文字の化け方が変わりました。

こまったぞ。

ふと気づきまして。Visual Studio Code のコンソール出力には PS **** と出てます。
Power Shell なんですね。
んで、こいつが Shift-JIS ベースなのではないだろうかと思ったわけです。

#! /usr/bin/perl
use strict;
use utf8;
binmode STDOUT, ':encoding(cp932)';

print "Perl開発環境出来上がり\n";

exit;

結果
PS E:\TestDir\Perl\sample> cd 'E:\TestDir\Perl\sample/'; ${env:PERLDB_OPTS}='RemotePort=localhost:55287'; & 'perl' '-d' 'E:\TestDir\Perl\sample/first.pl'
Perl開発環境のできあがり

ちゃんと日本語表示されています。
めでたしめでたし。

Linuxサーバー用のプログラムを Windows 上で開発・デバッグしたいと思っているので、環境に応じて binmode 変えなきゃなりませんね。
さて、どーしようか・・・

つづきは、また今度。

2020年6月1日月曜日

自分のblogが表示されなくなってしまった。

どうも最近、このブログを Chrome で表示できない状態になってたみたいで。

alexgorbatchev.comを待機中です...
と表示されて延々とだんまりになります。

ページのソースを表示させるとソースは表示できてる。
んで、上記のドメインが書かれている場所のソースを curl で覗いてみますと、

curl https://alexgorbatchev.com/pub/sh/current/styles/shCore.css
curl: (35) schannel: next InitializeSecurityContext failed: Unknown error (0x80092012) - 失効の関数は証明書の失効を確認 できませんでした。

証明書エラーで、取得できないようで。
んで、これって、たぶんページのデザインなんだろうな、と思いいたり
IEでログインしてテーマのデザインを適当に別のデザインに変更しました。

すると、上手く表示されるようになりました。

テーマで Simple を使ってると(ここの場合 Bold を選択してました)ダメなんじゃないかな。
ということで、同じように困っている人は、IEでログインしてテーマを変更するといいよ。


2020年5月8日金曜日

メールがなくなった?そんなことが起こらないようにするには

受信したはずのメールがなくなった!
というのは、割とよくある話で、実際に何度も相談を受けたことがあります。

そういった相談をされてこられる方には以下の特徴があります。

1.受信したメールは、すべて、Outlookの受信トレイにある。
2.メールの添付ファイルはデスクトップに保存している。

すごいんですよ。
会話中に、
『えーっと、どれだったかな』
と言いながら Outlook のメール検索機能で差出人を検索して
『あーこれこれ』
って膨大なメールから探し出して示してくれるんだけど、元々見ていたメールが見えなくなっちゃうとか。

デスクトップにびっしりとアイコンが並んでいて、短縮されている長いファイル名のファイルを探し出してクリックするところとかを見て
『なんとかしてあげたい』
と思うことしきりです。(笑)

話を元に戻しましょう。
『メールがどこかへ行ってしまった』
ですね。

メールソフトの不具合というのもたしかに考えられます。
多くの場合は忘れていた振分けの指定や、マウスの操作でよそのフォルダに移動してしまった場合が多いものです。
そういった時は、メールソフトの検索機能で送信者や、わずかに覚えているメールの文面を検索して見つけることができます。

こういったシーンのきっかけになるのは、たとえば取引先から
『この間のメールの件、まだ返信をもらってないんだけど』
なんて連絡が来てからあわてるものですから、なかなか効率よく目的のメールを見つけられないことが多いものです。

はじめっからメールを整理しておけば、そういった問題を発生させにくくすることはできるものです。

いざという時に慌てなくて済むように、普段からメールの【仕分け】機能あるいは【振り分け機能】を利用しましょう。


まずは、メールソフトでアカウントの配下に、取引先などわかりやすい名前のフォルダを作成します。

Outlookの「仕分けルール」を使って、
・取引先からのメール(差出人が取引先になっているメール)を受信したら指定フォルダに移動する。
・取引先へのメール(宛先が取引先のメールアドレス)を送信したときは、指定フォルダに移動する。
という2つの指定をしておくことで、その後は取引先とのやり取りを1つのフォルダで管理できるようになります。



















強力な Outlook用の振り分けマネージャ BizFilter for Outlook には「クロスフィルタ」の機能が備わっていて、2つの条件を1度に設定してしまうことができます。




この図では、[取引先¥新選組]のフォルダに、ドメインが「shinsengumi.seasoft.co.jp」の相手とのメールを振り分けるように指示していますが、この1回の設定で
1.shinsengumi.seasoft.co.jpからの受信メールは[取引先¥新選組]フォルダに振り分ける。
2.shinsengumi.seasoft.co.jpへの送信メールは[取引先¥新選組]フォルダに振り分ける。

という2つの振り分け条件を一度に設定できるわけです。

【振り分けマネージャ BizFilter for Outlook】には、ほかにも
・Outlook の仕分け機能では指定できない、AND/ORの複合条件での振り分け
・正規表現を用いた振り分けルールの設定
・設定したルールを再度実行する「イールドフィルタ」
など、メールを中心とした業務の効率を大幅に向上できる数々の機能が備わっています。

1か月無料で試用できるトライアルライセンスを一度試してみてはいかがでしょう?
こちらから無料でダウンロードできますよ。

2020年2月21日金曜日

SVNサーバーをヘテムルサーバーに移設


SVNサーバをヘテムルサーバに移設


ヘテムルサーバから転送量制限の緩和メールが届いたのと、SVNサーバを置いているさくらVPSがちょっと重かったので、SVNサーバを移設してみました。

少しハマってしまったので、まとめておきます。

リポジトリを最新に

いちおう、移設前にローカルコンピュータ上の内容とリポジトリを一致させておいたほうがいいと思いましたので、コミットしておきました。


ローカルコンピュータ上では TortoiseSVN を利用してます。

リポジトリの退避

移設前のサーバー上のリポジトリを退避(バックアップ)します。

バックアップには svnadmin dump コマンドを使用します。

リポジトリをどこに作ったか忘れてしまってたので探すのに苦労したw

ls /var/svn/repos/ に発見しましたw



まず、移設前の環境でリポジトリをバックアップします。


SSHなどでサーバーにログイン。


作業ディレクトリを作ります。


(dfなどでディスクのサイズを確認しておきましょう)


# cd /tmp
# mkdir back
# cd ./back

現在のリポジトリの内容をダンプします。

# svnadmin dump /var/svn/repos/PROJECT > ./PROJECT.dump 2>/dev/null


標準エラー出力をリダイレクトしておかないと、すごい量のダンプが出力されて、そのうち印刷データなどに飛ばされるようなことになりかねます(実際そうなったw)ので、標準エラー出力を止める必要があります。

2>/dev/null

書いてないと時間もかかるしkillできないしで、めちゃくちゃ待たされますw

終わったらダンプファイルを圧縮します。

tar -zcvf PROJECT.dump.tar.gz PROJECT.dump

圧縮したダンプファイルを移設先にコピーします。

バックアップ目的でローカルコンピュータを経由してもいいけど、普通にscp で転送したほうが楽ですね。

まず移転先のヘテムルサーバに SSHでログインして、tmp フォルダを作っておきます。


# ssh -P 2222 ユーザー名@SSHドメイン

# mkdir -p ./tmp

# scp -P 2222 PROJECT.dump.tar.gz ユーザー名@SSHドメイン:/home/sites/heteml/users/h/o/g/hoge/tmp/

※ /home/sites/heteml/users/h/o/g/hoge を付けとかないとだめなのがミソw

ダンプファイルの解凍

ヘテムルサーバにログインしてダンプファイルを解凍します。


# cd ./tmp
# tar -zxvf PROJECT.dump
# cd ..


リポジトリを作成します。


# mkdir -p ./repos
# svnadmin create ./repos/PROJECT


リポジトリをダンプファイルから復元(リストア)

# svnadmin load ./repos/PROJECT < ./tmp/PROJECT.dump 2>/dev/null

これでリポジトリ構成が移設できます。


Windows上の TortiseSVN でリポジトリの再配置

※ここが最も苦労しました。SSHのポート番号が 2222 なのと、リポジトリのパス名指定がややこしいからでした。


まず、C:\ユーザー\ユーザー名\AppData\Roaming\Subversion\config ファイル
を開き、[tunnels]セクションに以下を追加します。



repos = "C:\\Program Files\\TortoiseSVN\\bin\\TortoisePlink.exe" -ssh -P 2222 -l ユーザー名 -pw パスワード
            ↑ '\\'と2つ付けないとダメでした。場合によっては空白部分にも '\ 'が必要と記載されている場所もありました。
↑小文字でなければいけないし、'_' などは使用できないようでした。


エクスプローラからローカルフォルダを右クリックし、TortizeSVNメニュー
の再配置を選択し以下のように記載します。

svn+repos://SSHサーバー/home/sites/heteml/users/h/o/g/hoge/repos/PROJECT

再配置が完了すれば、移設がうまくいったことになったと思ったら大間違い。

ちゃんと更新とかコミットを確認しないと大変なことになります。

更新がうまくいかなかった場合の対処について

リビジョンが 73 なのに 173 のリビジョンなんてない!というエラーで更新
ができなくなってしまいました。


対応としてやったこと

(1) リポジトリが正しいかを確認。

別のフォルダを作って、対象のリポジトリをチェックアウトしてみます。

うまくいかない場合はサーバー側のリポジトリに問題があります。

うちの場合は正しくチェックアウトできました。


(2) ローカルフォルダの .svn フォルダを削除します。

勇気のいる行動ですねw真似をされる場合は自己責任でお願いします。

(3) リポジトリをチェックアウトします。

フォルダが空でないよと警告出ますが、リポジトリを本来のローカルフォルダ
にチェックアウトします。


※(1)で新しく作成したフォルダにチェックアウトしたのち古いフォルダ
と名前を変更してしまえばいいと思いましたが、それはできませんでしたw

上記手順でうまくいきました。

めでたしめでたし。

さいごに

古いサーバーのリポジトリやダンプは削除しておきましょう。

svnadmin にはリポジトリを削除する機能が用意されていないので、

# rm -rf /var/svn/repos/PROJECT で削除します。

なかなか時間のかかる作業でした。