ホチキス先生の「プログラマーと呼ばれたい」

InfoPath & SQL Server !

Archive for the ‘Microsoft Office’ Category

Microsoft Visual Studio 2015 と SQL Server データベースファイルで開発する「目からうろこ」の C# プログラミングによる成績処理システム(5) – 生徒基本情報のデータを整理してデータベースに保存する下準備をする

with 5 comments

1.既存のデータを集める

VisualStudio_成績処理_054_mid_640

生徒基本情報のようなデータは、成績処理にデータベースを使っていない学校でも、多くはエクセルのような表計算で管理されているだろう。まず校内にある生徒データを集めてエクセルでまとめる。エクセルはこのようなデータ型が決まっていないデータを集めて整理するには使いやすい。

この例でわかるように、表計算のデータはデータとしてそのまま使えない場合がある。よくあるのは、数字に見えるが実際は日本語の2バイトフォント、いわゆる全角文字になっていること、アルファベットも全角と半角が混在していること、よけいな空白が混じっていること、などだ。上の表計算データの例では、氏名が姓と名に分かれておらず、また空白が入っていること、氏名の後ろに何らかの意味を持った記号「・」があること、などだ。

2.氏名データを姓と名に分ける

VisualStudio_成績処理_055_mid_640

どうしても手作業が発生するのは、氏名データから姓と名を分ける作業だ。ここではエクセルの関数を使って氏名のデータから全角と半角の空白と、これも全角と半角の「・」を取り除き、前から2文字を仮に姓だとして、前から3文字以降を名だとして切り取っている。エクセルの表計算上の関数は次のようになる。

「姓名の空白をとる」関数の例 =SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(E2," ","")," ",""),"・",""),"・","")
「姓を切り取る」関数の例 =LEFT(H2,2)
「名を切り取る」関数 =MID(H2,3,10)

また数字のようで日本語であるかもしれない「学年」や「出席番号」を数字にし、性別からよけいな空白を取り除く、クラスを半角にする、などの処理をする。

「学年を数字にする」関数の例 =VALUE(A2)
「出席番号を数字にする」関数の例 =VALUE(D2)
「性別から空白を取る」関数の例 =SUBSTITUTE(SUBSTITUTE(F2," ","")," ","")
「クラスを半角にする」関数の例 =ASC(C2)

3.テーブル構造の見直しとテーブルを生成する SQL 文の変更

こうして既存のデータを整理すると、生徒基本情報データとしてあったほうが良いフィールドに気づく。ここでは「学科名」と「本科か専修コースか」のデータが必要だと考えた。

本校では、クラス名を学科名からつけている。建築科はクラス名に「A」をつけており、1年生は「A1」、2年生は「A2」といったものだ。したがって生徒が所属するクラス名から学科がわかるが、学科名はフィールドとして持っておいたほうが様々な処理がしやすいと考えた。また本校は一般の高校生が学ぶ「本科」に加えて、いちど高等学校を卒業した社会人が学ぶ「専修コース」があるので、それもデータとして加えたい。

・gakka 学科名 ユニコード可変長文字列型(4)
・honsen クラス名 ユニコード可変長文字列型(2)

「gakka」フィールドには「建築」、「機械」、「電気」、「情報技術」のデータを記録することに、「honsen」フィールドには「本科」または「専修」を記録することにする。

テーブル構造を変えるには、最初に作ったテーブル作成の SQL 文を変更して行う。メモ帳などのテキストファイルにしておいた元の SQL 文を次のように変更する。

VisualStudio_成績処理_056_mid_640

SQL 文のうち、[gakka] で始まる行と [honsen] で始まる行を追加した。

4.テーブルの削除とテーブル生成の SQL 文の実行

VisualStudio_成績処理_057_mid_640

Visual Studio の SQL Server オブジェクトエクスプローラーで、作った dbo.Seito テーブルを削除する。削除はテーブル名をポイントして右クリックし「削除」をする。

VisualStudio_成績処理_058_mid_640

テーブルを削除すると、テーブルにデータがあった場合そのデータがすべてなくなってしまうので、たいへん危険な操作になる。そこで「データベース更新のプレビュー」で、ほんとうに削除して良いか聞かれる。よければ「データベースの更新」をクリックする。

VisualStudio_成績処理_060_mid_640

テーブルがなくなった。

VisualStudio_成績処理_061_mid_640

SQL Server オブジェクトエクスプローラーで「テーブル」フォルダを右クリックし、もういちど「新しいテーブルの追加」を行う。

VisualStudio_成績処理_062_mid_640

ここでデザインビューを操作するのではなく、デザインビューの下の「T-SQL」に先のメモ帳で作り直した SQL 文を貼り付ける。すると上のデザインビューにも SQL 文に相当するデザインが表示される。

VisualStudio_成績処理_063_mid_640

テーブルのデザインビューの左上にある上向き矢印「更新」でデータベースを更新する。

VisualStudio_成績処理_064_mid_640

「データベース更新のプレビュー」で「データベースの更新」ボタンをクリックして更新を実行する。

VisualStudio_成績処理_066_mid_640

下部の「データツール操作」で更新が正常に完了したことがわかる。

VisualStudio_成績処理_067_mid_640

SQL Server オブジェクトエクスプローラーで生成したテーブルを確認する。

次回は整理したデータをテーブルに保存する作業を行う。

広告

Access で年賀状のあて名印刷をするコツ

leave a comment »

この時期、1年間使わなかった年賀状印刷ソフトを久しぶりに起動し、印刷に四苦八苦というところも多いだろう。ところが年に1回しかつかわないソフトの使い方は、どうしても忘れてしまいがちになるのではないか。また今年中にプリンタや周辺機器を買い替えてアプリケーションが対応しなくなったり、もしかしたら昨今のことだから、家に何台もあるパソコンのうち、どれにソフトをインストールしてあったか忘れてしまっている、といったこともあるかもしれない。またそれが調子が悪くて捨ててしまっていた、といったこともあるだろう。

年賀状を印刷するには、いわゆる「宛名印刷ソフト」というものを使う人が多いだろうが、宛名印刷ほど Access に得意な分野はない。そこで、住所データをアクセスにインポートし、宛名印刷をするコツを紹介する。ここでは Microsoft Office Access 2007 で説明するが、他のバージョンでもほぼ同じだ。

