Total Pageviews

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:

2019/10/10

[Excel] 規劃求解 - 假設有雞兔同籠,上有 35 顆頭,下有 94 隻腳,請問雞、兔個幾隻?

初始表格內容如下:


點選 [資料] => [規劃求解]


設定目標值,共有 94 隻腳


設定變數儲存格


設定條件 - 35 顆頭


按下 [求解] 按鈕


檢查結果 - 23 隻雞、 12 隻兔子






2019/10/09

[閱讀筆記] Measure What Matters (4/5)

  1. OKRs 與獎金不應緊密地綁在一起的原因是,有些人會訂定困難的目標來挑戰自己,有些人則會訂定簡單的目標,訂定困難目標的人可能只完成當初設定的 70%,訂定較簡單目標的人則可能完成 90%,你該給後者較高的獎金嗎?
  2. 主管與下屬的對話 (conversation) 通常會包含五個關鍵的部分
Critical areas in conversation
Description
目標設定與反思
(Goal setting and reflection)
員工的 OKR 計畫在於設定未來 OKR cycle 的目標。討論的重點在於個人的目標與關鍵成果,如何與組織的優先順序一致。
持續的工作進度報告
(Ongoing progress update)
快速瞭解員工即時的進度。progress update 會問兩個基本問題:有哪些事情有做好 (What’s working well)?哪些事情沒做好 (What’s not working well)?若有需要解決的問題,要儘速解決
雙向指導
(Two-way coaching)
主管協助激發下屬的潛力,下屬協助主管的工作做得更好
職涯發展
(Career growth)
主管協助下屬發展技能、找出成長的機會、擴展企業未來的視野
輕量級的績效評核
(Lightweight performance reviews)
回饋機制在於收集資訊,並且彙整員工從上次會議後迄今的完成狀況,是否符合組織的期望


  1. 回饋 (feedback) 是一種基於觀察與經驗所得到的意見,讓我們知道在別人眼中的看法。為了收成 OKRs 完整的果實,feedback 是整個過程中不可或缺的一個部分。如果你自己都不知道自己做的如何,你怎麼可能會知道如何做得更好呢?
  2. 現代的組織,feedback 應該是隨時的 (ad hoc)、即時的 (real time) 與多方向的 (multidirectional)。如果我們可以即時評價 Uber 司機 (司機也可以評價乘客)、即時在 Yelp 評價餐廳,為什麼在職場不能支援即時且雙向的主管與員工的回饋呢?讓員工可以有珍貴的機會告訴他們的主管:你需要我怎麼做讓你更成功?接下來換我告訴你,我需要你給我什麼協助?
  3. 有高度成就認可 (high-recognition) 的企業,較低認可的企業,離職率降低 31%。這裡有幾個可以執行的方法:
Recognition approaches
Description
建立同儕間的認可文化
(Institute peer-to-peer recognition)
當員工的成就時常被同儕所認可,感謝的文化就會孕育而生
訂定清楚的標準
(Establish clear criteria)
認可員工的行爲與結果:完成特殊專案、達成企業目標、展現企業價值等 (取代每月之星的活動)
分享認可的故事
(Share recognition stories)
透過 email 或公司的 blogs 來補充成就背後的意義
讓認可更加頻繁與可及
(Make recognition frequent and attainable)
對於較小的成就也要給予認可
將認可與企業目標、策略,緊緊綁在一起
(Tie recognition to company goals and strategies)
任何可以支援組織優先目標的事情 (ex. 客服、創新、團隊合作、成本縮減等),都要及時給予認可


  1. Adobe 在改變績效評核前後所做的調整

