Total Pageviews

2019/11/03

[Sybase] java.lang.ClassCastException: java.sql.Timestamp cannot be cast to com.sybase.jdbc4.jdbc.DateObject

Problem
In my spring boot project, it will occur the following ClassCastException irregularly:
java.lang.ClassCastException: java.sql.Timestamp cannot be cast to com.sybase.jdbc4.jdbc.DateObject
 at com.sybase.jdbc4.tds.TdsParam.checkDateRange(TdsParam.java:1707)
 at com.sybase.jdbc4.tds.TdsParam.prepareForSend(TdsParam.java:997)
 at com.sybase.jdbc4.jdbc.ParamManager.checkParams(ParamManager.java:1192)
 at com.sybase.jdbc4.tds.Tds.language(Tds.java:1022)
 at com.sybase.jdbc4.jdbc.SybStatement.sendQuery(SybStatement.java:2557)
 at com.sybase.jdbc4.jdbc.SybPreparedStatement.sendQuery(SybPreparedStatement.java:3191)
 at com.sybase.jdbc4.jdbc.SybStatement.execute(SybStatement.java:2829)
 at com.sybase.jdbc4.jdbc.SybPreparedStatement.execute(SybPreparedStatement.java:1566)
 at com.zaxxer.hikari.pool.ProxyPreparedStatement.execute(ProxyPreparedStatement.java:44)
 at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.execute(HikariProxyPreparedStatement.java)
 at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.execute(ResultSetReturnImpl.java:128)
 at org.hibernate.id.IdentityGenerator$InsertSelectDelegate.executeAndExtract(IdentityGenerator.java:87)
 at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:42)
 at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2933)
 at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3524)
 at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:81)
 at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:637)
 at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:282)
 at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:263)
 at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:317)
 at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:318)
 at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:275)
 at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:182)
 at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:113)
 at org.hibernate.jpa.event.internal.core.JpaPersistEventListener.saveWithGeneratedId(JpaPersistEventListener.java:67)
 at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:189)
 at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:132)
 at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:58)
 at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:783)
 at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:768)
 at sun.reflect.GeneratedMethodAccessor253.invoke(Unknown Source)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 at java.lang.reflect.Method.invoke(Method.java:498)
 at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:305)
 at com.sun.proxy.$Proxy162.persist(Unknown Source)


How-To
When I remove DYNAMIC_PREPARE=false parameter from my datasource url, ClassCastException does not happen so far.
But the root cause is still unknown.

2019/11/02