まず住所データを用意する。もし宛名印刷ソフトを使っているならデータが取り出せるはずだ。宛名印刷ソフトからデータをエクスポートすると、たとえばこのようなデータになる。これはCSV 形式のデータで、ファイルのフォーマットはテキストファイルと同じ扱いになっている。宛名印刷ソフトによってはエクセル形式でデータを取り出せるものもあるだろうし、データがなければエクセルで作ってもいいだろう。

Access年賀状_001 

<fig.1 : ある宛名印刷ソフトからエクスポートした住所データ>

これを Access にインポートする。まず Access を起動したら「空のデータベース」を作成する。作成する場所は「ドキュメント」で、ファイル名は「年賀状印刷」とでもしておこう。

Access年賀状_002_mid_640

<fig.2 : Access を起動して「空のデータベース」を作成する>

Access年賀状_003_mid_640

<fig.3 : Access のファイル名を「年賀状印刷」として作成する>

Access が起動し、テーブルのデザイン画面になったら、テーブルは作らなくてよいので保存しないで閉じる。次にメニューから「外部データ」のタブを開き、「テキストファイルのインポート」をクリックする。もし用意した住所データがエクセルの場合は「Excel ワークシートのインポート」をクリックする。

Access年賀状_004_mid_640

<fig.4 : テキストファイルのインポートをする>

テキストファイルのインポートを実行すると、インポートするデータを指定するように求められるので、CSV のテキストファイルを保存した「ドキュメント」を指定して、ファイルを選択する。

Access年賀状_005_mid_640

<fig.5 : インポートするテキストファイルを指定する>

Access年賀状_006_mid_640

<Fig.6 : インポートするテキストファイルを保存した「ドキュメント」フォルダからファイル名を選択する>

ファイル名を指定したら「テキストインポートウィザード」がはじまる。このウィザードでは、データの形式を自動で読み取り、適切な形式に判断してくれるので、基本的には「次へ」の連続でうまくいく。ただ、郵便番号のフィールドは、場合によっては数値と判断される場合があるので、テキストになっていることを確認しよう。もし数値と判断されてしまったら、たとえば番号の最初の数字が「0」の場合、その「0」が失われて桁が小さくなるし、後でやる「郵便番号の前と後ろの切り離し」がやりにくくなる。

Access年賀状_007_mid_640

<fig.7 : テキストインポートウィザードでデータ区切りを指定する>

Access年賀状_008_mid_640

<fig.8 : データインポートウィザードでテキストの保存形態を確認する>

Access年賀状_009_mid_640

<fig.9 : データインポートウィザードでデータの型を確認する>

データの型、特に郵便番号のフィールドが「数値」ではなく「テキスト」になっていることを確認し、次へすすむと主キーの設定になる。ここでは「主キーを自動的に設定する」にして連番を自動で割り当てることとする。

Access年賀状_010_mid_640

<fig.10 : テキストインポートウィザードで主キーを自動的に設定する>

インポートウィザードが終了すると、インポートしたデータのテーブル名を指定する。ここでは自動的に割り当てられた「住所エクスポート」のままでいいだろう。

Access年賀状_011_mid_640

<fig.11 : テキストインポートウィザードでインポート先のテーブル名を指定する>

インポートウィザードを終了すると、このインポート操作を保存するかを聞かれる。もし何度も同じ操作をする可能性があるなら保存をするが、このような場合は保存しなくていいだろう。

Access年賀状_012_mid_640

<fig.12 : テキストインポートウイザードでインポート操作の保存ができる>

データのインポートができた。このままではフィールド名がわかりにくいので、テーブルをデザインしてフィールド名を「宛名」、「郵便番号」、「住所」に変えよう。

Access年賀状_013_mid_640

<fig.13 : 住所データがインポートできた>

Access年賀状_014_mid_640_480

<fig.14 : テーブルをデザインビューにしてフィールド名を変更する>

Access年賀状_015_mid_640

<fig.15 : テーブルをデザインビューにしてフィールドを「宛名」、「郵便番号」、「住所」に変更する>

Access年賀状_016_mid_640

<fig.16 : 「住所エクスポート」テーブルのフィールド名を変更した>

次に、このテーブルをもとにして、はがきの宛名印刷に使いやすいデータをクエリで加工する。「作成」タブの「クエリデザイン」で新しいクエリを作成しよう。クエリを作成すると、どのテーブルのデータからデータを取得するかを選択する。ここでは「郵便番号住所」のデータしかないので、それだけが選択できる。

Access年賀状_017_mid_640

<fig.17 : 「作成」タブの「クエリデザイン」で新しいクエリを作成する>

Access年賀状_018_mid_640

<fig.18 : クエリデザインでテーブルを選択する>

Access年賀状_019_mid_640

<fig.19 : 新しいクエリにテーブルが関連付けられた>

新しいクエリにテーブル「住所エクスポート」が関連付けられたら、表示するフィールドを選んでいく。ここで単にフィールドを「宛名」、「郵便番号」、「住所」と選択してもいいが、後で印刷画面のレポートを作りやすくするために、フィールドを少し加工しよう。

宛名には「様」を付けたいので、全角スペースをひとつ挟んで「様」を表示するようにする。郵便番号は前の 3桁と後ろの 4桁を分離する。住所はそのままでいいだろう。このように表示するには、「フィールド」を次のように記述する。

———————————

宛名様: [宛名] & " " & "様"
郵便番号前: Left([郵便番号],3)
郵便番号後: Right([郵便番号],4)
住所

———————————

まず最初のフィールドに「宛名様」とするのは、フィールドの別名だ。そのあとに「:」をはさんで表示するデータを記述する。「&」は文字列をつなぐ演算子で、” ”は全角のスペースをひとつ挟んでおり、次の「&」で”様”の文字をつないでいる。

次のフィールドの別名は「郵便番号前」とし、「:」ではさんで Left([郵便番号],3) とするのは、「郵便番号」のフィールドのデータを左から、つまり前から3文字だけ表示する関数だ。同様に次のフィールドは別名を「郵便番号後」とし、「:」ではさんで Right([郵便番号],4) としている。これは「郵便番号」のフィールドのデータを右から、つまり後から4文字だけ表示する関数だ。これで郵便番号の前と後ろを別のフィールドで表示し、区別できる。

「住所」フィールドはそのまま使えばよいだろう。

Access年賀状_020_mid_640

<fig.20 : 表示するフィールドの式を記述する>

フィールドの式が記述できたらクエリを保存する。「印刷用クエリ」の名前にしよう。

Access年賀状_021_mid_640

