Total Pageviews

2020/11/10

[Java] [Spring] How to configure Spring profile?

Problem
I am using jsoup to download excel file from google drive via Java.

I need to connect to google drive via http proxy in office, and can connect to google drive without proxy at home.

How to use Spring profile to configure to fit my different working environment?


How-To
1. Create a DownloadService Interface
package com.cht.tool.filegenerator.service;

import java.io.IOException;

public interface DownloadService {

    void downloadExcel() throws IOException;

}

2. Create a JSoupDefaultService serivce and mark with default profile
package com.cht.tool.filegenerator.service;

import lombok.extern.slf4j.Slf4j;
import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

@Slf4j
@Service
@Profile({"default"})
public class JSoupDefaultService implements DownloadService {

    @Value("${jsoup.from}")
    private String from;

    @Value("${jsoup.to}")
    private String to;

    public void downloadExcel() throws IOException {
        log.debug("default profile");
        Connection.Response response = null;
        try {
            response = Jsoup.connect(from)
                    .ignoreContentType(true)
                    .execute();
        } catch (IOException e) {
            throw new IOException("fail to connect to google drive, error : " + e.getMessage(), e);
        }
        log.debug("status code = {}", response.statusCode());

        Files.write(Paths.get(to), response.bodyAsBytes());
        log.debug("excel file downloaded.");
    }

}

3. Create a JSoupService service and mark with office profile
package com.cht.tool.filegenerator.service;

import lombok.extern.slf4j.Slf4j;
import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

@Slf4j
@Service
@Profile("office")
public class JSoupService implements DownloadService {

    @Value("${jsoup.from}")
    private String from;

    @Value("${jsoup.to}")
    private String to;

    @Value("${jsoup.proxy}")
    private String proxy;

    @Value("${jsoup.port}")
    private int port;

    public void downloadExcel() throws IOException {
        log.debug("office profile");
        Connection.Response response = null;
        try {
            response = Jsoup.connect(from)
                    .proxy(proxy, port)
                    .ignoreContentType(true)
                    .execute();
        } catch (IOException e) {
            throw new IOException("fail to connect to google drive, error : " + e.getMessage(), e);
        }
        log.debug("status code = {}", response.statusCode());

        Files.write(Paths.get(to), response.bodyAsBytes());
        log.debug("excel file downloaded.");
    }

}


4. Create a default profile in yaml
spring:
  profiles:
    active: default


5. Write Test code in Spring Application
package com.cht.tool.filegenerator;

import com.cht.tool.filegenerator.service.DownloadService;
import com.cht.tool.filegenerator.service.FileGeneratorService;
import com.cht.tool.filegenerator.service.JSoupService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.annotation.EnableAsync;

import java.nio.file.Files;
import java.nio.file.Paths;

@Slf4j
@SpringBootApplication
public class FileGeneratorApplication {

    @Value("${jsoup.to}")
    private String to;

    public static void main(String[] args) {
        SpringApplication.run(FileGeneratorApplication.class, args);
    }

    @Bean
    CommandLineRunner run(FileGeneratorService fileGeneratorService, DownloadService downloadService) {
        return args -> {
            if (Files.exists(Paths.get(to))) {
                Files.delete(Paths.get(to));
            }
            downloadService.downloadExcel();

            fileGeneratorService.writePropertyFile();
            fileGeneratorService.writeFtpPropertyFile();
            fileGeneratorService.writeFtlFile();
            fileGeneratorService.writeSqlFile();
        };
    }
}

6. Do test
2020-07-24 11:18:50.529 DEBUG 6628 --- [           main] c.c.t.f.FileGeneratorApplication         : Running with Spring Boot v2.3.1.RELEASE, Spring v5.2.7.RELEASE
2020-07-24 11:18:50.529  INFO 6628 --- [           main] c.c.t.f.FileGeneratorApplication         : The following profiles are active: default
2020-07-24 11:18:51.328  INFO 6628 --- [           main] c.c.t.f.FileGeneratorApplication         : Started FileGeneratorApplication in 1.355 seconds (JVM running for 2.489)
2020-07-24 11:18:51.343 DEBUG 6628 --- [           main] c.c.t.f.service.JSoupDefaultService      : default profile
2020-07-24 11:18:53.501 DEBUG 6628 --- [           main] c.c.t.f.service.JSoupDefaultService      : status code = 200
2020-07-24 11:18:53.732 DEBUG 6628 --- [           main] c.c.t.f.service.JSoupDefaultService      : excel file downloaded.





2020/11/09

[Java] [IntelliJ] How to set Spring profile in IntelliJ

Requirement
Assume I have two Spring profile, default and office, how to set office profile in IntelliJ?


