natsu 積分 0

Internal iteration並沒有如傳統iteration有next()用來指示走訪下一個元素的方法。Internal iteration由你的應用程式決定要被迭代的集合,但該如何走訪集合中的的每一個元素則是由JDK決定;而External iteration則是被迭代的集合及迭代的方式兩者皆由應用程式來決定。

而主要的差別是,External iteration只能以序列方式(serial)迭代集合,而Internal iteration除了可以序列方式,也支援以平行方式(parallel)來迭代集合。

也就是說Sream的forEach可以利用平行計算將迭代的程式拆分為多個子程式來平行處理,最後在將子程式的執行結果組合起來。其意味著Stream的forEach比原本的iteration更彈性且高效

聽起來是個從 iteration 改用 stream 的好處

natsu 積分 0

在通常情況下會將具有以下特徵的資料放入到二級快取中:

  • 很少被修改的資料。
  • 不是很重要的資料,允許出現偶爾併發的資料。
  • 不會被併發訪問的資料。
  • 常量資料。
  • 不會被第三方修改的資料

而對於具有以下特徵的資料則不適合放在二級快取中:

  • 經常被修改的資料。
  • 財務資料,絕對不允許出現併發。
  • 與其他應用共享的資料。

在這裡特別要注意的是對放入快取中的資料不能有第三方的應用對資料進行更改(其中也包括在自己程式中使用其他方式進行資料的修改,例如,JDBC),因為那樣Hibernate將不會知道資料已經被修改,也就無法保證快取中的資料與資料庫中資料的一致性。

雖然很早就知道有二級快取這功能,但考慮到以下項目,所以都沒有機會用:

  • 資料一致性的問題
  • 與其下多個 SQL 然後 cache 起來,不如下一個 SQL 就把多筆資料都撈回來應該還比較有效率
natsu 積分 0

另外架 DB 去改 OS 參數是很常見的事,裝過 Oracle DB 就會知道。

寫程式十多年都沒有聽 DBA 提起過有這回事 ...

可能是我和 DBA 比較不熟吧 XD

P.S. 一般開發時用的 DB (測試區) 都是用預設值 ...

natsu 積分 0

沒想到架個 DB 也需要改到 Kernel Parameters ...

不過應該是 PostgreSQL 有丟出相關錯誤訊息時才需要改吧?

natsu 積分 0 編輯於

ZGC restricts itself to 4Tb heaps which require 42-bits, leaving 22-bits of possible state of which it currently uses 4-bits: finalizable, remap, mark0 and mark1.

喔喔,4TB 耶!

不過可能也沒機會用到這麼多 ram ...

natsu 積分 0

後來發現同事有這台筆電!據說是去小高黑店買的

natsu 積分 0

純 rest 要用名詞, 所以要改寫成 /user/{id}/approval。

我是有看到用動詞的例子:

要講究純 rest 到最後變得像是在考文法一樣, 咬文嚼字, 我個人是不太喜歡浪費時間在這種地方啦。

說的也是 ...

而且用 PATCH 就對了嗎?approve user 這個動作有可能改到三個 Table 以上,不一定是只改 user.approved 這個 boolean flag 而已啊。

我只是覺得 approve 這個動作應該只是在 update 資料,所以用 PATCH 比較合適 ...

不過改三個 Table 有可能代表了同時修改三個資源,這部份 REST 目前也沒有規範到 ...

就像您說的那樣,最後會是 REST 和 RPC 混用吧

natsu 積分 0

API 版號應該出現在 URI 中還是 HTTP header 中?以 REST API Versioning 的描述兩種皆可,但看完論文後哪種較好呢?

  • 我覺得 API 版號應該出現在 URI 中,因為這樣可以保證 client 端不會 call 錯版本 ... (雖然這樣的 URI 有點不好看 ...)
  • 若是用 parameter 或 header 來指定 API 版號,就有 client 端給錯資料而 call 錯版本的風險 (當然如果 client 端是可信賴的就沒差)

參考資料:Versioning RESTful Services1

natsu 積分 0

不過 url 都會是小寫英文 和 - 就是了。然後就算是 RPC , url 也會傾向用 /approve/user/{id} 而不是 /approveUser?id={id}

我覺得如果 url 是 /user/{id}/approve + PATCH 應該就符合 REST 了吧

natsu 積分 0

不要為了 GC 而在最後一行加上 foo = null 這種東西,現在 JVM 不需要這種寫法

應該說是為了避免 OutOfMemoryError 而在最後一行加上 foo = null 這種東西 ......

不過是特殊情形下才需要這樣做,或者你不想加大 -Xmx 的值 ......

natsu 積分 0 編輯於

NULL參照法---Nulling a Reference: 將null指派給物件變數,使目前的物件變數沒有參照對象。

雖說「Null sucks.1」,但 null 還是有用處的。

有時會發生 OutOfMemoryError 就是因為程式在同一時間建立了太多物件,所以要把變數設成 null (若是在 collection 中則是用 remove 的方式) 讓它可以儘早被 GC 回收。

當然如果沒有 memory 方面的問題的話,一般是不用把變數設成 null 的。

natsu 積分 0

在 pom.xml 中,則要使用如下設定:

  1. spring-context 不要引用 commons-logging
  2. 改用 jcl-over-slf4jlogback-classic
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spring-framework.version}</version>
    <exclusions>
        <!-- Exclude Commons Logging in favor of SLF4j -->
        <exclusion>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>
...
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
    <version>1.6.1</version>
</dependency>
<!-- for slf4j v1.6.1 -->
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>0.9.29</version>
</dependency>
natsu 積分 0

可能過不久就會有消息說:微軟準備買下 Python ...

natsu 積分 0

所以其實這個目標,沒辦法單靠上面我們介紹的這些瀏覽器的快取機制來達成,需要 Server 那邊一起配合才行。其實說穿了,就是把 Etag 的機制自己實作在檔案裡面。

在檔名上加上 Etag 的方法似乎不錯

但是目前 Server 端並不會自動處理檔名的部份:

  1. 產生 html 時要將 script.js (Server 上的實際檔名) 轉換為 script-qd3j2orjoa.js (Browser 看到的檔名)
  2. Browser 發出 request 時要將 script-qd3j2orjoa.js 轉換為 script.js

除非把 Server 上的實際檔名改成 script-qd3j2orjoa.js 就可以讓 Server 與 Browser 所使用的檔名一致,但是這樣又不利於版控 ...

natsu 積分 0

在 EGit 的 Show in History 中選擇 Show all changes of selected resource and its children 就可以看到 rename 前的 history。(類似於執行 git log --follow /path/to/file 的結果)

natsu 積分 1 編輯於

不過現在的話建議用 front end 的技術做吧,除非需求一定要 server render

還是有機會用得到,例如把產生的圖表放進郵件裡面寄出 ...

而且若是有需要從 DB 裡面撈資料的話,在 server render 的效能會比較好吧。

natsu 積分 0

Java中的TreeMap、Comparable、Comparator - 神一样的存在 - 博客园1

  • 用 HashMap 時是以 hashCode()equals() 來比較兩個 key 是否相等
  • 用 TreeMap 時則是以 Comparable 介面的 comparareTo() 來比較兩個 key 是否相等