<fig.21 : クエリを保存する>

クエリが保存できたらデータを確認しよう。宛名にはスペースをはさんで「様」が、郵便番号は前 3桁と後 4桁が別フィールドで分離されて表示されているはずだ。

Access年賀状_022_mid_640

<fig.22 : 「印刷用クエリ」のデータを確認する>

次に印刷用のレポートを作成する。「作成」タブから「レポートデザイン」で空白のレポートを作成する。空白のレポートでは自動的に「ページヘッダー」と「ページフッター」ができるが、年賀状印刷にヘッダーやフッターは必要ないので削除する。ヘッダーとフッターを削除するには、

Access年賀状_023_mid_640

<fig.23 : 「作成」タブから「レポート」「レポートデザイン」で新しい空白のレポートを作成する>

Access年賀状_024_mid_640

<fig.24 : レポートの「ページヘッダー」と「ページフッター」を削除する>

次にレポートに対してデータを割りつける。レポートのビューでは、左上の「■」をポイントするとレポート全体を選択したことになるので、その状態で「プロパティシート」から「データ」タブの「レコードソース」をクリックして関連付けるテーブルまたはクエリを選択する。ここでは「印刷用クエリ」を選択する。

Access年賀状_025_mid_640

<fig.25 : レポートに対してレコードソースを割り当てる>

次にレポートにフィールドを追加する。「デザイン」タブから「既存のフィールドの追加」をクリックすると、レポートに関連付けられた「印刷用クエリ」の各フィールドを選択できるので、レポートにドラッグしてフィールドを追加する。

あるいは「デザイン」タブの「コントロール」から「テキストボックス」をレポートにドラッグし、後でフィールドのデータを関連付けてもいいだろう。

フィールドを画面に追加すると、フィールド名のラベルも同時にできるが、必要ないので削除する。

Access年賀状_026_mid_640

<fig.26 : レポートにフィールドを追加する>

Access年賀状_027_mid_640

<fig.27 : 不要なラベルを削除した>

次に、1ページごとに改ページされる設定をする。それには「詳細」のセクションを選択したまま「プロパティシート」で「改ページ」を「カレントセクションの前」に変更する。これで 1レコードずつ改ページされて印刷されるようになる。

Access年賀状_028_mid_640

<fig.28 : 「詳細」セクションを改ページするように設定する>

後は用紙のサイズを「はがき」にし、各フィールドのフォントや文字の大きさ、位置を調節するだけだ。フォントは、郵便番号は「MS Pゴシック」に、住所と宛名は「HG教科書体」がおすすめだ。文字の大きさは「郵便番号前」を 16ポイント、「郵便番号後」を 14ポイント、「住所」を 12ポイント、「宛名様」を 22ポイントとしてみた。

レポートデザインのコツとして、印刷の余白はできるだけ小さくしておくことがある。「郵便番号前」と「郵便番号後」のフィールドは、年賀はがきの郵便番号枠に収まるようにするために「文字配置」を「均等割り付け」にするとよい。また住所のフィールドは、長い住所もあるので大きめにしておき、さらに切手印刷に重ならないようにレイアウトする。「宛名様」のフィールドはハガキの中央に収まるように「文字配置」を「中央」にするとよいだろう。

Access年賀状_029_mid_640

<fig.29 : フィールドの文字フォントと文字の大きさを設定する>

「印刷プレビュー」でおおまかなレイアウトを確かめながらデザインする。だいたいのレイアウトができたら、A4サイズの用紙を 4つに切って葉書大にし、印刷する。印刷した紙を年賀葉書に重ねて位置を確認する。プリンタによって印刷する位置に違いがあるので、ここは何度かやってみながら調節するしかない。

Access年賀状_030_mid_640

<fig.30 : 「印刷プレビュー」でレイアウトを確認する>

IMG_4099_mid_640_480

<fig.31 : 普通の紙に印刷して年賀葉書に重ねて位置を確かめる>

おおむね位置があえば、年賀葉書をプリンタにセットして印刷する。ここでも一度に印刷せず、何枚か試し印刷をし、郵便番号の位置などレイアウトがうまく印刷されるか確認しながらしよう。最終調整だ。あっていなければフィールドサイズを変えたり、フィールドの位置を動かしたりしてベストの位置に修正しよう。

IMG_4098_mid_640_480

<fig.32 : 郵便番号の位置を確認しながら印刷する>

このように説明すると手間がかかるようだが、Access がある程度わかっているなら簡単だ。住所データさえあれば 15分もあれば印刷できる状態まで作れるだろう。

作業手順とコツをまとめると次のようになる。

(1)データをインポートする。このとき郵便番号を数値にせずテキストでインポートする。
(2)データをそのまま使わず、宛名を「様」付きにしたり郵便番号を前と後ろに分けるクエリを作る。
(3)レポートを作ってクエリを割り当てる。ページのヘッダーとフッターを削除し、詳細セクションを改ページする。
(4)フィールドの大きさやフォント、文字の大きさをレイアウトする。文字位置を「均等割り付け」や「中央」で工夫する。
(5)試し印刷を念入りにして、文字の大きさや郵便番号の位置を丁寧にあわせる。

Access は複数ページにわたる帳票印刷が得意だ。これは葉書印刷にも活かせるので、ぜひ Access で年賀状印刷をやって欲しい。そしてこの年賀状印刷のコツは他の帳票印刷でも使えるはずだ。

Written by Yoshio Matsumoto

2014年12月30日 at 1:05 PM

郵便番号データを SQL Server で利用するには(2) – データ変換サービス DTS を使わず Access を利用してデータを SQL Server に取り込む

leave a comment »

SQL Server に Excel や Access、CSV形式などのテキストファイルを取り込むために、データ変換サービス、DTS がある。だがデータ変換サービスはデータ型に厳密であるなど、実際の運用においては使いにくい面もある。そこでデータ変換サービス DTS を使わず、Access を利用してデータを SQL Server に取り込むことを紹介する。Access を使うと、取り込みたいデータを確認しながら作業ができるので、データ型やフィールドサイズが不明の場合でも対応しやすい。

ここで SQL Server に取り込みたいデータが、日本郵便からダウンロードできる全国郵便番号であるとする。郵便番号データのダウンロードについては、前回の blog を参考にしてほしい。

 

