Total Pageviews

2020/02/29

2020/02/28

[Travel] 2020/02 嘉義


嘉義公園

嘉義公園

嘉義公園

嘉義公園

嘉義市立棒球場

2020/02/10

[Docker] 如何將預先準備好的 SQL 檔案,於啟動時匯入 Oracle Docker

1. 確認 Docker 所 mount 的 directory

2. 將準備好的 SQL file(s) 放到特定目錄下



3. 指定 volume,將 sql 所存放的路徑 (i.e. /Users/guojunyou/Documents/docker/local-initdb) 對應到 /etc/entrypoint-initdb.d
docker run -d --shm-size=2g -p 8080:8080 -p 1521:1521 \
-e NLS_LANG="TRADITIONAL CHINESE_TAIWAN.AL32UTF8" \
-v /Users/guojunyou/Documents/docker/local-initdb:/etc/entrypoint-initdb.d \
42dda6eba3ea


Reference
[1] https://hub.docker.com/r/orangehrm/oracle-xe-11g

2020/02/09

[Docker] 如何解決 Oracle Docker 匯入資料繁體中文亂碼問題

Problem
我有準備好 create table 與 insert data 的語法在指定目錄,並用以下指令啟動 docker:
docker run -d --shm-size=1g -p 8080:8080 -p 1521:1521 \
-v /Users/guojunyou/Documents/docker/local-initdb:/etc/entrypoint-initdb.d \
42dda6eba3ea

並成功啟動 Oracle docker
guojunyoude-iMac:~ guojunyou$ docker logs 4445b2acf933 --details
 Starting Oracle Net Listener.
 Starting Oracle Database 11g Express Edition instance.

 Database init...

 /start.sh: running /etc/entrypoint-initdb.d/data.sql

 Table created.

 1 row created.

 1 row created.

 1 row created.

 1 row created.

 End init.
 Oracle started successfully!

發現所 insert 的資料都是亂碼


How-To
這是因為編碼所導致的問題,在啟動指令增加一個參數
-e NLS_LANG="TRADITIONAL CHINESE_TAIWAN.AL32UTF8" 即可解決亂碼問題
docker run -d --shm-size=1g -p 8080:8080 -p 1521:1521 \
-e NLS_LANG="TRADITIONAL CHINESE_TAIWAN.AL32UTF8" \
-v /Users/guojunyou/Documents/docker/local-initdb:/etc/entrypoint-initdb.d \
42dda6eba3ea




2020/02/08

[Docker] Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection

Problem
As I tried to pull a docker image, I got the following error message:
F:\git
λ docker pull orangehrm/oracle-xe-11g
Using default tag: latest
Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: 
request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)


How-To
Configure proxy and restart docker


Pull again 
F:\git
λ docker pull orangehrm/oracle-xe-11g
Using default tag: latest
latest: Pulling from orangehrm/oracle-xe-11g
cb56c90f0b30: Pull complete
0acc551e5716: Pull complete
8956dcd35143: Pull complete
908242721214: Pull complete
b44ff14dd3bb: Pull complete
81ac3d025953: Pull complete
b555aeaf1117: Pull complete
e1896669ff82: Pull complete
9437119349eb: Pull complete
96e36910991c: Pull complete
2de589c896ac: Pull complete
c5510f7fcb03: Pull complete
c09e52e19f4b: Pull complete
abbfadca26af: Pull complete
c14464a9caeb: Pull complete
4468bbe36672: Pull complete
85cfa88ee1f2: Pull complete
d4831108a661: Pull complete
0821dd9b7524: Pull complete
b19f8225db0a: Pull complete
3001b1e31fbc: Pull complete
585b27c5a8cb: Pull complete
4977c21ef050: Pull complete
acf12f209883: Pull complete
51a0fc043bdd: Pull complete
47759cd1519f: Pull complete
Digest: sha256:b56c95bb59dfef4ee8d373713209105dedb52f09d56c82f94edb29f1fac3b60c
Status: Downloaded newer image for orangehrm/oracle-xe-11g:latest
docker.io/orangehrm/oracle-xe-11g:latest

2020/02/07

[Mac] 無法打開XXX,因為它來自未識別的開發者

Problem



How-To
到安全性及隱私權


強制打開


2020/02/06

[Docker] error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.40/version:

Problem
When I try to get my docker version, I get the error message as bellows:
F:\git\doodle\cheers2019 (master -> origin)
λ docker version
Client: Docker Engine - Community
 Version:           19.03.5
 API version:       1.40
 Go version:        go1.12.12
 Git commit:        633a0ea
 Built:             Wed Nov 13 07:22:37 2019
 OS/Arch:           windows/amd64
 Experimental:      false
error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.40/version: open //./pipe/docker_engine: The system cannot find the file specified.
 In the default daemon configuration on Windows, the docker client must be run elevated to connect. This error may also indicate that the docker daemon is not running.

How-To
Start up docker


Check again:
F:\git\doodle\cheers2019 (master -> origin)                     
λ docker version                                                
Client: Docker Engine - Community                               
 Version:           19.03.5                                     
 API version:       1.40                                        
 Go version:        go1.12.12                                   
 Git commit:        633a0ea                                     
 Built:             Wed Nov 13 07:22:37 2019                    
 OS/Arch:           windows/amd64                               
 Experimental:      false                                       
                                                                
Server: Docker Engine - Community                               
 Engine:                                                        
  Version:          19.03.5                                     
  API version:      1.40 (minimum version 1.12)                 
  Go version:       go1.12.12                                   
  Git commit:       633a0ea                                     
  Built:            Wed Nov 13 07:29:19 2019                    
  OS/Arch:          linux/amd64                                 
  Experimental:     false                                       
 containerd:                                                    
  Version:          v1.2.10                                     
  GitCommit:        b34a5c8af56e510852c35414db4c1f4fa6172339    
 runc:                                                          
  Version:          1.0.0-rc8+dev                               
  GitCommit:        3e425f80a8c931f88e6d94a8c831b9d5aa481657    
 docker-init:                                                   
  Version:          0.18.0                                      
  GitCommit:        fec3683                                     




2020/02/05

[Intellij IDEA] How to build project automatically

By default, Intellij IDEA doesn’t compile classes automatically. 

But, you can enable the auto compile feature by following steps :
File => Settings => Build, Execution, Deployment => Compiler => Checked "Build project automatically"


2020/02/04

[Java] [Freemarker] Generate Text file from FTL - example 2

Requirement
I would like generate text file as bellows:
FreeMarker Template example: Hello World!

        ===================(Page:0001)
        ======  County List   ======
        ========================
        1. 台灣
        2. Japan
        3. The Netherlands


        ===================(Page:0002)
        ======  County List   ======
        ========================
        4. United Kingdom
        5. France
        6. Canada


        ===================(Page:0003)
        ======  County List   ======
        ========================
        7. United States
        8. Italy

------------------------------
Number of Record(s): 0000000008
Print date: 19 Nov 19

FTL file
<#-- 設定 locale,讓日期印出來是英文
     https://freemarker.apache.org/docs/ref_directive_setting.html  -->
<#setting locale = "en_US">

<#-- 宣告變數用來儲存總筆數與頁數
     https://freemarker.apache.org/docs/ref_directive_assign.html -->
<#assign total = 0>
<#assign page = 1>

<#-- 取得現在日期 -->
<#assign dateTime = .now>
<#assign date = dateTime?date>

FreeMarker Template example: ${message}

<#list countries as country>
    <#-- 一頁三筆資料 -->
    <#if total % 3 == 0>
        <#-- 第二頁開始才在表頭增加兩行空白 -->
        <#if page gt 1>


        </#if>
        <#-- 將 page number 格式化 -->
        ===================(Page:${page?string["0000"]})
        ======  County List   ======
        ========================
        <#assign page = page + 1>
    </#if>
        ${country_index + 1}. ${country}
        <#assign total = total + 1>
</#list>

------------------------------
Number of Record(s): ${total?left_pad(10, "0")}
<#-- https://freemarker.apache.org/docs/ref_builtins_date.html -->
Print date: ${date?string["dd MMM yy"]}


Test Case
package com.test.batch;