[閱讀筆記] 情緒勒索:那些在伴侶、親子、職場間,最讓人窒息的相處 (3/5)

  1. 當你開始練習相信自己「夠好」,存在於這個世界有其重要性與價值,重視自己的需求與感受甚於他人,不會常常委屈自己時,你就有足夠的自我價值與勇氣,去抵抗情緒勒索的手段
  2. 當「真實的自己」得以展現,自己的感受與想法可以被看見,被自我接納,你就會更有勇氣,讓別人看到這樣的你,而且更有機會,遇到願意接納、支持「真實的你」的人
  3. 我們無法忍受自己有「不完美」、「可能失敗」的部分,因為那是「不夠好的自己」,是不能被接受的、應該被剔除的。但是,那個「可能犯錯的自己」,其實是最真實而勇敢的;那個「完美的自己」,是一個符合社會期待,帶著面具與盔甲的「假我」
  4. 當我們越相信自己必須完美,就越不容許自己犯錯,更不能允許自己顯露出那個「真實、可能犯錯」的「脆弱自我」。然後,我們就離自己越來越遠,不相信「真實的自己」是能夠被喜愛、被接納的。如果,連自己都不接受真實的自己了,怎麼還能期待別人可以接受呢?
  5. 在這種「追求完美,不允許犯錯與失敗」的文化,使得我們失去創新的勇氣與能力,讓我們很容易放棄夢想,只能遵循被社會認可的路,一步一步走向別人為我們安排的目標
  6. 犯錯是常有的事情,當我們能夠將「事情」與「自我」分開,我們才有能力更清楚真實自己的樣貌。記住,即使我們能力很好,仍然有可能會犯錯,而犯錯或失敗,只是因為我做不好,並非我不好,從錯誤中吸取經驗,不貳過就好
  7. 身為一個人,我們有感受,也有需求。我們應該要被尊重、被理解,而不是被「你應該」的教條壓抑,使得兩人互動時,只有一個人的聲音。就算是與權威互動,仍然是兩人關係。在人與人之間的關係裡,人生而平等,即使職位、身份不同,但彼此都是一個獨立的個體,需要互相尊重、理解。
  8. 我們的傳統文化,教我們如何對權威者「順從」,卻忘了教導我們,如和「學會尊重別人」,以及如何學會「不讓別人不尊重地傷害我們」
  9. 試著問自己:「我總是擔心自己對不起別人,但是,我對得起自己嗎?」此時,或許你才會看得到,深埋在你內心身處的委屈與傷痛
  10. 「自我價值感」是每個人感覺到生活幸福滿足與否的重要依據。如何提升自我價值感呢?你只要練習「重視自己的感受」就好。
  11. 一個好配合的人,他人也可能在你的「好配合」中,忽略了重視你的需求與感受。當你開始重視、尊重自己的感受時,你開始懂得表達,懂得拒絕,懂得為自己的權益發聲。你會感覺到自己更有力量,更有勇氣,進而感覺到自己的重要性。而他人,也會在這個過程中,聽到你的表達與拒絕,學會了解你,也學會用你想要的方法尊重你,與你互動
  12. 當你不表達自己的感受與需求時,別人可能並不曉得我們需要什麼,而「忽略」就成為理所當然的事
  13. 「忽略」不一定是他人的「惡意」,而是因為我們的「擔心」。當我們過度單心「如果我表達出我的需求,別人會不會因而討厭我,或覺得我不好相處」,這種想法反而過度放大了「表達需求可能造成的不好後果」,也顯示我們對他人「缺乏信任」。
  14. 練習重視並表達自己的感受,不只是捍衛自己的權益,更重要的是,我們也在展現對這個世界與他人的信任
  15. 當兩人互動關係淪於只有一個人可以表達感受,或只為了滿足其中一個人的需求時,這段關係已經不再平衡、不再健康
  16. 你願意信任對方而表達你的感受,那是你的勇敢。但他不願意接受你的感受時,那仍然不是你的錯,因為你仍然可以表達出你的立場,表達出至少你「不想要犧牲自己的感受與需求而去滿足他」,這就展現了:你開始有勇氣去為自己捍衛權益,學會保護自己
  17. 你保護、尊重自己的感受與需求,並未要求他人犧牲自己的需求去滿足你,所以這並不是「自私」;但若他人若要求你為了他的感受與需求,而犧牲你自己的,這就是他的「自私」。因此,在不侵犯、傷害他人權益的基礎下,去重視自己的感受與需求,是一個尊重並保護自己的展現,也是提升自我價值的一個最好方法
  18. 當你開始「練習重視自己的感受」時,你就是開始「練習把自己找回來」。當你越尊重自己的感受,不再壓抑與忽略時,你也將越來越了解自己,開始感覺自己與這個世界的連結越來越深,也會讓你感受到自己存在於這世界的意義
  19. 當你在練習表達自己的需求與感受時,其實也是在練習拉起你的「界線」。你的表達才能讓別人知道:這界限之內的是我的領土,你需要尊重我的感受;而我的感受,正是你不能侵犯的範圍。如此一來,別人才有機會練習尊重你的「界線」、「感受」。在這個過程中,你也才有機會,感受別人的在意與自己對別人的重要性,進一步感受到:原來,我是個有價值的人,是個重要的人
  20. 當身邊的人出現情緒時,我們可能會戰戰兢兢,採取一些行去因應策略
討好
       當他人只要使用較為明顯的負面情緒,可能就會造成你很大的焦慮,你可能就會願意為了安撫他的情緒,讓他情緒變好而做任何事
       使用這種情緒因應策略的人,其實是特別容易陷入情緒勒索的循環中