ダウンロードした csv データファイルを Access に取り込むため、まず Access を起動して空のデータベースを作成する。ここで使用した Access のバージョンは Microsoft Office Access 2007 だが、違うバージョンでもうまくいくはずだ。Access データベースファイルを作成する場所はローカルコンピュータのドキュメントなど適当な場所でいい。

SQL_DTS_Access_001_mid_640

<Fig.1 : Microsoft Office Access 2007 を起動して空のデータベースを作成する。

空のデータベースを作成したら、リボンメニューの「外部データ」から「テキストファイルのインポート」を実行する。日本郵便からダウンロードしたデータが、csv 形式のテキストファイルだからだ。

SQL_DTS_Access_002_mid_640

<Fig.2 : 「外部データ」メニューの「テキストファイルのインポート」を実行する>

データのインポートはウイザードに従ってすすめる。「データのインポート元とインポート先、またはリンク元とリンク先の選択」でデータをインポートする郵便番号ファイルを選択し、データの保存方法は「現在のデータベースの新しいテーブルにソースデータをインポートする」を選ぶ。

SQL_DTS_Access_003_mid_640

<Fig.3 : データのインポート元とインポート先、またはリンク元とリンク先の選択>

ファイルを指定したら読み込むデータが表示されるので、データの区切り形式を選択する。データの区切りは「区切り記号付き」を選ぶ。

SQL_DTS_Access_004_mid_640

<Fig.4 : データインポートウィザードでデータの区切り形式を選択する>

次にフィールド区切り記号を選択する。フィールド区切り記号は「カンマ」を指定する。また「先頭行をフィールド名として使う」オプションは、読み込まれたデータを見てフィールド名に相当するデータがないので、チェックを外す。

SQL_DTS_Access_005_mid_640

<Fig.5 : フィールド区切り記号の選択と先頭行をフィールド名として使うかの選択>

次に読み込むフィールドのフィールド名や型を設定する。Access が読み取ったデータからフィールドの型を類推して決めてくれるが、郵便番号は数値として判断される場合がある。確かに郵便番号は数値なのだが、数値として読み取った場合は先頭のゼロが無視されてしまうので、郵便番号のフィールドは「テキスト型」に変更しておく。

SQL_DTS_Access_006_mid_640

<Fig.6 : フィールドのオプションを設定する>

主キーの設定では、ここでインポートするデータの主キーが不明であるので、「主キーを自動的に設定する」を選んでおく。こうすれば自動的に「ID」のフィールドが作られ、連番が与えられる。

SQL_DTS_Access_007_mid_640

<Fig.7 : 主キーの設定>

インポートウィザードの最終場面では、インポート先のテーブル名を記述する。ここではファイル名から自動的に割り当てられた「KEN_ALL」の名前とした。

SQL_DTS_Access_008_mid_640

<Fig.8 : インポート先のテーブルの指定>

インポートが完了したら、「インポート操作の保存」の画面になる。同じインポート操作を後で繰り返したい場合は、ここで「インポート操作の保存」にチェックをしておくと、簡単に再現できる。ここでは繰り返ししないつもりなので、チェックをしないでおく。

SQL_DTS_Access_009_mid_640

<Fig.9 : インポート操作の保存>

インポートウィザードが終わったら、インポートデータは新たに生成した「KEN_ALL」テーブルに保存されている。テーブルの下部にはレコード数が 123,708 件であることがわかる。

SQL_DTS_Access_010_mid_640

<Fig.10 : インポートウィザードを終了しデータをインポートした>

読み込んだ「KEN_ALL」テーブルのデータを見ると、フィールド1 は意味がよくわからない何らかの管理番号になっているようだ。フィールド2 は郵便番号の前部分、フィールド3 は郵便番号の全6桁、フィールド4 からフィールド6 が住所の読み仮名、フィールド7 からフィールド9 が住所になっている。フィールド10 から15 は何らかの管理フラグだ。

データ構造がわかったら、これに相当するテーブルを SQL Server に作る。CREATE 文は次のようなものとした。

——————————————————————————-

CREATE TABLE 郵便番号住所2(
    管理番号 int NULL,
    プレ郵便番号 varchar(7) NULL,
    郵便番号 char(7) NULL,
    都道府県カナ nvarchar(7) NULL,
    市区町村カナ nvarchar(25) NULL,
    住所それ以降カナ nvarchar(80) NULL,
    都道府県 nvarchar(10) NULL,
    市区町村 nvarchar(25) NULL,
    住所それ以降 nvarchar(80) NULL,
    管理フラグ1 char(1) NULL,
    管理フラグ2 char(1) NULL,
    管理フラグ3 char(1) NULL,
    管理フラグ4 char(1) NULL,
    管理フラグ5 char(1) NULL,
    管理フラグ6 char(1) NULL
)

——————————————————————————-

SQL_DTS_Access_011_mid_640

<Fig.11 : SQL Server Management Studio で郵便番号住所をストアするテーブルを作る>

次に Access を SQL Server のテーブルに「リンクテーブル」として接続する。リボンメニューの「外部データ」から「その他」をクリックし「ODBC データベース」を実行する。

SQL_DTS_Access_012_mid_640

<Fig.12 : リボンメニューの「外部データ」から「その他」をクリックし「ODBC データベース」を実行する

外部データの取り込みウィザードがはじまる。日本郵便のサイトからダウンロードした csv のテキストファイルは Access に取り込んだが、ここでは SQL Server のテーブルにリンクするために「リンクテーブルを作成してソースデータにリンクする」を選択する。

SQL_DTS_Access_013_mid_640

<Fig.13 : 外部データの取り込みウィザードでリンクテーブルを作成してソースデータにリンクする>

「データソースの選択」では、適切な SQL Server へのデータソースがあれば選択するだけでいいが、なければ新規作成する。DNS 名のところの「新規作成」ボタンをクリックする。

SQL_DTS_Access_014

<Fig.14 : データソースの選択>

セットアップするデータソースのドライバーを選択する。接続したい SQL Server を選択して「次へ」をクリックする。

SQL_DTS_Access_015

<Fig.15 : セットアップするデータソースのドライバーを選択する>

データソース名を決めて入力する。データソース名は、後で見てわかるような、適当な名前でいい。

SQL_DTS_Access_016

<Fig.16 : データソース名を決めて入力する>

データソースが作成される。「完了」をクリックする。

SQL_DTS_Access_017

<Fig.17 : データソースの作成>

接続する SQL Server を選択する。「サーバー」テキストボックスの右端▼をクリックすると、利用できる SQL Server が選択できるので、テーブルを作成した SQL Server を選択して「次へ」をクリックする。

