読者です 読者をやめる 読者になる 読者になる

checkpoint

自分用のIT技術系ノートです。古い情報や間違っている情報もあるので注意。

Identity値を取得する3つの方法

SQL Serverで主キーなんかに使う型でIdentityってありますよね?
IDとして自動的に連番を振り出してくれるヤツ。

自動的に付与される値なので(普通は)明示的に指定することができません。
行を登録した後に取得することになりますが、その際に利用できる構文が3つあります。


それぞれ以下の条件において最後に振り出されたIdentity値を取得します。


  • @@IDENTITY

セッション:実行したセッション
スコープ:全てのスコープ
テーブル:全てのテーブル

SELECT @@IDENTITY
  • SCOPE_IDENTITY

セッション:実行したセッション
スコープ:実行したスコープ
テーブル:全てのテーブル

SELECT SCOPE_IDENTITY()
  • IDENT_CURRENT

セッション:全てのセッション
スコープ:全てのスコープ
テーブル:指定したテーブル

SELECT IDENT_CURRENT('テーブル名')

スコープというのはストアド、トリガ、関数、バッチなどのひとかたまりを言います。
@@IDENTITYを利用している場合は「全てのスコープ」が対象となるため、テーブル更新によってトリガなどが起動し、別テーブルのIdentity値が更新されてしまうと、そちらの方が取得されてしまいます。


正直、一度これでハマったので「IDENT_CURRENTを利用してテーブルを明示する」という方法に変えたのです。
しかしよく考えたらこちらは「全てのセッション」が対象になるため、別々のセッションのトランザクションが並列に走った場合、取得される値がどちらか一方のものになってしまう可能性があります。(多分可能性は低いでしょうが)


なので「Identityを含むテーブルに行を登録し、すぐ値を取得する」というケースの場合はSCOPE_IDENTITYを利用するのがベストです。


Identity値を取得する場合は3種類の違いに気をつけて使い分けましょう。

Developers summit 2010に参加しての個人的なまとめ(二日目)

デブサミから1ヶ月過ぎちゃいましたけど、いかがお過ごしでしょうか。
個人的なまとめ二日目編、後日後日と思っていたらいつの間にか3月が終わろうとしていました。
いつものことです。


まさに先延ばしの人生。
でもこれは個人的なまとめなので別にいいんだよ!


二日目 2010年2月19日金曜日

  • 【19-B-1】ここまで来た!製造、金融でのアジャイル基幹システム開発 〜ユーザー主導が成功の鍵!〜

朝一からかなり濃い内容のセッションでした。
内容としてはアジャイルソフトウェア開発で基幹システムを構築した二社の事例紹介。
ユーザー主導、というところをどちらも強調されていて身につまされる思いでした。

    • 東邦チタニウム株式会社
      • 北九州八幡への新工場立ち上げに伴う生産管理システムの構築
      • 調査活動半年、開発一年(一ヶ月ごとのイテレーション×9回)
      • 予定の2ヶ月前倒し稼働、予算3%減、不具合なしでの稼働!
      • 工場稼動までの基幹が短く、業務フローが決まり切っていない状況だったのでウォーターフォールは無理だった
      • 業務調査に時間をかけた
      • アジャイルに向いていない人は、決まったとおりに作る人
      • アジャイルに向いている人は、決まっていないことをユーザーと決めて作っていく人
      • ユーザー部門のマネージャーをプロジェクトに引き込んで、ユーザー部門からの要望を即座に取捨選択
      • ユーザーとのコミュニケーションが上手くとれるかどうかでシステムの品質が決まる

    • 株式会社マネースクウェアジャパン
      • FX取引システムの部分再構築
      • 週単位のイテレーション、機能ごとに段階的に作り込み
      • 四ヶ月で改修完了、性能10倍、全面改修と比較して1/3のコスト
      • 金融業界ではビジネスの変化が激しい。ウォーターフォールは不向きと判断
      • できるだけ関係者を巻き込んで計画を進めた
      • 基本的な設計や方向性は最初にきっちり決めた
      • ドキュメントは必要最低限しか作らない。細かいものはTRACなどで管理
      • テストケースをユーザー自身に作ってもらうことで、システム構築の苦労を共有
      • ユーザーをどれくらい巻き込んでプロジェクトを進めるかが重要
      • 技術者はユーザーに最新技術を押し付けないで、ITは手段と意識して欲しい