How-To
Step 1. Run ➡️ Edit Configuration

 
Step 2. Fill in office to Activate profiles ➡️ Click OK



2020/11/08

[閱讀筆記] The Bullet Journal Method: Track Your Past, Order Your Present, Plan Your Future (7/7)

  1. Custom Collection 是設計用來滿足特定需求。其可以是簡單的購物清單,或是複雜的長期計劃。建立 Custom Collection 是 BuJo 中最具創意、快樂與有意義的層面,因為你自主想辦法解決眼前所面臨的挑戰。

  1. Daily Log 設計用來記載大小事,但是 Custom Collection 是為了特定目的而存在。你應避免將所有資訊都記載在 Custom Collection,這樣會變成 junk drawer Collection。如果你無法從 Collection 學習到有意義的資訊,這就是一個毫無價值的 Collection,也就不需要花時間去維護它,不要浪費你的時間在那些無法對你的生活增加價值的 Collections

  2. Custom Collections 三個關鍵的來源

Key Sources

說明

① 目標

  • 目標是很重要的,它提供了做這件事情的意義、方向與目的

  • Custom Collection 可以協助我們將目標分解成多個 elements,讓我們可以一個一個處理

② 挑戰

  • 生活中有許多挑戰會讓我們感到憤怒、焦慮、不知所措或自我批判。

  • 一旦我們在 Custom Collection 中,清楚描述所面臨的挑戰,可以讓我們專心於發展解決方案與追蹤執行進度。

③ 任務

  • 許多 Collection 一開始只有一個簡單任務,例如「規劃假期」。

  • 若只有單一一個任務,你會感到不知所措,但是「規劃假期」對於你來說應該是感到興奮而非焦慮,你該做的是將任務往下展開,產生多個大小適中、可執行、易管理的多個小任務


  1. 建立 Custom Collection 的步驟

Steps

說明

① 腦力激盪

  • 開啟動每個專案前,我都會 Custom Collection 的首頁寫下初始的想法,無論是文字、影像、心智圖等,此做法可以卸下 (unload) 你心中的想法,並讓你對此專案感到興奮。

② 檢視動機

  • 無論你的專案是寫一本書、規劃假期、重新裝潢地下室等,你必須先檢視做這件事情的動機:

    • [Why] 為什麼要做這個專案?

    • [What] 解決了什麼需求?如:更有品質的家庭時光、透過衝浪與森林浴讓身心獲得放鬆等

  • 透過找到我們真實的動機,可以增加我們行動的潛在影響力。換句話說,瞭解你為什麼感到被迫做某件事,可以協助你更好地定義做某件事。(Understanding why you feel compelled to do something will help you better define how to do something.)


  1. 定義動機的練習

Template

I want to ____ [what] so that I can __ [why] by ___ [how].

Example

I want to go on vacation so that I can relax by not being in the office.

找出動機

  • 未必要透過「旅行」才能達到「暫時離開辦公室」的目的。這趟旅程有什麼原因真的讓你感到期待?使用 Five Whys 的方法來捫心自問:

    • 為什麼你想要度假?要放鬆一下

    • 為什麼?因為工作讓我感到喘不過氣且感到沮喪

    • 為什麼?工作內容重複、枯燥且讓我感到孤獨

    • 為什麼?我的生活都被侷限在座位,無法看到我在意的人

    • 為什麼?因為我無法花時間與所關心的人相處

找出動機後,修正句子

I want to go on vacation so that I can remind myself what I am working for by spending quality time with people I care about while we have fun exploring a tropical place together.

Example 2

I want to go to nursing school so that I can help people by learning how to treat illness and suffering.


  1. 設計師知道自己已達到完美境界,不是再也沒有任何東西可添加,而是再也沒有任何東西可以剔除。(A designer knows he has achieved perfection not when there is nothing left to add, but when there is nothing left to take away)

  2. Collection 的設計注意事項

① 功能性

(functionality)

  • Collections 是協助你完成你目標的工具,而非妨礙你的石頭。你該重視的是 Collections 功能性與內容,而非形式 (form) 與筆記本外觀

  • 不要一開始太貪心,一口氣想做很多事情,秉持 less is more 的原則,挑選且專注於最重要的事情,之後再慢慢增加

  • 撰寫時要思考,一年後再回頭看的時候,是否看得懂。秉持 future-proof 的原則,你現在寫的,必須讓數年後的自己,重新閱讀這段文字時,可以迅速回想起當時是怎麼做的、為什麼行得通 (why & how)

  • Collection 的設計要簡單 (simple)、專注 (focued) 與相關 (relevant),詳細記載哪些方法行得通,哪些行不通,幫助你找出改善的機會

② 易讀性