SQL_DTS_Access_018

<Fig.18 : 接続する SQL Server を選択する>

SQL Server のログイン認証を選択する。「ネットワークへのログイン ID で、Windows NT の認証メカニズムを使う」はいわゆるWindows 統合認証で、「ユーザーが入力する SQL Server 用のログイン ID とパスワードを使う」は SQL Server にユーザーを作ってログインするものだ。作業している環境によるが、ここでは前者のログインで利用するものとする。

SQL_DTS_Access_019

<Fig.19 : SQL Server のログイン認証を選択する>

既定のデータベースを設定する。郵便番号住所テーブルを作成したデータベース名は「test」だったので、それを選択する。

SQL_DTS_Access_020

<Fig.20 : 既定のデータベースを設定する>

これでデータソースの作成を完了する。

SQL_DTS_Access_021

<Fig.21 : データソースの作成を完了する>

データソースが作成されたら、データソースの詳細が表示される。ここで「データソースのテスト」をクリックすると、SQL Server に接続テストをすることができる。

SQL_DTS_Access_022

<Fig.22 : データソースの作成完了とテスト>

データソースの接続テストが成功した。

SQL_DTS_Access_023

<Fig.23 : SQL Server へのデータソースの接続テスト>

データ接続ができたら、リンクしたいテーブルを指定する。ここでは「郵便番号住所2」テーブルに接続したい。

SQL_DTS_Access_024

<Fig.24 : テーブルのリンク>

リンクテーブルが作成できた。リンクテーブルは地球のようなアイコンで、画面の左側「すべてのテーブル」に「dbo.郵便番号住所2」の名前で表示されている。このテーブルは Access 上に実体はなく、SQL Server のテーブルにリンクしている。

SQL_DTS_Access_025_mid_640

<Fig.25 : リンクテーブルの作成完了>

リンクテーブル「dbo.郵便番号住所2」を開くと、SQL Server 上のデータを見ることができる。まだデータは入っていないので、一件もデータがない。

SQL_DTS_Access_026_mid_640

<Fig.26 : リンクテーブル「dbo.郵便番号住所2」を開いてデータを確かめる>

リンクテーブルが作成できたら、Access にインポートしたデータを、リンクテーブル「dbo.郵便番号2」へコピーする。Access でテーブルへデータをコピーするとき、簡単なのは「追加クエリ」を作成することだ。

「新しいクエリ」を作成し、テーブル「KEN_ALL」を元データとする。画面に表示された「KEN_ALL」テーブルの各フィールドを下段にドラッグし、表示させる。

SQL_DTS_Access_027_mid_640

<Fig.27 : 新しいクエリを作りフィールドを表示させる>

次にこのクエリを「追加クエリ」にする。Access では SQL 文を使ってデータを追加することもできるが、単純にテーブルからテーブルへデータを追加する場合は、追加クエリを使うと便利だ。

クエリを追加クエリにするには、クエリの編集画面で「デザイン」メニューの「+!」のアイコン、「追加」をクリックする。すると「追加」のウインドウが表示され、追加先のテーブルを選択するようになる。追加先はリンクテーブル「dbo.郵便番号2」を選択する。

SQL_DTS_Access_028_mid_640

<Fig.28 : クエリを追加クエリにする>

SQL_DTS_Access_029_mid_640

<Fig.29 : 追加クエリの設定で追加先のテーブルを選択する>

dbo.郵便番号2」をクエリを追加クエリにすると、画面の下部に表示されたフィールドの下の項目が変わる。単なる選択クエリの場合は、「フィールド」、「テーブル」、「並べ替え」、「表示」、「抽出条件」、「または」となっているが、追加クエリにすると「表示」の項目はなくなり、かわりに「レコードの追加」が表示される。これは、データを追加するテーブルのどのフィールドに追加するかを選択する項目だ。各フィールドの「レコードの追加」クリックすると、追加先に設定した「dbo.郵便番号2」の各フィールドが表示されるので、追加したい適切なフィールドを選択し決定していく。追加しなくてもよいフィールドは指定しなくていい。

ここで作成した SQL Server の「dbo.郵便番号2」の場合、「KEN_ALL」テーブルの各フィールドに対して、「ID」を「管理番号」に、「フィールド1」は指定せず、「フィールド2」を「プレ郵便番号」に、以降、フィールド3から「郵便番号」以降を順に設定する。

SQL_DTS_Access_030_mid_640

<Fig.30 : クエリを追加クエリにした>

SQL_DTS_Access_031_mid_640

<Fig.31 : 追加クエリの各フィールドに追加先のフィールドを設定する>

追加クエリができたら保存する。クエリ名は「郵便番号住所の追加」とした。

SQL_DTS_Access_032_mid_640

<Fig.32 : 追加クエリを保存する>

追加クエリが保存できたら、「すべてのテーブル」にあるクエリの名前「郵便番号住所の追加」をダブルクリックする。「追加クエリを実行すると、テーブルのデータが変更されます」となるので「はい」をクリックする。次に追加されるデータの件数が表示されるので、間違いなければ「はい」をクリックする。

SQL_DTS_Access_033_mid_640

<Fig.33 : 保存した追加クエリ「郵便番号住所の追加」をダブルクリックして実行する>

SQL_DTS_Access_034_mid_640

<Fig.34 : 追加クエリを実行してテーブルにデータを追加する>

SQL_DTS_Access_035_mid_640

<Fig.35 : 追加されるデータの件数が表示される>

この追加クエリは、SQL の INSERT 文になっている。SQL 文を確かめるには、追加クエリをデザインし「SQL ビュー」にするといい。次のような SQL 文が生成していることがわかる。

——————————————————————————-

INSERT INTO dbo_郵便番号住所2 ( 管理番号, プレ郵便番号, 郵便番号, 都道府県カナ
              , 市区町村カナ, 住所それ以降カナ, 都道府県, 市区町村, 住所それ以降
              , 管理フラグ1, 管理フラグ2, 管理フラグ3, 管理フラグ4, 管理フラグ5, 管理フラグ6 )
SELECT KEN_ALL.ID, KEN_ALL.フィールド2, KEN_ALL.フィールド3, KEN_ALL.フィールド4
              , KEN_ALL.フィールド5, KEN_ALL.フィールド6, KEN_ALL.フィールド7, KEN_ALL.フィールド8
              , KEN_ALL.フィールド9, KEN_ALL.フィールド10, KEN_ALL.フィールド11, KEN_ALL.フィールド12
              , KEN_ALL.フィールド13, KEN_ALL.フィールド14, KEN_ALL.フィールド15
