2016年2月8日 星期一

[javascript] 處理 js 的長時間工作

概念:
    javascript 是單執行緒來執行的,當事件被觸發後是會一個一個的執行,前一個沒有結束,後面的也不會執行

    常見的情況像是瀏覽器的 alert 阻擋住了後面的工作等等

衍生問題:
    使用 iframe 如何? 事件觸發順序是什麼 ?

-----
範例的第一個按鈕.... 真的會執行很久...

http://embed.plnkr.co/CNwaGKvRmIhALA0ZTYxb/

----
透過簡單的招式將工作切割成小工作來執行

var jobs = 200000;  // 總工作數
var partNum = 2000;  // 工作切割個數
var partSize = jobs/partNum; // 每個切割中的工作數
var iter = 0;  // 控制迭代的變數

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


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


2015年12月28日 星期一

[javascript] not not (!!) 運算

!!false===false
!!true===true
!!0===false
!!parseInt("foo")===false// NaN is falsy
!!1===true
!!-1===true// -1 is truthy
!!""===false// empty string is falsy
!!"foo"===true// non-empty string is truthy
!!"false"===true// ...even if it contains a falsy value
!!window.foo===false// undefined is falsy
!!null===false// null is falsy
!!{}===true// an (empty) object is truthy
!![]===true// an (empty) array is truthy; PHP programmers beware!

2015年11月2日 星期一

[Multithread] Java multithread

Java multithread - 1


在開發多執行緒程式時,常發生的問題是共用資源非同步問題,就像工作一個人做好好的,多一個人沒有協調好就是來添亂的,除了叫他麥來亂之外,可能好好協調才是增加產能的好策略。

本系列文主要把之前遇過的一些多執行緒問題紀錄一下,然後一些資料參考這本書和部分本人的記憶,如果有疏漏或是錯誤也請不吝指教。

問題


  • 共用物件
  • 多資源資源鎖定
  • Job - Worker
  • 排程

Java - Syncronized


  • syncronized method
  • syncronized block

Java - Thread


  • wait
  • sleep
  • join
  • yank
  • notify/notifyAll
  • interrupt
  • Thread/Runnable
  • Mutax Object

Queue Design


Worker Design


Job

[maven] profile - activation

http://maven.apache.org/guides/introduction/introduction-to-profiles.html

profile 設定裡面除了 id, build 之外還有個蠻有用的設定

activation 可以用來設定啟用這個 profile 的條件 (哇喔~~~)

指定 JDK 1.4
  1. <activation>
  2. <jdk>1.4</jdk>
  3. </activation>

JDK 1.3~1.6前
  1. <activation>
  2. <jdk>[1.3,1.6)</jdk>
  3. </activation>

特定 OS
  1. <activation>
  2. <os>
  3. <name>Windows XP</name>
  4. <family>Windows</family>
  5. <arch>x86</arch>
  6. <version>5.1.2600</version>
  7. </os>
  8. </activation>

有 debug 這個 property
  1. <activation>
  2. <property>
  3. <name>debug</name>
  4. </property>
  5. </activation>

environment 設定成 test -Denvironment=test
  1. <activation>
  2. <property>
  3. <name>environment</name>
  4. <value>test</value>
  5. </property>
  6. </activation>

沒有某個檔案或資料夾
  1. <activation>
  2. <file>
  3. <missing>target/generated-sources/axistools/wsdl2java/org/apache/maven</missing>
  4. </file>
  5. </activation>

預設啟動
  1. <activation>
  2. <activeByDefault>true</activeByDefault>
  3. </activation>

2015年10月17日 星期六

[maven] profile 使用

最近專案在發佈的時候,需要把 war 檔案中的 config, jar 等檔案移出來的需求

看了一下 maven-war-plugin 的範例文件

把專案設定丟出來加些說明

1. 在 pom.xml 裡面增加 profiles 不同的 profile 可以適用不同環境的上版參數設定

2. profile 裡面主要有三個 plugin,設定大概如下方說明

3. mvn clean install -Dmaven.test.skip=true -Puat

-P 就是指定 profile 的意思

Eclipse version


threads 跟 skip Tests 都是自己加的 不需要可以自己移掉


--- plugin 示意

  •  maven-war-plugin : 
    • 處理 war 檔案包裝,包括檔案過濾、web.xml 指定、其他資源載入等
  • maven-compiler-plugin
    • java 編譯相關參數,設定編譯用參數,顯示提示等
  • maven-resource-plugin
    • 將設定檔案移動至指定位置

2015年9月17日 星期四

[log4j] 顯示 SQL & 參數值

log4j.properties 設定

log4j.logger.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
log4j.logger.org.hibernate.SQL=DEBUG
log4j.logger.org.hibernate=ERROR



org.hibernate.SQL 用來顯示 PeparedStatement
org.hibernate.type.descriptor.sql.BasicBinder 用來顯示 bind 的值