import com.test.batch.exception.FtlException;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import lombok.Builder;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class FtlTest {

    private Configuration cfg;

    @Before
    public void init() {
        cfg = new Configuration();
        // 設定到 classpath 讀取 ftl file
        cfg.setClassForTemplateLoading(this.getClass(), "/");
    }
    
    @Test
    public void testCountriesFtl() {
        try (Writer file = new FileWriter(new File("C:/ftl_countries.txt"));) {
            Template template = cfg.getTemplate("ftl/countries.ftl");

            Map<String, Object> data = new HashMap<>();
            data.put("message", "Hello World!");

            List<String> countries = new ArrayList<String>();
            countries.add("台灣");
            countries.add("Japan");
            countries.add("The Netherlands");
            countries.add("United Kingdom");
            countries.add("France");
            countries.add("Canada");
            countries.add("United States");
            countries.add("Italy");

            data.put("countries", countries);

            template.process(data, file);
        } catch (IOException | TemplateException e) {
            throw new FtlException("fail to generate file from ftl file : " + e.getMessage(), e);
        }
    }

}



2020/02/03

[Java] [Freemarker] Generate Text file from FTL - example 1

Requirement
I would like to generate text file as bellows:
分行代碼  貸款代碼   客戶代碼  流水號
808      12345678   0000001   111                           
303      87654321   0000002   222                           
123      45678912   0000003   333                           
-------------------------------------------------
Number of Record(s): 0000000003


FTL File
<#assign total = 0>
<#if rows??>
分行代碼  貸款代碼   客戶代碼  流水號
<#list rows as row>
<#-- https://freemarker.apache.org/docs/ref_builtins_string.html#ref_builtin_right_pad -->
${row.branchId?right_pad(16)}${row.custLoanNumber?right_pad(11)}${row.custId?right_pad(10)}${row.ext1?right_pad(30)}
<#assign total = total + 1>
</#list>
<#else>
No Data Found!
</#if>
<#-- https://freemarker.apache.org/docs/ref_builtins_string.html#ref_builtin_left_pad -->
-------------------------------------------------
Number of Record(s): ${total?left_pad(10, "0")}


Test Case
package com.test.batch;

import com.test.batch.exception.FtlException;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import lombok.Builder;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class FtlTest {

    private Configuration cfg;

    @Before
    public void init() {
        cfg = new Configuration();
        // 設定到 classpath 讀取 ftl file
        cfg.setClassForTemplateLoading(this.getClass(), "/");
    }
    @Test
    public void testBankFtl() {
        try (Writer file = new FileWriter(new File("C:/ftl_bank.txt"));) {
            Template template = cfg.getTemplate("ftl/bank.ftl");

            Map<String, Object> data = new HashMap<>();

            List<Row> rows = new ArrayList<Row>();
            rows.add(Row.builder().branchId("808").custLoanNumber("12345678").custId("0000001").ext1("111").build());
            rows.add(Row.builder().branchId("303").custLoanNumber("87654321").custId("0000002").ext1("222").build());
            rows.add(Row.builder().branchId("123").custLoanNumber("45678912").custId("0000003").ext1("333").build());

            data.put("rows", rows);

            template.process(data, file);
        } catch (IOException | TemplateException e) {
            throw new FtlException("fail to generate file from ftl file : " + e.getMessage(), e);
        }
    }

    @Getter
    @Builder
    public static class Row {
        private String branchId;
        private String custLoanNumber;
        private String custId;
        private String ext1;
    }

}





2020/02/02

[閱讀筆記] 正義:一場思辨之旅 (2/3)

  1. 志願軍的反對意見:
  1. 代理孕母的爭議:我們都必須思考兩個問題 - 我們在自由市場上所做的選擇有多自由?是不是有特定的德性與更高的才或是無法由市場表彰,而且是錢買不到的?
  1. 三種常見看待正義的方式:
方式
說明
功利主義
  • 福利最大化與正義連結
  • 能夠造成福利或是整體社會的集體幸福最大化,就是正義
自由放任主義
  • 自由與正義連結
  • 不受約束、自由的市場,就是正義;管制市場,就是侵害個人的選擇自由
提倡德性
  • 德性為基礎連結正義
  • 認為正義就是給予人在道德上應得的東西,也就是分配財貨以獎勵並提倡德性


  1. 康德的意見:
方式
說明
功利主義
[反對] 
  • 只因為一件事物為許多人帶來快樂,不代表那件事物是對的
  • 僅因多數人偏好特定法律,並不代表法律就合乎正義
  • 功利主義對道德毫無貢獻,其只會算計福利最大化