FROM KEN_ALL;

——————————————————————————-

SQL_DTS_Access_037_mid_640

<Fig.36 : 追加クエリを SQL ビューで確認する>

追加クエリを実行すると、Access にインポートされたデータが SQL Server に追加されているはずだ。「dbo.郵便番号住所2」のリンクテーブルを開いたままなら、一度閉じて再度開くと最新のデータが表示される。

SQL_DTS_Access_038_mid_640

<Fig.37 : 「dbo.郵便番号住所2」のリンクテーブルを開いてインポートされたデータを表示する>

SQL Server Management Studio で直接 SQL Server のテーブルを確かめても、データがインポートされたことが確認できる。

SQL_DTS_Access_039_mid_640

<Fig.38 : SQL Server Management Studio でインポートされたデータを確認する>

このように、Access を使って SQL Server にデータをインポートすることができる。まず Access に CSV データを取り込み、次に「リンクテーブル」で Access を SQL Server に接続し、「追加クエリ」でデータを追加するのだ。

Access の追加クエリは画面上でフィールドを選択することで視覚的にテーブルからテーブルにデータを追加することができるので、SQL Server のデータ処理に使ってもいいだろう。

PhotoshopとMicrosoft Office Word 2010で作る – Facebookプロフィール写真の加工

leave a comment »

このたび10年以上ぶりに使い続けたネットのプロフィール写真を更新した。その作り方を紹介してみる。

まず撮った写真そのままがこんなかんじだ。

yocface2014_making_001

もとになる写真はこれだ。自分でデジカメを左手に持ち、斜め上に手をあげて上から撮影した。ちなみにブルーのシャツは2013年にMVPグローバルサミットで渡米した際に米マイクロソフト本社のカンパニーストアで買ってきた御土産だ。この写真には、プロフィール写真にするためにいくつかの問題がある。ひとつは背景が均一でなく邪魔なものが映っていること、ふたつめに風があったので髪が乱れるなどしていること、などだ。

まず気になる髪の乱れを修正しよう。縮小表示では気がつかないかもしれないが、拡大すると意外に髪が乱れているのがわかる。これはスタンプツールでタイルの色で塗りつぶすことで隠していく。

yocface2014_making_001-2_mid_640

yocface2014_making_001-3_mid_640

次に顔にかかった一本の髪を修正する。これもスタンプツールだ。

yocface2014_making_001-4_mid_640

yocface2014_making_001-5_mid_640

次に背景を整理しよう。邪魔な背景を除いて均一な背景を作るには、Photoshopを使って画像の一部分をコピーして貼り付けたり、スタンプで加工するのがいい。写真をPhotoshopで読み込み、白いタイルの背景を切り取り、新しいレイヤーで貼り付ける。角度をあわせるために回転を加える。

yocface2014_making_002_mid_640

yocface2014_making_003_mid_640 背景が後ろに広がった。右奥の隅も修正した。しかし奥の部分をよくみると、手前から奥に向かうタイルの目地はまっすぐになっているが、左から斜め上に向かってのびる目地は角度がずれているのがわかる。手前の画像をコピーして無理やり斜めに角度を変えたためだ。ここでは触らずにおいておく。

yocface2014_making_004_mid_640

次は画面の左側の修正だ。ここでは元の画像から縦にタイルの部分を切り取り、新しいレイヤーにコピーして角度を変え重ねた。しかしこれでは、色合いの違いがありすぎて違和感のある背景になった。そこで目地の部分だけを残して白いタイル部分を切り取り、新たに近似色で塗りつぶすことにした。

yocface2014_making_009_mid_640

次に顔のしみをとってみよう。些細なことと思われるが、小さなしみでも部分的に消すだけで肌がきれいになり、若々しく見えるようになるはずだ。

yocface2014_making_010_mid_640

yocface2014_making_011_mid_640

yocface2014_making_012_mid_640

yocface2014_making_013_mid_640

Photoshopによる加工の最後に、画像奥のタイルの角度を修正する。画像の一部をコピーし、新しいレイヤーに貼り付け、角度を変え、色合いを調整し、場合によっては近似色で塗りつぶす、スタンプツールでコピーする、など手作業を駆使する。

yocface2014_making_014_mid_640_480

できた画像をMicrosoft Office Word 2010に貼り付ける。画像の必要な部分を正方形に切り取るため、図形描画で正方形を描く。描いた正方形のプロパティで、線の太さを太くし色を白にすると正方形の枠で画像を切り取るイメージになる。正方形の大きさを変え、位置を動かして適切な部分を切り取るようにする。目安は、画像の中心に目がくるかんじだ。

yocface2014_making_016_mid_640

yocface2014_making_017_mid_640

yocface2014_making_018_mid_640

そしてワードアートで文字を乗せる。文字を乗せる場合は、プロフィール写真が小さいスペースでわかりやすく見えるため、できるだけ画像を大きく見せるのがいい。そのため顔の位置をやや上側に動かし、文字を画面の幅いっぱいに広がる感じで乗せる。

yocface2014_making_019_mid_640

納得いくかんじにできれば、印刷プレビューモードにして画像を表示する。そのまま画面をキャプチャし、必要な部分を切り取る。

yocface2014_making_020_mid_640

これで完成だ。あとはアップロードするFacebookやSNSのシステムにあうように縮小するなどすればいい。

yocface2014_making_021_mid_640

Written by Yoshio Matsumoto

2014年5月15日 at 12:34 AM

SQL Server : サーバーサイドでデータの変更日付をテーブルに自動的に記録するために、AFTER UPDATEトリガを利用する。変更データの絞込みにはサブクエリではなく in 句を使う。

leave a comment »

「SQL Server : サーバーサイドでデータの作成日付をテーブルに自動的に記録するために、フィールドの列のプロパティで規定値を設定し、INSTEAD OF INSERTトリガを利用する」では、テーブルのフィールドに「作成日」のフィールドを作り、データの生成日と時間を自動的に記録する方法を説明した。データの生成日と時間をサーバー側で記録するには、フィールドのプロパティに既定値を設定する方法と、INSTEAD OF INSERTトリガで強制的にデータを与える方法があった。では、既に生成しているデータの「更新日」をSQL Server側で自動的に記録するにはどうすればよいだろう。これもテーブルに「トリガ」を設定することで実現できるが、少し工夫が必要だ。