逃避
       逃避的情緒因應策略包含情緒隔離、離開現場、搞笑、顧左右而言他等
       時常使用「逃避」策略的人,雖然會讓身邊親近的人,覺得他是「不在意」別人的感受,但很多時候,反而是因為他們「太在意」別人的情緒,甚至習慣性地覺得別人的情緒是自己造成的,應該是自己的責任
       實際上,這類人並不想要負這個責任,因為他們覺得自己沒有能力讓別人的情緒好轉,所以長期採取「逃避」策略,來因應他人情緒
說服
       如果我們太習慣地別人的感受負責,我們很難尊重別人與我看法不同時,可能會出現一些屬於他的負面情緒,當對方無法接受自己的說明與價值觀時,就會感到非常挫折、沮喪
       例如處在沮喪情緒的孩子,只想要一個人靜一靜,而發現「說服」策略無效的父母,就會變得沮喪、挫折,「覺得自己沒有成功讓對方情緒變好」,因此感受到自己的無能。為了保護自己,不讓自己感覺這麼糟,變成父母對孩子生氣
憤怒
       「憤怒」這個情緒因應策略,是「習慣承擔他人情緒責任」的常見因應策略。
       這都是很明顯的情緒界線模糊,習慣性地認為他人情緒是我的責任。以至於,當我們面對他人情緒不好時,下意識去承擔別人的情緒責任,因此我們想要扭轉、改善,當發現「沒辦法」的時候,就會感到生氣。這種ㄑ情況,特別容易在伴侶、家人間出現。原因是親密的關係中的情緒界線,本來就比較模糊,我們會因為「在意他們」,所以當他們情續不好時,會希望他們趕快好起來

2019/11/01

[閱讀筆記] The Innovator's Dilemma: When New Technologies Cause Great Firms to Fail (7/7)


  1. 探索不存在的市場 (non-existent markets) 最佳的研究方式是『採取行動』,而不是『被動觀察』(passive observation)
  2. 處理 disruptive innovations 的 business plan 的重點是計畫如何學習 (plan for learning),而非計畫如何執行一個預先想好的策略 (plan for executing a preconceived strategy)
  3. 結論:
    1. 某個產品的功能對於客戶現在來說是不實用的,或許未來他們就會用得到。因此,面對 sustaining innovations 時,傾聽客戶心聲是很重要的管理典範 (management paradigm),但是在 disruptive innovations 上,卻會造成誤導
    2. Innovation 提案必須獲得足夠的資金與人力,才有辦法成功。但是在組織內部的資源配置流程 (resource allocation process),決定資源調配的基準一定是獲利考量,在市場為知、客戶未知、成功機率未知的 innovation project 的優先權一定是擺在最後,最後就會因缺乏足夠資金與人力,而導致失敗
    3. 你將 disruptive product 放到 mainstream market 來探索新產品的可能性,結果一定是失敗的,看看電腦硬碟、挖土機與電動車產業就可以知道。你要為 disruptive product 找到新的市場,而非讓 existing customers 對其品頭論足
    4. 組織或個人所具備的能力,定義了過去解決問題的類型。但是,disruptive technology 所驅動的新市場,是不同的問題類型,需要不同的解決問題的能力
    5. 組織應保留資源來做 disruptive technology 的 trial and error,別把所有賭注放在第一個 idea,保留資源做多次嘗試,從失敗中快速學習,再次嘗試,透過這個過程了解 disruptive technology 順利商業化所需要的市場、客戶與技術
    6. Disruptive innovations 的先行者可以取得重大的 first-mover advantage,故取得領先地位是非常重要的;sustaining innovations 則未必
    7. 對於利用 disruptive innovations 進入市場的新進者,最強而有力的保護就是他們手上的 disruptive products,因為這些產品屬性都是被 established leaders 所忽略的。established firm 可以克服這個障礙,但是其必須先了解與解決 sustaining 與 disruptive technology 本質上的差異,賦予 disruptive technology 適當的 resource, process 與 value,才能獲得成功
  4. Disruptive technology 的原則
Disruptive technology 的原則
說明
① 資源依賴原則
  • 企業將資源投入到哪裡,是由客戶與投資人所決定的;
  • 企業為了存活,必須提供顧客想要的產品與服務,提供投資人想看到的獲利。績效越好的企業,就會有發展良好的篩選系統,剃除客戶不想要的點子。因此,disruptive technologies 很難獲得適當的資源 (因為在當下是顧客不想要的、低毛利的產品)
  • 當有一天,原本顧客說不要的產品,突然隔天說要的時候,此時,established firms 就會發現為時已晚
