Total Pageviews

2019/01/07

[Database] [Sybase] How to implement trim() in Sybase?

Problem
If I would like to remove unnecessary space from a column value, how to do it in Sybase?

Sybase does not have trim function which provide by Oracle.
Error: Function 'trim' not found. If this is a SQLJ function or SQL function, use sp_help to check whether the object exists (sp_help may produce a large amount of output).

SQLState:  S1000
ErrorCode: 14216


How-To
You can use ltrim and rtrim to fulfill this requirement:
select ltrim(rtrim('   123aa       '))


2019/01/06

[Java] How to generate XSD file from Java Bean?

Problem
How to generate XSD file from Java Bean?

How-To
Take one Dto class for example:
package com.demo.dto;

import lombok.Data;
import lombok.ToString;

@Data
public class M7480CallDto {
    private String m7480CallId;
    private String agentId;
    private String agentName;
    private String agentExtension;
    private String callTimeStr;
    private String answerTimeStr;
    private String callDisconnectionTimeStr;
    private String endPcpTimeStr;
    private Integer callWaitingDuration;
    private Integer callAgentDuration;
    private Integer callTalkingDuration;
    private Integer callPcpDuration;
    private Integer callDisconnectionStatus;
}

Sample code for conversion:
package com.demo.util;

import java.io.File;
import java.io.IOException;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.SchemaOutputResolver;
import javax.xml.transform.Result;
import javax.xml.transform.stream.StreamResult;

import com.demo.dto.M7480CallDto;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class XsdUtils {

    private final static String XSD_DIR = "F:\\git\\demo\\src\\main\\resources\\xsd\\";

    public static void main(String[] args) throws Exception {
        XsdUtils.generateXsdFile(M7480CallDto.class, "m7480CallData.xsd");
    }

    public static void generateXsdFile(Class clazz, String fileName) throws Exception {
        try {
            (JAXBContext.newInstance(clazz)).generateSchema(new SchemaOutputResolver() {
                @Override
                public Result createOutput(String namespaceUri, String suggestedFileName) throws IOException {
                    return new StreamResult(new File(XSD_DIR + fileName));
                }
            });
            log.debug("成功產生 Xsd 檔案到 " + XSD_DIR + fileName);
        } catch (IOException | JAXBException e) {
            log.error(e.getMessage());
            throw new Exception("產生 Xsd 檔案發生錯誤,錯誤原因" + e.getMessage());
        }
    }
}


Xsd file:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
 
    <xs:complexType name="m7480CallDto">
        <xs:sequence>
            <xs:element name="agentExtension" type="xs:string" minOccurs="0"/>
            <xs:element name="agentId" type="xs:string" minOccurs="0"/>
            <xs:element name="agentName" type="xs:string" minOccurs="0"/>
            <xs:element name="answerTimeStr" type="xs:string" minOccurs="0"/>
            <xs:element name="callAgentDuration" type="xs:int" minOccurs="0"/>
            <xs:element name="callDisconnectionStatus" type="xs:int" minOccurs="0"/>
            <xs:element name="callDisconnectionTimeStr" type="xs:string" minOccurs="0"/>
            <xs:element name="callPcpDuration" type="xs:int" minOccurs="0"/>
            <xs:element name="callTalkingDuration" type="xs:int" minOccurs="0"/>
            <xs:element name="callTimeStr" type="xs:string" minOccurs="0"/>
            <xs:element name="callWaitingDuration" type="xs:int" minOccurs="0"/>
            <xs:element name="endPcpTimeStr" type="xs:string" minOccurs="0"/>
            <xs:element name="m7480CallId" type="xs:string" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>
    
</xs:schema>






2019/01/05

[Spring] How to consume a SOAP web service

Problem
If I would like to consume a web service which provide by http://localhost:8080/ws/eaWs.wsdl

How to create SOAP client to consume web services?


How-To
1. Generate Java classes via SoapUI and save WSDL file into resources/wsdl

