2016年1月31日 星期日

[SQL] 三值邏輯,資料庫 null 在 where 中的運作

解釋下,上上禮拜新人遇到 oracle 裡面 '' 等價於 null,然後上禮拜又遇到下面這個問題

然後激發出我的雞婆個性 XDDD


遇到 null 的時候,我們的是非觀念.... 變得有點奇怪...

為什麼 in (null), not in (null) 都不給我回傳資料,搞毛啊 = =

我們一般的真值表是這樣的:


有一種叫做三值邏輯 Three-Valued Logic (TVL or 3VL),真值表是這樣的:

3VL 引入了"我不知道"的概念,這樣上面的真值表就很合理了!

NOT UNKNOW == UNKNOW
  "非"我不知道 當然還是 我不知道啊 XDD

TRUE AND UNKNOW == UNKNOW
  我吃飽了,但是我不知道你吃飽了沒,所以 "我們兩個都吃飽了"的問題 => 不知道

------

null 在資料庫中就是一個 UNKNOW 值的概念

一個地址欄位被填入了 null 時,正是代表了我不知道地址是哪裡的意思

而 SQL 的 WHERE 部分需要明確的 TRUE/FALSE 結果,來表示這筆資料該不該回傳

當查詢的結果是 UNKNOW 時,這筆資料是不會回傳

直接使用 =, <>, in, not in, exists, not exists 都是在做 TRUE/FALSE 的回答

所以常見的 id = null (UNKNOW)或是 id <> null (NOT UNKNOW)都是不會回傳資料的

我們需要表示不知道的時候,會需要明確地用 is null / is not null 將 3VL 轉回 2VL

------

以下上面第一張圖的解釋:

id in (null)
   id = null 結果是 UNKNOW 不是 TRUE 也不是 FALSE 不回傳

id not in (null)
   not (id = null) 等價於 id <> null ,所以結果是 UNKNOW  不是 TRUE 也不是 FALSE 不回傳

id in ('1', null)
   id = '1' or id = null,當 id 值是 '1' 是 TRUE,當 id 值不是 '1' 是 FALSE
   TRUE OR UNKNOW == TRUEFALSE OR UNKNOW ==  UNKNOW
   所以 id 值是 '1' 結果是 TRUE 會回傳,其他值得情況是 UNKNOW 不回傳

id not in ('1', null)
   not (id = '1' or id = null) 等價於 id <> '1' and id <> null
   參考真值表 TRUE AND UNKNOW == UNKNOWFALSE AND UNKNOW == FALSE
   所以就一筆資料都不會回傳

-----

報告完畢 應該是這樣沒有錯

2016年1月30日 星期六

[javascript] Hoisting & Scope

今天差點被奇怪的中文翻譯書給騙了 以為弄了那麼久竟然弄錯

只好寫下來紀錄一下

不過哥真的很認真

還有附圖 跟 live demo

----

Hoisting - 提升 - 意思是說 js 的變數宣告,其實會被默默地移至同一 scope 的開頭

因為是默默的,所以很容易有以下的誤解

http://embed.plnkr.co/jP72zKg7V3viYLAtGEeE/

var i = 0;

(function(){
    i = 5; // 很像是在操作上面那個全域的 i

    // 中間可能隔很多行
    // 中間可能隔很多行
    // 中間可能隔很多行
    // 中間可能隔很多行
    // 中間可能隔很多行
    // 中間可能隔很多行

    for(var i = 0 ; i < 10; i++){

    }
})()

alert(i); // ??? 是 0 還是 5 呢?


但是實際上會像是:

var i = 0;

(function(){
    var i;
    i = 5; // 很像是在操作上面那個全域的 i

    // 中間可能隔很多行
    // 中間可能隔很多行
    // 中間可能隔很多行
    // 中間可能隔很多行
    // 中間可能隔很多行
    // 中間可能隔很多行

    for(i = 0 ; i < 10; i++){

    }
})()

alert(i); // 很明確是 0 沒錯了

所以如果可以,在 function 剛進來的地方宣告吧。
!!! 絕對不是在說多設定全域變數 !!!

----

Scope : 就是這個變數可以被人家使用的範圍

一般寫 c#, java 等語言,變數都是 block scope

意思是說從 宣告之後 到 目前所在的大括弧區間尾巴 (英文是一個 block ),都是可以使用的,一旦這個範圍還使用就噴錯了

但是 js 是 function scope 而且配合剛剛的 Hoisting 來說

可以使用的範圍是本變數所在的這個 function 從頭至尾都視做已經宣告

差別只是值被 assign 了沒有,undefined => assigned

然後有個比較特別的是直接宣告的 function

他是不管在哪兒宣告,都是在整個 scope 可見,就是被提升啦!!!!!!! (機車)

http://embed.plnkr.co/XgMeOjyD6AtMPtYdwayY/


範例一,只要宣告了那在前面使用這個變數是不會噴掉的!!!


範例二,就算是我們習慣的 block 也是一樣,超出了 block 值也還在喔


 範例三,那些在 function 之外的 access,噴!!! 直接就給你噴錯了!! 請小心

2016年1月6日 星期三

[Tech] 程式呼叫 Gmail 寄信

Gmail 寄信

最近使用 C# 寫 e-mail 的模組,想當然就是使用 gmail 做測試

不過發現一個新東西

原來針對低安全性的來源 gmail 會阻擋

需要去開權限才能使用

https://myaccount.google.com/security?pli=1#signin


直接進去登入和安全性,然後移到下方有個[允許安全性較低的應用程式]
預設是關閉的 記得打開測試完要再關起來