PSI Labs RSS feed

[設計]SQL設計書の書き方(続き)

こんにちは。shintaniです。

前回のSQL設計書(データ取得図)の記事 の続きです。

今回はGROUP BYやソート順の書き方、そしてインラインビューを使う場合と、書くときのポイントを説明します。




まずはGROUP BY とソート順。
(前回の紹介では書き忘れていました・・・)

SQL設計書01.JPG




ソート順とグループ化項目の位置に違和感を覚える方もいるでしょう。
しかしソート順は図に書いた理由の他にも「SELECT項目がどう並ぶか?」という観点から、SELECT句のそばにあった方が分かりやすいです。
そしてグループ化項目は「テーブル結合後にどう集約するか?」なので、図の下にあった方が分かりやすいです。



次は インラインビュー。



SQL設計書02.JPG


こんな感じになります。
(インラインビューにしなくても出来る・・・というのは御容赦を)




書くときのポイントですが、


SELECT句はこだわらない。テーブル結合にこだわる

です。

SELECT句の部分が間違っていても後で修正は容易です。
リターンされるレコード数が増えるわけでもなく、かつ影響範囲はその列だけだからです。
(インラインビューのSELECT句だったら困るかもしれませんが・・・)
半面、使用するテーブルや結合条件に誤りがあった場合、影響は甚大です。

また、分析関数を使ったりCASE式での複雑な分岐があったりする場合、そこに大量に記述して「テーブル結合」が見辛くなってしまうことがあります。
その場合にはいっそ「列A:別紙_列Aの取得方法、を参照」などと書いて、別シートに移してしまった方が分かりやすいです。

ではでは。






[設計]SQL設計書の書き方

お久しぶりです。shintaniです。

今回はSQLの設計書について書いてみます。
とはいっても「正しいSQLの設計書」などとおこがましいことを言うつもりはありません。
「今までより多少マシなSQLの設計書」という程度に捉えて下さい。

このような帳票があるとします。
WS000000.JPG

これに対して、下記のような詳細設計書(SQL設計書)を書いているプロジェクトが結構あるかと思います
WS000001.JPG

これでは殆どSQL自体を書いているのと変わりません。
テーブル同士の繋がりや絞り込み条件も分かり辛いです。

これに対し、下記は私が以前関わったプロジェクトで作ったSQL設計書です。
(そこでは ”データ取得図” と呼んでいました)
WS000005.JPG

これはE-R図とは異なるものです。
あくまでSQLの結合方法や条件設定などを記述したものです。
この形式のSQL設計書には以下のようなメリットがあります。

---------------------------------------------------------------------------------------

1 図として記述することで書いた当人も理解が深まる
2 テーブル結合、条件などが一目で分かる。結合条件の記述漏れもすぐに分かる。
3 画面、帳票は「ヘッダ」と「データ」部分に分かれることが多いが、それらが1対nで結ばれているかどうか分かる。
4 この形式ならばお客さんもデータ取得の方法が分かりやすい。
  「画面のデータがおかしい」という不具合が出た際、これを見せてすぐに正しいデータの取得方法が分かったことも多い。

---------------------------------------------------------------------------------------

「副問い合わせやUNION ALLとか色々あるだろう!その場合はどうするんだ!?」
という意見もあると思いますが、例えばunion allは下記のように書きました。

【UNION ALLの場合】
WS000006.JPG

ただ分析関数など図オンリーでは対応仕切れないものもあり、
その場合はテーブル結合条件だけ書いてその他は文章で記述しました。

様々なSQLについてこの形式で記述しましたが、殆どの場合で
「仕様書を記述する手間 < 実際にSQLを作成する手間」
が成り立ち、別の人がこれを元に実際のSQLを作成することが出来ました。

今も試行錯誤している途中ですが、それなりに使える設計書ではないかと思います。
参考にして頂ければ幸いです。

ではでは。



【2017/04/23 追記】

GROUP句やソート条件などの書き方について、続きの記事を書きました。
[設計]SQL設計書の書き方(続き)

よろしければこちらもご覧下さい。



PHP7.1.0からセッション設定が簡単になりました

