2011年3月28日

Microsoft SQL Serverに関する些細な4つのTips

===========================================================
マザー・テレサの名言から考える「今、自分にできること。」 : earth in us.
===========================================================


自分の旧ブログからの転載です。


1. MS SQL Serverの@@IDENTITYで正しい値が取得出来ない時は。。。

SQLサーバーで@@IDENTITYを使うと、Insert直後にトリガーが走ってさらにその中で別のInsert文が実行される場合に意図した値が取得出来ないという問題に遭遇しました。
そこで調べて見た所、SCOPE_IDENTITY() という関数があるのを遅ればせながら今日知りました。^^;
これだとトリガーに関係なく自分の直前のInsert文の結果としての最新のIdentity値が取得出来るそうです。

SCOPE_IDENTITY (Transact-SQL)
http://msdn.microsoft.com/en-us/library/ms190315.aspx


Alternatives to @@IDENTITY in SQL Server 2000
http://www.sqlteam.com/article/alternatives-to-identity-in-sql-server-2000


Identity Crisis
http://msdn.microsoft.com/en-us/library/aa224821%28SQL.80%29.aspx


Getting the Wrong Identity in Microsoft SQL Server identity Columns?
http://www.databasejournal.com/features/mssql/article.php/10894_3307541_2/Getting-the-Wrong-Identity-in-Microsoft-SQL-Server-identity-Columns.htm


結論:

これからは@@IDENTITYではなく SCOPE_IDENTITY() を使おう!


注)もちろん場合によっては @@IDENTITYの方が望ましい場合もあるかも知れませんので、何でもかんでもという訳ではありません。。。



2. SQLServerのDB内の全テーブルのデータ容量を表示する

下の2つのサイトの情報を参考にして、全テーブルのデータ容量を表示するSQLを作ってみました。
レコード件数だけでなく、データ領域とインデックス領域の使用量も確認出来るので便利かなと。

[SQL]SQLServerのDB内に存際する全テーブルの件数取得(T-SQL)
http://genz0.blogspot.com/2009/04/sqlsqlserverdbt-sql.html


【SQL Server】テーブルの使用量を確認する
http://blog.livedoor.jp/akf0/archives/51427351.html



上記2つの作者様、情報ありがとうござました!

以下、SQLです。

SET NOCOUNT ON

--テーブル変数(結果格納用)
DECLARE @TEMP_TABLE table(
row_id int IDENTITY(1,1) NOT NULL
,T_NAME varchar(128) NULL
,T_CNT bigint
,T_DATA bigint -- KBytes
,T_INDEX bigint -- KBytes
PRIMARY KEY (row_id)
)

DECLARE @NAME nvarchar(128), @SQL nvarchar(256)
DECLARE @CNT bigint, @DATA bigint, @INDEX bigint
declare @row_id int


--カーソルの宣言
DECLARE cs CURSOR FOR
SELECT NAME FROM sysobjects where type='U' ORDER BY NAME

--カーソルのオープン
OPEN cs
FETCH NEXT FROM cs
INTO @NAME
WHILE @@FETCH_STATUS = 0
BEGIN
SET @SQL = N'EXEC sp_MStablespace [' + @NAME + ']'

INSERT INTO @TEMP_TABLE (T_CNT, T_DATA, T_INDEX)
EXECUTE sp_executesql @SQL

SET @row_id = @@IDENTITY
update @TEMP_TABLE SET T_NAME = @NAME WHERE row_id = @row_id

FETCH NEXT FROM cs
INTO @NAME
END

CLOSE cs
DEALLOCATE cs

--実行結果を表示する
SELECT T_NAME, T_CNT, T_DATA, T_INDEX, (T_DATA+T_INDEX) / 1024 AS TOTAL_MB
FROM @TEMP_TABLE ORDER BY (T_DATA+T_INDEX) / 1024 DESC
SET NOCOUNT OFF



3. MS SQL Serverからメールを送信する

EXEC master.dbo.xp_sendmail
@recipients = @mailto,
@query = @sql,
@subject = @sub,
@message = @msg,
@attach_results = 'True',
@width = 2000

注)使用するにはSQLサーバー側でメールサーバーの設定が必要。



4. ストアド内のSQLのエラー

他社が開発したあるシステムで、データ取り込み処理の途中でSQLエラーが発生してしまいました。「文字列が長すぎるからフィールドに入らないよー」っていうワーニングでした。