東邦チタニウムさんの事例についてはこちらでも詳しい記事があります。
ご指定いただいたページが見つかりません。 - CIO Online

  • 【19-D-2】業務システム特化型RIA「Nexaweb」

自社RIA製品の紹介が中心のセッションでしたが、改めてRIAとはどんなものか?どうあるべきか?を考えることができました。

    • RIAが求められる理由
      • ブラウザベースでは実現できないUI
      • 快適なキーボードオペレーション
      • →生産性の高いWEBシステムの実現

    • ユーザーが求める点
      • ソフトやプラグインのインストールが発生しないこと
      • 特殊な運用や管理が必要でないこと
      • 独自の言語や知識の習得が必要でないこと

    • Nexaweb
      • クライアント側のランタイムはごく小さいサイズ(300KB〜)
      • XMLによるUI構築
      • JAVAによる開発
      • リアルタイムサーバープッシュ
  • 【19-E-3】自分でできるWebアプリケーション脆弱性診断

    • なぜ自社でできない?
      • テスト方法や判定基準が分からない、仕様書が作れない、ノウハウがない
      • 自社基準の診断では顧客に信用してもらえない

    • 自分でできるんです!
      • LASDEC(財団法人地方自治情報センター)のWeb健康診断の基準を利用
      • 診断の仕様書や報告書の雛形が公開されているので、そのまま使える!
      • 診断自体は簡易なものだが、仕様は著名な専門家の方々が決めたので信用できる
      • 高木浩光氏とか
      • 診断にはツールを併用すると便利(Burp Suiteなど)
  • 【19-C-4】次世代型情報取得システムの構築技法 〜 CRUSE開発を通じて

今最もアツい分野であるモバイル情報システムについての構築事例でした。

    • 背景
      • 情報インフラの充実で、モバイル機器を利用した情報取得の環境は整いつつある
      • しかし、上手な情報活用が進んでいるとは言い難い

    • 問題点
      • 携帯端末特有の制約(画面の大きさ、入力手段など)
      • PC向けのシステムではモバイル機器では使いにくい

    • どう解決するか?
      • 人間の行動プロセス…操作→認知→判断の繰り返し
      • システムに与えられた情報を活用、環境から取得した情報など
      • できるだけ少ない手順、シンプルな方法でシステムを操作
      • システムが視点の変え方をナビゲート
      • ユーザーの嗜好をフィードバック

    • iCRUISE
      • iPhoneを利用したレストラン検索
      • 「電話で人と話しているかのように検索」
      • マップ+ホットペッパーグルメサーチAPI
      • ボイス検索、音声フィードバック
      • 声の出演:ゆっくり
      • 近日App Storeで公開予定!
  • 【19-D-5】Silverlightを用いたビジネス アプリケーション作成のポイント

    • Silverlight+ビジネスアプリ
      • リッチな表現力、操作性→効率化、生産性の向上
      • Webアプリケーションであること→処理のサーバー集中、クライアント展開が容易
      • 包括的な開発フレームワークであること→開発効率と保守性の向上
      • 業務要件にマッチした場合はよい相性!

  • 【19-B-6】実践Cucumber 〜ユーザの視点でシステムの振る舞いをテストしよう

    • Cucumberとは
      • Rubyで書かれた自然言語対応テストツール
      • ユーザーと対話しながらテスト=意思疎通できる
      • アジャイル開発におけるコミュニケーションの円滑化

    • 特徴
      • 高レベルのステップも構築することができる(ex.管理者でログイン)
      • 「表」を作ってパラメータ変更の繰り返しテストも
      • 「用語集」で単語に処理を結びつけることができる
      • メンテナンスされ続ける仕様書
      • 資産価値の高いテストが書ける
      • →変化に対応できうるテスト