こんにちは、tomitaです。

昨年12月に PHP-7.1.0 がリリースされました。

機能もいろいろ追加されましたが、セッション生成方法も変更され、php.ini の session 設定項目も変わりました。

削除されたsession設定項目

  • session.entropy_length
  • session.entropy_file
  • session.hash_function
  • session.hash_bits_per_character

追加されたsession設定項目

  • session.sid_length
  • session.sid_bits_per_character

session.sid_length はセッションID文字列の長さを指定します。最低32を指定しろ、とマニュアルにはあります。

session.sid_bits_per_character はセッションID文字のビット数(4,5,6 のいずれか)を指定します。マニュアルには 5(0-9、a-z)を奨励とあります。

例えば

session.sid_length = 32
session.sid_bits_per_character = 5

を設定した場合、生成されるセッションIDは以下のようになります。

bq1j0rij95ud8gi52caqvc3bcga4i5tf

以前よりも設定項目が減り、2項目を指定するだけで堅牢なセッションIDが生成できます。できればもう少しはやく実装してほしかった…

それでは~


AWSで停止・削除したインスタンスが勝手に再起動されて復活する

こんにちは。shintaniです。

年末年始でAWSを勉強してみようと思い多少進めたところで、タイトルにあるようなことで少し躓いたのでそれを記事にしてみます。


① まずはオーソドックスにチュートリアルに従って進めました。

20170109_00.jpg


② Amazon Elastic Beanstalk を利用し、インスタンスを1つ立ち上げて、サンプルPHPのWebページを表示するところまでします。
(サンプルHP画像は省略)

20170109_01.jpg


③ そして「無料枠とはいえ使わないインスタンスは停止する癖を付けましょう」
ということで停止します・・・が、勝手に復活します。

20170109_02.jpg

なおこれは「削除」をした場合も同様。
どうやっても同じインスタンスが再び起動します。

「まあいいや、無料だし」ということで放置。


④ そして後で、Google App Engine で動かしているJavaアプリを移植してみようと、
ちゃんとした名前で再びインスタンスを作成します。
(画像省略)


⑤ このインスタンスも停止すると勝手に復活します・・・

20170109_03.jpg


⑥ この状態で数日放置・・・したところ、AWSの請求アラートメールが届きました。

20170109_04.jpg

インスタンス2つは無料枠をオーバーするから金払え、とのこと。

20170109_05.jpg


⑦ 「こっちは停止したいのに勝手に復活しといて金を請求とはどんな悪徳企業・・・」と思いましたが、
ポップアップ内のリンクを辿っていったら解決方法は分かりました。

20170109_06.jpg
20170109_07.jpg
20170109_08.jpg


⑧ つまりはElastic Beanstalk を先に削除しなければならなかったようです。

これをしたら問題なく停止できました。
というかElastic Beanstalk の削除でインスタンスも連動して削除されました。

20170109_09.jpg


【おわりに】
しかし、これはインスタンス停止のところで
「先にElastic Beanstalk を停止・削除してね。でないとこっちは停止できないよ」
と出るべきではないですかね?
それじゃ何かまずいんでしょうか?

ゾンビのごとく復活されても、理由分からないです。
日本語説明あったからよかったものの、オール英語だと見つけられていたか厳しかった・・・。

というような引っ掛かりはあったものの、今後はクラウドを使うシステムが増えていくことは確実なので、
勉強は続けていこうと思います。

では、また何かありましたら。


JavaScriptのちょっとした便利機能:ConsoleオブジェクトとStorageオブジェクト

こんにちは。新谷です。

色々経験を積むと、却って新規に追加された便利機能を知らず、昔ながらの手間の掛かるやり方を使い続けたりしてしまいます。
それを避けるために時々は入門・初心者本を読むことにしています。

今回はその中で知った便利な機能2つを紹介します。
記事タイトルを見て「知ってるよジョーシキでしょ」と思った人は記事を閉じて大丈夫です m(_ _)m

※本記事は「改定新版 JavaScript本格入門 モダンスタイルによる基礎から現場での応用まで(山田祥寛著)」の内容を参考にしました