② 市場太小無法解決大企業所需的成長需求
  • 為了滿足投資人的期待,一定要不斷想辦法讓業績成長,故維持成長率會是很重要的事情。但是,當企業規模越大,就需要更多的收入才能維持預期的成長率
  • 由於要維持成長的原因,企業很難進入較新、較小的市場,所以其必定只聚焦於較大的市場
③ 不存在的市場無法進行分析與預測
  • 完整的市場分析與好的規劃,再加上好的執行力,是好的管理者的指標。但是,disruptive technology 因為市場還不存在,所以根本無法提供完整的市場分析,故計劃常會被擱置
④ 所提供的科技可能不等於市場需求
  • 儘管 disruptive technologies 在初期只能用在小市場,但是最終將會在 mainstream markets 變成很有競爭力。這是因為技術進步的腳步常會超越主流市場客戶想要的或可吸收的,當出現 overshoot performance 時,就是 disruptive technolgy 出現的時機
  • 當產生 performance oversupply 時,顧客就會調整挑選產品的條件,朝向可用性、便利性與價格的方向移動,此時較新的技術通常擁有較多的優勢

  1. 面對 disruptive technologies,身為管理者應該:
管理者的態度
說明
① 尋找需要此技術的顧客
  • 組織對 disruptive technologies 的責任,就是找到需要此技術的顧客,由這群顧客說明他們需要什麼,而非傾聽 mainstram customers 的意見
② 成立獨立的組織
  • 成立一個獨立組織來發展 disruptive technologies
③ 做好失敗的準備
  • 別將你所有的資源賭在第一次嘗試,通常第一次都會失敗,將你首次進行 disruptive technology 商業化所做的努力視為學習的機會,根據你所收集的資料重新規劃
④ 不要期待一開始就有重大進展 (breakthroughs)
  • 盡早開始,盡快取得 first mover advantage。
  • 尋找市場採行的技術的產品屬性,你可以發現到在現有主流市場以外的事物,你也會找到不受 mainstram markets 青睞的 disruptive technology 產品屬性,有一天會在新市場建立起來

  1. Disruptive technology 的特性:
    1. 單純、便宜且功能較少
    2. 產品通常都是低毛利
    3. Leading firms 中,貢獻獲利最多的客戶通常不想用它
    4. 初期商業化的市場通常是在剛浮現或是不重要的市場 (emerging or insiginificant markets)
  2. Leading firms 通常都會有往 upmarket 走的傾向,發展更複雜的產品,收取更高的價格,導致 leading firms 很難發展較簡單、價格較便宜的產品。
  3. Leading firm 面對 disruptive technology 常採取觀望態度,希望其發展成熟、進入 mainstream markets 後才開始採取行動,通常都為時已晚
  4. Disruptive technology 的初期特性是,其在目前對於主流客戶很重視的產品屬性表現較差,但是他找到另外一個市場的顧客所重視的其他產品屬性。等待期改善原本主流市場所重視的產品屬性已改善時,就是大舉進攻主流市場的時刻
  5. 當兩個或更多的商品滿足主流產品所需的功能時,顧客就會開始改變採購決策因素,通常就會從功能轉向可靠度、便利性到價格
  6. 大部分的人認為資深高階主管會對於未來公司走向,以及將資源投注到哪裡,做出重大決策。但是,其實真實的權力卻握在決定將那些提案 (proposals) 呈上給高階主管的中階員工 (midlevel employees)。你該想想有那些因素導致中階員工忽略或扼殺 disruptive technologies?
  7. 身為公司管理者,你該思考為什麼在大型企業的有抱負的員工,會因個人職涯考量,忽略或扼殺 disruptive technologies。管理良善的企業 (well-managed companies) 是否應思考並修改企業政策?
  8. 不同的市場擁有不同的需求,適用不同的技術;相同的,在不同的環境,組織的結構與管理方法,也應因地制宜
  9. 你應該將 disruptive technology 視為行銷挑戰 (marketing challenge),而非技術挑戰。你是透過技術來發掘市場的嗎? 
  10. 你該注意某些客戶認為是非常重要,另外一群人卻視為缺點的產品屬性 (product attributes),在未來,其有可能變成優點。千萬別等到有新的突破時,才著手改進技術的效能

