Program: 2009年9月アーカイブ
配列データの参照(javascript / template toolkit)
今月は直近の大きな提携に向けて、ひたすらコピペプログラミングしてます。
さすがにコピペのみだと対応しきれない部分が多すぎるので日々勉強してますが、まだまだ初心者。
とりあえず今日書いたコードのおさらい。
とある配列データを取得して、ランダムで抽選した6つの配列要素を、テーブルを使って2列3行にデータを並べるプログラムを、JavaScriptとPerlのtemplate toolkitを使って二種類書きました。
配列の参照方法と、while分の中でのif分を使った条件分岐辺りがおさらいポイントです。
簡単なプログラムですが、まだまだ悩みますねぇ。
脱コピペプログラマ。
■JavaScript版
<script type="text/javascript">
<!--
var hogedata = getJSONData('http://domain.com/html/hoge.js');
// 配列hogedataに、hoge.jsのデータを流し込む
var cnt = 6;
// 変数cntを宣言し、繰り返し回数6をセット
var rnd = Math.floor(Math.random() * hogedata.length);
// 変数rndを宣言し、hogedataの要素数を上限として、乱数を発生
// floor関数で小数点以下を切り捨てて、変数rndに代入
if(rnd > hogedata.length - cnt){
rnd = hogedata.length - cnt;
}
// 変数rndに代入された数値が、hogedataの要素数-6より大きい場合は、hogedataの要素数のマイナス6の数値をrndに代入
// 最後の6つの要素を参照する
h = '<table>';
h += '<tr>';
var i = rnd;
// 配列参照用の変数iを宣言、rndの値を代入
var c = 1;
// 変数cを宣言、1を代入
while(i <= rnd + cnt - 1){
// iが、乱数rndから1を引いた数に、繰り返し回数cnt6以上になるまで、以下の処理を繰り返す
// -1 は、配列要素の1番目が0番であるための処理
if(c == 3){
// もし変数cが3の場合は、trを追加し、変数cを1に初期化
c = 1;
h += '<tr>';
}
h += '<td width="168" valign="top" style="line-height:140%">';
h += '<a href="' + hogedata[i].url + target="_blank">';
// 配列hogedataの要素番号[i]のurlデータを表示
h += '<span class="title">' + hogedata[i].name + '</span><br>';
h += '<img width="75" height="75" border="0" src="' + hogedata[i].imageurl + '"><br> ';
h += '<span class="address">' + hogedata[i].address + '<br>';
h += '</span>';
h += '</a>';
h += '<br></td>';
c == 2 ? '</tr>' : '';
// 変数cが2の場合に、trを閉じる
c++;
i++;
//変数cとiをインクリメントし、処理を繰り返す
}
h += '</table>';
document.write(h);
//-->
</script>
JavaScriptはhtmlを書くのに直接書けないのでコードがぐちゃぐちゃ見えて嫌ですね。
初心者はこれだけで嫌悪感を感じてしまいます。
■template toolkit版
[% USE hogedata = HOGE('/var/www/domain.com/html/js/hoge.js') -%]
// 配列hogedataにjsのデータを流し込む
[% cnt = 6 -%]
// 変数cntを宣言、初期値6をセット
[% USE rnd = RAND(hogedata.size) -%]
// 変数rndを宣言、hogedataの配列の要素数の中から、ランダムで要素数を上限とした整数を初期値としてセッット。
// template toolkitでは、RANDで整数が返されるようで、jsみたいな小数点以下切り捨て処理は不要みたい。便利!
[% IF hogedata.size - cnt < rnd -%][% rnd = hogedata.size - cnt -%][% END -%]
// hogedataの要素数から、cnt(4)を引いたものが、rnd(ランダム整数)より小さい場合、rndには配列要素上限からcnt(4)を引いた数を代入
<table><tr>
[% c = 1 -%]
// 変数cを宣言、初期値1をセット
[% FOREACH i IN hogedata -%]
// 変数iを宣言、hogedataの配列を代入し、繰り返し処理を開始
[% NEXT IF loop.count <= rnd -%]
// ⑦変数rndまでroopをスキップ
[% IF c == 3 -%]<tr>[% c = 1 -%][% END -%]
// 変数cが3の場合、<tr>を記述し、変数cを1に初期化
<td width="168" valign="top" style="line-height:140%"> <a href="[% i.url %]" target="_blank" style="text-decoration:none;">
<span class="title">[% iname -%]</span><br>
<img border="0" src="[% i.imageurl -%]&w=70&h=70&auto_offset=1&size_img=0&zoom_in=0"><br>
<span class="address">
[% IF i.entry -%]<a href="http://www.domain.com/thread/[% i.entry.-1 -%]">掲示板を見る</a>
[% ELSE -%]<a href="http://www.domain.com/thread/id=[% i.id -%]">評判を聞く</a>[% END -%]
<br><br></td>
[% (c == 2) ? '</tr>' : '' -%]
// ⑨変数cが2の場合、trを閉じる、そうでない場合は、何もせずに次の処理を行う
[% c = c + 1 -%]
// ⑩変数cに数値1を追加
[% LAST IF loop.count >= rnd + cnt -%]
// ⑪loop.countが、変数rndと変数cnt(4)の合計以上になった場合に処理を終える
template toolkitは非常に分かりやすい。
コードもシンプルで見やすいですね。
日本語のドキュメントがほとんどないのが難です。
データベースの論理設計 ER図を書こう
今進めているプロジェクトでは、業務システムの設計を担当しております。
システムの設計といっても幅広いわけですが、要件定義から外部設計、データベースの概念設計とか、割と上流工程まではお手の物なのですが、そこからさらに進むとチンプンカンプンです。
な状態なのですが、今回データベースの論理設計まで自分でやることになっていまして、もちろん初チャレンジなわけなのですが、当然、ある程度しっかりと勉強しないと着手するのもままならないといった状態。
その状態のまま、なかなかガッツリ時間を取れるタイミングがなく(言い訳)、かなり長期間ベンディングしちゃっていましたが、どうにもこうにも自分が動かないとプロジェクトが進まない局面に差し掛かってきましたので(というのと、物理的に時間の余裕も出てきまして)、とりあえず前に進めねばと、ER図の書き方を調べました。初歩の初歩。
ということで、Part4 初めてのデータベース設計の内容のうち、ER図についてのルールや基礎知識について、忘れないようにまとめます。
以下、もっとも普及しているらしいIDEF1XというものでER図を書くルール。
ER図の基本的な考え方
- モデリングする対象をエンティティ(実態)と、エンティティ間のリレーションシップ(関連)で表すということ
たとえば具体的には
- 「A」というエンティティは、属性として、「い」、「ろ」、「は」を持つ
- これらの属性のうち、「A」を特定できる属性を主キーと呼ぶ
- 主キー以外の属性を非キーと呼ぶ
ER図の書き方
- ER図では、エンティティを四角形で表し、主キーを四角形の上段に、非キーを下段に書く
FOREIGN KEY
- あるエンティティの属性のうち、他のエンティティの主キーになっているものを、外部キーと呼び、属性の後ろにFK(foreign key)を表示する
リレーションシップについて
- 特定のエンティティとエンティティが、1対nの関係になっている場合、四角を線で結び、n側のエンティティの線に黒丸をつける
- また、あるエンティティ「A」に外部キーが存在する場合、その外部キーを主keyとするエンティティ「B」を親エンティティ、エンティティAを子エンティティと呼ぶ
リレーションシップの分岐について
- 黒丸の横に指定がない場合:1対0以上(0人があり得る)
- 黒丸の横にPがある場合:1対1以上(常に1以上)
- 黒丸の横にZがある場合:1対0または1(0もしくは1)
- 黒丸の横に数字がある場合:1対nの「n」が決まっている
- ひし形:0または1対n?の場合の0を表す(非依存関係に対してのみ指定できる)
リレーションシップとエンティティの種類
- 四角の角が丸くなっているもの:従属エンティティ(依存エンティティ)と呼ぶ)
その他のルール、呼び名
- 従属エンティティは、親エンティティなしでは存在できない
- ほかのエンティティに依存しないエンティティを独立エンティティと呼ぶ
- 立エンティティに対するリレーションシップは破線で表示し、非依存リレーションシップと呼ぶ
エンンティティの種類
- エンティティは実体という意味ですがもう少し具体的に言えば二種類に分けられる
- リソース・エンティティ(業務を遂行するために必要な人,物,お金などのリソース)
- イベント・エンティティ(企業活動を構成するアクティビティです。業務フローを描いたときに現れる処理単位や,システム概念図に現れる)
以上、簡単にまとめでした。
ここからの具体的な書き方や詳細は以下をご参照ください。
2011.2.25 追記 以下、その後勉強してみた関連するお勧め書籍のご紹介です。ご参考までに。