諸般の事情で仕方なく無視して続行させたいのですが、デバッグしようにもものすごく長いストアドなので、なかなか厄介なんです。

結局、ストアドの最初に「SET ANSI_WARNINGS OFF」っていう1行を入れて逃げました。^^;
もちろん本当は良くないのですが、最悪の場合こう言う逃げ方もあると言う事で。




===========================================================
マザー・テレサの名言から考える「今、自分にできること。」 : earth in us.
===========================================================







.

2011年3月22日

Google App Engineで開発を始めるならチェックしたい本3冊

===========================================================
マザー・テレサの名言から考える「今、自分にできること。」 : earth in us.
===========================================================


はじめてのGoogle App Engine for Java―巨大サーバを利用したWebアプリ開発の基本! (I/O BOOKS)
image

まずは手早く概要を把握したいという人向きの入門書。
JDKのインストールやJavaとサーブレットの基本から説明されているので、今までJavaでの開発をした事が無い人には役に立ちそうだ。

逆にApp Engineの概要やJavaとサーブレットについては既に知っているという人には、全5章のうち始めの3章は必要ないかも知れない。

第4章はデータストアの説明。Low Level APIを使った追加・更新・削除と検索の例が載っている。エンティティグループとトランザクションについても触れられているので、一通りの知識は身に付けられる。

第5章はその他のサービスとして、ユーザー認証、URLフェッチと画像操作APIなどの説明。メールの送受信やタスクキューなどについても触れられているが、ざっと紹介している程度なのであまり深い内容ではない。タイトルにも「はじめての」とある通りGoogle App Engineに初めて触れる人には良いと思う。


すっきりわかるGoogle App Engine for Javaクラウドプログラミング
image

Google App Engineの隅から隅までを丁寧に解説してあるので、「こんな機能あったかな?」と思った時や、「これはどうするんだっけ?」という時にリファレンス的に活用出来る。

ただデータベースアクセスに「スピンアップが遅くなる」と言われているJDO(Java Data Objects)を使っているのがちょっと残念。

個人的には、以下の内容が今後役に立ちそうで有難かった。

第7章 7.6 「OAuthによる第3者からのアクセス」
第9章 9.6 「メールによる画像のアップロード」
第10章 10.4 「XMPPからTwitterへリダイレクトするサンプルプログラム」
第12章 12.4 「Twitterボットのサンプルプログラム」(タスクキュー使用)

第16章は、「本格的なアプリケーションの作成」という事でブログシステムを一から実装する例となっている。


オープンソース徹底活用 Slim3 on Google App Engine for Java
image

Google App Engineでデータストアを使うアプリケーションを開発するのであれば*必読*の1冊。

Slim3に限らず、BigTableやデータストアそのものの仕組みから解説されているので、「なぜこういう検索が出来ないのか」や「RDBで簡単に出来るあの機能はどうやって実現すればいいのか」という疑問に答えてくれる。

Capter 3~5はSlim3を使う使わないに関わらず、データストアを使うならば読んでおくべき。

今回の3冊の中では、最もお買い得感が高い一冊だった。





===========================================================
マザー・テレサの名言から考える「今、自分にできること。」 : earth in us.
===========================================================



.

2011年3月16日

jQuery UIのダイアログで特定のボタンをデフォルトにする方法

======================================================
漢(オトコ)のコンピュータ道: 地震による災害復旧に対して今我々が出来ること。
======================================================


jQuery UIのダイアログを使って見て、デフォルトボタンの指定をするオプションが見当たらなかったので、調査した結果をメモ。

今回の情報元:
javascript - jquery-ui Dialog: Make a button in the dialog the default action (Enter key) - Stack Overflow

javascript - Submit jQuery UI dialog on <Enter> - Stack Overflow

調べた結果によると、
$("#myDialog").dialog({
    open: function() {
        $(this).parents('.ui-dialog-buttonpane button:eq(0)').focus(); 
    }
});

という感じで、ダイアログを開いた時の処理でボタンにフォーカスを当ててあげれば良いとの事。このボタンの指定方法を自分で調べるのが面倒だったので時間の節約になった。

2番目のボタンをデフォルトにしたい場合は、eq(0)の所をeq(1)にすればOK。

同じ考え方で下の様にすればボタンのテキストの色を変える事も出来た。

