技術」カテゴリーアーカイブ

ローカルのSQL Server+Windows10にJDBCで繋がらなくなった→解決

今使ってるPCはWindows7から、例の無料アップグレード期間にWindows10にアップグレードしたものなのだけど、
7時代には動いてたプログラムが動かなくなってた。

Eclipse + Java6 + JBossAS6 なサーバで、同一マシンで動いてるSQL ServerからJDBC経由でデータを取ってくるプログラムなんだけど
Win7時代には問題なく動いていたのに、Win10で起動したら

com.microsoft.sqlserver.jdbc.SQLServerException:ドライバーが SSL (Secure Sockets Layer) 暗号化による SQL Server への安全な接続を確立できませんでした

とか言って繋がらない。

上記エラーメッセージで色々ググったけど、ソレらしい情報見つからない。

試しに別PC(Win7)のSQL Serverに繋いだら、こっちは繋がった。
OSのせいか?

で、なんとなく試しにJBoss動かしてるJREを7にしてみたら、繋がった。
Win10とJRE6のJDBCは相性が悪いっぽいな。

Windows10にしたらJBossでSQL Serverに繋がらなくなった件

久しぶりに技術系エントリ

仕事でJBoss6AS + Java6 + SQL ServerなシステムをWin7マシンで作ってて、それはちゃんと動いてて納品したのが1年前。
で、今年に入ってWin7マシンをWin10にアップグレードしたのね。
で、また仕事で上記のJBossのシステムの機能追加案件が来たので起動してみたら、DBの接続辺りで下記のような例外が出てた。
続きを読む

swprintf → swprintf_sに移行したらメモリ破壊した

VC6のプロジェクトをVS2010にする作業をしているのですが、

warning C4996: ‘sprintf’: This function or variable may be unsafe.

みたいな警告が出まくるんですよね。
これは「sprintfとか古くてセキュリティ的にヤバイからsprintf_s使え」みたいな意味で、別にそのままでも使えないことはないけど、
「_s付きのに移行せよ」
って指示を受けたのでせっせこ移行作業してるんですよ。

どうせならVS2015とかにしてくれてもいいのい。

で、_s付きのって大抵、

char buff[20];
int val = 10;
sprintf_s(buff, sizeof(buff), "%d", val);

みたいな感じで第一引数のバッファのサイズを第二引数に渡すだけなんだけど、swprintfを同じようにswprintf_sにしてみたらメモリ破壊してくれた。

wchar_t buff[20];
int val = 10;
swprintf_s(buff, sizeof(buff), "%d", val);

これでメモリ破壊が起る。

コレ、正解は

swprintf_s(buff, 20, "%d", val);

sprintf_s系の第二引数はバッファサイズじゃなくて文字数なんですね。
MSDNには

sizeOfBuffer
  格納する最大文字数。

MSDN

って書いてある。引数名が罠。
VS2010で関数にカーソル当てると出てくるチップでは「size_t _SizeInWords」って書いてあった。こっちならまだ解ったのに。

これ案外引っかかりやすそうな罠だと思うんだけど、ググっても出てこないんだよね。
みんな引っかからないのかな。
私がヘボいだけなのか。

JavaとKeep-Aliveの話

Javaに対する愚痴みたいなエントリー

グダグダと無為に長い文章書いたけど、結論だけ先に書くと、
・JavaではIPパケットヘッダを操作出来ないので、Keep-Aliveを自力で実装することは不可能。
・どうしてもKeep-AliveしたかったらC/C++でDLLとか作ってJNIで呼び出すか、OSの設定(レジストリとか)を変えるしかない。
 Jpcapを使ったJava用のライブラリがありましたが、今は公開されてないっぽい。結局JNI使うし。
・Javaはうんこ
ということです。

続きを読む