2016年6月14日火曜日

DBまとめ1:SQLソート、それをZend_DB使って

以下のようなテーブルrosterがあったとする。
+----+--------+
| id | name   |
+----+--------+
|  1 | Daniel |
|  2 | NULL   |
|  3 | Bob    |
|  4 | Alice  |
|  5 | Carol  |
+----+--------+
単に ORDER BY key_col ASC とするとNULLが先頭にくる。
mysql> SELECT * FROM roster ORDER BY name ASC;
+----+--------+
| id | name   |
+----+--------+
|  2 | NULL   |
|  4 | Alice  |
|  3 | Bob    |
|  5 | Carol  |
|  1 | Daniel |
+----+--------+
NULLを最後にもってきたい場合は次のように書く。
mysql> SELECT * FROM roster ORDER BY name IS NULL ASC, name ASC;
+----+--------+
| id | name   |
+----+--------+
|  4 | Alice  |
|  3 | Bob    |
|  5 | Carol  |
|  1 | Daniel |
|  2 | NULL   |
+----+--------+
key_col IS NULL ASC でNULLが最後になるのでそのあと key_col ASC で昇順にソートする。


ORACLE とかだと下記のように簡単に
ORDER BY comment ASC NULL LAST
NULLS FIRST
NULL 値を順序の最初にするソートを行なう
NULLS LAST
NULL 値を順序の最後にするソートを行なう

このorderをZend使って

$select->order(new Zend_Db_Expr('case when MyDate is null then 1 else 0 end, MyDate'));



○参考
 Zend Framework order by ascending null values last
 [MySQL] 昇順ソートでNULLを最後にする方法
 MySQLでNULLを含む列をORDER BYしたときの挙動
 MySQL のソート時に NULL を最後にしたい場合
 MySQL で NULL を一番最後にして昇順にソートする

2015年12月9日水曜日

JavaScriptまとめ4:即時関数

function hoge() {
  alert(1);
}

hoge(); // 1

// 上記の関数定義と関数呼び出しをまとめて書くと↓

(function hoge() {
  alert(1);
})();


○即時関数メリット
1. グローバル変数に関数の割り当てがなされない
2. 即時"関数"だから関数内部の変数はローカルに限定される
 
○即時関数の別の記述方法
 
(function hoge() {
  alert('即時関数どす');
})();
これが一般的に即時関数と称されるコードです。
ですが、関数を式として評価させる方法はカッコでくくる以外にも方法があり、
+function() {
  alert('これでも即時関数');
}();

・その他記述方法 
 即時関数(function(){ ... })()の別の書き方いろいろ



○参考
 知ってて当然?初級者のためのJavaScriptで使う即時関数(function(){...})()の全て - 三等兵

2015年11月7日土曜日

JavaScriptまとめ3()

ただし、これは ECMAScript3 の仕様での話です。ECMAScript5 の仕様からグローバル変数 undefined についての記述を引用します。
http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262%205th%20edition%20December%202009.pdf
15.1.1 Value Properties of the Global Object
15.1.1.3 undefined
The value of undefined is undefined (see 8.1). This property has the attributes { Writable: false, Enumerable: false, Configurable: false }.
ECMAScript5 の仕様では undefined プロパティの Writable が flase となっていますので、値を変更することができなくなりました。






undefined はただのグローバル変数


こんなことだって可能
alert(undefined); // "undefined"
var undefined = "こんにちは";
alert(undefined) // "こんにちは"



自分の意思でundefinedを自由に書き換えることができる
つまり、undefinedは常にundefinedである保証はどこにもないから、undefinedを使うのを避けるべきとうことです。
対して、void演算子を使えば、常に本当のundefinedを返すので、安全です。


function test () {
    var undefined = true; //undefinedを上書き

    if(undefined){
        console.log( 'undefined: ' + undefined );
    }

    if(void 0 ){
        console.log( '決して実行されない' );
    }
}

test();


voidを使わずにundefinedを獲得する方法

(function(a,b,undefined){
    console.log(undefined)
})(1,2);

これはjQueryのソースでも使われている手法
無名関数をその場で実行し、実引数には1,2しか渡していないのに、仮引数のほうではa,b以外に、
もう一つundefinedという最初から渡されないと仮定した仮引数をセットすることで、安全にundefinedを獲得


○参考
 `undefined`の代わりに、`void 0`を使ったほうがいい
http://liginc.co.jp/web/js/38494

2015年8月3日月曜日

システム殴り書き備忘録1

CSS
http://www.slideshare.net/hiloki/a-good-css-and-sass-architecture?related=1

jQUeryアンチパターン
http://www.slideshare.net/paul.irish/perfcompression

実例で学ぶ、JOIN (NLJ) が遅くなる理屈と対処法
http://qiita.com/yuku_t/items/208be188eef17699c7a5?utm_content=buffer77626&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer

忘れがちなJavaScriptの基礎中の基礎
http://qiita.com/Yama-to/items/5e0827dfd2bd440537d0?utm_content=buffer8fe4a&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer

2015年6月18日木曜日

PHPまとめ1:エルビス演算子

/*━━━━━━━━━━━━━━■PHP■━━━━━━━━━━━━━━*/
○エルビス演算子
$c = $a ?: $b;

○三項演算子の場合
$c = $a ? $a : $b;


/*━━━━━━━━━━━━━━■JavaScript■━━━━━━━━━━━━━━*/
c = a || b;

・補足
JavaScriptでは、論理演算子&& ||の比較対象としてBoolean以外の値を指定した場合、その値をBooleanに変換せず返します。
よってJavaScriptでは論理演算子||をエルビス演算子の代わりとして用いることが出来ます。

論理演算子&& ||がBoolean以外の値を返すのはJavaScriptに限った話ではありません。
他のプログラミング言語でもこのような実装になっている言語が存在します。
よってこの記事で紹介したテクニック(と呼べるほどの事かは疑問ですが)はJavaScript以外の言語でも利用できます。


/*━━━━━━━━━━━━━━■PHP7で2項演算子「??」が新設■━━━━━━━━━━━━━━*/

オペランドがnull以外の値であればその値を、そうでなければ右オペランドを返す
var_dump(null ?? false ?? true); // false

これはPHP 5.3で導入されたエルビス演算子「?:」と少し似ています。
エルビス演算子は真偽の判断
??演算子はnullかどうかの判断を行う点が異なる

var_dump(null ?: false ?: true); // true

それだけでなく、??演算子はisset()と同様に未定義値をチェックしてもエラーになりません。
これは非常に大きな違いで、??演算子があれば今までのisset()地獄から解放されるかもしれません。

var_dump($arr["foo"] ?: "bar"); // 未定義だとUndefined variableかUndefined indexで怒られちゃう
var_dump(isset($arr["foo"]) ? $arr["foo"] : "bar"); // 結局こう書いてたよね…
var_dump($arr["foo"] ?? "bar"); // PHP7ではこれで動く!

PHP7調査(11)??演算子の新設
JavaScriptではエルビス演算子を論理演算子で代用できる
エルビス演算子でスマートに変数を初期化