$(this).parents('.ui-dialog-buttonpane button:eq(0)').css('color', '#F00');


なるほど!




======================================================
漢(オトコ)のコンピュータ道: 地震による災害復旧に対して今我々が出来ること。
======================================================



.

2011年3月8日

パスワードのクラッキングを難しくする「ソルト」と「ストレッチング」とは

今日下の記事を読んだ。
HBGary事件の顛末
セキュリティベンダーの HBGaryが先日 Anonymousによってハックされ話題になった。HBGaryはセキュリティ研究者である Greg Hoglundがファウンダーである。彼は長年 rootkit.comを運営しているほか、Exploiting Softwareや rootkitsなどのすばらしい書籍も書いており、この業界ではかなりの有名人だ。
この事件は一体どのようにして起きたのか。きっかけは、HBGary Federalという会社が Anonymousについて調査した結果を公表しようとしたことに対する、Anonymousの報復攻撃ということのようだ。(続き...)
SQL Injectionの脆弱性から、ソーシャルエンジニアリングも絡めて芋づる式にメールアカウントやサーバーのログインパスワードなどが取得されて行く過程が大変興味深い。

ここで言及されていた、パスワードハッシュを作成する際の「ソルト」と「ストレッチング」について、初耳だったのでメモ。

ソルトについては以下のエントリが詳しい。
塩加減は重要? - JULYの日記
(...)非可逆処理を行う際に、ランダムなデータをパスワードに付け加えてから処理を行うと、同じパスワードであっても、処理結果は違ったものになります。この付加されるデータを「ソルト」と言います。
パスワード情報を保存する時は、このソルトの値と処理結果の値を保存しておきます。検証する時には、入力されたパスワードと保存されているソルトの値を組み合わせて非可逆処理を行い、その結果と保存されている値を比較します。(...)

パスワードクラック - Wikipedia
レインボーテーブル - Wikipedia
という事で、ソルトを付加して非可逆処理を行うと「レインボーテーブル」を使ったクラッキングがやりにくくなるとの事。ただしこれだけだとブルートフォースアタックにはあまり効果が無い。

ストレッチングについては以下を参照。
Key stretching - Wikipedia, the free encyclopedia
(...)key stretching refers to techniques used to make a possibly weak key, typically a password or passphrase, more secure against a brute force attack by increasing the time it takes to test each possible key. (...)
Key stretching techniques generally work as follows. The initial key is fed into an algorithm that, running on a given speed of processor, takes a known constant time to apply. The algorithm is constructed so that the delay introduced is acceptable to most users, say one second on a typical personal computer. The output is the enhanced key. The enhanced key should be of sufficient size to make it unfeasible to break by brute force (e.g. at least 128 bits). The overall algorithm used should be secure in the sense that there should be no known way of taking a shortcut that would make it possible to calculate the enhanced key in less time (less processor work) than by using the key stretching algorithm itself.
要するに、最初のキーに対して何万回(上のページの例では65000回)も(ハッシュ関数などで)計算して求めたキー(enhanced key)を使ってパスワードを非可逆処理しておく。そうするとユーザーが入力したパスワードをチェックする時にも同じ回数の計算処理を行うので1秒程度の時間がかかってしまうが、利便性が損なわれる程ではない。
ところが悪意を持ったクラッカーがブルートフォースでパスワードを取得しようとした場合にも1回の試行につき1秒程度(コンピュータの性能にもよるが)の時間がかかり、合計すると通常のブルートフォースよりも桁違いに長い時間となってしまい現実的ではなくなる、という事らしい。

なるほど、勉強になりました。^^

ついでに検索にヒットした下の記事も読んで改めて参考になった。
Rg00dP@55Wrd53z―奥深きパスワードの世界 - 世界のセキュリティ・ラボから:ITpro

人の造りしもの――“パスワード”の破られ方と守り方 - @IT
くれぐれも簡単なパスワードの使用には注意したい。





2011/04/22 追記:
パスワードについて非常に分りやすい説明を見つけたので、リンクを。
パスワードの話


2011/05/10 追記:
こちらも必見。
これからの「パスワード」の話をしよう
パスワードをハッシュ化(暗号化)保存することを法律で義務化するくらいのことが必要だと思う


2011/10/10 追記:
また新しい記事が出たのでリンクを追加。
本当は怖いパスワードの話(1/4) - @IT 









.