まず次のようなテーブルを作ろう。

——————————————————

フィールド名 データ型 備考
ID int 主キー、IDENTITY(はい)、シード(1)、増分(1)
データ int
作成日 datetime
更新日 datetime

——————————————————

SQLSV_blog_update_datetime_001_mid_640

<Fig.1 : サンプルの「テスト」テーブルを作る>

テーブルができたら、いくつかサンプルのデータを作っておこう。

SQLSV_blog_update_datetime_003_mid_640

<Fig.2 : 「テスト」テーブルにサンプルのデータを作っておく>

次に、この「テスト」テーブルに次のクエリでAFTER UPDATEトリガを設定する。

——————————————————

CREATE trigger trig_02 on テスト after update

as

update テスト set 更新日 = getdate() where ID = (select ID from inserted)

——————————————————

SQLSV_blog_update_datetime_002_mid_640

<Fig.3 : 「テスト」テーブルにトリガを設定する>

SQLSV_blog_update_datetime_004_mid_640

<FIg.4 : 「テスト」テーブルにトリガを設定した>

このトリガは、「テスト」テーブルにUPDATE文が発行されたとき、変更されたデータが入っている「inserted」一時テーブルのIDを調べ、そのIDと同じIDのデータに対して「更新日」のフィールド値を gerdate() 関数で現在の日付と時間を取得して更新するというものだ。

では、このトリガを設定した「テスト」テーブルのデータを更新してみよう。次のクエリを試してみる。

——————————————————

UPDATE テスト SET データ = 101 where データ = 100

——————————————————

SQLSV_blog_update_datetime_005_mid_640

<Fig.5 : トリガを設定した「テスト」テーブルに UPDATE 文を実行する>

UPDATE 文は1件のデータを更新するものだが、処理結果のメッセージが2行表示されている。トリガが動いたのだ。ではテーブルのデータを確認してみよう。

SQLSV_blog_update_datetime_006_mid_640

<Fig.6 : データを更新した「テスト」テーブルのデータを確認する>

トリガによって「更新日」のデータが自動的に記録されたことがわかる。だが、実はこのトリガには問題がある。試しに、次のクエリを実行してみよう。このクエリでは、データが 800 のデータを更新しているが、サンプルデータには 800 のデータが2件あるのだ。

——————————————————

UPDATE テスト SET データ = 801 where データ = 800

——————————————————

SQLSV_blog_update_datetime_007_mid_640

<Fig.7 : 「テスト」テーブルの2件のデータを更新しようとしてエラーになった>

トリガに設定した UPDATE 文はサブクエリだ。サブクエリでは複数の値を処理することができない。これでは困るので、トリガを変更する。変更するには、テーブルを展開してトリガを表示し、右クリックで「変更」をクリックする。

SQLSV_blog_update_datetime_010_mid_640

<Fig.8 : 「テスト」テーブルに設定したトリガを変更する>

——————————————————

update テスト set 更新日 = getdate() where ID in (select ID from inserted)

——————————————————

= でつないだサブクエリを in 句に変更するのだ。

SQLSV_blog_update_datetime_011_mid_640

<Fig.9 : トリガのサブクエリを in 句に変更する>

変更できたら、もういちどデータを2件変更する UPDATE 文を実行してみよう。うまくいくはずだ。

SQLSV_blog_update_datetime_012_mid_640

<Fig.10 : データを2件変更する UPDATE 文を実行する>

変更したデータを確認しよう。

SQLSV_blog_update_datetime_013_mid_640

<Fig.10 : UPDATE 文を変更したテーブルを確認する>

このように更新日の日付と時間をサーバー側で自動的に記録するには、テーブルにトリガを設定すればよい。そのとき、変更をうけたデータを絞り込むにサブクエリではなくて in 句を利用する。サブクエリでは複数のデータを更新する UPDATE 文でエラーがおこるためだ。

神戸SQL Server Users GroupのSQL Serverセミナー(初級1)を実施した

leave a comment »

校務の情報化にはデータベースの知識と技術が必要なことから、SQL Serverを勉強するコミュニティを作った。とりわけ今年度から指導要録のデータベース化が一歩前進することから、各学校の担当者はデータベース化に取り組まざるを得ないはずだ。

神戸SQL Server Users Group
http://kobesqlserverusersgroup.wordpress.com/

昨日、2013年11月9日(土)には神戸SQL Server Users Groupと特定非営利活動法人 情報技術相互支援協会の共催で、SQL Serverセミナー(初級1)を開催した。

このSQL Serverセミナーでは、SQL Serverの初心者がSQL Serverの基礎を学び、データベースを使ったシステムを作り運用することができるようにすることを目標としている。1回のトレーニングを90分とし、初級講座を1、2と分けて企画した。初級1ではSQL Management Studioの使い方、テーブル作成、データベースダイアグラム、ビューとリレーションシップ、データの型、簡単なSQL文、を内容とした。初級2ではストアドプロシージャ、トリガ、ユーザー定義関数、データベースダイアグラム、SQLの応用、を計画している。

初級セミナーは1と2でおおよそ基本を網羅するように考えたが、やはり90分では深まりに欠ける。あらかじめ用意した初級1のプリントをひととおり網羅したが、やりたいと思っていた直積やPIVOTまで説明できなかったし、SQL文もごく基本的なものに留まった。次回は初級1.5的なセミナーとし、フォローアップを考えている。

今後もSQL Serverセミナーは神戸三宮で定期的に開催する予定だ。日程は決まり次第、神戸SQL Server Users Groupのblog http://kobesqlserverusersgroup.wordpress.com/ に公開するので、興味がある人はチェックしてほしい。

Microsoft Surface RTでWord、Excel、PowerPoint、OneNoteを使って日常的なパソコン業務のほとんどができる。

with 7 comments

このところMicrosoft Surface RTをメインに使って仕事をしているが、Microsoft Surface RTではWord、Excel、PowerPoint、OneNoteを使えるので日常的なパソコン業務のほとんどができる。また数々のパソコン用周辺機器が使えるので、パソコン環境を利用して便利になる。USBメモリやプリンタへの出力など一般的なノートパソコンと同じ環境を利用できるメリットはたいへん大きい。

