‘プログラミング’ カテゴリーのアーカイブ
Windows Phoneアプリ開発 – たった4行でできるBing Mapの利用
Windows Phone開発用のMicrosoft Visual Studio 2010 Express for Windows PhoneでBing Mapを利用するアプリを作っているところだ。PC上のシミュレーターで作ったプログラムの動作確認をしている。
「作ったプログラム」と書いたが、実際はたった4行しかコードを書いていない。
1.BingMapsTaskのインスタンス変数を定義する
2.new演算子でインスタンスを生成する
3.GeoCoordinateクラスを生成しBingMapsTaskのインスタンスに割り当てる
4.BingMapTaskインスタンスをShowメソッドで表示する
これだけで画面タッチに対応したズーム機能のある地図アプリケーションができる。実に簡単だ。
Windows Phoneプログラミングの魅力のひとつに豊富なオブジェクトが利用できることがある。BingMapの利用はその典型的なものといえる。
と書いていて忘れていた。usingステートメントで名前空間の指定をしなければいけないので、実際は6行のコードである。
5.Microsoft.Phone.Tasks名前空間の指定
6.System.Device.Location名前空間の指定
SQL Server – 「基準値」テーブルでコードを一括管理する
SQL Serverによるシステムがある程度になると、いろいろな処理をするためのコードを効率よく処理することが必要になる。学校の場合は、たとえば「教科科目コード」や「時限コード」のような時間割に関するコード、「在籍コード」や「異動コード」など生徒の在籍状態に関するコード、などだ。
これらのコードをシステム上どのようにして処理するかだが、単純に考えると「教科科目コード」や「時限コード」といった名前のテーブルを作りコードを記録することだが、それぞれのコードに対してテーブルを作ると、テーブルの数が増えてシステム全体の見通しが悪くなる。ちなみに、このようにテーブルを作る場合でも、テーブル名は「コード教科科目」や「コード時限」のように「コード」といった共通の名前を前にするとテーブル名を一覧表示したときに見通しがよくなる。もちろん「C_教科科目コード」や「C_時限コード」のようにシンボリックな文字を前につけてもよい。
システムが大きくなると、このようなコードを記録する必要も大きくなる。そこでコードを一括して「基準値」テーブルにストアして管理する方法がよい。そのためにコードはすべて二桁の文字char(2)か、または日付smalldatetimeと統一し、次のようなテーブルを作る。
——————————————————————————-
テーブル名:基準値
フィールド:
基準値管理番号 int IDENTITY(1,1) NOT NULL
基準分類 varchar(50)
基準内容 varchar(50)
基準値 char(2)
基準日 smalldatetime
表示順 int
——————————————————————————-
このテーブルで、「基準分類」によってコードの分類をし、コードの内容は「基準内容」に記述する。たとえば次のようにデータをストアする。
——————————————————————————-
基準分類 基準内容 基準値 基準日 表示順
性別 男 01 NULL 1
性別 女 02 NULL 2
異動 入学 01 NULL 1
異動 休学 02 NULL 2
異動 復学 03 NULL 3
異動 留学 04 NULL 4
異動 転学 05 NULL 5
異動 退学 06 NULL 6
異動 卒業 07 NULL 7
教科 国語 01 NULL 1
教科 地歴 02 NULL 2
教科 数学 03 NULL 3
教科 理科 04 NULL 4
教科 保健体育 05 NULL 5
教科 芸術 06 NULL 6
教科 外国語 07 NULL 7
教科 家庭 08 NULL 8
教科 情報 09 NULL 9
教科 商業 10 NULL 10
日程 前期開始日 NULL 2011/04/01 1
日程 前期終了日 NULL 2011/09/30 2
日程 後期開始日 NULL 2011/10/01 3
日程 後期終了日 NULL 2012/03/31 4
——————————————————————————-
この「基準値」テーブルを使って必要なコードを取得する。たとえば「性別」のコードを使うときは、
select 基準内容,基準値 from 基準値 where 基準分類=’性別’ order by 表示順
といったクエリを使う。これを「v_性別コード」のようなビューにしておくのもよいだろう。
「日程」データを取得するには、
select 基準内容,基準日 from 基準値 where 基準分類 = ‘日程’ order by 表示順
とする。
このように、コードを一元管理することで「あのコードを格納したのはなんというテーブルだったっけ」というように探し出す必要がなくなるのだ。
SQL Server – ストアドプロシージャの雛形を作成した
SQL Serverでストアドプロシージャを作成する時間が多くなった。管理のための作業をストアドプロシージャにする作業が多くなったからだ。そこで新しいストアドプロシージャを作るときに、雛形となるものを作ってみた。
このストアドプロシージャでは、引数として「対象」と「年度」を設定している。もちろん引数の意味を変更することや増やすことも可能だ。また処理の履歴を「処理記録」テーブルにストアすることにしている。そのとき、システムから「年度コード」、「日付」、「処理者」を取得し、パラメーターとして一緒にストアしている。これにより処理の履歴を追跡しやすくしている。参考になれば幸いである。
———————————————————————————————————————————-
create procedure ストアドプロシージャ雛形
@P_対象 as varchar(50),
@P_年度 as char(2)
as
/*
使い方
<実行例> execute ストアドプロシージャ雛形 ‘男性’,’10′
*/
–処理定数の取得
declare @今年度 as char(2)
declare @日付時間 as smalldatetime
declare @処理者 as varchar(50)
set @今年度 = (select nendo_cd from const_nendo where now_cd = 1)
set @日付時間 = getdate()
set @処理者 = substring(suser_sname(),6,6)
–実際の処理
if @P_対象 = ‘男性’
begin
insert into 処理記録(日付,職員番号,備考)
values (@日付時間,@処理者,’「ストアドプロシージャ雛形」を実行した。引数は、’ + ‘引数1(対象):’ + @P_対象
+ ‘ 引数2(年度):’ + @P_年度 + ‘ 今年度 :’ + @今年度)
end
if @P_対象 = ‘女性’
begin
insert into 処理記録(日付,職員番号,備考)
values (@日付時間,@処理者,’「ストアドプロシージャ雛形」を実行した。引数は、’ + ‘引数1(対象):’ + @P_対象
+ ‘ 引数2(年度):’ + @P_年度 + ‘ 今年度 :’ + @今年度)
end
———————————————————————————————————————————-
Microsoft Expression Studioの1、2、3、4を振り返る。
<Fig.1 – Microsoft Expression Studioの初期バージョンから4までのパッケージ>
Microsoft Expressin Studioが世に現れたのは2007年7月13日、Microsoft Expression Studio 2の発売は2008年8月7月18日、Microsoft Expression Studio 3の発売が2009年11月6日、そして満を持して発売されたMicrosoft Expression Studio 4 Ultimateの発売は2010年9月3日だった。ほぼ一年ごとに新しいバージョンが出るというスケジュールでバージョン4まで進化し、Microsoft Expressionは充実した開発ツールになった。
Expression Studioは2と3の間で大きな変化がある。それは表面的には次のように現れている。
・1と2は硬質プラスチック製のパッケージだが、3と4は軟質樹脂製のパッケージを紙パッケージでくるんだものだ。
・1と2にはVisual Studioが同梱されているが、3と4にVisual Studioはついていない。
・1と2にはExpression Mediaがあったが、3と4にはない。
・1と2はインストールの途中でインストールキーを要求されないが、3と4ではインストールキーが必要だ。
・1と2ではExpression Webのインストールキーが別に与えられているが、3と4では統一されている。
Visual Studioを代表とするマイクロソフトの開発ツールのパッケージは従来はとても大きかった。紙媒体のマニュアルも同梱していたためもあるが、価格にふさわしい風格を持たせたい、という意図も大いに感じられた。パッケージの大きさ、重さにある種の感動と満足を感じたりしたものだったが、近年のパッケージはどれも簡素になる方向性がある。Expression Studioも直近のパッケージはとても好感がもてるものだ。
あらためてこれらExpression Studioを初期バージョンからPCにインストールし、Expression Blendで新しいプロジェクトを作った画面をキャプチャした。この画面を見ただけでもツールの進化がうかがえるはずだ。
<Fig.2 – Microsoft Expression Blend初期バージョンの画面>
<Fig.3 – Microsoft Expression Blend 2の画面>
<Fig.4 – Microsoft Expression Blend 3の画面>
<Fig.5 – Microsoft Expression Blend 4の画面>
Microsoft Expression Studioは、Webページデザインの「Microsoft Expression Web」、XAMLベースのベクトル形式デザインツール「Microsoft Expression Design」、音声や映像データを編集する「Microsoft Expression Encorder」、そして開発ツールの「Microsoft Expression Blend」をひとつのパッケージにした製品だが、この中で最も中核に位置づけられるものが「Microsoft Expression Blend」だ。
Microsoft Expression Blendは初期バージョンから4までの間にずいぶん進化した。特に2から3への進化は劇的であったが、3から4への進化も重要な点がある。少なくとも3までは、プログラムのためにVisual Studioを併用せざるを得ないところがかなりあったが、4ではほとんどVisual Studioを使わずにExpression Blendだけで多くの作業が完結するまでに仕上げられている。
Windows Phone 7の話題も身近に聞こえてきて、ますますExpressionから目が離せない。
SQL Serverのユーザー定義関数を使おう~(11)任意の日における生徒の年齢を知るユーザー定義関数
生徒の年齢を知りたい場合がある。それも任意の日における年齢を知る必要がある。というのも、学校における各種統計において、「その日の年齢」であったり「ある基準日における年齢」であったり、年齢を算出する基準日が異なるためだ。これに対応するユーザー定義関数を作ってみた。
生徒は学籍番号で管理されており、「生徒」テーブルに生年月日が保存されている。この生年月日から年齢を算出するユーザー定義関数だ。
使い方はこうだ。
select dbo.fx生徒年齢(学籍番号,基準日)
たとえば2010年4月1日における学籍番号0101001の生徒の年齢を知るには、実際にはこんなかんじ。
select dbo.fx生徒年齢(’0101001′,’2010/04/01′)
——————(ここからユーザー定義関数)——————
create function [dbo].[fx生徒年齢]
(
@p_学籍番号 char(7),
@p_基準日 smalldatetime
)
returns int
AS
begin
declare @判定 int
declare @生年月日 smalldatetime
set @生年月日 = (select 生年月日 from 生徒 where 学籍番号 = @p_学籍番号)
set @判定 = datediff(dd
,cast(’2000/’+cast(month(@生年月日) as varchar(2))+’/'+cast(day(@生年月日) as varchar(2)) as smalldatetime)
,cast(’2000/’+cast(month(@p_基準日) as varchar(2))+’/'+cast(day(@p_基準日) as varchar(2))as smalldatetime))
return (select case when @判定 < 0 then datediff(yy,@生年月日,@p_基準日)-1
when @判定 >= 0 then datediff(yy,@生年月日,@p_基準日) end)
return null
end
——————(ここまでユーザー定義関数)——————
SQL Serverのユーザー定義関数を使おう~(10)月曜から始まる年度週番号ユーザー定義関数
以前、「年度週番号」を返すT-SQLのユーザー定義関数を作ったことを書いた。ある日付が、その年度の何週目にあたるかを求める必要があったからだ。以前に書いたユーザー定義関数はこのようなものだった。
———————-(ここから)———————-
create function fx年度週番号
(
@p_日付 datetime
)
returns int
as
begin
declare @thisyear41 datetime
declare @overyear41 datetime
set @thisyear41 = cast(cast(datepart(year,@p_日付) as varchar) + ‘/’ +’4/1′ as datetime)
set @overyear41 = cast(cast(datepart(year,@p_日付)-1 as varchar) + ‘/’ +’4/1′ as datetime)
if @p_日付 > @thisyear41
begin
return datediff(week,@thisyear41,@p_日付)+1
end
if @p_日付 < @thisyear41
begin
return datediff(week,@overyear41,@p_日付)+1
end
if @p_日付 = @thisyear41
begin
return 1
end
return null
end
———————-(ここまで)———————-
引数にする日付の年の4月1日を求め、日付が4月1日よりも後だったらその日付は4月1日から12月31日までであり、4月1日よりも前だったら年が変わっているので1月1日から3月31日までであると判定し、週の番号を求める仕組みだった。
このユーザー定義関数では、日曜日が週の最初に来る値を返す。しかし欲しかったのは日曜日が週の最後に来る値を返すユーザー定義関数だった。そこでこのユーザー定義関数を修正し、月曜で始まる週として年度週番号を返すユーザー定義関数に変更した。変更は力技的であり、日付が日曜ならば年度週番号を1マイナスする、という仕組みにした。
———————-(ここから)———————-
create function fx年度週番号
(
@p_日付 datetime
)
returns int
as
/*
日曜はじまりの年度週番号を返すように変更
*/
begin
declare @thisyear41 datetime
declare @overyear41 datetime
set @thisyear41 = cast(cast(datepart(year,@p_日付) as varchar) + ‘/’ +’4/1′ as datetime)
set @overyear41 = cast(cast(datepart(year,@p_日付)-1 as varchar) + ‘/’ +’4/1′ as datetime)
declare @sunday_minus int
set @sunday_minus = 0
if datepart(weekday,@p_日付) = 1
set @sunday_minus = 1
if @p_日付 > @thisyear41
begin
return datediff(week,@thisyear41,@p_日付)+1-@sunday_minus
end
if @p_日付 < @thisyear41
begin
return datediff(week,@overyear41,@p_日付)+1-@sunday_minus
end
if @p_日付 = @thisyear41
begin
return 1
end
return null
end
———————-(ここまで)———————-
アドミンティーチャーズ第6回(大阪)勉強会は2011年2月19日開催
東京の勉強会に続いて大阪でも勉強会をする。東京の勉強会のテーマはデータベースにポイントを絞ったが、大阪の勉強会では広く「教育の情報化」をテーマにした。
今回の勉強会は講師陣がスペシャルである。
まず、昨年末に満を持して発売された、シャープのメディア情報端末「ガラパゴス GALAPAGOS」について、シャープの方より技術的な話をうかがう。昨年度はいわば「電子書籍元年」だと言えるが、シャープのガラパゴスは電子書籍はもちろん、メディアサービスと連携し、ビデオや音楽も再生できる端末だ。今後はこのようなPCではない情報端末も普及することが予想され、その活用は学校現場でも求められるだろう。
そして現在兵庫県立須磨東高等学校に勤務される、仲正博先生をお迎えして、長年開発を続けてこられた「IKシステム」についての話をしていただく。IKシステムは仲先生が兵庫県立伊川谷北高等学校に勤務されていた1993年に、学校で統一的に成績処理をするシステムが必要とされて開発され、以降、全日制普通高校の標準的な仕様を確立されて一般公開し、現在数多くの学校で利用されている校務処理システムだ。仲先生からこのIKシステムの歴史や開発の理念などを語っていただく。
そして実際に学校現場で、情報システムの運用管理がどのようになされていて、どんな問題があるのか、うまくいっているコツはなにか、などを、現場の担当者からレポートしていただきディスカッションする。参加者の方も積極的に参加していただければと思う。
私からは東京勉強会と同じ内容の、InfoPathとAccessを使った教務システムの構築デモを演示する。全日制普通高校の成績処理を念頭におき、フルスクラッチで50分の時間でどれだけできるかをお見せする。この勉強会で使うデモは、持ち帰ってご自分でもやってみることができるようにテキスト形式のものを用意するので、勉強会では、だいたいどのような感じで作ることができるのか、を把握していただくことを目標にする。
勉強会は参加費無料、定員40名。場所はマイクロソフト関西支店セミナールームだ。学校の先生だけでなく、教育の情報化に興味のある方なら大歓迎だ。申し込みはアドミンティーチャーズWebサイトから電子メールで受け付けている。
アドミンティーチャーズWeb
http://adminteachers.wordpress.com/
第6回勉強会(大阪)の詳細ページ
エクセルのマクロで図形を操作する(4) – オートシェイプを消去する
ではエクセルのシートに作ったオートシェイプを消去するにはどうすればいいだろうか。オートシェイプを削除するには、deleteメソッドが使えるはずだ。試しに次の2つのマクロを作ってみよう。
————————————————————————
Sub smaile()
ActiveSheet.Shapes.AddShape msoShapeSmileyFace, 10, 20, 100, 100
ActiveSheet.Shapes.AddShape msoShapeSmileyFace, 120, 20, 100, 100
End Sub
————————————————————————
Sub delete()
Sheet1.Shapes(1).delete
Sheet1.Shapes(2).delete
End Sub
————————————————————————
最初のマクロでは、スマイルのオートシェイプを2つ作っている。これら2つのオートシェイプはそれぞれShapes(1)とShapes(2)という番号で管理されている。そして次のマクロでは、そのShapes(1)とShapes(2)に対して消去のDeleteメソッドを実行している。だが残念ながらこのマクロは、消去するときにエラーになる。ひとつめのシェイプを消去した後「指定したコレクションに対するインデックスが境界を越えています。」というメッセージが出るはずだ。なぜかといえば、Shapes(1)を消去したときに、自動的にShapes(2)がShapes(1)になってしまうからだ。そこで消去する順番は、まず数字の大きいShapes(2)を消去し、その次にShapes(1)を消去する、というようにすればいい。次のマクロは正しく動くだろう。
————————————————————————
Sub smaile()
ActiveSheet.Shapes.AddShape msoShapeSmileyFace, 10, 20, 100, 100
ActiveSheet.Shapes.AddShape msoShapeSmileyFace, 120, 20, 100, 100
End Sub
————————————————————————
Sub delete()
Sheet1.Shapes(2).delete
Sheet1.Shapes(1).delete
End Sub
————————————————————————
あるいは次のように、Shapes(1)を二回消去する、というようにしてもうまく消去できる。
————————————————————————
Sub smaile()
ActiveSheet.Shapes.AddShape msoShapeSmileyFace, 10, 20, 100, 100
ActiveSheet.Shapes.AddShape msoShapeSmileyFace, 120, 20, 100, 100
End Sub
————————————————————————
Sub delete()
Sheet1.Shapes(1).delete
Sheet1.Shapes(1).delete
End Sub
————————————————————————
エクセルのマクロで図形を操作する(3) – オートシェイプに名前をつける
エクセルのシート上に作成したオートシェイプは番号がついているが、番号ではなく、オートシェイプに名前を付けて区別することもできる。例えばこんな具合だ。
Sub smaile()
ActiveSheet.Shapes.AddShape msoShapeSmileyFace, 10, 20, 100, 100
ActiveSheet.Shapes.AddShape msoShapeSmileyFace, 120, 20, 100, 100
ActiveSheet.Shapes(1).Name = “taro”
ActiveSheet.Shapes(2).Name = “hanako”
Sheet1.Shapes(“taro”).IncrementRotation (-20)
Sheet1.Shapes(“hanako”).IncrementRotation (20)
Sheet1.Shapes(“taro”).Adjustments.Item(1) = 0.5
Sheet1.Shapes(“hanako”).Width = 160
Sheet1.Shapes(“hanako”).Height = 160
End Sub
(Fig.1 オートシェイプを2つ作成し名前を付けて角度や変形、大きさを変えた)
ここでは作成した2つのオートシェイプに「taro」と「hanako」という名前をつけている。「taro」に操作をするときはShapes(“taro”)、「hanako」に操作をするときはShapes(“hanako”)と記述して区別できる。ここでは「taro」を左に20度(つまり右に-20度)回転、変形を0.5、「hanako」は右に20度回転、幅と高さを160に拡大している。
エクセルのマクロで図形を操作する(2) – 作成したオートシェイプには番号がついている
エクセルのシート上に作成されたオートシェイプは連番で管理されている。たとえば次のようなマクロを作って実行する。結果はこんな具合だ。
Sub smaile()
ActiveSheet.Shapes.AddShape msoShapeSmileyFace, 10, 20, 100, 100
ActiveSheet.Shapes.AddShape msoShapeSmileyFace, 120, 20, 100, 100
Sheet1.Shapes(1).IncrementRotation (-10)
Sheet1.Shapes(2).IncrementRotation (10)
Sheet1.Shapes(1).Adjustments.Item(1) = 0.5
End Sub
ここでは2つのオートシェイプを作っているが、それぞれ作成された順番でShapes(1)、Shapes(2)という連番で管理されている。最初に作成したオートシェイプは図の左側のもので、こちらはShapes(1)、次に作成したオートシェイプが右側で、Shapes(2)である。Shapes(1)を左に10度(つまりマイナス10度)回転させ、Shapes(2)を右に10度回転させる、そして右側のShapes(1)については、Adjustment.Itemの値を変えて変形している。