2. Create WsClientConfig class:
package com.example.soapClient.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.oxm.jaxb.Jaxb2Marshaller;
import org.springframework.ws.client.core.WebServiceTemplate;

@Configuration
public class WsClientConfig {
    
    private String defaultUri = "http://localhost:8080/ws/eaWs";
    
    @Bean
    public Jaxb2Marshaller jaxb2Marshaller() {
      Jaxb2Marshaller jaxb2Marshaller = new Jaxb2Marshaller();
      jaxb2Marshaller.setContextPaths("ws.oi2.npa.ea.country", "ws.oi2.npa.ea.emp");

      return jaxb2Marshaller;
    }

    @Bean
    public WebServiceTemplate webServiceTemplate() {
      WebServiceTemplate webServiceTemplate = new WebServiceTemplate();
      webServiceTemplate.setMarshaller(jaxb2Marshaller());
      webServiceTemplate.setUnmarshaller(jaxb2Marshaller());
      webServiceTemplate.setDefaultUri(defaultUri);

      return webServiceTemplate;
    }
}


3. Create Country Client Class
package com.example.soapClient.client;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.ws.client.core.WebServiceTemplate;

import ws.oi2.npa.ea.country.Country;
import ws.oi2.npa.ea.country.GetCountryRequest;
import ws.oi2.npa.ea.country.GetCountryResponse;

@Component
public class CountryClient {

    @Autowired
    private WebServiceTemplate webServiceTemplate;

    public void getCountry(String name) {
        GetCountryRequest request = new GetCountryRequest();
        request.setName(name);

        GetCountryResponse response = (GetCountryResponse) webServiceTemplate.marshalSendAndReceive(request);
        Country country = response.getCountry();

        System.out.println("[getCountry] name = " + country.getName() + ", capital = " + country.getCapital());
    }

}


4. Create Employee Client Class
package com.example.soapClient.client;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.ws.client.core.WebServiceTemplate;

import ws.oi2.npa.ea.emp.Employee;
import ws.oi2.npa.ea.emp.GetEmployeeByIdRequest;
import ws.oi2.npa.ea.emp.GetEmployeeRequest;
import ws.oi2.npa.ea.emp.GetEmployeeResponse;

@Component
public class EmployeeClient {

    @Autowired
    private WebServiceTemplate webServiceTemplate;

    public void getEmployeeByName(String name) {
        GetEmployeeRequest request = new GetEmployeeRequest();
        request.setName(name);

        GetEmployeeResponse response = (GetEmployeeResponse) webServiceTemplate.marshalSendAndReceive(request);
        Employee employee = response.getEmployee();
        System.out.println("[getEmployeeByName] id = " + employee.getId() + ", name = " + employee.getName());
    }

    public void getEmployeeById(Integer id) {
        GetEmployeeByIdRequest request = new GetEmployeeByIdRequest();
        request.setId(id);
        
        GetEmployeeResponse response = (GetEmployeeResponse) webServiceTemplate.marshalSendAndReceive(request);
        Employee employee = response.getEmployee();
        System.out.println("[getEmployeeById] id = " + employee.getId() + ", name = " + employee.getName());
    }

}


5. Do test
package com.example.soapClient;

import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

import com.example.soapClient.client.CountryClient;
import com.example.soapClient.client.EmployeeClient;

@SpringBootApplication
public class SoapClientApplication {

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

    @Bean
    CommandLineRunner test(CountryClient cClient, EmployeeClient eClient) {
        return args -> {
            cClient.getCountry("台灣");
            
            eClient.getEmployeeById(1);
            
            eClient.getEmployeeByName("Mandy");
        };
    }
}

Test result:
[getCountry] name = 台灣, capital = 台北
[getEmployeeById] id = 1, name = Albert
[getEmployeeByName] id = 2, name = Mandy



Reference
[1] https://spring.io/guides/gs/consuming-web-service/

2019/01/04

[Java] [Tool] How to generate Java code from WSDL via SoapUI?

Problem
How to generate Java code from WSDL via SoapUI?