多分今回のデブサミで一番ヤバかったセッション。いろんな意味で。インパクトがすごい。
そして今回一番予想を裏切られたセッション。もちろんいい意味で。
話についていくのが精一杯だったのですが、パタンランゲージには強い興味を持ちました。

    • パタンランゲージの一例
      • 「中心部の共域」 … 集団の多くが利用するエリアを主要動線に隣接させ、中心部に持ってくるべし
      • →「寅さん」の映画に見ることができる
      • 「親密度の変化」 … 奥に行くほどプライベートなエリアを配置すべし


パタンランゲージについては特に面白い内容だったためか、Twitterで実況されていた方も居られるようでした。
せっかくなので、Togetterでまとめてあります。是非ご一読を!

Developers summit 2010 [19-E-7]建築から開発プロセスを学ぶ~パタンランゲージ Tweetまとめ - Togetter



以上を以て二日目のセッション終了。
というかね、二日も椅子に座ってると腰とケツが痛くて厳しいです本当。
来年も目黒雅叙園なら座布団とかクッションがあったほうがいいですね。


あと今回二日通して目一杯セッションに参加しましたけど、これだと余裕がなさすぎるという感じです。
アスク・ザ・スピーカーコーナーで講師の方とお話ししようにも時間がとれませんし。
次回は少し余裕をもった計画で臨みたいところです。


とにかくこの規模のイベントで参加が完全無料とかあり得ないですよ本当。
参加できるかどうか分かりませんが、次回も是非参加したいイベントでした。


特にまとまりの無い話ですしオチもありませんがこれは個人的なまとめなので別にいいんだよ!
とにかくデブサミは超オススメということと、座布団は必要、詰め込みすぎに注意!ということでした。
どっとはらい

Developers summit 2010に参加しての個人的なまとめ(一日目)

先日初めてデブサミなるイベントに参加してきました。

世界は変わった。開発の現場はどうか? Developers Summit 2010

日本のソフトウェア開発者が集まるこのカンファレンス。今年で7回目の開催だそうです。
というわけで参加セッションと次回参加に向けてのまとめをここに記しておくことにします。

一日目 2010年2月18日木曜日

  • 【18-D-1】.NET Framework 4概要
    • .NET4の新機能
      • ユーザーエクスペリエンスの向上・UIの向上(WPFASP.NET強化)
      • コア機能の拡充(CLRのバージョンアップ、機能追加)
      • 開発生産性の向上
      • 連続性(異なるプラットフォーム間で同様の開発が可能)
    • CLRがバージョン4.0に。Framework2.0〜3.5は2.0だったので久々のバージョンアップ。
    • 動的言語のサポート。動的言語ランタイム(DLR:Dynamic Language Runtime)搭載。
    • IronRubyIronPythonのサポート。C#VB.NETでの動的変数のサポート。
    • WindowsFormからWPFへの移行を促す強化。Windows7マルチタッチなどをサポート。
    • Visual Studio 2010ならSilverlightの開発環境がついてくる!
    • マルチコアCPUへの対応。並列処理が簡単に行える。Prallel.Forなどのデモ。直列処理より速度が30%向上。
    • マルチスレッドで並列動作するので順番が重要なループなどでは使わないよう気をつける必要がある。

  • 【18-D-2】アジリティを向上させる開発ツールの進化 〜 Visual Studio 2010 の場合