自由放任主義
[贊同]
  • 每個人都值得尊重,不是因為我們對自己擁有所有權,而是因為我們是理性的個體,擁有推理能力;我們也是自主的個體,擁有行動與選擇上的自由
  • 我們的理性能力和自由能力密不可分,這兩種能力共同為我們賦予了獨特性,使我們過著不只是動物般的生活,也使我成為不只是忙著滿足嗜欲的動物而已。
提倡德性
[反對]
  • 道德不能建立於單純的經驗考量上,這些因素會隨著其他條件而改變,無法作為普世道德原則的基礎,例如普世人權


  1. 根據康德的說法,自由的行為就是自主 (autonomy) 的行為,而行為要能夠自主,就是依據我為自己訂定的法則行事,而不是根據自然的決定或社會的慣例行事。例如,你放開一顆撞球,那顆撞球就會往下掉,在掉落的過程中,撞球不是自由行事,而是受到自然律的支配,也就是萬有引力定律;又如我從 Taipei 101 跌落下來(或被人推下來),當我墜落地面時,絕對不會有人說我是自由的,我就跟那顆撞球一樣,被萬有引力定律所支配。自由的行為不是選擇達成特定目標的最佳手段,而是選擇目標本身,為了目標本身而做出選擇,人類能做出這種選擇,但撞球以及大多數的動物卻不能
  1. 他律決定的例子:做一件事是為了另一件事,而另外那件事又是為了另一件事,以此類推。我們如果從事他律行為,就是為了外力給予我們的目標而行事。在這種狀況下,我們對於自己追求的目標而言,只是工具,不是創造者
  1. 自主的概念:一旦我們依據自己為自己訂定的法則從事自主的行為,即使是為了該項行為本身而從事那個行為,那個行為本身就是目的。這種自主行動的能力就是為人類生活賦予特殊尊嚴的因素,標誌了人與物的不同
  2. 康德認為,動機有分成兩種:
方式
說明
義務動機
  • 只有義務動機能夠賦予行為道德價值,也就是做一件事是因為那件事是正確的
  • 只要為了正確的理由而做出正確的事情,因此感到愉悅就不會有損其道德價值
喜好動機
  • 繫安全帶是精明算計的行為,非道德行為


  1. 康德認為的道德最高原則
方式
說明
對比一:道德
  • 義務動機 vs. 喜好動機。
  • 只有義務動機能夠為行為賦予道德價值
對比二:自由
  • 自主 vs. 他律。
  • 我們如果擁有自由的能力,必定也有依循其他某種法則行事的能力,一種不同於物理定律的法則。如果我們的行為只單純受到物理定律支配,就與一顆往下掉的撞球受到地心引力支配無異
對比三:理性
  • 定言令式 (categorical imperative)  vs. 假言令式 (hypothetical imperatives)。
  • 定言令式:定言指的就是「無條件的」,也就是沒有任何漏洞或意外。定言令式關注的不是行為的內容以及可能帶來的後果,而是行為的形式,以及產生行為的準則。只有定言令式有資格成為道德令式
  • 假言令式使用「工具性理性」:你如果想要X,就做Y。你如果想要或得良好商譽,就誠實對待你的顧客。假言令式關注的是行為的內容以及可能帶來的後果。
對比四:立場
  • 理智界 vs. 感官界
  • 身為自然個體,我們屬於感官界的一份子,我們的行為受到自然法則以及因果規律性所決定;身為理性個體,我們生活在理智界裡,在這裡,獨立於自然法則之外,我們擁有自主能力,能夠為自己訂定的法則行事


  1. 定言令式的例子
定言令式
說明
把你的行為準則普世化
  • 行為準則 (maxim) 是只為你的行為提供理由的規則或原則,也就是說我們應該只遵循能夠在毫不矛盾的情況下予以普世化的原則。
  • 此種原則的目的在於看出我的行為準則是否合乎定言令式。普世化的驗證方式,用以確認我們即將採取的行動,是否把自己的利益與特殊處境擺在其他所有人的利益之前
