2014年9月17日水曜日

Mybatisを使う中でのTips (軽め

使っているライブラリのバージョンは、3.0.4です。
マニュアルをきちんと読めばわかる内容なので、自分用メモです。

IF文について


else はありません。
比較演算子は、 != か、 == です
ELSEを使いたければ、chooseを。

例) Order Byを可変にする例

OEDER BY
<if test="sortId != null and sortId!=''">
  ${sortId} ${sortType}
</if>
<if test="sortId == null or sortId == ''">
  COLA ASC
  ,COLB DESC
</if>

別途定義しているSQLを利用する方法


定義:

<sql id = "commonQuery">
SELECT 1
</sql>

呼び出し

<include refid="commonQuery"/>


2014年9月16日火曜日

MySQLでサブクエリでUPDATE

以外と便利です。ただ、方言なので、ANSI的なSQLとは違います。


UPDATE `tableA` r,
    (SELECT id,c.hoge
    FROM `tableA` r
       JOIN tableB e ON r.aa = e.aa
       JOIN tableC c ON c.bb = e.bb) x
SET
r.hoge = x.hoge
WHERE
r.id = x.id;

2014年9月12日金曜日

サーバーOSのシャットダウン時にtomcatが正常にシャットダウンしない件

仮想環境で新たにアプリが動作するサーバー環境を作成したところ、
OSのシャットダウン時にTomcatが正しく終了せず、OSが終了できなくなってしまいました。

色々と調べたところ、解消したので経緯を残しておきます。


事象

サーバOS上で、shutdown -h nowを行うと、tomcatの終了スクリプトで待ち状態。そのうち
UnknownHostExceptionを出して、うんともすんともいかなくなる。


java.net.UnknownHostException: hostname: hostname
    at java.net.InetAddress.getLocalHost(InetAddress.java:1360)
    at org.apache.jk.common.ChannelSocket.unLockSocket(ChannelSocket.java:490)
    at org.apache.jk.common.ChannelSocket.pause(ChannelSocket.java:288)
    at org.apache.jk.server.JkMain.pause(JkMain.java:726)
    at org.apache.jk.server.JkCoyoteHandler.pause(JkCoyoteHandler.java:153)
    at org.apache.catalina.connector.Connector.pause(Connector.java:1037)
    at org.apache.catalina.core.StandardService.stop(StandardService.java:578)
    at org.apache.catalina.core.StandardServer.stop(StandardServer.java:788)
    at org.apache.catalina.startup.Catalina.stop(Catalina.java:662)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:629)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)


結果

ホスト名が原因ではなく、tomcatのサービスが正しくインストールされていなかったため。

過程

・ホスト名の解決
 /etc/hostsに、hostnameを書いていなかったので、書きました。

しかし、ダメ。

・シャットダウンの詳細確認

きちんと動いているサーバーもあるので、シャットダウンの時の内容を比較。
すると、tomcatの終了順が違う事がわかりました。

終了順をさらに調べていくと、以下な感じ
cd /etc/rc.d

【OKケース】

[root@host rc.d]# ls -l -R | grep tomcat
lrwxrwxrwx  1 16  9月 12 19:52 2014 K15tomcat -> ../init.d/tomcat
lrwxrwxrwx  1 16  9月 12 19:52 2014 K15tomcat -> ../init.d/tomcat
lrwxrwxrwx  1 16  9月 12 19:52 2014 S80tomcat -> ../init.d/tomcat
lrwxrwxrwx  1 16  9月 12 19:52 2014 S80tomcat -> ../init.d/tomcat
lrwxrwxrwx  1 16  9月 12 19:52 2014 S80tomcat -> ../init.d/tomcat
lrwxrwxrwx  1 16  9月 12 19:52 2014 S80tomcat -> ../init.d/tomcat
lrwxrwxrwx  1 16  9月 12 19:52 2014 K15tomcat -> ../init.d/tomcat
【NGケース】

[root@host rc.d]# ls -l -R | grep tomcat
lrwxrwxrwx  1 16  9月 12 19:52 2014 S80tomcat -> ../init.d/tomcat
lrwxrwxrwx  1 16  9月 12 19:52 2014 S80tomcat -> ../init.d/tomcat
lrwxrwxrwx  1 16  9月 12 19:52 2014 S80tomcat -> ../init.d/tomcat
lrwxrwxrwx  1 16  9月 12 19:52 2014 S80tomcat -> ../init.d/tomcat
終了スクリプトがない・・・


というわけで、


chkconfig --del tomcat
chkconfig --add tomcat
chkconfig tomcat on


を実施し、きちんと生成されて、正しくシャットダウンできる事が確認できました。

インストールに失敗したのかもしれません・・・


2014年9月9日火曜日

CentOS6.5 + mod_mono で起動時にエラー「Failed to connect to mod-mono-server after several attempts to spawn the process.」