2019/10/31

[Travel] 碧潭

DSC05773

DSC05770

DSC05774

DSC05775

2019/10/15

[Spring Framework] Extract static SQL statement to sql file

If we had some static SQL statement, it won't change based on specific condition, then we can consider to extract them into SQL file.

It will reduce line of code in your custom repository implementation class, it will be easier to maintain as well.

Assume SQL files is located in /resource/sql/common


Therefore, we can create a utility class to read the content of SQL file:
package tw.com.abc.analysis.util;

import org.springframework.stereotype.Component;
import org.springframework.util.ResourceUtils;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.stream.Stream;

@Component
public class SqlFileLoader {

    public String getSqlFile(String fileName) throws IOException {
        StringBuilder sql = new StringBuilder();
        try {
            File file = ResourceUtils.getFile("classpath:sql/common/" + fileName);
            Stream<String> lines = Files.lines(file.toPath());
            lines.forEach(l -> sql.append(l).append(" \n "));
        } catch (IOException e) {
            throw new IOException("cannot find sql file", e);
        }
        return sql.toString();
    }

}

2019/10/14

[Apache POI] How to set formula from another sheet?

Problem
I had two sheets in my excel file.
If some of cells in first sheet's formula is from second sheet, how to fulfill this requirement?

How-To
Remember to set formula after your code completed second sheet.
If you set formula before second sheet, it will not have any effect.


2019/10/13

[Spring Boot] found character '%' that cannot start any token. (Do not use % for indentation)

Problem
My application.yaml looks like:
excel:
  revenue:
    path: F:\\報表\\
    fileName: %s年%s月報表.xls



When I startup my spring boot project, it showed the following error message and fail to startup:
Caused by: org.yaml.snakeyaml.scanner.ScannerException: while scanning for the next token
found character '%' that cannot start any token. (Do not use % for indentation)
 in 'reader', line 8, column 15:
        fileName: %s年%s月報表.xls
                  ^


How-To
Add single quote to head and tail.
excel:
  revenue:
    path: F:\\報表\\
    fileName: `%s年%s月報表.xls`    



2019/10/12

[Apache POI] 常用 CellStyle 設定

Sample code:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
     // 為 cell 上色
     CellStyle headerCellStyle = workbook.createCellStyle();
     headerCellStyle.setFillForegroundColor(IndexedColors.LIME.getIndex());
     headerCellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
     headerCellStyle.setDataFormat(workbook.createDataFormat().getFormat("#,##0"));
     headerCellStyle.setFont(font);
    
     CellStyle highlightCellStyle = workbook.createCellStyle();
     highlightCellStyle.setFillForegroundColor(IndexedColors.LEMON_CHIFFON.getIndex());
     highlightCellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
     highlightCellStyle.setDataFormat(workbook.createDataFormat().getFormat("#,##0"));
    
     CellStyle footerCellStyle = workbook.createCellStyle();
     footerCellStyle.setFillForegroundColor(IndexedColors.LIME.getIndex());
     footerCellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
     footerCellStyle.setDataFormat(workbook.createDataFormat().getFormat("#,##0"));
     footerCellStyle.setFont(font);
    
     // 為 cell value 加上 1000 seperator
     CellStyle nonHighlightCellStyle = workbook.createCellStyle();
     nonHighlightCellStyle.setDataFormat(workbook.createDataFormat().getFormat("#,##0"));
    
     // 為 cell value 加上百分比
     CellStyle percentageCellStyle = workbook.createCellStyle();
     percentageCellStyle.setDataFormat(workbook.createDataFormat().getFormat("0.000%"));

2019/10/11

[Apache POI] How to draw border in Apache POI?

Problem
I would like to draw border as bellows:


How-To
You can make good use of  PropertyTemplate to draw border with ease.

If you would like to draw line for multiple tables, you can do this way: