ゴミ箱.net

汚物は消毒

Windows VistaにVisual Studio 2012を入れて悲惨な目に遭った奴m9(^Д^)プギャー

Windows VistaのマシンにVisual Studio Express 2012をインストールすることはできない。

インストーラを実行しようとしたら、最初は何にも警告も出ずにインストールプロセスが進行するが、最後の最後にエラーが出る。いちおうインストールは完了するが、起動しようとしてもエラーが発生してできない。
最初にOSのチェックぐらいしろよ糞豚野郎。

しかも、アンインストールしても完全に元の状態には戻らない。使えないゴミを始末してめでたしめでたし…とはいかないのだ。
ビルドするたびに「2008は有効な警告番号ではありません」という意味不明な警告が出るようになり、非常にうっとうしい。
それだけならともかく、Visual Studio 2010をインストールしていると、どういうわけか.NET Framework3.5以下をターゲットとしてビルドしたときにリソースによる多言語化ができなくなるというステキな置き土産まで残しやがってくれます。
どうやらリソースのDLLが常に.NET Framework4.0向けにビルドされてしまうようになり、ロードできなくなってしまうらしい。

その場合の対処方法。くれぐれも自己責任でお願いします。

レジストリの以下のキーに対し、値を変更します。(これはもしかするといらないかも?)
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows
名称: CurrentInstallFolder 値: C:\Program Files\Microsoft SDKs\Windows\v8.0A\→C:\Program Files\Microsoft SDKs\Windows\v7.0A\
名称: CurrentVersion 値: v8.0A→v7.0A

また、レジストリに以下のキーが残っていると思うので、丸ごと消してください。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\4.0\11.0
このキーはVisual Studio 2012が裏で呼び出すMicrosoft SDKのパスを指定しているのだが、Visual Studio 2012を削除しても消えてくれない。
そしてこれが残っているせいで、Visual Studio 2010がMicrosoft SDKのパスを正常に認識しなくなり、上に書いたようなおかしな挙動を引き起こしているようだ。
レジストリを編集したらプロジェクトをリビルドすればおk。

スポンサーサイト

PageTop

またStruts2のバグ踏んだ

ついでにもう1つStruts 2のバグを踏んだ。

[#WW-4184] When a getter of an action calls getText("getterName.something"), method call stack overflow occurs - ASF JIRA

アクションクラスにgetterを用意し、その中でメソッドgetTextを呼び出す。
そのとき、getTextのパラメータとして「getterの名前.○○」を指定する。

public class HogeAction extends ActionSupport {
public String getPiyo(){
return getText("piyo.fuga");
}
}

また、アクションクラスと同名のプロパティファイルを用意し、「getterの名前.○○」をキーとする値が存在しないようにしておく。

このとき、JSPファイルからこのgetterを参照しようとすると無限再帰呼び出しが発生してスタックがオーバーフローする。
しかも<s:debug>タグを入れると例外が発生してデバッグできなくなってしまう。

このバグを踏むのはなかなかのレアケースだと思うが、レアなバグにはまる人間はまれによくいる。ちょうどここに1人。
万が一踏んでしまったらgetterの名前かgetTextの引数のどちらかを変えましょう。

PageTop

Struts2のバグ踏んだ

ウェブアプリケーションフレームワークのStruts 2を使っててバグに出くわしたので報告してみた。

[#WW-4167] Unable to create a custom validator inheriting IntRangeFieldValidator - ASF JIRA

Struts 2には入力値をチェックする仕組みとしてバリデータというものがあり、最初から用意されているもの以外に独自に作成することもできる。
整数値の入力値の最大・最小値をチェックするためのバリデータとしてIntRangeFieldValidatorというのが用意されているが、それを継承して独自のバリデータを作ろうとしたところ、なぜか動作しない。

どうやらIntRangeFieldValidatorの基底クラスでgetter、setterの型が型パラメータで指定されているのが悪いらしい。基底クラスの直接の派生クラスでは問題ないが、間接的に継承している場合にsetterに値がきちんと渡されないようだ。

回避策としては、IntRangeFieldValidatorを継承しないようにするか、継承するときは型パラメータを使ったgetterとsetter(getMin, setMin, getMax, setMan)をオーバーライドしましょう(実装は基底クラスのメソッドを呼び出すだけでおk)。

PageTop

フリーソフトの利用者は開発者にどこまでついていくべきか

フレームワークとしてStruts 2を使ったウェブアプリケーションを開発していたら、最近重大なセキュリティフィックスが出たというのであわてて差し替えた。
まあJARファイルを入れ替えるだけなのでちゃちゃっとWARファイルを作り直してリリースしたのだが。
…あれ?なんか入力チェックが動かなくなってる?

続きを読む

PageTop