延々とVS2010の新機能などを紹介するのかと思いきや、マイクロソフトでのアジャイル開発の取り組みなどの話題から入ってしばらく戸惑ってしまいましたが、VS2010自体がアジャイル開発を強く意識したものになっているということがよく分かるセッションになっていました。

    • 2008以前はTeam System限定だったTeam foundation Server(TFS)に全エディション対応。というかTeam System自体が無くなった。
    • TFSとVS2010の組み合わせでアジャイル開発を強力にサポートする。採用するプラクティスは自由。特定のプラクティスに特化したものではない。
    • TFSを利用することによってタスク管理、開発者の負荷なども管理、チェックイン時の自動ビルドなど。
    • IntelliTrace機能…デバッグの記録と再実行が可能。変数の状態なども全て再現可能。
    • 各モジュールの依存関係をグラフィカルに可視化する機能もあり。

  • 【18-D-3】ASP.NET MVC 2
    • ASP.NET MVC2の位置付けとしては、Webフォームとの共存がふさわしいのではないか。
    • WebフォームはWindowsFormプログラマがWebアプリケーションのプログラミングに馴染むよう考えられたものだとすると、ASP.NET MVCはWebプログラマをWindowsに誘導するためのものとも考えられる。
    • Model … 固有のサポートはない。MVC2ではAccount Modelsというサンプル実装があるのでそれを利用。
    • Controller、View … スキャッフォールド(足場)を提供。ウィザード形式で雛型というかテンプレート的なものを作成できる。
    • MVC2での機能強化
      • Area … 一つのアプリケーション内に複数のMVCモデルを作る機能。大規模案件に便利。
      • 非同期Controller … 外部サービス利用時など、サーバー処理で時間がかかるものに有効。
      • 強く型付けされたHTMLヘルパー
      • Validation

  • 【18-D-4】Expression Studio 3で作るSilverlight 3