「マイクロソフトが満を持して発表したSurface RTは最初にして最高のタブレットだ。キックスタンド、タイプカバー、USBポート、そしてワード、エクセル、パワーポイント、ワンノートの利用が他に比類ない。」
https://matsumotoyoshio.wordpress.com/2013/07/03/%e3%83%9e%e3%82%a4%e3%82%af%e3%83%ad%e3%82%bd%e3%83%95%e3%83%88%e3%81%8c%e6%ba%80%e3%82%92%e6%8c%81%e3%81%97%e3%81%a6%e7%99%ba%e8%a1%a8%e3%81%97%e3%81%9fsurface-rt%e3%81%af%e6%9c%80%e5%88%9d%e3%81%ab/

「Microsoft Surface RTに最適のコンテンツ保存用USB外部メモリ – 超小型で取り付けたまま持ち運んでもいい」
https://matsumotoyoshio.wordpress.com/2013/07/05/microsoft-surface-rt%e3%81%ab%e6%9c%80%e9%81%a9%e3%81%ae%e3%82%b3%e3%83%b3%e3%83%86%e3%83%b3%e3%83%84%e4%bf%9d%e5%ad%98%e7%94%a8usb%e5%a4%96%e9%83%a8%e3%83%a1%e3%83%a2%e3%83%aa-%e8%b6%85%e5%b0%8f/

「Surface RTはUSBでレーザープリンタなどが利用できる。これは大きなメリットだ。」
https://matsumotoyoshio.wordpress.com/2013/07/10/surface-rt%e3%81%afusb%e3%81%a7%e3%83%ac%e3%83%bc%e3%82%b6%e3%83%bc%e3%83%97%e3%83%aa%e3%83%b3%e3%82%bf%e3%81%aa%e3%81%a9%e3%81%8c%e5%88%a9%e7%94%a8%e3%81%a7%e3%81%8d%e3%82%8b%e3%80%82%e3%81%93/

また外部VGAモニタやHDMI出力も専用ケーブルで利用することができる。外部出力でプレゼンをすることができるのだ。

「Surface RTにSurface VGAアダプターとSurface HDデジタルAVアダプターを使い大型モニタに画面を映し出す。授業でSurfaceを利用すれば手際よくコンテンツを提示できるだろう。」
https://matsumotoyoshio.wordpress.com/2013/07/11/surface-rt%e3%81%absurface-vga%e3%82%a2%e3%83%80%e3%83%97%e3%82%bf%e3%83%bc%e3%81%a8surface-hd%e3%83%87%e3%82%b8%e3%82%bf%e3%83%abav%e3%82%a2%e3%83%80%e3%83%97%e3%82%bf%e3%83%bc%e3%82%92%e4%bd%bf/

ここで改めてSurface RTとは何か、一般的なWindows 8パソコンとの違いは何かを考えてみると、最も大きな違いは、これまで開発された市販のアプリケーションやネットで手に入るフリーソフトなどをそのままでは利用できないことだろう。たとえば俺の場合なら、パソコンでできるが現状ではSurface RTでできないことは、画像編集、サウンドとビデオの編集、そしてプログラミングだ。

しかし冷静に考えてみると、いったいこれらの作業をどの程度やっているかといえば、俺は職業デザイナーでもプログラマーでもないので、月に難度かする、という程度だ。日々行うのは、電子メール、Webでの検索、デジカメで撮った写真を見る、FacebookなどSNSの利用、電子ブックの読書、Wordによる文書作成と閲覧、Excelでの表計算と閲覧、PowerPointのプレゼン作成と閲覧、これでほぼ網羅する。仕事における業務でも、個人の利用でも同じだ。

結局、これまでの一般的なパソコンを使わなければならない場面というのは、極端に減っているのだ。しかしSurface RTまでは違った。Surface RT以前のタブレットには不可能なことがあまりにも多かった。仕事で使えない最も決定的な理由は、Word、Excel、PowerPointなどのOfficeアプリケーションが使えないことだ。それ以外にも、印刷することが難しい、USBなどの汎用インタフェースがない、パソコン用の周辺機器が使えない、などの制約が大きすぎた。

Surface RTは、いわば町乗りの自家用車だ。家族で遠方に旅行に出かけるにはワゴン車など大型の車がいいかもしれないし、山道をがんがん上るにはランドクルーザーなど四輪駆動がいいかもしれない。制限速度のないレース場でぶっとばすにはスポーツカーに乗るかも知れない。しかし、ちょっと近くのスーパーに買い物に行くには小型車できれば軽自動車がいいに決まっている。高級パソコンとSurface RTを比較するのは、ワゴン車や四駆、スポーツカーと町乗りの自家用車を比べることと同じで意味がない。

車に例えれば、Surface RT以前のタブレットは、いわば自転車だったと言える。ちょっとした気晴らしに乗るにはいいが、車の代わりにはならない。だがSurface RTは万能ではないが日常的なマイカーに十分相当する性能を持っている。車を持つには車庫が必要だが、パソコンやタブレットは何台持っても置き場所に困ることはない。一家に一台というマイカーの時代が、一家に2台3台と持つようになったように、パソコンあるいはタブレットも用途に応じて複数を使い分ける時代だ。

Surface RTの実力は、Surface RTを使いこなしている者にはよくわかる。まだ発売されたばかりなので一般の人にはわからないことが多いだろうが、その実力が次第に知られるようになれば、爆発的に普及するだろう。

●追記 2013/07/13

Microsoft Surface RTについては、次の記事も参考にしてほしい。

「今日は日本版Microsoft Surface Proの発売日」
https://matsumotoyoshio.wordpress.com/2013/06/07/%e4%bb%8a%e6%97%a5%e3%81%af%e6%97%a5%e6%9c%ac%e7%89%88microsoft-surface-pro%e3%81%ae%e7%99%ba%e5%a3%b2%e6%97%a5/

「Microsoft SurfaceのUSBポートにパソコン用のキーボードを接続して使う。専用のタッチカバーやタイプカバーに不満を感じたら市販のキーボードを選んで使おう。」
https://matsumotoyoshio.wordpress.com/2013/07/13/microsoft-surface%e3%81%aeusb%e3%83%9d%e3%83%bc%e3%83%88%e3%81%ab%e3%83%91%e3%82%bd%e3%82%b3%e3%83%b3%e7%94%a8%e3%81%ae%e3%82%ad%e3%83%bc%e3%83%9c%e3%83%bc%e3%83%89%e3%82%92%e6%8e%a5%e7%b6%9a%e3%81%97/

Written by Yoshio Matsumoto

2013年7月13日 at 1:32 PM