« 2008年11月 | トップページ | 2009年1月 »

2008年12月

2008年12月28日 (日)

SQLServerのインデックスについて調べてみました。

恐らく、以下に挙げる内容は「至極当然」の話だと思いますが、
調べてみたので残しておきます。

まずは、クラスタ化インデックスをSectionNoに張り、Noに非クラスタ化一意インデックスを張ったテーブル


USE [DB_TEST]
GO
CREATE TABLE [dbo].[Clustered_Table](
[No] [int] NOT NULL,
[SectionNo] [int] NOT NULL,
[Name] [nvarchar](50) COLLATE Japanese_CI_AS NOT NULL,
[updDate] [datetime] NOT NULL
) ON [PRIMARY]
USE [DB_TEST]
GO
CREATE UNIQUE NONCLUSTERED INDEX [IX_Primary_Table] ON [dbo].[Clustered_Table]
(
[No] ASC
)WITH (PAD_INDEX = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF) ON [PRIMARY]

USE [DB_TEST]
GO
CREATE CLUSTERED INDEX [IX_Clustered_Table] ON [dbo].[Clustered_Table]
(
[SectionNo] ASC
)WITH (PAD_INDEX = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF) ON [PRIMARY]

次にNo列にプライマリキーをつけたもの

USE [DB_TEST]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[NonClustered_Table](
[No] [int] NOT NULL,
[SectionNo] [int] NOT NULL,
[Name] [nvarchar](50) COLLATE Japanese_CI_AS NOT NULL,
[updDate] [datetime] NOT NULL,
CONSTRAINT [PK_NonClustered_Table] PRIMARY KEY CLUSTERED
(
[No] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

この2つのテーブルに10000件のデータをそれぞれ入れて、
SELECT * FROM dbo.Clusterd_Table WHERE SectionNo = 500
SELECT * FROM dbo.NonClusterd_Table WHERE SectionNo = 500

なんていうSQLを実行させて、それぞれ実行プランを取得しました。
すると、コストに以下の差がでました。

非クラスタ化
I/Oコスト:0.0586806
CPUコスト:0.011157
操作コスト:0.0698376

クラスタ化
I/Oコスト:0.003125
CPUコスト:0.000168
操作コスト:0.003293

クラスタで分割された範囲を検索させると劇的な速さが実現されるようです。

ただ、プライマリキーでの検索ではさすがに非クラスタ化の方が早いように思います。
(実際にはそんなに数値的な差は無かったですが、
クラスタ化テーブルの方は、一意インデックスとクラスタ化インデックスの両方を検索していました)

まあ、範囲検索が多いか、キーでの検索が多いかの違いでしょうか。
テーブル設計をしっかりしましょうということで。

(クラスタ分割した時ってインデックスの再構築が必要になるような…?)

| | コメント (0) | トラックバック (0)

2008年12月27日 (土)

e-Tax専用ソフトをインストールしました。

私のVistaパソコンにe-Taxソフトをインストールしました。

意外にはまったのでメモしておきます。

まず、国税電子申告・納税システムのサイトに行く。
そこで、最初に「開始届出」を提出する。(これは登録後すぐに完了します)

開始届出を入力する前にルート証明書のインストールとか信頼済みサイトに登録するツールを
ダウンロードしてインストールしなければいけない。

PDF形式の申告書をダウンロードするが、ダウンロード中にPCが固まった。。。
(私のVistaパソコンはよく固まります…。)

で、再度ダウンロード後、入力して送信。(送信する前に保存と印刷はしておいた方がいいです。
送信ボタンを押すとPDFが閉じられます。

登録後はe-Taxのソフトをダウンロードして、さて起動・・・と思ったら「ICカードが認識できませんでした」の
メッセージがでて電子証明書登録ができない・・・。

あれ?ICカードリーダライタはささってるし、ランプも緑・・・。

実は、公的個人認証サービスのサイトで
利用者クライアントをインストールしなければいけないと言う事に気がつきまして
それをインストール。

これで無事e-Taxソフトも起動して万事OKとなりました。

ちなみに、e-Taxソフトインストール後に再度ルート証明書のインストールをしないと
e-Taxソフトは正常動作しません。。。

| | コメント (0) | トラックバック (0)

2008年12月25日 (木)

年末年始は実家ではなく家にいることになりました。

本日はクリスマス・イブで1年を通じて一番盛り上がる(?)時期ですが、
私にとってはもう次の年末年始をどうするかを考えていました。

で、実家に帰ろうと思って連絡をすると、実家に誰もいないとの事で…。
(以前にもそういうことがあったんですけどね。)

今年は26(?)~1月4日までの9~10連休となりそうです。

今の所、年末は確定申告の準備として帳簿の整理
(と言っても、記入の再確認と金額のチェックなどの軽いもの)

LINQ、Groovyについて。

あとは、仕事でSQLServerが色々とやらかしてくれたので、ここらで本格的に
SQLServerについて知識を深めてみようかなと思ってみたりします。
(Microsoft系の書籍は高いんだけどな…)

意外と、実家に帰らないほうが充実した年末年始が過ごせそうです(?)

| | コメント (0) | トラックバック (0)

2008年12月23日 (火)

Groovyをjavaで実行させる方法(java.exe編)

今日は午後からgroovyの本の読んだところまでのコードを実行させて動作を
確認していました。

で、groovyはJavaに比べてコードが書きやすいと改めて思いました。
ちょっとしたコードを書くならスクリプトのように記述しておけば動作するし、
コンパイルしてJavaのコードと連携する事も可能ですしね。

で、groovyはJava.exeで実行することも可能だったわけですが、
これに苦戦してしまいました。
(先にオチをいうとクラスパスの通し方などは本をしっかり読んでおけば書いてあったわけですが)

実行しても「java.lang.NoClassDefFoundError」がでて実行エラーがでてしまいました。
これだけなら、明らかにCLASSPATHの問題なのは分かっていましたが
CLASSPATHの通し方を忘れてしまっていました。
(これに加えてどのJARファイルを参照すればいいのかが分からなかった)

ということで、色々と苦戦した結果ですが、

JavaからのGroovyの実行方法
その1(クラスパスを指定して実行する場合+実行するクラスがカレントにある場合)
(Windows) java -cp %GROOVY_HOME\embeddable\groovy-all-1.5.7.jar;. hogehoge
(Linux) java -cp $GROOVY_HOME/embeddable/groovy-all-1.5.7.jar:. hogehoge
その2(CLASSPATH変数にセットしておく場合)
Windows
CLASSPATHに%GROOVY_HOME\embeddable\groovy-all-1.5.7.jarを追加してコマンドプロンプト再起動。
(詳しくないのですが、環境変数で%とか使えるのだろうか。私はフルパス指定しました)

Linuxは動作確認していないのでまた今度。

やっぱり基本は大切ですね。

| | コメント (0) | トラックバック (1)

2008年12月21日 (日)

住民基本台帳カードを取得しようと思います。

そろそろ確定申告について考えていかないといけないわけですが、
今回はe-Taxというのに挑戦してみようと思っています。

そのe-Taxに挑戦するにはまずは住民基本台帳カードが必要だそうで
それを取得するために証明写真を撮ってきました。

月曜日に市役所に行って軽くGETしてこようと思います。
(ちなみに岡山市は無料でもらえるらしいです)

住民基本台帳の関係ってどれも「悪名高い」と思ったのは私だけですかね。

| | コメント (0) | トラックバック (0)

2008年12月18日 (木)

Groovyをインストールしました。

最近、ある方のおすすめでGroovyの理解を深めているわけですが、
やっとPCにインストールしました。

RubyとかPerlのようなスクリプト言語のような記述でプログラムが書けて
しかもJavaVM上で動作させるのでJavaプログラムと連動させることもできます。

今は以下の書籍を読んでいるだけですが、Rubyなどにも実装されている範囲の指定とか
リストの制御が非常に簡単です。(リスト自体の定義も可能だったりするようです)
list[2..3] = [1,2];
と記述するだけでリストの2番目と3番目にデータが更新(データがなければ勝手に拡張して挿入)
されますし、何より、マイナスの添字を指定すると最後尾からの値が取得できたりします。
JavaでそんなことをしたらArrayIndexOutOfBoundsExceptionがスローされますよね。

今のところ興味深いのはクロージャの部分です。今のところ「イベントハンドラ」の
ような動きを想像させますね。(それが正しいかどうかはわかりませんが、何かの処理を
実行した後に実行される処理のようなので。)


| | コメント (0) | トラックバック (0)

2008年12月16日 (火)

ガウディ本読書会+忘年会議に参加しました。

先週の日曜日に久しぶりにガウディ本読書会が開催されたので
参加してきました。

3章から読み始めたわけですが、2章と違ってプログラミングの概念が多く
書かれていて感覚的にも理解しやすいと思いました。

アジャイル開発を業務に適用している話は非常に興味深く、
(私の今の仕事では絶対にやらない(しようとしない)ことなので余計面白そうでした。
ウォーターフォール型も悪くないんですが、そういう開発手法についてはまた後日…)

忘年会議の方は私は体調が悪かったのでお酒は飲まなかったのですが、
やっぱり飲み会の時にはお酒を飲みたいものだと思いました。

そして、忘年会2次会では、2009年に盛り上がるであろうビジネスの話が聞けたので
1次会、2次会共に有意義でした。
私のように個人事業でフラフラしてるよりも会社を持った人は観点が違うなと思わされた
ような気がしました。

| | コメント (0) | トラックバック (1)

2008年12月11日 (木)

SQLServerパフォーマンス関係の情報取得メモ

最近SQLServerのパフォーマンスが原因による障害が発生しているので
少しSQLServer自体のチューニングができないのかどうか調べてみました。

チューニングではないですが、SQLServerの稼動状況を参照するためのビューが
存在しているようです。

select * from sys.dm_os_perormance_counters -- パフォーマンスカウンタ
select * from sys.dm_io_virtual_file_stats(NULL, NULL) -- ディスクI/O状態(全てのDBの情報を取得)
select * from sys.dm_os_wait_stats -- テーブルのロック状況を取得

まあ、DBごとにパーティションを分けて配置するか、ディスクを分けておくのが
一番ディスクI/Oの速度は速そうですね。(一番いいのはディスクI/O自体を減らす?)

チューニング系の作業は地道だけど、それなりに面白いですよね。私だけかもしれませんが。

| | コメント (0) | トラックバック (0)

LINQ to XMLで苦戦中(解決)

苦戦していたLINQなんですが、SAMEさんからのヒントにより
うまくGridViewに表示する事が出来ました。

SAMEさんのソースでは一旦DataTableにセットしなおしてから
GridViewにバインドしているようでしたが、どうやら、直撃でバインドしても
うまく表示できるようですね。
(おそらく、今貼っているソースにはGridViewのプロパティ設定などを載せていないから
わざとDataTableに入れてからバインドさせていると勝手に推測)

C#の場合は(?)一旦内部の要素に値をセットすると言う事が必要なんですね!


using System;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string strFilePath = Server.MapPath("./");
XElement xmldoc = XElement.Load(strFilePath + "App_Data/udons_2008_forControl.xml");

var query = from c in xmldoc.Elements("商品")
select new
{
品番 = c.Element("品番").Value,
品名 = c.Element("品名").Value,
地方発送 = c.Attribute("地方発送").Value,
イメージ = c.Element("品名").Attribute("イメージ").Value,
セット内容 = c.Element("セット内容").Value,
セット = c.Element("セット内容").Attribute("セット").Value,
単価 = c.Element("セット内容").Attribute("単価").Value,
価格 = c.Element("価格").Value
};

GridView1.DataSource = query;
GridView1.DataBind();
}
}

| | コメント (0) | トラックバック (0)

2008年12月10日 (水)

LINQ to XMLで苦戦中…。

以下のXMLをDataGridにバインドして表示するWebプログラムをC#で組もうとしたら・・・。


<商品情報>
<商品 地方発送="なし">
<品番>udon_01
<品名 イメージ="tenpura.gif">天ぷらうどん
<セット内容 セット="5" 単価="700">うどん、かけつゆ、えび天ぷら、あげ巻き
<価格>3500

<商品 地方発送="なし">
<品番>udon_02
<品名 イメージ="kakiage.gif">かきあげうどん
<セット内容 セット="5" 単価="560">うどん、かけつゆ、季節のかきあげ、かまぼこ
<価格>2800

<商品 地方発送="あり">
<品番>udon_03
<品名 イメージ="kitsune.gif">きつねうどん
<セット内容 セット="4" 単価="375">うどん、かけつゆ、味付け油あげ、かまぼこ
<価格>1500

<商品 地方発送="なし">
<品番>udon_04
<品名 イメージ="tsukimi.gif">月見うどん
<セット内容 セット="4" 単価="150">うどん、かけつゆ、生卵
<価格>600

<商品 地方発送="あり">
<品番>udon_05
<品名 イメージ="kakeudon.gif">かけうどん
<セット内容 セット="6" 単価="250">うどん、ぶっかけつゆ、あげ巻き、乾燥薬味
<価格>1500

<商品 地方発送="あり">
<品番>udon_06
<品名 イメージ="wakame.gif">わかめうどん
<セット内容 セット="10" 単価="250">うどん、かけつゆ、乾燥わかめ、かまぼこ
<価格>2500

<商品 地方発送="あり">
<品番>udon_07
<品名 イメージ="sansai.gif">山菜うどん
<セット内容 セット="10" 単価="250">うどん、かけつゆ、しいたけ、しめじ、山菜、かまぼこ
<価格>2500

<商品 地方発送="なし">
<品番>udon_08
<品名 イメージ="nikomi.gif">煮込みうどん
<セット内容 セット="7" 単価="400">うどん、かけつゆ、しめじ、きじ肉、ほうれんそう、あげ巻き
<価格>2800

<商品 地方発送="なし">
<品番>udon_09
<品名 イメージ="misonikomi.gif">味噌煮込みうどん
<セット内容 セット="7" 単価="400">うどん、いりこだし、麦みそ、じゃこ天、ごぼう天、きじ肉、かぼちゃ、乾燥ねぎ
<価格>2800

<商品 地方発送="なし">
<品番>udon_10
<品名 イメージ="curry.gif">カレーうどん
<セット内容 セット="5" 単価="600">うどん、かけつゆ、粉末カレー、きじ肉、野菜
<価格>3000


以下のプログラムでそのままバインドできると思ったら、
LINQでデータを取るところで「匿名型では、同じ名前を持つ複数のプロパティを含む事はできません。」
とコンパイルエラーになってしまいました。
protected void Page_Load(object sender, EventArgs e)
{
string strFilePath = Server.MapPath("./");
XElement xmldoc = XElement.Load(strFilePath + "App_Data/udons_2008_forControl.xml");

var query = from c in xmldoc.Elements("商品")
select new
{
c.Element("品番").Value,
c.Element("品名").Value,
c.Attribute("地方発送").Value,
c.Element("品名").Attribute("イメージ").Value,
c.Element("セット内容").Value,
c.Element("セット内容").Attribute("セット").Value,
c.Element("セット内容").Attribute("単価").Value,
c.Element("価格").Value
};

GridView1.DataSource = query;
GridView1.DataBind();
}

VB.NETの場合はc.Element("XXX")の部分をc.<品番>.Valueで取得できるみたいなのですが、
C#に翻訳しようと思うと何か足りないのだろうか…。

タイムオーバーになったのでまた明日以降ということで。。。

| | コメント (2) | トラックバック (1)

2008年12月 7日 (日)

4つの目標を掲げてみました。


  1. LINQ(統合言語クエリ)について調べる

  2. Groovyについて調べる

  3. LPI Level2挑戦(予定)

  4. 情報処理技術者試験(データベース)挑戦(予定)

まあ、何でこれを掲げたのかというと特に意味は無いわけですが、
いまいち仕事が楽しくないので、少し仕事以外の所に力を注いでみようかな?と思ったわけです。

なので上記4つを仕事に生かす気は(ほぼ)ありません(笑)

| | コメント (0) | トラックバック (0)

2008年12月 3日 (水)

どうやら腸炎になってしまったようです。

先週の土曜日(29日)の昼から体調が悪くなり、
ずっと寝たきり状態になってしまいました。
で、予定していた、「オープンセミナー2008@徳島」にも参加できず、
月曜日に休みをもらっていたのが幸いでしたが、
それでもきついですね。

意味不明な腹痛と下痢に悩まされて。。。

と、昨年も同じようなことになったのに気がついたわけですが、
去年と違って嘔吐がないので、普通に夕食も摂ってしまいました。(量は少なめですが)
明日から、少し症状がなくなるまで絶食生活が続く事になりそうです。
(スポーツドリンクは飲むようにします。飲まず食わずではさすがに体が持たないので。。。)

| | コメント (0) | トラックバック (0)

« 2008年11月 | トップページ | 2009年1月 »