この方一番プレゼンが上手だったんじゃないかと個人的には思います。デモも面白く聴いていて飽きない!

    • Expression Blend3 … Silverlightと.NETのためのUI設計ツール
      • SketchFlowでグラフィカルに画面遷移を設計
      • コードを書かずにインタラクション制御が可能(ビヘイビア)
      • Yahooがヤフオクアプリの設計に使ったとのこと
    • Expression Web3 … Webサイト構築ツール
      • SuperPreviewで複数のブラウザで比較検証(FirefoxはインストールされていればOK。IE6はインストールされてなくてもOK)
    • Expression Encoder3 … ビデオエンコードツール
      • スクリーンキャプチャでアプリケーションの動作を動画で記録できる
    • Expresiion Design3 … ベクターグラフィックツール

  • 【18-D-5】MVP & .NET Community Member`s Lightning Talks

ライトニングトークセッションというものを聞いたのは初めてでしたが、5分という限られた時間で面白い話をしようという緊張感がかえっていい刺激になり、最後まで飽きのこないセッションでした。

    • 【スピーカー:小野修司 氏】 「WCF RIA Servicesってなんだろう?」
      • .NET RIA Servicesと呼ばれていたものが、Silverlight4とともにWCF RIA Servicesとなって提供される
    • 【スピーカー:福岡寿和 氏】 「DBを使った業務アプリ作成の王道を教えます。」
      • "愚直なDB設計" … 正規化はきっちりと!非正規化によるパフォーマンスアップなどは後から考える事
      • "テストしやすい設計" … ロジック統合!DB-Webサービス-クライアント。なぜWebサービス?ユニットテストしやすいから!UIとロジックの分離。
      • "安全な運用" … 配布ミスをなくそう。WEBエイド。
    • 【スピーカー:亀川和史 氏】 「Windows 7のトラブルに立ち向かう〜Troubleshooting Packご紹介」
      • Win7/Server2008R2ではトラブルシューティングツールが追加された。
      • 自動トラブル解析・解決・レポート。PowerShell必要。
    • 【スピーカー:瀬尾佳隆 氏】 「Visual Studioでテストデータを作ろう」
      • SQL Serverでテストデータの生成が面倒。単純な値の繰り返しになりやすい。
      • VS2010 Premium または Ultimateでデータ生成機能があり!正規表現でルール作成して大量にデータを作成。→より現実に近いテストデータが簡単に生成できる。
    • 【スピーカー:冨田順 氏】「Windows AzureでWebサーバーを再発明してみる」
      • クラウドは不自由?Windows AzureならWebサーバーだって作れちゃう!
      • クラウドだとファイルシステムが使えない→BLOBストレージが使える。
      • クライアント-Webサーバー-ファイルシステム → クライアント-WorkerRole-BLOBストレージ。本当にスケーラブルなWebサーバーができた!
    • 【スピーカー:こだかかおる 氏】 「Visual Studio 温故知新」
      • Visual Studio 2010からVisual Studio 97まで遡る!新しい案件ではVS2005(.NET2.0)以降がいいんじゃないかな…

  • 【18-E-6】RDB入門〜アプリケーション開発者が陥りやすいDB開発の落とし穴〜

システム導入後のトラブル事例から学ぶケーススタディ。残念ながら既に知っているか経験済みのケースでしたが、RDBを使ったシステムを開発している人には勉強になるセッションだったのではないかと思います。

    • システムが止まった → トランザクション分離レベルの不用意な再セットが原因。トランザクション分離レベルの理解と管理はきっちりと!
    • パフォーマンスがでない → SQLの無駄な発行が多すぎる。要求仕様をそのままSQLに置き換えるのは危険。
    • Viewのパフォーマンスがでない → 集合関数、集合演算子などを使用している場合は注意が必要。どうしてもというならマテリアライズド・ビューの利用も検討。
    • マルチコアCPUが生かされていない → I/Oがボトルネックになっている。キャッシュサイズを増やすなど、I/Oの速度改善が必要。

  • 【18-D-7】Azure開発の極意

この方のセッションはカジュアルな感じで構えずに聞け、話に引き込まれました。マイクロソフトのスピーカーは全員プレゼンのレベルが異常に高かったと思います。

    • Azureは「アズール」ではなく「アジュール」と読む。(司会のおねえさんはいきなり「アズール」と言ってしまった)
    • .NETはそのままAzureへ(64bit)クラウドだからと言って特別なことは何も無し。
    • WindowsだからサポートもSLAも安心。技術サポート対応可(Premium)
    • Windowsだから動作するアプリケーションも豊富。ADMINがないと動かない、というものでない限り大抵使える。
    • 25時間/月まで無料(初期特別プラン)、MSDNサブスクリプション特典…1インスタンス8ヶ月使い放題 750時間/月
    • 課金はデプロイ時間で。CPU使用率は関係なし。RUNしてなくてもデプロイしていれば課金発生。(1時間ごとの課金)
    • 管理はPowerShellのコマンドレットで可能。+夜間はデータ転送料のみ無料 =自動管理スクリプトで賢く運用
    • Key-Value Storeも利用可。嫌ならSQL Azureもあるよ。SQL Azureはチューニングがきかない。割り当てリソースも非公開。→パフォーマンスを気にする案件では注意が必要。
    • WebRoleはIISを利用するとき。それ以外はWorkerRoleで。
    • WorkerRoleは任意のTCPポートが利用可。ただしメール送信などをする場合、IPがスパマーと隣り合ってしまうと弾かれるかも。
    • クラウドの真価は(カネさえ払えば)無限にスケールする



とりあえず、1日目は以上でした。
流石に一日中椅子に座りっぱなしだとお尻や腰が痛くなってきます。しかも隣の人との距離がほぼ0。みつみつ。
たぶん参加者数の問題だとは思いますが、もうちょっと余裕のある配置にして欲しかった…

お昼ごはんは目黒雅叙園内で食べなくても、周辺に食べるところがいろいろあったので助かりました。
ただ会社も多いのか昼食を求めるビジネスマン達で多くの店が満員状態。

全くまとまりのないまとめになり、オチもありませんが、デブサミに参加する歳は昼メシを食う店と椅子の硬さに気をつけろ!ということでした。どっとはらい

2日目編はまた後日!

Convert.Int32(String)とInt32.Parse(String)

文字列を整数に変換したい場合に用いるメソッド二種類。
どう違うのかぱっと見分かりません。

MSDNのConvert.Int32の項を見てみると…

戻り値は、value に対して Int32.Parse メソッドを呼び出した結果得られる値です。

とのことなので、内部的にはInt32.Parseを呼んでいるものと思われます。
なのでどっち使っても同じ…と言いたいところが、異なる点が1つだけ。

引数の文字列がnull参照の場合…

  • In32.ParseはArgumentNullExceptionをスロー
  • Convert.ToInt32は例外をスローせず0を返す

という違いがあります。
しかしどちらも空文字(長さ0の文字列)を与えるとFormatExceptionをスローします。

nullがエラーにならず0に変換されるのも個人的には気持ち悪いので、Int32.Parseをお勧めします。

というか、Framework2.0以降ならInt32.TryParseを使って万事解決。

ADO(.NET) + SQL Serverでパラメータークエリを使った場合、ローカル一時テーブルが作成出来ない

最近職場の人が言っていた件。自分も前にこれでかなり悩んだものです。


PRB: ADO のパラメーター化されたクエリを使用すると SQL Server のローカル一時テーブルが作成されません。


ADO.NET 1.1 でも再現するこの現象。例えば以下のようなパラメータークエリで起こります。

--SQLその1(ローカル一時テーブル作成)
SELECT
  hoge_id
  , hoge_val
INTO
  #hoge_temp
FROM
  hoge_table
WHERE
  hoge_id = @HOGEID


--SQLその2(ローカル一時テーブルをSELECT)
SELECT
  *
FROM
  #hoge_temp

この場合、SQLその2で以下のようなエラーとなります。

エラー-2147217865"無効なオブジェクト名 '#hoge_temp'

これではTransact-SQL必殺のSELECT INTO句を使えません。
マイクロソフトの見解としては「これは仕様によるものです」とのことですので、あきらめて以下のようにしましょう。

--SQLその1-1(ローカル一時テーブル作成 CREATE文使用)
CREATE TABLE
  #hoge_temp
  (hoge_id int
  , hoge_val nvarchar(64))


--SQLその1-2(ローカル一時テーブル作成 SELECT INTO アドホッククエリ)
--CREATE文でフィールドの型やデータ長を書きたくない場合に
SELECT TOP 0
  hoge_id
  , hoge_val
INTO
  #hoge_temp
FROM
  hoge_table WITH(NOLOCK)
--↑TOP 0でも場合によってはロックの影響を受けるのでNOLOCK


--SQLその2(ローカル一時テーブルにデータ書き込み パラメータークエリ)
INSERT INTO
  #hoge_temp
SELECT
  hoge_id
  , hoge_val
FROM
  hoge_table
WHERE
  hoge_id = @HOGEID
 

--SQLその3(ローカル一時テーブルをSELECT)

SQL Server 2005でデータベースから特定の名前の列を探すSQL

データベース内からある名前の列を探したい、しかしどのテーブルにあるかわからない、という場合がしばしばあります。

ドキュメントがちゃんと作成・保守されていればそれを見れば済むことなのですが、

「テーブル定義書?なにそれ」「E-R図?おいしいの?」な現場の場合はそれも不可能です。

というのは極端な例ですが、ドキュメントがあってもそれが100%信用できる!ってケースは少ないんじゃないかと思います。

そんなときは以下のSQLで検索しましょう。(ただしSQL Server 2005用)

SELECT
 o.name AS table_name
 , c.name AS column_name
FROM
 dbo.syscolumns c 
 INNER JOIN dbo.sysobjects o ON o.id = c.id
WHERE
 c.name LIKE '列名'
 AND o.xtype = 'U'

o.xtype = 'U'ってのはユーザーテーブルをあらわすので、ビューも検索に含めたい場合は、

 AND o.xtype IN ('U', 'V')

みたいな感じでOK。

ただしこの場合はシステムビューも検索結果に含まれるので注意です。

メソッドのオーバーロード作成時にありがちなバグ

例えば、下の様なメソッドがあって

public void ExampleMethod(string param1, int param2)
{
   (省略)
}

これに、引数が「param1」だけのオーバーロードを作るとします。
その場合正しくは、

public void ExampleMethod(string param1)
{
   this.ExampleMethod(param1, 10);
}

とかいう感じになるのですが、メソッド呼び出しの引数指定を間違えて

public void ExampleMethod(string param1)
{
   this.ExampleMethod(param1);
}

としてしまうことがありました。要するに呼び出し元と呼び出し先のメソッドが同じ。無限ループです。

ただの凡ミスですが、このバグはビルドエラーはおろか警告も一切出してくれないので注意が必要です。

このメソッドが呼び出された場合、当然無限ループとなりStackOverflowExceptionがスローされます。

引数の数が違うだけのオーバーロードを作成する場合は十分に注意しましょう。