DBでNULLでなく空のカラムを取得したい時

 

あまりないことだと思いますが、

カラムにスペースや空白が入ってるレコードを取得したい時

 

SELECT *

FROM テーブル

WHERE TRIM(カラム) = ”;

 

※PostgreSQL, MySQL,Oracleでは使えます。SQLServerdは異なる模様

  • TRIM….左右の空白を除去した文字列を取得できる
  • LTRIM….左の空白を除去した文字列を取得できる
  • RTRIM….右の空白を除去した文字列を取得できる

 

以下では、対応できない。

SELECT *

FROM テーブル

WHERE カラム IS NULL;

OVER句、ROW_NUMBER()

 

新しいSQL語彙を知ったので書きます!

 

・OVER句

・ROW_NUMBER()

 

 

まずはOVER句!

区間ごとに分割したり、並び替えたりできるやーつ

GROUP BYと何が違うんかな?

(((((( や っ て み よ う )))))

 

こんなテーブル(niku29)があったとして

id class_id name
1
1
カルビ
1
2
ホルモン
2
1
せせり
3
1
豚バラ

※idとclass_idのテーブル用意して結合するとかだと思うんですがここでは触れないでくださいw

 

牛(id=1)、鳥(id=2)、豚(id=3)の各種類の数を知りたい場合、

GROUP BYを使うと

SELECT
id,count(class_id)
FROM
niku29
GROUP BY id;

こんな感じ。すなお。

id count
1
2
3
1
2
1

 

 

OVER句を使うと、

SELECT
id,count(class_id) OVER (PARTITION BY id)
FROM
niku29;

こんな感じ?

id count
1
2
1
2
2
1
3
1

 

しかし、これだとid=1について2行同じレコードでてきちゃいます。

 

 

 

そこで、ROW_NUMBER()を使い、idごとに行数振り、

1行目だけ取ってくるやり方で見やすくします。

とりあえず、

SELECT
row_number() OVER (PARTITION BY id) AS row_num,
id,
count(class_id) OVER (PARTITION BY id)
FROM
niku29;

で行を表示してみる。

row_num id count
1
1
2
2
1
2
1
2
1
1
3
1

イイカンジ、もうちょい。

 

 

んで、1行目だけ取ってきて
SELECT
row_number() OVER (PARTITION BY id) AS row_num,
id,
count(class_id) OVER (PARTITION BY id)
FROM
niku29
WHERE row_num = 1;

ERROR:  列"row_num"は存在しません

え、あるやん。

 

そこで、

SELECT
row_number() OVER (PARTITION BY id) AS row_num,
id,
count(class_id) OVER (PARTITION BY id)
FROM
niku29
WHERE row_number() OVER (PARTITION BY id) = 1;

ERROR:  WHERE句ではウィンドウ関数を使用できません

使えないらしい・・・。

ウィンドウ関数 → row_number()、rank()とか….

 

 

すんごいネストするけどこれならできる!

SELECT
id,count
FROM
(SELECT
row_number() OVER (PARTITION BY id) AS row_num,
id,
count(class_id) OVER (PARTITION BY id) AS count
FROM
niku29) niku
WHERE row_num = 1;

id count
1
2
2
1
3
1

 

 

うーん、しかし例が悪かった。

もっとOVER,ROW_NUMBER()が役立つ時がきっとある!

 

まとめ

・WHERE句にWindow関数(ROW_NUMBERとか)は使えない。

 

シーケンス操作関数 -PostgresSQL

 

シーケンス操作関数とは…

参考:ここ

“PostgreSQLシーケンスオブジェクトに対し演算を行う関数。シーケンスオブジェクト(シーケンスジェネレータとも単にシーケンスとも呼ばれます)とはCREATE SEQUENCEで作成される1行の特別なテーブルです。”

テーブルなんですねえ。

 

シーケンス関数一覧

  • nextval(regclass) …
  • currval(regclass)    ….nextval後に
  • lastval()
  • setval(regclass, bright)
  • setval(regclass, bright, boolean)

 

 

\よくわかんないからやってみた。/

・SELECT currval(‘test_seq’::regclass);
・SELECT lastval();

※それぞれを別セッションで実行

currvalとlastvalはnextvalの後とか同じセッション内で実行しないと

「セッションでまだ定義されてません」

ってでますね。

(まとめ)

currvalとlastvalは同セッション内にてnextvalで定義した後に機能する。

nextvalで得られた値を返す。

 is_calledフラグが「はい」 → 最終値 + 増加数

   is_calledフラグが「いいえ」 → 最終値

 is_calledフラグ…..呼ばれた時に増加数分増加する/しない

 

 

currvalとlastvalって何が違うんやろ?

・lastval…シーケンスを指定するところがないです!

同セッション内で複数のシーケンスをnextvalした時、一番最初にnextvalしたシーケンスの返り値を得ることができました。

・currval…シーケンスが指定できますね。

 

 

 

regclassってなん?

参考:ここ

OID(オブジェクト識別子)っていうシステムテーブルのプライマリーキーの別名らしい。

よくわからんので、わかり次第まとめます!

 

ホワイトボックスとブラックボックス

 

ホワイトボックス(テスト)とブラックボックス(テスト)について書きます!

 

ブラックボックス…

内部処理、つまり実装、コードの内容に関わらず、外部仕様を満たすかのテスト

 

ホワイトボックス…

ブラックボックスとは逆で、内部処理、つまり実装、コード(メソッド)を一つ一つ想定通りに動くかをみるテスト

 

私自身、ユニットテストつまり単体テストはホワイトボックステストのことだと認識してます。

 

リファクタリングの面からも、

ホワイトボックステストは特に大事ですね。

ユニットテストコードかかないとなと改めて思いました。

 

JSONとJSONP〜その2〜

 

JSONPマダマダツヅキマスヨ。

 

前回、XSS攻撃を避けるためにも、クライアント側でパースしよう書きましたが、まだまだ謎が多いので書きます。

 

参考:ここここ

 

Content-type

jsonの場合、

application/jsonです。text/javascriptではない!

 

jsonpの場合、

実体はcallback関数でJSONを包んだJavaScriptなので、MIMEタイプはJavaScriptと同じでapplication/javascript

text/javascript → application/javascript (2006年4月RFC4329)

text/htmlとかtext/javascriptとかにしてるとhtmlと解釈してしまい、悪意あるスクリプトが仕込まれている場合、実行されていまします。→XSSの攻撃を受ける

content-typeを正しく記述することは重要!!

しかし、IE6だと、application/jsonとしていてもhtmlとして解釈してしまうようです。

 

callback関数

jsonpの仕組みって、コールバック関数を使ってサーバから受け取るデータにscriptとしての役割を持たす。

callback関数と同じ名前の関数の引数にJSONが入ったスクリプトを返すようクロスドメインのサーバーにリクエストし、
動的にそのスクリプトを読み込んだ瞬間にcallback関数が引数にJSONをつっこんだ状態で呼び出される。

 

 

ジェイソン違い、JSONPとJSONについて

 

ajax(つまりはXMLHttpRequest)って便利ですよね。

異なるドメインにアクセスはできない=クロスドメイン制約

を除いては・・・・。

 

しかし、JSONPを使うと、なぜ異なるドメインのデータを取得できるのでしょうか?

そんな疑問からのJSONとJSONPの違いを調べました。

参考:ここ

 

JSON        =    JavaScript  Object Notation

JSONP     =    JSON with Padding (Padding=不要なもん)

→つまりJSONPはJSONではない!!!

 

JSONPの仕組み

<script src=”https://google.com/test.js”></script>

//変数data に “グーグルからのメッセージ”;が挿入されるとする。

<script>

alert(data);  //「グーグルからのメッセージ」がアラートされる。

</script>

 

 

スタイルシートやjQueryライブラリーを呼ぶのもクロスドメインじゃん!そうじゃん!と気付いた次第です。

クロスドメイン制約って簡単に回避できるやーんって、楽勝って感じですよね!

 

しかし

 

これって、データ取得先(上記例で言うとgoogle.com)に

自サイトでの実行権を与えっちゃってるんです!

もしも、dataと言う変数に無限アラートが仕込まれてたらどうしょうか?自分は何も実装していないのに、観覧者に不快な思いをさせてしまう可能性があるのです。

 

こういったXXS攻撃を避けるために、

1.JSON.parse()をしましょう!

JSON.parse()

※JSON,JSONPはオブジェクトのためJSON.stringfy()で文字列にしたのち、JSON.parseしましょうね!

 

2.JSONP使うのやめましょう!

じゃあ何使えばいいんや!教えてください。

 

viewportについて

 

viewport

ってスマホ対応の時使うレスポンシブル対応のやつだな、

っということしかわからなかっための勉強します!

 

 

参考:http://ichimaruni-design.com/2015/01/viewport/

 

 

結論

・スマホサイトがある場合

<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0">

 

width=device-width : 幅をデバイスごとにサイズを切り替えてくれる!

 

initial-scale:初期のズーム倍率

 

※device-width  ⇄ 初期のズーム倍率が 1 になる。(initial-scale=1.0)

 

minimum-scale=1.0とすることで最小倍率を指定しているが、初期ズーム倍率と等しいため、縮小できない状態。

なぜ、縮小できなくするのか謎・・・。

Yahoo!の天気サイトもしてた・・。これ↓

<meta name=”viewport” content=”width=device-width,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=no”>

user-scalable=noってしてるのに、拡大できるやん?なんで?

 

と、思ったらいろんなサイト比較してるとこ発見!

 

 

しかし、よくわからない。

maximum-scale=1.0,minimum-scale=1.0,user-scalable=no

ってどうなれば正しい挙動なの?

 

・PCサイトしかなく、SPで最適化したい場合

<meta name="viewport" content="width=960(コンテンツの大きさ)">

これすれば、横の余白がなくなる。

 

シーケンスの初期化

 

シーケンスって便利ですよね。

SQLでもできるし、phppgadminを使えばGUIでも操作できる!

 

しかし、シーケンス設定っていまいちよくわからないのでまとめます。

 

  • phppgadminでのシーケンスの作成

phppgadminでシーケンスを作成しようとするとこんな画面がでます。

名前:シーケンスの名前をつけます。

よく見るのは「 テーブル名_カラム名_seq」ですね。

増加数:直前の数値からいくつ増加するか。

最小値:デフォルトは1。

最大値:MAX値

開始値:デフォルトは最小値と同じ。

キャッシュ値:メモリに格納しておくシーケンス番号の量を指定します。

これによりアクセスを高速にすることができます。

最小値は1(デフォルト)

Can cycle?:番号が最大値を超えた場合に最小値に戻るかどうか。

「いいえ」(デフォルト)が指定された場合、シーケンスの限界値に達した後の

       nextval呼び出しは全てエラーになる。

ログカウント:わからん!誰か教えてください。

Will increment last value before returning next value (is_called)?:

訳)次の値を返す前に最終値を増加しますか?

 

 

