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.いくつかメッセージが出るかもしれませんが、適時対処

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


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

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

2014年7月29日火曜日

Eclipse開発環境で表示するリソースを絞る方法

膨大なソース、モジュールの中から、必要な分だけを絞って表示する方法です。


・プロジェクトエクスプローラの右上にある▼をクリックして、「ワーキングセットの選択」を選択
・「新規」を押して、表示したいリソースを選択
・名前を付けて保存

次回より、▼の中に登録したワーキングセットが表示されるようになります。

2014年7月7日月曜日

MySQLのGROUP_CONCAT という関数がものすごく便利な件

簡単に言ってしまうと、複数行のデータを、ぐちゃっと1行に纏めてくれる関数です。

SQL


select group_concat(column_name) from information_schema.columns
where table_schema = 'information_schema' and table_name = 'COLLATIONS'

結果


COLLATION_NAME,CHARACTER_SET_NAME,ID,IS_DEFAULT,IS_COMPILED,SORTLEN


ちなみに、group_concatを使わずに取れるデータがこれ。

-------------------------------
COLLATION_NAME
CHARACTER_SET_NAME
ID
IS_DEFAULT
IS_COMPILED
SORTLEN
-------------------------------
複数行のデータが、1行にまとまっていることがわかります。


親子の関連を持つデータで、このデータを横並び表示したい時とかにも活用できそうです。

注意点

●戻せるデータのサイズが決まってます。(設定で変更可能)
[my.ini]の[mysqld]セクションに以下を記載すると反映されます。(要再起動
set group_concat_max_len = 2048000;
※2MBにしています

●NULLを含むデータの場合、NULLが除外されます。

応用

・区切り文字をタブへ変えて、並び順を指定しています
・NULLは、ブランクへ置き換える事により、除外されることを防止しています



select group_concat(CASE WHEN column_name IS NULL THEN '' ELSE column_name END order by ordinal_position separator '\t') from information_schema.columns
where table_schema = 'information_schema' and table_name = 'COLLATIONS'

補足

Oracleでも、11gより同等の関数があるようです。

2014年7月4日金曜日

MySQLでスキーマ情報を取得する

汎用な処理が必要になったので、あるだろうと思い調べてみたらありました。
MySQL 5.5で確認しています。

テーブル名を取得する

SELECT * FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'データベーススキーマ名' ORDER BY TABLE_NAME;

Viewも取れてしまうので、あとは工夫で絞ると良いと思います。

カラム情報を取得する

SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'データベーススキーマ名' AND TABLE_NAME = 'テーブル名'
ORDER BY ORDINAL_POSITION;

汎用的にする

Function化して返すようにしています。
この処理は、CSVのヘッダ情報をカンマ区切り、ダブルクォーテーション付きで返すものです

---------------------------------------------------

CREATE FUNCTION GetColumnCommentsOfCSV(schemaName VARCHAR(255) , tableName VARCHAR(255)) RETURNS VARCHAR(2000)
BEGIN
  DECLARE done INT DEFAULT 0;
  DECLARE vColName VARCHAR(255);
  DECLARE vColComment VARCHAR(255);
  DECLARE vOutChar VARCHAR(2000);
  DECLARE curRec CURSOR FOR
    SELECT
        COLUMN_NAME
        ,COLUMN_COMMENT
    FROM
        INFORMATION_SCHEMA.COLUMNS
    WHERE 
        UPPER(TABLE_SCHEMA)   = UPPER(schemaName)   collate utf8_general_ci
      AND UPPER(TABLE_NAME)    = UPPER(tableName)    collate utf8_general_ci
    ORDER BY
        TABLE_NAME,ORDINAL_POSITION
    ;
  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
  SET vOutChar = '';
  OPEN curRec;
  REPEAT
    FETCH curRec INTO vColName , vColComment;
    IF NOT done THEN
      IF LENGTH(vOutchar) > 0 THEN
        SET vOutchar = CONCAT(vOutChar,',');
      END IF;
      SET vOutchar = CONCAT(vOutChar,'"');
      SET vOutChar = CONCAT(vOutChar,vColComment);
      SET vOutchar = CONCAT(vOutChar,'"');
    END IF;
  UNTIL done END REPEAT;
  CLOSE curRec;
  RETURN vOutChar;
END;
//
DELIMITER ;

Oracleとか、SQLserverでもやってた記憶があるので、今度載せます。

2014年7月3日木曜日

Windows8.1 にて過負荷とのたたかい (続き) まだ未解決

先日の記事で、Windows8.1のディスクアクセスが100%に張り付いてしまうという件を書いたのですが、いったん収まったと思ったらまだ引き続き起きているようなので、
抜本的なOS不具合解消のため、いくつか情報をあつめ、対処をしてみました。


○windowsタスクのホストプロセス が、ディスクアクセスを占有する

 
しばらく様子を見ていたところ、いきなり登場してハードディスクを占有しました。
これで調べてみると、Windows8.1のバックアップが悪さをしているかもとの事。

タスクを調べてみました。

コントロールパネル -> タスクのスケジュール -> Microsoft -> Windows -> WindowsBackup

見てみると、「ファイルがありません」のエラー

ま、動いていないんでしょう。タスクを「無効」にしてみました。


○イベントログでエラーが連続的に起きている。


【エラー内容】
Diagnostic Service Host サービスを、次のエラーが原因で開始できませんでした:
サービスが適切に機能するために必要な特権が、サービス アカウント構成に存在しません。 サービス Microsoft 管理コンソール (MMC) スナップイン (services.msc) とローカル セキュリティ設定 MMC スナップイン (secpol.msc) を使って、サービス構成とアカウント構成を表示することができます。

2014/6/6から発生していました。WindowsUpdateの直後かも。


同様のお悩みの方がいました。MSにも情報あり
http://social.technet.microsoft.com/Forums/windows/ja-JP/fc74eaec-99bc-44ae-97f4-ece5d3cc76a5/diagonostic-service-host-id-7000?forum=w7itprogeneralja

[コントロールパネル] -> [グループポリシーの編集] -> [コンピューターの構成] -> [Windows の設定] -> [セキュリティの設定] -> [ローカル ポリシー] ->
[ユーザー権利の割り当て] -> [システム パフォーマンスのプロファイル]

修正しようとしたら、「ユーザーまたはグループの追加」ボタンが押せませんでした。
ドメイン参加PCなので制御されているのかも。と思い、LocalのAdministratorで
ログインしても、ボタンが押せませんでした。


なのでいったん断念

まだ続きがありそうです。


----------------------------------------------------------
2014/08/23追記

しばらく放置していましたが、またディスク占有が発生したので
思いきって、Diagnostic System Hostを無効へ設定しました。

そうすると、
「Diagnostic Service Host サービスを、次のエラーが原因で開始できませんでした」
のエラーは出なくなりました。

ただ、ディスクアクセスは相変わらずです。
⇒数分後、おとなしくなりました。

これでしばらく様子を見てみようと思います。