where, group by, havingとかの評価(優先)順位

where -> group by -> having -> select -> order by

の順で評価するのでhavingにはselectでつけた別名を指定できない。order byには指定できる。

例:年が2010以降で名前ごとの件数が1より大きいものを大きい順で表示。

select name, count(*) cnt
  from TBL
 where year >= '2010'
 group by name
having count(*) > 1
 order by cnt desc
;

NULLがある場合のSQLのWhere句の条件に注意

OracleSQLでハマったんで備忘録(というか知らなかっただけ)。

テーブルTBL_Aが、

ID SEI MEI
1 鈴木 太郎
2 鈴木 二郎
3 NULL NULL
4 佐藤 一郎

で、SELECT文が

select * from TBL_A where SEI <> '佐藤';

だと結果は以下。

ID SEI MEI
1 鈴木 太郎
2 鈴木 二郎

となり、NULLは「佐藤以外」ではない。ちなみに、

select * from TBL_A where NOT(SEI = '佐藤');

でも結果は同じ。以下のサイトによれば、DB2でも同じとのことらしい。

SQLで特定の文字以外の条件でNULLのレコードが取得されない

どうやら、NULLの比較は、UNKNOWNという状態になるらしい。

NULLの特性

なので、NULLを含む「佐藤以外」の行を取得したいのなら、

select * from TBL_A where SEI IS NULL OR SEI <> '佐藤';

としないといけない。

認証(authentication)と認可(authorization)

いつもどっちがどうなのか忘れちまうので備忘録。以下のサイトが詳しい。

OAuth 2.0 + OpenID Connect のフルスクラッチ実装者が知見を語る

意味
認証(Authentication) 誰であるか。 Who one is.
認可(Authorization) 誰が誰に何の権限を与えるか。 Who grants what permissions to whom.

だそうだ。 だれなのかを「認証」して何(誰)かに権限を与えるのが認可。

上記サイトは一番分かりやすい OAuth の説明からもリンクしているが、このページも良い。

SQL*Plusの日付表示の変更

デフォルトだとYY-MM-DDしかでないSQL*Plusでは以下を表示前に実行しておく。

SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY/MM/DD HH24:MI:SS';

SQL*Plusってほかにもいろいろ使い勝手が悪いんだけど、コマンドラインで使う人があまりいないのかもしれない。。。

NLS関連の環境変数は以下が詳しい。

SHIFT the OracleのNLS関連パラメータ

Windows10でのディスク容量拡大方法

仮想環境のWindows10で、更新アシスタントからアップグレードするとCドライブの容量が足りねーってことでアップグレードできず、また、仮想環境の設定をみても容量は自動で拡大するようにしているのだがそう言われてしまう。どうも、以下のサイトの通り、回復パーティションを削除しないといけなかったらしい。

hottokei.hatenadiary.jp

pcmanabu.com

こちらの環境ではスナップショットなどは取っていなかったため、バックアップ(といっても仮想OSだけでなくOS全体まるごとバックアップ)を実行。その後、仮想のWindows10のディスクの管理で見るとやはり居やがる。

"回復パーティション"
回復パーティション

で、PCまなぶさんのサイトに書いてあるとおり、diskpartコマンドで削除して以下のようになった。

"回復パーティション削除後"
回復パーティション削除後

その後、Windows10のアップグレードを実行し完了した。

セッションのタイムアウト

セッションのタイムアウトtomcatならデフォルト30分。以下のファイル。

  • conf/web.xml (共通)
  • webapps/foobar/WEB-INF/web.xml (アプリごと)
<session-config>
    <session-timeout>30</session-timeout>
</session-config>

参考サイト

http://natsumisane.sakura.ne.jp/blog/2017/10/11/post-118/ http://d.hatena.ne.jp/zabadaq/20080108/1199811729

リロードしてもウィンドウオブジェクトを保持しておく方法(javascript)

ウィンドウをリロードするとグローバル変数に保存していた子供のウィンドウオブジェクトがわからなくなる(当然)。 その場合は、以下の方法が考えられる。

そのウィンドウ(W2)に親ウィンドウ(W1)がいる場合

その親にグローバル変数を持たせて以下のようにする

// W1
var child;

// 子供のウィンドウを生成するウィンドウ(W2)
window.opener.window.child = window.open('URL', 'mySon');

同じ名前でURL無指定

window.open()にURL無指定で同じウィンドウ名を指定すると同じ名前なので見失った子供のウィンドウオブジェクトを生成できる。

var child;

if (child == undefined) {
  child = window.open('', 'mySon');
}

ただし、子供すでにいない場合は空白のウィンドウを生成してしまう。