例えば、

増加数:1

最小値:1

開始値:1

Will increment last value before returning next value (is_called)?:いいえ

このシーケンスは1から始まり、2,3,4,….と1ずつ増加します。

 

 

 

  • phppgadminでのシーケンスの初期化

1.「リセット」をクリック。//最終値が1となる

2.「Restart」をクリック。//Will increment last value before returning next value (is_called)?が「いいえ」となる

 

 

  • SQLでのシーケンスの初期化

SELECT setval (‘シーケンス名’,  1,  false);

第2引数:最終値

第3引数:値を返す前に増加させるか<</Will increment last value before returning next value (is_called)?>>  true(増加する)/false(増加させない)

よく使うGitコマンド

 

Git DIFF

ブランチ間の差分を表示

$ git diff master[取り込むほう] develop[取り込まれるほう]

 

ブランチ間の差分があるファイル一覧を表示

$ git diff master[取り込むほう] develop[取り込まれるほう] --name-status

 

ブランチ間の差分があるファイル数を表示

$ git diff master[取り込むほう] develop[取り込まれるほう] --name-status | wc -l

 

 

HTML5ではaタグ内にdivといったブロック要素と呼ばれていたものをネストできるようになった

 

タイトル通りです!

ネストのルールって難しいです。

 

 