---------------------------------------------------------------

【Consoleオブジェクト】
デバックでJavaScriptの中で処理される値を確認する際、遥か昔ではalertをその時だけ入れて画面表示、
多少新しくなった後は F12で表示される開発者ツールでデバック実行+ウォッチ式、という感じで確認していました。

しかしConsoleオブジェクトを使えば、開発者ツールのコンソール部分に色々と出力することが可能です。

<html lang="ja">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<script type="text/javascript">

			function consoleOutput(){
				var testInput = document.getElementById('test_input');
				console.log('testInput:' + testInput);
				console.log('入力された値は 「'+ testInput.value + '」 です');
			}
		window.onload = function(){
				console.log('ロード完了');
		};
		</script>
	</head>
	<body>
		Colsoleテスト
		<br/>
		<input type="text" id="test_input" name="test_input"  length=10 />
		<br/>
		<input type="button" onclick="consoleOutput();" value="コンソール出力ボタン " />
		<br/>
	</body>
</html>

①上記のhtmlの初期表示は以下のようになります。

②値を入力しボタンを押下すると、F12で表示される開発者ツールのConsoleタブにこのように表示されます。

いちいちデバック実行することもなく、ましてやalertで画面表示する必要もなくなりました。

*******************************************************************************************

【Storageオブジェクト】

StorageオブジェクトとはHTML5から追加された機能で「ローカルマシンにデータを保存できる」というものです。
ローカルマシンにデータを保存する機能としては昔からクッキーがありましたが、下記のような違いがあります。
----------------------------------------------
データサイズの上限: Storageは5M、Cookieは4K
データの有効期限: Storageはなし、Cookieはあり
データ通信: Storageは発生しない、Cookieはリクエストのたびに毎回送信
----------------------------------------------

このようなことから、「元々の検索条件をStorageに保存しておき、進んだ先の画面から戻った場合に同じ条件で再検索する」
というようなことをする場合に便利です。

これまではサーバ側でsessionに保存していました。
しかし大量アクセスされるサーバではサーバ側メモリが問題になりますし、かつ保存・取得処理が結構面倒だったりします。

【注記】Google Chromeではローカルファイル上でもStorageは動作しますが、IEはサーバ上でしか動作しない模様です

<html lang="ja">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<script type="text/javascript">
			function saveStorage(){
				var storage  = localStorage;      // オリジン(スキーマ://ホスト名:ポート番号) 単位で値保持
				// var storage  = sessionStorage;    // セッション単位で値保持。ブラウザを閉じると消える。
	
				var storageKey = document.getElementById('storageKey').value;
				if(storageKey == ""){
					alert("ストレージKeyが未入力です");
					exit;
				}
				var storageValue = document.getElementById('storageValue').value;
				storage.setItem(storageKey,storageValue);
			}

			function loadStorage(){
				var storage  = localStorage;
				// var storage  = sessionStorage;
				var storageKey = document.getElementById('storageKey').value;
				if(storageKey == ""){
					alert("ストレージKeyが未入力です");
					exit;
				}

				var storageValue = storage.getItem(storageKey);
				document.getElementById('storageValue').value = storageValue;
			}
		</script>
	</head>
	<body>
		Storageテスト
		<br/>
		ストレージのKeyを入力:<input type="text" id="storageKey" name="storageKey"  length=10 />
		<br/>
		ストレージのvalueを入力<input type="text" id="storageValue" name="storageValue"  length=10 />
		<br/>
		<input type="button" onclick="saveStorage();" value="Storage保存ボタン " />
		<br/>
		<input type="button" onclick="loadStorage();" value="Storageから取り出し " />
		<br/>
	</body>
</html>

① Keyとvalueそれぞれに入力を行って、値の保存と取得を行う画面です。

② 設定された値はGoogle chromeでは開発者ツール上で確認することが可能です(IEの開発者ツールでは未確認)

値の設定・取得の記述方法はこれ以外にもあります。
また設定されている値をループ的にすべて取得する方法もあります。
詳しくは別途調査下さい。

では失礼致します。