部落格

不定期分享技術文章

  • article-XML-介紹

    2024/2/2

    XML
    XML-介紹

    什麼是 XML

    xml 是可擴展標記性的語言,

    像是,下方具有儲存格式

    <!--  這是一個xml的範例 -->
    <!-- student.xml -->
    <!-- Student[id=1, name=John ] -->
    <!-- Student[id=2, name=Mary ] -->
    
    <students>
        <student id="1">
            <name>John</name>
        </student>
        <student id="2">
            <name>Mary</name>
        </student>
    </students>
    

    XML 的作用

    1.用來保存數據,而且這些數據具有自我描述性 2.它還可以做為項目或著模塊的配置文件 3.用來傳輸數據(但現在以 JSON 為主)

    XML 的語法

    1.文檔聲明

    <?xml version="1.0" encoding="utf-8" ?>
    <!--
        version: 版本
        encoding: 編碼
     -->
    <?xml version="1.0" encoding="utf-8" ?>
    <!---->
    <books><!--表示多個圖書訊息-->
        <book sn="123456"><!--表示一個圖書訊息-->
            <title>Book 1</title><!--圖書訊息-->
            <author>Author 1</author><!--圖書訊息-->
            <price>100</price><!--圖書訊息-->
        </book>
        <book sn="46546">
            <title>Book 2</title>
            <author>Author 2</author>
            <price>200</price>
        </book>
        <book sn="5465465">
            <title>Book 3</title>
            <author>Author 3</author>
            <price>300</price>
        </book>
    </books>
    

    什麼是 XML 標籤

    1.也分單標籤和雙標籤 2.與 HTML 一樣,XML 也是由標籤組成的,標籤是 XML 的基本組成單元,它是 XML 的一個重要特點。 3.屬性可以提供有關元素的其他信息,每個屬性值必須用引號括起來

    XML 標籤的命名

    1.標籤名稱可以包含字母、數字和其他字符 2.標籤名稱不能以數字或標點符號開頭 3.標籤名稱不能包含空格 4.標籤名稱不能包含 xml 等字符

    xml 的規則

    1.所有的 xml 元素都必須有一個關閉標籤 2.標籤是大小寫敏感的 3.所有的 xml 標籤都必須合理的嵌套 4.所有的 xml 文檔都必須有一個根元素(頂級元素)
    5.CDATA 區塊用於將文本片段包括在內,這些片段中可能包含一些特殊字符,這些特殊字符在 xml 中是非法的,但是在 CDATA 區塊中是合法的

    <![CDATA[<html>
        <head>
            <title>Example</title>
        </head>
        <body>
            <p>CDATA example</p>
        </body>
    </html>]]>
    

  • article-TypeScript-Exclude

    2024/2/1

    TypeScript
    TypeScript-Exclude

    Exclude<UnionType, ExcludedMembers>

    顧名思義,就是排除某些類型的意思。
    引用官方的說法:從 UnionType 中排除所有可分配給 ExcludedMembers 的聯合成員,以構建一個新的類型。

    Constructs a type by excluding from UnionType all union members that are assignable to ExcludedMembers

    用法

    1.排除某個型別

    type T0 = Exclude<"a" | "b" | "c", "a">; // "b" | "c"
    

    2.排除多個型別

    type text = "A" | "B" | "C" | "D" | "E";
    type T1 = Exclude<text, "A" | "B" | "C">; // "D" | "E"
    

    3.排除某個類型

    type T2 = Exclude<number | "b" | "c", string>; // number
    

    4.排除物件類型

    type animal = &#123;name: "dog"&#125; | &#123;name: "cat"&#125; | &#123;name: "pig"&#125;;
    type T3 = Exclude<animal, &#123;name: "dog"&#125;>; // &#123;name:"cat"&#125; | &#123;name:"pig"&#125;
    

    5.藉由形狀排除型別

    type animal = &#123;name: "dog"; age: number&#125; | &#123;name: "cat"&#125; | &#123;name: "pig"&#125;;
    type T4 = Exclude<animal, &#123;age: number&#125;>; // &#123;name:"cat"&#125; | &#123;name:"pig"&#125;
    

    6.藉由樣板文字排除型別

    type animal = "Adog" | "Bcat" | "Cdog" | "Dpig";
    type T5 = Exclude<animal, `$&#123;string&#125;$&#123;"dog" | "cat"&#125;`>; //"Dpig"
    

    小結

    Exclude 用來排除某些型別,可以用來排除單一型別、多個型別、某個類型、物件類型、形狀、樣板文字等等。

    參考資料

    Exclude
    9 Ways to Use Exclude in TypeScript-Matt Pocock

  • article-TypeScript-常用功能-Readonly

    2024/1/31

    TypeScript
    TypeScript-常用功能-Readonly

    Readonly 其實從字面上很好理解,就是指能讀取的意思。
    根據官方文件的說方就是不能被創造一個 Type 的型別物件,其設置的屬性不能被重新賦值。

    Constructs a type with all properties of Type set to readonly, meaning the properties of the constructed type cannot be reassigned.

    用法

    1. 整個型別都不能被重新賦值
    interface Todo &#123;
      title: string;
    &#125;
    
    const todo: Readonly<Todo> = &#123;
      title: "Delete inactive users",
    &#125;;
    
    todo.title = "Hello";
    
    1. 可以個別設置屬性為 readonly
    type Foo = &#123;
      readonly bar: number;
      readonly bas: number;
    &#125;;
    
    // 初始化
    const foo: Foo = &#123;bar: 123, bas: 456&#125;;
    
    // 不能被重新賦值
    foo.bar = 456; //
    

    實際使用場景

    React 中的 props 就是一個很好的使用場景,因為 React 為單向資料流,子組件不能修改父組件傳遞過來的 props,所以可以使用 Readonly 來設置 props 的型別,預防突然犯傻直接修改了 props。

    interface MyComponentProps {
      readonly name: string;
      readonly age: number;
    }
    
    function MyComponent(props: MyComponentProps) {
      // 使用 props.name,但不能修改它
      return 
    {props.name}
    ; }

  • article-TypeScript 的 LeetCode-TypeHero

    2024/1/26

    TypeScript TypeHero
    TypeScript 的 LeetCode-TypeHero

    近幾年很火的 TypeScript 加強了 JavaScript 的型別部分,但 TypeScipt 的型別系統其實相當的複雜,於是有人開源了類似 LeetCode 的網站,讓我們可以練習 TypeScript 的型別系統,這個網站就是 TypeHero,今天就來介紹一下這個網站吧!

    TypeHero:https://typehero.dev/

    操作介面

    操作介面相當簡單易懂的,左邊是題目,右邊是編輯器,下方是測試結果,上方是編輯器的設定,可以選擇編輯器的主題,以及是否顯示行號。

    說明區

    1.Description(說明):附帶蠻詳細有關 TypeScript 的解說
    2.Solutionru(解答):裡面會有需多人提供參考答案在上頭
    3.Submissions(提交):可以看到自己每一次的提交紀錄

    解答區

    提供一個簡單的編輯器,進行解答。
    題目會像是下面這種形式,然後要補充缺少的型別或是成是碼。

    未完成題目
    const playSong = (artistName, year) => &#123;
      return `$&#123;artistName&#125; was released in the year $&#123;year&#125;`;
    &#125;;
    
    const artistName = "Frank Zappa";
    
    const age = 52;
    
    interface Musician &#123;
      artistName: string;
    
      // add the rest
    &#125;
    
    const musicianInfo = (&#123;artistName, age, deceased&#125;) => &#123;
      return `$&#123;artistName&#125;, age $&#123;age&#125;$&#123;deceased ? " (deceased)" : ""&#125;`;
    &#125;;
    
    musicianInfo(&#123;
      artistName,
      age,
      deceased: true,
    &#125;);
    
    完成後的樣子
    const playSong = (artistName: string, year: number) => &#123;
      return `$&#123;artistName&#125; was released in the year $&#123;year&#125;`;
    &#125;;
    
    const artistName: string = "Frank Zappa";
    
    const age: number = 52;
    
    interface Musician &#123;
      artistName: string;
      age: number;
      deceased: boolean;
      // add the rest
    &#125;
    
    const musicianInfo = (&#123;artistName, age, deceased&#125;: Musician) => &#123;
      return `$&#123;artistName&#125;, age $&#123;age&#125;$&#123;deceased ? " (deceased)" : ""&#125;`;
    &#125;;
    
    musicianInfo(&#123;
      artistName,
      age,
      deceased: true,
    &#125;);
    

    測試區

    按下 submit 後,會進行測試,如果有錯誤會顯示在下方,如果沒有錯誤,會顯示通過。

    小結

    其實還蠻好玩的,可以有小範圍的練習機會,而且這種關卡的設計型式,通關後會有一種莫名的成就感,蠻適合像我這種初學的人~

  • article-Java-遞迴

    2024/1/25

    Java
    Java-遞迴

    遞迴是一種函式呼叫自己的技巧,遞迴的函式必須要有一個終止條件,否則會無限迴圈下去,直到記憶體爆掉為止。

    public class Recursion &#123;
        public static void main(String[] args) &#123;
            int result = sum(10);
            System.out.println(result);
        &#125;
    
        public static int sum(int k) &#123;
            if (k > 0) &#123;
                return k + sum(k - 1);
            &#125; else &#123;
                return 0;
            &#125;
        &#125;
    &#125;
    

  • article-Java-訪問權限

    2024/1/25

    Java
    Java-訪問權限

    所謂的訪問權限,其實就是訪問屬性、方法的權利和限制

    public

    1. public: 公共的,任意使用,訪問權限修飾符
    2. Java 中的public class只能有一個,且必須與檔名相同
    3. main 方法必須是 public static void,不加不能使用,因為 main 方法是由 JVM 調用的,JVM 應該可以任意調用,不該受到限制。
    4. static: 靜態的,靜態方法,靜態變數,靜態代碼塊,main 方法不加 staitic,一樣不能使用

    private

    1. private: 私有的,訪問權限修飾符
    2. private 修飾的變數,只能在所屬類中使用

    default

    1. (default): 默認的,當沒有設定訪問權限修飾符時,JVM 會默認提供一個訪問權限,就是 package(路徑)訪問權限,子 package 不能使用
    2. default 修飾的變數,只能在同一包中使用

    protected

    1. protected: 受保護的,訪問權限修飾符
    2. protected 修飾的變數,只能在同一包中使用,同 package 或是不同 package 子類都可以使用

    小結

    訪問權限由小到大排列
    1.private: 只能在本類中使用
    2.(default): 只能在同一包中使用,不同的包路徑就不能使用
    3.protected: 只能在同一包中使用,同包或是不同包子類都可以使用
    4.public: 任意使用,JVM 預設給的構造方法

    類的訪問權限

    外部類

    就是直接在程式碼中定義的類 1.外部類只能是 public 或是 (default) 修飾

    內部類

    就是在類中定義的類 1.內部類可以是 public、protected、(default)、private 修飾 2.內部類就當成外部類的屬性或是方法來使用

    內部類如何創建

    因為內部類是外部類的屬性或是方法,所以必須先創建外部類,才能創建內部類

    package basic;
    
    public class helloworld &#123;
        public static void main(String[] args) &#123;
        //內部類要先創建外部類
            Outer outer = new Outer();
            Outer.Inner inner = outer.new Inner();
            inner.show();
        &#125;
    &#125;
    
    class Outer&#123;
        public  class Inner&#123;
            public void show()&#123;
                System.out.println("Hi");
            &#125;
        &#125;
    &#125;
    

    Final

    Java 中提供一種語法,可以讓初始化的變數或是方法或是類不被改變,這種語法就是 final

    1. final 修飾的變數,只能被賦值一次,不能再次賦值
    2. final 不能被 JVM 默認賦值,必須手動賦值
    3. final 修飾的方法不能被覆寫
    4. final 修飾的類不能被繼承,也就是不能有子類
    5. final 不能修飾建構方法
    6. final 可以修改方法的參數,一旦修飾就不能被修改

    常用的方法搭配構造方法使用

    package basic;
    
    public class helloworld &#123;
        public static void main(String[] args) &#123;
        final String name = "John";
          User user = new User(name);
        &#125;
    &#125;
    
    class User&#123;
        public String name;
        public User(String name)&#123;
            this.name = name;
        &#125;
    &#125;
    

    單例模式

    使用情境:

    1. 當需要創建一個類的實例,但是又不希望每次創建新的實例時都創建一個新的時候

    實作概念:

    1. 單例模式是一種常用的設計模式
    2. 在單例模式中,類的構造方法是私有的
    3. 在單例模式中,類必須自行創建一個實例
    4. 在單例模式中,類必須自行向整個系統提供這個實例
    package basic;
    
    public class helloworld &#123;
        public static void main(String[] args) &#123;
            SingleMode singleMode1 = SingleMode.getInstance();
            SingleMode singleMode2 = SingleMode.getInstance();
            System.out.println(singleMode1 == singleMode2);
        &#125;
    &#125;
    
    class SingleMode&#123;
        private static SingleMode singleMode = null;
        private SingleMode()&#123;
    
        &#125;
        public static SingleMode getInstance()&#123;
            if(singleMode == null)&#123;
                singleMode = new SingleMode();
            &#125;
            return  singleMode;
        &#125;
    &#125;