年度績效管理
持續績效管理
設定優先順序
在年初的時候設定優先順序 (priorities),設定完後就不會再重新審視
優先順序 (priorities) 設定完成後,主管會定期審視與調整
回饋流程
會經歷繁複的程序,包含員工遞交完成的結果與請求給予回饋,主管再撰寫審核意見
持續進行回饋的流程,並採取開放的對話方式,不拘泥於正式的文件
分紅決定程序
繁重地為每個員工評分與排名,最後再決定分紅比例
沒有正式的評分或排名,主管根據員工所完成的事項是否與企業整體目標是否一致來決定
績效評核會議
年底的時候才會進行績效評核,在過程中,員工也不知道自己做的是否有符合企業的目標與價值
每季會與員工進行討論,持續地給予回饋是一種常態。整個年度都會進行持續地討論與回饋,確保員工努力的方向是否與企業的目標一致
HR 的角色
管理整個績效評核的流程與紙本作業
訓練員工與主管能進行建設性的對話


  1. 離職 (turnover) 對於企業來說,成本是很高的。最好的離職是內部調職 (internal turnover),讓你的人才能夠在企業裡繼續發展他們的職涯,而非到其他地方發展。
  2. 在追求卓越的過程,企業所有成員在每天都要進行自我改進。領導者要變成更好的溝通者 (communicators) 與激勵者 (motivators),貢獻者 (contributor) 需要成長,更加守紀律 (disciplined)、成為謹慎的思考者 (rigorous thinkers)。當灌輸有意義的對話與回饋後,再加上有結構化的目標設定,會讓人們在有限的資源下,努力突破極限。
  3. 如果目標不明確,猶如棒球場上的外野飛球,到底是中外野手、還是右外野手要去接,若溝通不良,就會變成兩個外野手都覺得對方要去接而導致掉球,或是兩個外野手都要去接導致碰撞受傷。以書中的 Zume Pizza 為例,該企業的兩名外野手分別為行銷部門與產品部門,兩個部門都負責 Zume 的營收目標,雙方對於目標都感到疑惑,不知道何時、誰該去接球。此時,CEO 看出問題後,就把目標往下細分,行銷部門負責尋找新的營收,產品部門負責持續的營收。
  4. Better conversation 應當:
  5. OKRs 可以讓領導者清楚地表達最重要的事情 (priorities) 與洞見 (insights);CFRs 則是確保最重要的事情 (priorities) 與洞見 (insights) 有傳達給員工。但是目標在真空的環境是無法達成的,猶如聲波需要媒介 (i.e. 固體、液體、空氣) 才能傳遞。對於OKRs 與 CFRs 來說,組織文化就是傳遞的媒介 (medium),組織文化會活生生的表現其最珍視的價值觀與信仰。OKR 給予我們清楚的目標、CFR 提供我們達成目標的旅途中所需的能量
  6. 健康的組織文化與有結構的目標設定 (structural goal setting) 是互相依賴的,兩者是追求卓越的天生夥伴。
  7. 好的組織文化在於兩個元素
Elements
Description
Catalysts (催化劑)
包含支援工作的相關行為 (與 OKR 的精神相符):
  • 清楚定義的目標
  • 給予員工足夠的自主、時間與資源來協助完成工作
  • 以開放的心態從問題與成功中,習得教訓
Nourishers
(養分提供器)
包含人際間支援的行為 (與 CFR 相同):
  • 尊重與認可
  • 鼓勵
  • 情感的慰藉


  1. 當 OKR 建立起目標的肌肉,CFR 則是讓筋骨 (sinews) 更將有彈性且反應敏捷;脈搏偵測器 (i.e. feeback),則是用來衡量組織的即時健康狀況,包含身體與靈魂、工作與文化。
  2. 在過去,員工是根據命令來決定做事情 (do the next thing right),企業文化不是那麼重要;在現代,我們會要求員工做對的事情 (do the next right thing)。一本規章手冊 (rulebook) 可以告訴你哪些事情可以做、哪些事情不能做;但是,現在我需要文化來告訴我我該做什麼 (what I should do)。
  3. 若你要從 Good 變成 Great,首先,你必須先讓對的人上車,讓不適合的人下車,並且讓對的人在對的位置;接下來,你才開始轉動方向盤,並踩油門。
  4. OKRs 用於規劃人們該做什麼,追蹤實際執行進度與計畫間的差異,協調個人與團隊間的事情優先順序與里程碑。OKRs也常被使用於協助團隊成員專注於最重要的目標,避免被緊急但是較不重要的事情所分心。執行成效通常會用燈號來評分,0.0 ~ 0.3 是紅燈、0.4 ~ 0.6 是黃燈、0.7 ~ 1.0 是綠燈。
  5. 寫出好的 OKRs 不容易,以下列出幾個規則:
OKRs
Description
Objectives
  • 專注於 Whats
  • 傳達目標與目的;
  • 必須是積極的,但也不能過度脫離現實;
  • 必須是有形的、客觀的、清楚的,應該要讓理智觀察者能清楚判斷目標是否有達成
  • 目標的成功達標,必須提供企業清楚的價值
Key Results
  • 專注於 Hows
  • 傳達可衡量的里程碑;
  • 必須描述結果 (results),而非活動 (activities)。如果你的 KRs 包含尋求協助 (consult)、協助 (help)、分析 (analyze)、參與 (participate) 等字眼,這些是活動 (activity)。你的 KRs 要說明的是對這些活動的衝擊,例如 pbulish average and tail latency measurements from fix Colossus cells by March 7,而非 assess Colossus latency;
  • 必須包含完成的證據 (evidence of completion)。這些證據必須是可得的 (available)、可信任的 (credible)、容易發現的 (easily discoverable)。這些證據包含 change lists、metrics reports等。


  1. Committed vs Aspirational OKRs
Two variants
Description
Committed OKRs
  • 一定要達成的 OKRs,我們會願意調整時程與資源,來確保能夠如期交付
  • Committed OKRs 的預期分數為 1.0,若分數 < 1.0 就需要解釋原因,是規劃或是執行的失誤
Aspirational OKRs
  • 用來傳達我們希望世界的未來樣貌,即使我們沒有清楚的想法,該怎麼做或有哪些必要的資源來交付 OKR
  • Aspirational OKRs 預期平均分數為 0.7


  1. 典型的 OKR 撰寫錯誤與陷阱


Traps
Description
Trap #1 : 把 committed OKRs 與 aspirational OKRs 搞混
  • 誤將 committed OKRs 視為 aspirational 會增加失敗的風險。團隊成員可能不會正視此 OKRs,也可能不會改變優先權,轉而專注於執行其他 committed OKRs
  • 誤將 aspirational OKRs 視為 committed,會讓團隊成員產生防禦心理,因為他們不知道該怎麼執行;並且反而會讓真的 committed OKRs 缺乏足夠人員去執行
Trap #2 : 一如往常的 OKRs (business-as-usual OKRs)
  • OKRs 的撰寫常常是團隊成員相信可以完成的,且不會影響他們目前做事的方式,而非團隊真的想做的或是客戶真的想要的
Trap #3: 膽小的 Aspirational OKRs
  • 當你詢問「如果我們有額外的員工與一點幸運,我們可以怎麼做?」這就是 aspirational OKRs 錯誤的開始。你應該這麼問,「如果我們先不管目前的限制,多年後,我們的世界可能會變成什麼模樣?」
  • 石蕊測試 (litmus test):如果你詢問你的客戶,他們要什麼,你的 aspirational objective 是否符合或超越他們的要求?
Trap #4:威嚇 (Sandbagging)
  • 團隊的 committed OKRs 應該會消耗大部分的資源,但不應是全部的資源。
  • Committed + Aspirations OKRs 必定會超越團隊資源所能負擔。資深管理者須重新配置人員與其他資源,使其能夠有效率執行
Trap #5:低價值的目標 (aka 沒人在意的 OKR)
  • LVOs (Low Value Objectives) 是那種即是完成分數是 1.0,也沒有人注意或在意。
Trap #6:缺乏足夠的
KRs 來完成 Os
  • OKRs 會切分成想要的結果 (objective) 以及可衡量的步驟來達成想要的結果 (key results)。這是非常重要的,當 KRs 都得到 1.0,objective 的分數也會是 1.0
  • 缺乏足夠的 key results 來完成目標,是一個很常見的錯誤。錯誤原因來自於團隊排斥較困難的投入 (resource / priority / risk),所以會避免較難的 key results。
  • 這個陷阱所造成的負面影響特別嚴重,因為會延遲得知達成目標所需的真正的資源需求,並且會延遲完成目標的時程
  • 石蕊測試 (litmus test):當所有的 key results 都得到 1.0,是否無法達成預定的目標?如果是,就需增加或重新制定 key results,直到其能成功達成目標為止。