How-To
Assume I have a WSDL file: http://localhost:8080/ws/eaWs.wsdl

Prerequisite
1. Download SoapUI from https://www.soapui.org/
2. Download Java and set JAVA_HOME

3. Download Apache CXF from https://cxf.apache.org/download.html and set CXF_HOME


Steps to generate Java code from WSDL via SoapUI 
1. File => New SOAP Project

2. Specify project name and WSDL


3. Right Click => Generate Code => Apache CXF


4. Click Tools to set Apache CXF path if you do not configure before



5. Specify Output Directory, Package

6. Specify encoding in Custom Args


7. Click Generate button





2019/01/03

[閱讀筆記] 人類大歷史 (1/6)


  1. 思考的代價:大腦結構極其脆弱,本來就不利於活動,更別說還得用個巨大的頭骨把它裝起來。而且大腦消耗的能量驚人,對智人來說,大腦只佔身體總重約 2% ~ 3%,但是在身體休息、不活動時,大腦的能量消耗卻佔了 25%。相比之下,其他猿類的大腦在休息時的能量消耗大約只佔 8%(p.15)
  2. 由於人腦較大,遠古人類付出的代價有兩種:(p.15)
    1. 首先是得要花更多時間找食物
      1. 這就像政府把國防預算轉撥給教育,人類也把手臂二頭肌所需的能量撥給了大腦裡的神經元
      2. 對於在非洲草原上,這究竟是不是好策略,事先只能說無人能知
    2. 其次是肌肉退化萎縮
      1. 雖然黑猩猩要講道理絕對講不贏智人,但是牠卻能直接把智人像個布娃娃一樣扯個稀爛
  3. 大多數哺乳動物脫離子宮的時候,就像是已經上釉的陶器出了窯,如果還想再做什麼調整,不是刮傷、就是碎裂。然而,人類脫離子宮的時候,卻像是從爐裡拿出一團剛融化的玻璃,可以旋轉、拉長,可塑性高到令人歎為觀止。正因如此,才會有人是基督徒或佛教徒、有人是資本主義奉行者或社會主義者,又或有人好鬥好戰、有人愛好和平。 (p.17)
  4. 當人類已知用火的時候,可說是控制了一項又聽話、又有無窮力量的工具。不像老鷹只能被動使用氣流,人類可以選擇要在什麼地點、什麼時候放出一把火來,而且火的用途各式各樣。最重要的是,火的能量並不會受到人類身體構造或力氣而有所侷限。就算是柔弱的女子,只要有一塊燧石就能敲出火花,或是有一根點火棍就能夠摩擦起火,就能在數小時內毀掉整片森林。懂得用火後,人類很多發展,已經水到渠成了。(p.21)
  5. 愛因斯坦能說的聲音,鸚鵡也都能說,而且鸚鵡還能模仿手機鈴聲、摔門聲、警笛聲。當然,愛因斯坦有很多地方還是比鸚鵡強得多,人類在語言這點可是遙遙領先。雖然人類只能發出有限的聲音,但是組合起來卻能產生無限多的句子,各有不同的含義。於是,我們就能吸收、儲存和溝通驚人的訊息量,並了解我們周遭的世界例如,綠猴能夠向同伴大叫「小心!有獅子!」;人類能夠告訴朋友,什麼時間、在哪裡,他看到有一群獅子正在跟蹤一群野牛,有了這些資訊,他的部落成員就能一起討論,該怎麼逼近河邊,把獅子趕走,讓野牛成為自己的囊中物。(p.31~32)
  6. 遠古時候所發展出來的語言,要傳遞的最重要訊息,不是關於獅子和野牛,而是關於人類自己。我們的語言發展成了一種傳播八卦的工具。即使到了今天,絕大多數的人類溝通,講的還是八卦。這對我們來說,真是再自然不過,就像我們的語言天生就是為了這個目的而生。你認為一群歷史教授碰面吃午餐的時候,聊的會是第一次世界大戰的起因嗎?而核物理學家在研討會中場茶敘的時候,講的仍然是夸克?的確有時候如此,但更多時候講的都是:哪個教授逮到老公偷吃、有哪些人想當上院長、哪個同事拿研究經費買了 Lexus 之類的。(p.33~34)
  7. 等到認知革命之後,至人有了八卦的能力,於是部落規模變得更大、更穩定。但是,八卦也有限制,社會學研究指出,藉由八卦來維持的最大「自然」團體約是 150 人。只要超過這個數字,大多數人就無法真正深入了解所有成員的生活情形。即使到了今天,人類的團體還是繼續受到這個神奇的數字影響。一旦突破了 150 人的門檻,事情就大不同。如果是一個師的軍隊,士兵達到萬人,就不能再用帶一個排或一個連的方式來領導;許多成功的家族企業,也是因為規模越來越大、開始僱用更多人員時,就會碰上危機,非得徹底重整,才能繼續成長 (p.37)
  8. 認知革命帶來的新能力與影響 (p.48)
    1. 能傳達更大量關於智人身邊環境的資訊
      1. 可用於規劃並執行複雜的計畫,例如躲開獅子、獵捕野牛
    2. 能傳達更大量關於智人社會關係的資訊
      1. 組織更大、夠有凝聚力的團體,規模可達 150
    3. 能夠傳達關於虛構概念的資訊,例如部落的守護神、國家、有限公司以及人權
      1. 促進大量陌生人間的合作
      2. 社會行為的快速創新
  9. 人類和黑猩猩之間真正不同的地方,就在於那些虛構的故事,像膠水一樣把千千萬萬的個人、家庭和群體結合在一起。這種膠水,讓我們成了萬物的主宰。說到底,我們和遠古人類的不同之處,就在於與大量陌生人合作的技術有了大幅提升。遠古要做出一把燧石矛,只要一個人、靠著幾位清勁的朋友提供建議與協助,就能在數十分鐘內完成;但現代要做出核彈,需要全世界上百萬個互不認識的人互相合作,有的是礦工,得開採位於地底深處的鈾礦,也有的是理論物理學家,要寫出長串的數學公式來描述次原子粒子的交互作用。(p.50)
  10. 「是什麼讓人跟其他動物不一樣?人為什麼得以統治世界?」因為人相信不存在的東西,因而能夠組成龐大社會,並建立其他動物難以蹴及的力量。所有的人類社會,都奠基在「一群人集體想像的不存在的東西」上面。宗教和部落的傳統顯而易見,即便是現代的社會,也需要社會成員彼此遵守同一套規範,並且彼此知道彼此遵守同一套規範。
  11. 貪食基因 (gorgin gene):三萬年前的採集者,想吃甜食只有一種可能,那就是熟透的水果。所以,石器時代的女性,一旦碰到一顆長滿甜美無花果的樹,最明智的做法就是吃到吃不下為止,否則等到附近的狒狒也發現這棵樹,可就一顆也吃不到。因此,這種想大口吃下高熱量食物的本能,就這樣深植在我們的基因裡。這也是為什麼高熱量對人不好,但是總是戒不掉的原因。現今的富裕國家都有肥胖的問題,幾乎像瘟疫一樣蔓延,還迅速將魔爪伸向開發中國家。(p.54)
  12. 有證據顯示,自從採集時代以來,直到現代,智人腦容量其實是逐漸減少的。現代人必須專精於自身小領域的知識,但對於其他生活中的必須,絕大多數都是倚靠其他領域的專家,每個人懂的都只侷限於自己的那一塊小天地。就整體而言,現今人類所知遠超過遠古人類;但在個人層面,遠古的採集者是有史以來,最具備多樣知識和技能的人類。為了生存,至人需要對所在地瞭若指掌,為了讓日常採集食物的效率達到最高,也需要了解每種植物的生長模式、每種動物的生活習性;他們需要知道哪些食物比較營養、哪些有毒、哪些又能拿來治病;他們需要知道季節的變化,怎樣的天候代表雷雨將至、或是乾旱將臨等等。(p.64)
  13. 要衡量某一物種演化成功與否,評斷標準就在於世界上其 DNA 雙螺旋的副本數量多寡。就像今天如果要說某間公司經營得成功與否,我們看的往往是該公司的市值有多少錢,而不是他的員工開不開心;而物種的演化成功與否,看的就是這個物種的 DNA 副本存在世界上的數量多寡。如果世界上不再有某物種的 DNA 複本,就代表該物種已經絕種,也等於公司沒錢而宣告倒閉。1000 DNA 副本永遠都強過 100 份,這正是農業革命真正的本質:讓更多的人,卻以更糟的狀況活下去。如果有人說,為了「增加至人基因組在世界上的複本數量」,希望你降低自己的生活水準,你會同意嗎?沒有人會同意這筆交易。簡單說來,農業革命就是一個陷阱 (p.100)
  14. 其實人類在歷史上不斷地重蹈覆轍,道理都相同:因為我們無法真正瞭解各種決定最後的結果(p.103)
  15. 歷史上少數真正顛撲不破的道理,就是原本的奢侈品往往最後會變成必需品,而且帶來新的義務。等到習慣某種奢侈品,就開始認為這是天經地義。接著就是一種依賴,最後,生活中就再也不能沒有這種奢侈品(p.105)
  16. 人類一心追求更輕鬆的生活,於是釋放出一股巨大的力量、改變世界的面貌,但衍生的結果並沒有任何人料想得到,甚至也不是任何人所樂見。並沒有人背後操縱農業革命的發生,或是意圖讓人依賴穀類維生。一開始只是各種小事,主要是希望吃飽一點、生活安全一點,但最後累積引起的效應,就是讓遠古的採集者開始花上整天的時間,在烈日下挑水務農。(p.106)
  17. 浮士德與魔鬼交易,人類則跟穀物交易。西元 1200 年的埃及的一對牛在耕田的墳墓壁畫:野生的牛群可以自在漫遊,也有自己複雜的社會結構。但牛隻遭到閹割和馴化後,一輩子就只能活在人類的鞭子下,活在狹窄的牛棚裡,獨自或成對提供勞力,既不符合生理需求,也無法滿足其社會及情感需求。等到牛拉不動犁了,就只有被屠宰之途。但是請注意,畫中的埃及農民也是駝著背幹活,這跟牛沒有兩樣,就是一輩子做著有害身體、心靈和社會關係的勞動工作。(p.109)
  18. 從狹隘的演化觀點來看,演化成功與否的標準在於 DNA 的複本數量,於是牛業革命對於雞、牛、豬、羊來說,可是一大福音。不幸的是,演化觀點並不是唯一判斷物種成功與否的標準。因為它一切只考量到生存和繁殖,而不顧個體的痛苦或幸福。雖然就演化而言,馴化的雞和牛可能是最成功的代表,但他們過的時事生物有史以來最悲慘的生活。動物的馴化是建立在一系列的野蠻作為,而且隨著時間,殘忍程度只增不減。(p.111)
  19. 對於大多數的家畜來說,農業革命是一場可怕的災難,這種演化的成功是沒有意義的。就算是瀕臨絕種的野生犀牛,比起關在小籠子裡變肥、等著成為鮮美牛排的肉牛,日子應該還是好過得多。雖然自己的物種即將滅絕,但這絲毫不會影響那頭野生犀牛對自己生活的滿意度。相較之下,肉牛這種物種雖然在數量上大獲成功,卻完全無法安慰納西單獨個體所承受的痛苦。(p.114)
  20. 人類在狩獵採集時代,並沒有合作的生物本能,但因為有共同的神話故事,幾百個陌生人就能互相合作。然而,這種合作畢竟比較鬆散且有限,各個智人部落還是各自生活,也能滿足大多數的自身需要。農業革命讓人能夠開創出壅擠的城市、強大的帝國,接著人類就開始幻想出偉大的神靈、祖國、有限公司的故事,好建立起必要的社會連結、網絡(p.120)