(legibility)

  • 易讀性不僅僅是我們在 BuJo 上所書寫的內容,也包含我們剔除的事物。(Legibility is not just about what we put on the page, it is also about what we leave off.)

  • 如同 graphic design 中所保留的空白,不要把整個畫布畫滿,你反而應適度保留 white space,才能讓主題更聚焦、清晰也有結構。

③ 長久性

(Sustainability)

  • 維護 Collection 很花時間與精力,務必確保內容所要做的事情是值得的

  • 以 BuJo 的組成元素來說:

    • Index 用來解決找不到內容的挫折感;

    • Monthly Log 用來鳥瞰本月需要做的重要事情與預計要花的時間

  • 遇到不值得花這麼大力氣的事情,你就簡化它,讓未來花越少力氣在這些瑣事上

  • BuJo 可以讓你知道你對什麼事情感到好奇,有哪些事情吸引你注意。

  • 經過一段時間的撰寫 BuJo,你就可以找出什麼樣的格式可以讓你思考更清晰、更專注、讓你的進度更有意義。

  • 撰寫 BoJo 可以讓你更有意識的生活,不僅知道你在做什麼 (what you are doing),也可以知道你如何做 (how you are doing it),是協助你持續改進的工具。


  1. Benjamin Franklin:「如果你沒有做好準備,你就準備失敗。(If you fail to plan, you are planning to fail)」你無法完全避免失敗,但是在你投入專案前,做好事前規劃,可以大大增加成功的機率。在你投入專案之前,你應先停下來,定義有哪些參數 (parameters) 與變數 (variables),確保最佳化使用你的時間與精力,有條理地列出你的行動計畫。這個過程,你就像廚師,設想你預計要端出的佳餚,需要有哪些食材,如何處理食材、烹飪等。

  1. 當我們建立主要 Collection 後,可以問自己一些問題,透過問題分解出多個 subcollection:

VACATION TO THE NETHERLANDS


MISSION STATEMENT

I want to go on vacation (WHAT) so that I can remind myself what I am working for (WHY) by spending quality time with people I care about while we have fun exploring a tropical place together (HOW).



DESTINATIONS

  • Where do I want to go in the Netherlands?


ACTIVITIES

  • What do I want to do?

  • What do my travel companions like to do?


TIME

  • Vacation days available

  • Flight time

  • Local commute time

  • Activities duration


BUDGET

  • Flight

  • Car rental

  • Lodging

  • Gas

  • Food

  • Acitivities



  1. 清單 / 列表 (list) 是我們常用來記錄工作事項的方式,以下有幾個方法,讓你的清單保持專注且可管理,過多的清單只會把你壓得喘不過氣,反而忽略了重要的事情:

① 確認優先順序

(Prioritizing)

  • 我們在草擬清單時,如同在搜集資料,列出一堆事項。一旦覺得列的差不多時,就該花時間退一步與反思:

    • 哪些項目引發你的興趣?哪些沒有?

    • 依據你的 mental scale,給予每個項目權重,利用 Signifier 來標注出最重要的項目,與剔除不重要的瑣事

② 為項目加上情境

(Context)

  • 情境 (context) 可以提供額外資訊給我們,協助我們確認優先順序與決策。

  • 例如,去荷蘭的Alkmaar cheese market,單看此項目會沒有感覺,但是你加上地理位置 (location)、交通時間 (time) 與交通 / 飲食成本 (cost),感覺就會不一樣,當你得知每週五才會有歡樂的起司搬運活動,你就不會在禮拜三到此景點。


  1. 加上 context 的清單的例子:

荷蘭行

T (時間)

L (地點)

$ (成本)

起司市集

週五/9~12

N (North)

$120

* 小孩堤防

週六/一整天

S (South)

4-hr

莫瑞泰斯皇家美術館

週日/14~17

W (West)

$65

羊角村 (Giethoorn)

週一/一整天

E (East)

$140


  1. Peter Drucker :「你無法管理你無法衡量的事物」(You can’t manage what you can’t measure)。

  1. 在追求進度 (progress) 時,你必須了解的不僅是哪些方法管用、哪些方法不管用(what),還要了解為什麼(why)。例如,減重 10 磅很好,但其與上健身房無關,了解與飲食有關反而是更有價值的事。有些關聯或許不總是這麼直接,但是只要我們持續追蹤,一定可以找出模式,讓我們更了解因果關係。我們知道的越多,我們就可以更有效率,取得更多進步與進度。

  2. Bullet Journal 不在於其外觀如何,重點是 BuJo 讓你感覺如何以及效果如何 。BuJo 是一台自我探索的方法,協助你發現你所在意的事物與你想過的生活 (what you care about and the life you want to live)。BuJo Method 可以在自我發現的旅程中協助你,過程中一切端視你是否樂意正視過去的限制,或許你可以從中發現自己的潛力。