把人視為目的
  • 假設某個東西的存在本身具有絕對價值,其本身就是目的。
  • 人是有理性的個體,本身就是一種目的,而不是僅供某種意志恣意使用的工具。人與物之間的根本差異,就是人是理性個體。人不只有相對價值,而是有絕對價值,一種內在價值,也就是說,理性個體擁有尊嚴。


  1. 絕對與相對:為什麼兩個人都會有同樣的行為舉止呢?因為這就是一種「相對」,絕對中的相對;從宗教的角度來舉例,基督教徒信仰基督耶穌為唯一的真神,這是絕對,可相對於非宗教信徒者或他教的信徒而言,就非絕對,再換個例子,台灣的藍綠政黨,某種程度上也都是彼此的絕對,而對人民來說又是相對。
  2. 康德主張的道德與自由:任何奠基在利益上的原則,必定只會是「條件式原則」,不可能成為「道德法則」。
 
  1. 道德不是經驗性的,而是與這個世界隔著一些距離,道德會評判這個世界;雖然科學擁有強大的力量與洞見,卻無法觸及道德問題,原因是科學只能在感官界中運作。
  2. 康德主張,謊言與誤導性的真話之間存在著具有道德重要性的差異,精心建構的迴避說詞是向說實話的義務致敬,但直接說謊沒有做到這一點。在簡單撒謊即可過關的情況下,一個人如果還費心提出一項具有誤導性,但嚴格來說並未違背事實的陳述,即是表達了對於道德法則的尊重,不論這樣的表達有多麼含糊不清。
  1. 美國政治哲學家 John Rawls 在《正義論》(A Theory of Justice) 著作中,主張思考正義的方式就是詢問我們在初始平等狀態中,會同意接受哪些原則。在大家都不知道自己是 Bill Gates 或街頭流浪漢的前提下,會浮出兩項正義原則:
正義原則
說明
❶ 為公平提供平等的自由
  • 例如言論與宗教自由,這項原則優先於社會效用與整體福利的考量
  • 我們不會願意為了社會與經濟利益而犧牲自己的根本權利與自由。
❷ 社會與經濟平等
  • 這項原則不要求所等與財富的平等分配,根據 Rawls 提到的「差異原則」:如果社會與經濟不平等對社會中最弱勢成員是有利的,我們應該要允許這樣的不平等
  • 究竟差異原則有多大的平等效果?很難判定,因為酬勞差異的小過取決於社會與經濟情境。假設為醫生提供較高的酬勞,以提升偏鄉醫療照顧的供給與品質,這就擁有正當性


  1. 我們經常質疑人所訂立的協議是否公正,而且我們也熟知那些可能造成劣質協議的偶然條件:訂定協議的一方可能比較精於談判,或者佔據比較有利的談判地位,或是叫了解交易事物帶有的價值。電影《教父》當中的老柯里昂的那句名言:「我會開出一個他拒絕不了解的協議」,就顯示了大多數的談判或多或少太有的那種壓力。
  2. 契約只有在實現「自主性」與「互惠性」這兩項理想的情況下,才會具有道德份量。就自願行為而言,契約表達我們的自主性;其中規定的義務之所以具有效力,因為那是我們自願承擔,也就是我們自由地把那些義務背負在自己身上。就互利工具而言,契約援引了互惠的理想;履行契約的義務來自於另一項義務,也就是必須回報別人為我們提供的利益。在實務上,自主性與互惠性未必完美實現。有些協議雖然是自願達成,卻不是對雙方都有利。
  1. 契約的道德限制:第一,協議的事實不保證協議的公平性;第二,同意不足以創造出具有約束力的道德主張權。例如,某個無知的老婦人,被一個無恥的水電工利用、牟利,只是修理馬桶漏水就收取十萬的費用,即便是水電工沒有脅迫婦人,此項協議是出於自願,卻一點也不足以確保其中交換的利益是平等或相近的。
  2. 在現實生活裡,每個人的處境各自不同,可能有談判能力與知識的差異。只要這點成立,協議的事實本身就不足以保證協議的公平性。這就是為什麼實際上的契約並非獨立自足的道德工具。我們總是有充分的理由可以問:「雙方同意的條件是否公平?」
  3. 人有出身之別,透過自由放任主義的觀點,只是創造出形式上的機會主義;透過功績主義的觀點,雖然彌補了不平等的教育機會,但是彌補不了不平等的自然天賦。但是,如果不接受功績市場社會,唯一替代選項就是強加限制天賦出眾者的齊頭式平等。