いつもの通りCentOS環境でmod_monoをソースからインストールして起動したところ
「Failed to connect to mod-mono-server after several attempts to spawn the process.」
のエラーが出てしまい、対処をしたので手順をメモしておきます。

概略

  1. ソースからmod_monoをインストール
  2. /testエイリアスを作成し、mod_monoのサンプルサイトへアクセス
  3. 503エラーとなったので、/var/log/httpd/error_log を参照したところ、上記のエラー

原因

SELINUXが標準でインストールされ、稼働していたためでした。

SELINUUXの動作状況確認


#getenforce

enforcing : 有効 , disabled : 無効




SELINUXの無効化設定


/etc/selinux/config
SELINUX=disabled


サーバー再起動で、完了です。


2014年8月18日月曜日

Kendo UI で、Cultureを変更する

モックアップを作りたいだけなので、簡単にメモ。

<script src="../../../kendoui/js/cultures/kendo.culture.ja.min.js"></script>

<script>
kendo.culture("ja");
</script>

ある程度使えるかどうかの評価をすることになったらちゃんと記事にしていきます。

2014年8月14日木曜日

ビルドされているモジュールのプラットフォームを確認する方法(corFlags.exe)

CorFlags.exe というFrameworkに付属しているツールを利用すると
モジュールがビルドされたプラットフォームを確認する事が出来ます。

私の場合、64bit環境で動作有、原因を調べるのに使いました。

http://msdn.microsoft.com/ja-jp/library/ms164699(v=vs.110).aspx


【使用例】
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin>CorFlags.exe aspnet_merge.exe
Microsoft (R) .NET Framework CorFlags Conversion Tool.  Version  3.5.30729.1
Copyright (c) Microsoft Corporation.  All rights reserved.

Version   : v2.0.50727
CLR Header: 2.5
PE        : PE32
CorFlags  : 11
ILONLY    : 1
32BIT     : 1
Signed    : 1

正しい使い方はあれこれありそうですが、私の場合には32bitでビルドされたことが
わかって、それでOKだったので、話題としては終わりでした。


プログラム入れ替えにより ASP.net WebサービスでPermissionsエラーが発生

IIS ASP.net環境で動作しているプログラムの入替を行ったところ
Permissionエラーが発生するようになってしまいました。
その対処の一部始終をメモしておきます。

【概況】

・IIS + ASP.netで稼働しているWebサーバ。 (Webサービスを稼働中) Win2008R2 , IIS7.0

・Webサービスの1つに不具合があり、プログラムの入替を行う。

【環境】

・WebService Directory
 |-web.config
 |- bin
  |- Program.dll ←今回これだけを入替
  |- *.dll

【やったこと】

・Program.dllをコピーして別の場所へバックアップ
・持参した、Program.dllを、上書きコピー


結果、これでアウトでした。
起きたエラーがコレ。

型 'System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' のアクセス許可の要求に失敗しました。
場所System.Security.CodeAccessSecurityEngine.Check(Objectdemand,StackCrawlMark&stackMark,BooleanisPermSet)
  場所System.Security.CodeAccessPermission.Demand()
  場所System.Reflection.Assembly.VerifyCodeBaseDiscovery(StringcodeBase)
  場所System.Reflection.Assembly.get_CodeBase()


【原因】

・Internetゾーンから取得したファイルを、そのままIIS稼働環境へコピーしたため。

【対処】

・ファイルのプロパティにてブロックを解除する。
 で、ダメだったので、あれこれやっているうちに、できるようになりました。

結果としては、アプリケーションプールにキャッシュされていたようです。

・アプリケーションプールの、停止、再起動を行う。
 使っていたアプリケーションプールは共有だったので、個別に新規で一つ作り
 新規で作ったアプリケーションプールを割り当ててみました。
 その結果、改善されました。
 それで、通常使っているアプリケーションプールを一旦再起動して、
 アプリケーションプールの設定を元に戻すと、正常稼働。

 アプリケーションプールの再起動時に、動作中プロセスの影響からなのか
 「アプリケーションプールを起動できません」的なエラーが出て焦りましたが、
 少し待ってから起動したら動いたので、結果問題なしといったところです。

【他に調べたこと】

・IISにキャッシュされていないか
 ⇒Windows\Microsoft.net\Framework**\Version\Temporary ASP.NET Files に
  IISが自分のロードしたモジュールをキャッシュします。
⇒結果、問題なし。
  念のため、
  ・アプリケーションとしての設定を解除
  ・該当キャッシュをクリア
  ・再度アプリケーションへ変換
  とやり、キャッシュの再構成を行いましたが、改善せず

【やりたかったけど試してない事】

・IISの再起動
 他にもアプリが動いていて、止めるにはいろいろと手間があったので、今回は除外

【まとめ】

普段はUSB媒体でプログラムの持ち込みをするのですが、今回はWeb経由で
プログラムを持ち込んだため、はまりました。

インターネットから取得したデータの扱いには十分注意しましょう。

2014年8月10日日曜日

ネットワーク(LAN)はループさせてはいけません(ブロードキャストストーム)