ulにネストしていいのはliだけなのに、liの中はなんでもネストしていいとか・・・。

HTML5以前では、ブロック要素やインライン要素を使ってのルールがありました。

が、

HTML5からブロック要素インライン要素といった分類がなくなりました。

 

そのかわり(?)としてコンテンツモデル

という概念ができました。

 

コンテンツモデル:各要素が内包できるコンテンツ

 

HTML要素は、0個以上の以下カテゴリーに属しています。

  • フローコンテンツ
  • メタデータコンテンツ
  • セクショニングコンテンツ
  • ヘッディングコンテンツ
  • フレージングコンテンツ
  • エンベッディッドコンテンツ
  • インタラクティブコンテンツ

 

これにより

今まで「インライン要素」と呼んでいた要素が

フレージングコンテンツとなったようです。

 

 

本題に戻ると・・・

a(アンカー)要素の仕様を見ると、

コンテンツモデル…..transparent(透過)

↑親要素のコンテンツモデルがそのまま継承されるという意味

 

 

 

例えば、

<p>

  <a href=”#”>リンク</a>

</p>

・a要素の親はp要素である。

・p要素のコンテンツモデルはフレージングコンテンツである。

→a要素にネストできる要素は

<span>,<a>,<img>といった、フレージングコンテンツとなる。

 

 

また、

<div>

  <a href=”#”>リンク</a>

</div>

・a要素の親はdiv要素である。

・div要素のコンテンツモデルはフローコンテンツである。

→a要素にネストできる要素は

メタデータコンテンツの一部を除いたほぼすべての要素となる。