先日、お客様先へシステム納品時に、LAN障害が発生。
結局はループだったであろう。という事なのですが、
改めてその爆発力を目の当たりにしたのでまとめておきます。

現象

・ネットワークがつながったり、切れたりする。
・PINGを継続して実行していると、何回かに1回くらい、Request Timeoutが出る。

インフラ屋さんがあれこれ調べてやっていたのですが、ひょんなところで気がついた
ハブに、ネットワークループがありました。
その片方を取り外したところ、解決。

結論


ネットワークはループさせたらだめ。
※但し、STP(スパニングツリープロトコル)を持っているハブを利用しているだとか
 VLANとか、意図的にループ経路を作っている場合には別


そもそもネットワークのループって?

ループってどういうことか?っていうと、
・1本のLANケーブルを、同じハブに挿したらダメ。ということです。
・ハブ間は、1本のLANケーブルでつなぐことが基本で、二重化のようにつないだらダメという事です。
・ぐるっと回って1周。というようなLAN配線はダメということです。


詳しくはASCIIさんあたりを参照。
http://ascii.jp/elem/000/000/451/451629/
http://ascii.jp/elem/000/000/561/561903/


何も知らないユーザーさんだと、気にもならないのでしょうけども、
以外に単純な落とし穴で、ネットワークが使えなくなってしまう。


余談

そのお客さんは半日間、全システムがほぼダウンで、業務になってませんでした。

2014年7月31日木曜日

EclipseでJSLintを使う

Javascriptの構文チェックを行う方法はいくつかあると思いますが、
今回、既存システムに対して改めて構文チェックを行おうと思い、
Eclipseのプラグインも提供されているJSLintを使う事にしました。

【事前準備】

Eclipseマーケットプレースより、JSLintのプラグインをインストール
※インストール後にEclipseの再起動が必要です。

Eclipseマーケットプレースの使いかたについては別記事で紹介していますので併せて参照ください。

【チェック方法】

1.メニューバーより「プロジェクト」→「プロパティ」を選択
2.「JSHint」を選択し、「Enable JSHint for~~」の欄で「追加」ボタンを押す
3.対象とするファイル、およびフォルダの指定ができるので、必要なファイル、フォルダを指定

プロジェクトをビルドすると、問題ビューに警告が表示されるようになります。

【警告を除外する方法】

JSHintが出すいくつかの警告は、構文の問題というよりもお作法(規約)に近いものがあり、
開発スタイルによっては無意味です。

設定で、出力する警告を制御する事が出来ます。


やり方は2つ。プロジェクト単位の設定か、Eclipse全体の設定か。を選べます。

1.プロジェクト単位
 「プロジェクト」→「プロパティ」→「JSHint」→「Configuration」→
 「Enable Project~」のチェックOnで設定を記載

2.全体
 「ウインドウ」→「設定」→「JSHint」→「構成」で設定を記載


いずれも、以下のような構文で記載します。
設定可能なオプションは公式ドキュメントを参照ください。
(日本語訳してくれている方もいるので併せて参考で)

○json形式


{
"laxcomma":true,
"laxbreak":true,
"smarttabs":true,
"evil":true
}

パラメータで抑止できないエラーについては、以下の対処法で対応可能です。

1) jshint.jsより、該当のメッセージを探す。
2) メッセージコードをメモ
3) パラメータに、以下形式で記載

{
"asi":true,
"evil":true,
"laxcomma":true,
"laxbreak":true,
"smarttabs":true,
"sub":true,
"-W009":false, //The array literal notation [] is preferable.
"-W099":false, //Mixed spaces and tabs
"-W041":false  //Use '{a}' to compare with '{b}'
}


2014年7月30日水曜日

Eclipseでプラグインを簡単にインストールできるEclipseマーケットプレース

Eclipseでプラグインをインストールしたいと思い、過去の記憶から色々と記事等を探していたところ、
GUIより簡単に指定、インストールできる仕組みがありました。


VisualStudioにもNuGetパッケージ管理という方法がありますが、それと同様のようです。


【手順】

1.「ヘルプ」より、「Eclipseマーケットプレース」を選択。
 ※ここで出てこない場合には、Exclipseのバージョン、利用しているパッケージの違いのようです。
 ※Eclipseマーケットプレース自体もプラグインのようなので、追加インストールは可能と思われます。

2.画面が出てきます。検索キーワードを入れると、対象のプラグインが表示されます。
 選択して、「次へ」

3.ライセンス条項等が出るので確認して「次へ」

4.いくつかメッセージが出るかもしれませんが、適時対処

これだけでインストールできます。


従来型「ヘルプ」→「新規ソフトウェアのインストール」でも同じことはできるはずです。
今回、この方法にたどり着けず、たどり着いても欲しいプラグインが出てこず、という状況で
方法を探していたところマーケットプレースへたどり着いた。という状況でした。

今はもう更新されていないのかもしれません・・・(未確認です