<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>笔记 on MoeJue&#39;s Blog</title>
    <link>https://en.moejue.cn/zh-hant/tags/%E7%AC%94%E8%AE%B0/</link>
    <description>Recent content in 笔记 on MoeJue&#39;s Blog</description>
    <generator>Hugo -- 0.151.2</generator>
    <language>zh-hant</language>
    <lastBuildDate>Sun, 06 Jul 2025 14:25:00 +0000</lastBuildDate>
    <atom:link href="https://en.moejue.cn/zh-hant/tags/%E7%AC%94%E8%AE%B0/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>多鏈支援，真沒你想的那麼簡單</title>
      <link>https://en.moejue.cn/zh-hant/posts/269/</link>
      <pubDate>Sat, 05 Jul 2025 08:20:55 +0000</pubDate>
      <guid>https://en.moejue.cn/zh-hant/posts/269/</guid>
      <description>&lt;h4 id=&#34;多鏈錢包整合的實踐反思&#34;&gt;多鏈錢包整合的實踐反思&lt;/h4&gt;
&lt;p&gt;總算是空閒下來可以整理一下程式碼了，Web3 專案接入多鏈錢包連接功能，主要涉及 Ethereum、Polygon、BSC 和 Solana。乍一聽好像只是「多做幾套相容邏輯」的事，但真正落地後才發現，很多東西其實沒想得那麼簡單。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;this.networkConfigs = {
    ethereum: {
        chainId: &amp;#39;0x1&amp;#39;, // 1
        chainName: &amp;#39;Ethereum Mainnet&amp;#39;,
        nativeCurrency: {
            name: &amp;#39;Ethereum&amp;#39;,
            symbol: &amp;#39;ETH&amp;#39;,
            decimals: 18
        },
        rpcUrls: [&amp;#39;https://eth-mainnet.public.blastapi.io&amp;#39;],
        blockExplorerUrls: [&amp;#39;https://etherscan.io&amp;#39;]
    },
    polygon: {
        chainId: &amp;#39;0x89&amp;#39;, // 137
        chainName: &amp;#39;Polygon Mainnet&amp;#39;,
        nativeCurrency: {
            name: &amp;#39;MATIC&amp;#39;,
            symbol: &amp;#39;MATIC&amp;#39;,
            decimals: 18
        },
        rpcUrls: [&amp;#39;https://polygon-rpc.com&amp;#39;],
        blockExplorerUrls: [&amp;#39;https://polygonscan.com&amp;#39;]
    },
    bsc: {
        chainId: &amp;#39;0x38&amp;#39;, // 56
        chainName: &amp;#39;BNB Smart Chain&amp;#39;,
        nativeCurrency: {
            name: &amp;#39;BNB&amp;#39;,
            symbol: &amp;#39;BNB&amp;#39;,
            decimals: 18
        },
        rpcUrls: [&amp;#39;https://bsc-dataseed.binance.org&amp;#39;],
        blockExplorerUrls: [&amp;#39;https://bscscan.com&amp;#39;]
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&#34;多鏈並非簡單的支援多個錢包&#34;&gt;多鏈並非簡單的「支援多個錢包」&lt;/h4&gt;
&lt;p&gt;最大的感受是：鏈不一樣，錢包互動方式也不一樣，連 SDK 的思維方式都不一樣。以太坊生態可以用統一的 Web3.js 處理很多邏輯，而到了 Solana，你會發現它完全是另一套系統：Provider 接入、連接流程、PublicKey 建構方式都不太一樣，甚至連網路延遲和穩定性都影響體驗。&lt;/p&gt;</description>
    </item>
    <item>
      <title>[筆記] Git 常用命令大全（按場景分類）</title>
      <link>https://en.moejue.cn/zh-hant/posts/264/</link>
      <pubDate>Mon, 02 Jun 2025 06:58:42 +0000</pubDate>
      <guid>https://en.moejue.cn/zh-hant/posts/264/</guid>
      <description>&lt;p&gt;適用於日常開發中對 Git 的常見操作。透過分類整理，幫助你快速上手或查閱。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;-基礎指令&#34;&gt;📦 基礎指令&lt;/h2&gt;
&lt;p&gt;指令&lt;/p&gt;
&lt;p&gt;用途&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git init&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;初始化一個 Git 儲存庫（建立 &lt;code&gt;.git&lt;/code&gt; 資料夾）。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git clone &amp;lt;url&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;將遠端儲存庫複製到本地。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git status&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;查看目前工作目錄狀態（檔案修改、暫存等）。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git add &amp;lt;file&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;將檔案新增到暫存區。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git commit -m &amp;quot;message&amp;quot;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;提交暫存區檔案到本地儲存庫，並新增提交訊息。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git log&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;查看提交歷史。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;-分支管理&#34;&gt;🌱 分支管理&lt;/h2&gt;
&lt;p&gt;指令&lt;/p&gt;
&lt;p&gt;用途&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git branch&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;查看本地分支列表。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git branch &amp;lt;branch-name&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;建立一個新分支。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git checkout &amp;lt;branch-name&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;切換到指定分支。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git switch &amp;lt;branch-name&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;切換到指定分支（推薦使用的新指令）。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git merge &amp;lt;branch-name&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;將指定分支合併到目前分支。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git branch -d &amp;lt;branch-name&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;刪除已合併的分支。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git branch -D &amp;lt;branch-name&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;強制刪除分支。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;-遠端儲存庫操作&#34;&gt;🌍 遠端儲存庫操作&lt;/h2&gt;
&lt;p&gt;指令&lt;/p&gt;
&lt;p&gt;用途&lt;/p&gt;</description>
    </item>
    <item>
      <title>什麼是Web3.0，與區塊鏈又有什麼關係？</title>
      <link>https://en.moejue.cn/zh-hant/posts/202/</link>
      <pubDate>Mon, 17 Jun 2024 12:59:22 +0000</pubDate>
      <guid>https://en.moejue.cn/zh-hant/posts/202/</guid>
      <description>&lt;p&gt;又是一個莫名其妙的詞語的新起-。- 我大致歸納為以下幾個點&lt;/p&gt;
&lt;h2 id=&#34;什麼是web30&#34;&gt;什麼是web3.0&lt;/h2&gt;
&lt;p&gt;Web 3.0（Web3）是下一代網際網路的發展方向，旨在創建一個更加去中心化、用戶控制和數據保護的網路環境。與之前的Web 1.0（靜態網頁）和Web 2.0（動態、互動式網頁和社交媒體）不同，Web 3.0的核心理念和技術包括以下幾個方面：&lt;/p&gt;
&lt;h3 id=&#34;去中心化&#34;&gt;去中心化：&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;區塊鏈技術：Web 3.0的核心是區塊鏈技術，它提供了一個去中心化的帳本，記錄所有的交易和數據變化。這意味著數據不再由單一的中央伺服器控制，而是分佈在多個節點上。&lt;/li&gt;
&lt;li&gt;分佈式應用（DApps）：這些應用程式運行在區塊鏈網路上，沒有中心化的控制者。DApps的用戶可以直接進行交易和互動，而無需通過中介機構。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;用戶控制和數據保護&#34;&gt;用戶控制和數據保護：&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;用戶主權身份：在Web 3.0中，用戶可以完全控制自己的數位身份和數據。通過加密技術，用戶可以決定誰可以訪問他們的数据以及如何使用這些數據。&lt;/li&gt;
&lt;li&gt;數據所有權：用戶的數據儲存在去中心化的網路上，用戶擁有數據的所有權，而不是由大公司集中管理和控制。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;智能合約&#34;&gt;智能合約：&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;自動執行協議：智能合約是在區塊鏈上運行的自動化協議，當滿足特定條件時自動執行。這種技術可以用於各種場景，如金融交易、供應鏈管理和法律合約。 互操作性：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;跨平台和跨鏈技術：Web 3.0致力於實現不同區塊鏈和分佈式網路之間的互操作性，使得數據和資產可以在不同平台之間無縫轉移。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;去信任化和透明度&#34;&gt;去信任化和透明度：&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;無信任機制：Web 3.0通過區塊鏈技術實現了無信任機制，即參與者無需互相信任或依賴第三方中介，就能進行安全的交易和互動。&lt;/li&gt;
&lt;li&gt;透明性：所有交易和數據變更記錄在區塊鏈上，公開透明且不可篡改，提高了信任度和安全性。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;web-30的應用場景&#34;&gt;Web 3.0的應用場景&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;去中心化金融（DeFi）：通過智能合約和區塊鏈技術，提供無需中介的金融服務，如借貸、交易和投資。&lt;/li&gt;
&lt;li&gt;數位身份：用戶可以創建和管理自己的數位身份，控制個人數據的訪問和使用。&lt;/li&gt;
&lt;li&gt;供應鏈管理：通過區塊鏈技術，實現供應鏈的透明和可追溯性，防止偽造和欺詐。&lt;/li&gt;
&lt;li&gt;內容創作和分發：藝術家、音樂家和作家可以直接與觀眾互動和交易，獲得更公平的收益分配。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;那什麼又是區塊鏈呢&#34;&gt;那什麼又是區塊鏈呢？&lt;/h2&gt;
&lt;p&gt;區塊鏈技術是一種分佈式帳本技術（Distributed Ledger Technology, DLT），用於記錄交易和資訊的不可篡改、去中心化的資料庫。區塊鏈技術的核心思想是通過去中心化的方式實現數據的安全、透明和可信。&lt;/p&gt;
&lt;h3 id=&#34;區塊鏈的基本原理&#34;&gt;區塊鏈的基本原理&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;區塊（Block）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;區塊是包含交易記錄的數據包。每個區塊包含多個交易和一個哈希值（用於唯一標識該區塊）。&lt;/li&gt;
&lt;li&gt;區塊還包含上一個區塊的哈希值，從而將所有區塊連接成鏈，形成區塊鏈。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;鏈（Chain）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;區塊通過哈希值相互連接，形成一個鏈式結構。每個區塊包含前一個區塊的哈希值，這使得區塊鏈中的數據難以篡改。&lt;/li&gt;
&lt;li&gt;如果試圖更改一個區塊中的數據，將導致該區塊及其後續所有區塊的哈希值發生變化，需要重新計算所有這些區塊的哈希值，這幾乎是不可能的。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;去中心化（Decentralization）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;區塊鏈網路中的所有節點（電腦）都保存一個完整的區塊鏈副本，這些副本通過共識機制保持一致。&lt;/li&gt;
&lt;li&gt;沒有中央機構控制或管理區塊鏈，數據由所有節點共同維護。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;共識機制（Consensus Mechanism）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;區塊鏈網路使用共識機制來確保所有節點對區塊鏈的狀態達成一致。常見的共識機制包括工作量證明（Proof of Work, PoW）和權益證明（Proof of Stake, PoS）。&lt;/li&gt;
&lt;li&gt;工作量證明（PoW）：礦工通過解決複雜的數學問題來驗證交易，並將其添加到區塊鏈中。解決問題需要大量計算能力，確保了區塊鏈的安全性。 權益證明（PoS）：驗證者根據其持有的加密貨幣數量和其他因素來驗證交易，並獲得相應的獎勵。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;加密技術（Cryptography）： -區塊鏈使用加密技術確保數據的安全性和隱私性。每個交易都使用公鑰和私鑰進行簽名和驗證，確保只有合法的所有者才能發起交易。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;區塊鏈的優點&#34;&gt;區塊鏈的優點&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;安全性：
&lt;ul&gt;
&lt;li&gt;數據分佈在多個節點上，沒有單點故障，攻擊者難以篡改數據。 每個區塊包含上一個區塊的哈希值，篡改一個區塊需要更改整個鏈條，成本極高。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;2.透明性：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;區塊鏈上的所有交易記錄都是公開可見的，任何人都可以查閱。 交易記錄不可篡改，提高了系統的透明度和信任度。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;3.去中心化：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;沒有中央控制機構，所有節點平等參與網路的維護和管理，防止了單點控制和權力集中。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;4.不可篡改性：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一旦數據被寫入區塊鏈，就很難被篡改，確保了數據的完整性和真實性。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;區塊鏈的應用場景&#34;&gt;區塊鏈的應用場景&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;加密貨幣：&lt;/p&gt;</description>
    </item>
    <item>
      <title>熱敏藍牙印表機開發</title>
      <link>https://en.moejue.cn/zh-hant/posts/100/</link>
      <pubDate>Tue, 05 Nov 2019 14:49:50 +0000</pubDate>
      <guid>https://en.moejue.cn/zh-hant/posts/100/</guid>
      <description>&lt;p&gt;最近在做小票打印這塊，項目需求是IOS和安卓兩種都要實現，開始做的時候也是一臉懵，然後網上找了不少資料，踩了一堆坑，看了好多文章，結果還好成了&lt;br&gt;
藍牙打印機一般分為兩種打印模式，票據打印、標籤打印&lt;/p&gt;
&lt;p&gt;公司買的渣渣打印機連開發文檔都沒有，害我走了不少坑，讓我開發買的時候也不諮詢諮詢我&lt;br&gt;
目前微信小程序連接藍牙打印機 wx.createBLEConnection 測試在IOS設備上沒有問題，在部分安卓手機上會出現異常（表現為，連接是會彈出系統配對框，不管點取消還是輸入配對碼後點確定，都會立馬斷開連接。如果不輸入也不取消則會在30秒以內自動斷開藍牙打印機）&lt;/p&gt;
&lt;p&gt;現在採用的方式是各給安卓和IOS寫一套藍牙打印的命令&lt;br&gt;
&lt;strong&gt;IOS&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;// ====================藍牙操作==================  //初始化藍牙模組
openBluetoothAdapter() {&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if (app.sysinfo.provider == 1) {
    // 開啟藍牙
    app.onBluetooth()
    setTimeout(() =&amp;gt; {
        this.android\_search()
    }, 2000)
    return false;
}


this.closeBluetoothAdapter()
uni.openBluetoothAdapter({
    success: (res) =&amp;gt; {
        console.log(&amp;quot;初始化藍牙模組: &amp;quot; + JSON.stringify(res));
        this.startBluetoothDevicesDiscovery()
    },
    fail: (res) =&amp;gt; {
        if (res.errCode === 10001) {
            uni.onBluetoothAdapterStateChange((res) =&amp;gt; {
                console.log(&#39;監聽藍牙適配器狀態變化事件&#39;, res)
                if (res.available == false) {
                    app.global\_printing = {}
                    this.connected = false
                    this.chs = \[\]
                    this.canWrite = false
                }
                if (res.available) {
                    this.startBluetoothDevicesDiscovery()
                }
            })
        }
        if (res.errCode) {
            app.alert(&#39;初始化藍牙失敗，錯誤碼：&#39; + res.errCode)
            return false;
        }
        app.alert(res.errMsg)
    }
})
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;},&lt;/p&gt;</description>
    </item>
    <item>
      <title>微信授權登入</title>
      <link>https://en.moejue.cn/zh-hant/posts/88/</link>
      <pubDate>Fri, 05 Apr 2019 09:29:45 +0000</pubDate>
      <guid>https://en.moejue.cn/zh-hant/posts/88/</guid>
      <description>&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://res.wx.qq.com/mpres/htmledition/weui-desktopSkin/svg/buildless/bg_logo_primary4247a9.svg&#34;&gt; 文件：&lt;a href=&#34;https://mp.weixin.qq.com/wiki?t=resource/res_main&amp;amp;id=mp1421135319&#34;&gt;https://mp.weixin.qq.com/wiki?t=resource/res_main&amp;amp;id=mp1421135319&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;微信的授權登入與QQ、新浪等平台的授權登入大同小異，均採用OauthOAuth2.0鑑權方式。&lt;br&gt;
微信授權分為兩種：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;靜默授權&lt;/li&gt;
&lt;li&gt;彈窗授權，需要用戶手動同意&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;兩種scope的區別說明&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;以snsapi_base為scope發起的網頁授權，是用來獲取進入頁面的用戶openid的，並且是靜默授權並自動跳轉到回調頁的。用戶感知的就是直接進入了回調頁（往往是業務頁面）&lt;/li&gt;
&lt;li&gt;以snsapi_userinfo為scope發起的網頁授權，是用來獲取用戶的基本資訊的。但這種授權需要用戶手動同意，並且由於用戶同意過，所以無須關注，就可在授權後獲取該用戶的基本資訊。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;用戶管理類介面中的「獲取用戶基本資訊介面」，是在用戶和公眾號產生訊息交互或關注後事件推送後，才能根據用戶OpenID來獲取用戶基本資訊。這個介面，包括其他微信介面，都是需要該用戶（即openid）關注了公眾號後，才能呼叫成功的。&lt;/p&gt;
&lt;p&gt;具體而言，網頁授權流程分為四步：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;引導用戶進入授權頁面同意授權，獲取code&lt;/li&gt;
&lt;li&gt;透過code換取網頁授權access_token（與基礎支援中的access_token不同）&lt;/li&gt;
&lt;li&gt;如果需要，開發者可以重新整理網頁授權access_token，避免過期&lt;/li&gt;
&lt;li&gt;透過網頁授權access_token和openid獲取用戶基本資訊（支援UnionID機制）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;以下是封裝的微信操作類，需要用到兩個資料表，用於保存access_token、ticket，由於它們具有一定有效期，且每天請求數有上限，所以開發者需自行保存&lt;/p&gt;
&lt;?php
/\*\*
\*   微信操作表
\*   wxtoken 表結構
\*   id
\*   access\_token
\*   addtime
\*   wxticket 表結構
\*   id
\*   ticket
\*   addtime
\*/
class WX {
	private $appid;
	private $appserect;
	private $curl;
	private $msg;
	protected $errs = array(
		&#39;-1&#39; =&gt; &#39;系統繁忙，此時請開發者稍候再試&#39;,
		&#39;0&#39; =&gt; &#39;請求成功&#39;,
		&#39;40001&#39; =&gt; &#39;AppSecret錯誤或者AppSecret不屬於這個公眾號，請開發者確認AppSecret的正確性&#39;,
		&#39;40002&#39; =&gt; &#39;請確保grant\_type字段值為client\_credential&#39;,
		&#39;40164&#39; =&gt; &#39;呼叫介面的IP地址不在白名單中，請在介面IP白名單中進行設定。&#39;,
	);
	function \_\_construct($appid, $appserect) {
		$this-&gt;appid = $appid;
		$this-&gt;appserect = $appserect;
		$this-&gt;curl = new Curl();
	}
	/\*
	微信網頁授權登入  需要在公眾號設定 - 功能設定 - 網頁授權域名
	第一步：用戶同意授權，獲取code
	scope : snsapi\_base 只能獲取openid 直接跳轉
	snsapi\_userinfo
	\*/
	public function getCode($redirect\_uri, $scope = &#39;snsapi\_userinfo&#39;,$state = &#39;1&#39;) {
		$url = &#34;https://open.weixin.qq.com/connect/oauth2/authorize?appid={$this-&gt;appid}&amp;redirect\_uri={$redirect\_uri}&amp;response\_type=code&amp;scope={$scope}&amp;state={$state}#wechat\_redirect&#34;;
		header(&#34;Location:{$url}&#34;);
		exit;
	}
	/\*
	第二步：透過code換取網頁授權access\_token
	\*/
	public function getAccessTokenByCode($code) {
		$url = &#34;https://api.weixin.qq.com/sns/oauth2/access\_token?appid={$this-&gt;appid}&amp;secret={$this-&gt;appserect}&amp;code={$code}&amp;grant\_type=authorization\_code&#34;;
		// exit($url);
		// $curl = new Curl();
		$result = $this-&gt;curl-&gt;doGet($url);
		if (!$result) {
			// $this-&gt;curl-&gt;getError()
			$this-&gt;msg = &#34;獲取token失敗&#34;;
			return false;
		}
		$result = json\_decode($result, true);
		if ($result\[&#39;errcode&#39;\]) {
			$this-&gt;msg = $result\[&#39;errmsg&#39;\];
			return false;
		}
		return $result;
	}
	// 第三步：重新整理access\_token（如果需要） 透過code 獲取openid $type 0靜默授權 1彈窗授權
	public function getUserInfo($code, $type = 0, $lang = &#39;zh\_CN &#39;) {
		$result = $this-&gt;getAccessTokenByCode($code);
			if (!$result) {
			return false;
		}
		$member = C::t(PT\_USER)-&gt;getByOpenid($result\[&#39;openid&#39;\]);
	if ($member) {
		return $member;
	} else {
		if ($type) {
			$url = &#34;https://api.weixin.qq.com/sns/userinfo?access\_token={$result\[&#39;access\_token&#39;\]}&amp;openid={$result\[&#39;openid&#39;\]}&amp;lang={$lang}&#34;;
			// $return = $this-&gt;curl-&gt;doGet($url);
			// 這介面有病 強制顯示文件頭
			$return = file\_get\_contents($url);
			if (!$return) {
				$this-&gt;msg = &#39;獲取用戶資訊失敗&#39;;
				return false;
			}
			$return = json\_decode($return, true);
			if (!$return) {
				$this-&gt;msg = &#39;獲取用戶資訊返回失敗&#39;;
				return false;
			}
			// file\_put\_contents(&#39;ccc.txt&#39;,print\_r($return,true),FILE\_APPEND);
			$data = array(
				&#39;openid&#39; =&gt; $return\[&#39;openid&#39;\],
				&#39;name&#39; =&gt; $return\[&#39;nickname&#39;\],
				&#39;sex&#39; =&gt; $return\[&#39;sex&#39;\],
				&#39;province&#39; =&gt; $return\[&#39;province&#39;\],
				&#39;city&#39; =&gt; $return\[&#39;city&#39;\],
				&#39;country&#39; =&gt; $return\[&#39;country&#39;\],
				&#39;img&#39; =&gt; $return\[&#39;headimgurl&#39;\],
				&#39;bindtel&#39; =&gt; 0,
			);
		} else {
			$data = array(
				&#39;openid&#39; =&gt; $result\[&#39;openid&#39;\],
				&#39;username&#39; =&gt; &#34;微信用戶\_&#34; . random(6,1)
			);
		}
		$name = rand(100000, 1000000000);
		$e = $name . &#34;@qq.com&#34;;
		$password = $e;
		$id = UserAddEdit(0, $data\[&#39;username&#39;\], $password, $e,10,0,&#34;&#34;, $msg);
		if ($id &lt;= 0) {
			$this-&gt;msg = $msg;
			return false;
		}
		C::t(PT\_USER)-&gt;update($data, $id);
		$member = C::t(PT\_USER)-&gt;get($id);
		return $member;
		}
	}
	/\*
	公眾號 安全中心 設定IP白名單
	公眾號的全局唯一介面呼叫憑據，公眾號呼叫各介面時都需使用access\_token。開發者需要進行妥善保存。access\_token的儲存至少要保留512個字符空間。access\_token的有效期目前為2個小時，需定時重新整理，重複獲取將導致上次獲取的access\_token失效。
	\*/
	public function getAccessToken($type) {
		$addtime = TIMESTAMP - 7200;
		$url = &#34;https://api.weixin.qq.com/cgi-bin/token?grant\_type=client\_credential&amp;appid={$this-&gt;appid}&amp;secret={$this-&gt;appserect}&#34;;
		$row = C::t(PT\_WXTOKEN)-&gt;getNew($addtime, $type);
		if ($row) {
			return $row\[&#39;access\_token&#39;\];
		} else {
			$result = $this-&gt;curl-&gt;doGet($url);
			if (!$result) {
				$this-&gt;msg = &#34;無法獲取令牌內容&#34;;
				return false;
			}
			$result = json\_decode($result, true);
			if (!$result) {
				$this-&gt;msg = &#34;解析令牌內容失敗&#34;;
				return false;
			}
			if ($result\[&#39;access\_token&#39;\]) {
				C::t(PT\_WXTOKEN)-&gt;addToken($result\[&#39;access\_token&#39;\], $type);
				return $result\[&#39;access\_token&#39;\];
			} else {
				$this-&gt;msg = &#34;獲取令牌失敗&#34;;
				return false;
			}
		}
	}
	// 獲取js票據  需要在公眾號設定 - 功能設定 - JS介面安全域名設定
	public function getJsTicket() {
		$addtime = TIMESTAMP - 7200;
		$row = C::t(PT\_WXTICKET)-&gt;getNew($addtime);
		if ($row) {
			return $row\[&#39;ticket&#39;\];
		} else {
			$token = $this-&gt;getAccessToken();
			if (!$token) {
				return false;
			}
			$url = &#34;https://api.weixin.qq.com/cgi-bin/ticket/getticket?access\_token={$token}&amp;type=jsapi&#34;;
			$result = $this-&gt;curl-&gt;doGet($url);
			if (!$result) {
				$this-&gt;msg = &#34;無法獲取js票據&#34;;
				return false;
			}
			$result = json\_decode($result, true);
			if (!$result) {
				$this-&gt;msg = &#34;解析js票據內容失敗&#34;;
				return false;
			}
			if ($result\[&#39;ticket&#39;\]) {
				C::t(PT\_WXTICKET)-&gt;addTicket($result\[&#39;ticket&#39;\]);
				return $result\[&#39;ticket&#39;\];
			} else {
				$this-&gt;msg = &#34;獲取js票據失敗&#34;;
				return false;
			}
		}
	}
	// js sdk 票據簽名 當前網頁的URL，不包含#及其後面部分
	public function jsSign($data) {
		// 1.所有待簽名參數按照字段名的ASCII 碼從小到大排序（字典序）
		ksort($data);
		// 2.URL鍵值對的格式（即key1=value1&amp;key2=value2…）拼接成字符串string1 採用原始值，不進行URL 轉義
		$string1 = $this-&gt;ToUrlParams($data);
		// echo &#34;string1:{$string1}&lt;br/&gt;&#34;;
		// 3.對string1做sha1加密
		$sign = sha1($string1);
		// echo &#34;signature:{$sign}&lt;br/&gt;&#34;;
		return $sign;
	}
	// 獲取訊息內容
	public function getMsg() {
		return $this-&gt;msg;
	}
	/\*\*
	\* 格式化參數格式化成url參數
	\*/
	public function ToUrlParams($data) {
		$buff = &#34;&#34;;
		foreach ($data as $k =&gt; $v) {
			if ($k != &#34;sign&#34; &amp;&amp; $v != &#34;&#34; &amp;&amp; !is\_array($v)) {
				$buff .= $k . &#34;=&#34; . $v . &#34;&amp;&#34;;
			}
		}
		$buff = trim($buff, &#34;&amp;&#34;);
		return $buff;
	}
}
?&gt;
&lt;p&gt;// 微信登入
function wxlogin() {
global $_G,$identifier,$config,$wx;
if (!$_G[&amp;lsquo;uid&amp;rsquo;]) {
if ($_GET[&amp;lsquo;state&amp;rsquo;]) {
// 回調
$member = $wx-&amp;gt;getUserInfo($_GET[&amp;lsquo;code&amp;rsquo;]);
if (!$member) {
exit($wx-&amp;gt;getMsg());
}
if (!function_exists(&amp;ldquo;setloginstatus&amp;rdquo;)) {
include_once libfile(&amp;lsquo;function/member&amp;rsquo;);
}
// 設定登入狀態$wx
setloginstatus($member, 2592000);
checkfollowfeed();
$_G[&amp;lsquo;uid&amp;rsquo;] = $member[&amp;lsquo;uid&amp;rsquo;];
$_G[&amp;lsquo;member&amp;rsquo;] = $member;
} else {
// 請求授權 對參數編碼
$redirect = urlencode(getProtocol() . $_SERVER[&amp;lsquo;HTTP_HOST&amp;rsquo;] . $_SERVER[&amp;lsquo;REQUEST_URI&amp;rsquo;]);
$wx-&amp;gt;getCode($redirect, &amp;lsquo;snsapi_base&amp;rsquo;);
}
}
}
function getProtocol() {
return is_HTTPS() ? &amp;lsquo;https://&amp;rsquo; : &amp;lsquo;http://&amp;rsquo;;
}
function is_HTTPS() {  if ($_SERVER[&amp;lsquo;HTTPS&amp;rsquo;] === 1 || $_SERVER[&amp;lsquo;HTTPS&amp;rsquo;] === &amp;lsquo;on&amp;rsquo; || $_SERVER[&amp;lsquo;SERVER_PORT&amp;rsquo;] == 443) {
return true;
}
return false;
}&lt;/p&gt;</description>
    </item>
    <item>
      <title>微信JSAPI支付</title>
      <link>https://en.moejue.cn/zh-hant/posts/89/</link>
      <pubDate>Sat, 30 Mar 2019 09:30:21 +0000</pubDate>
      <guid>https://en.moejue.cn/zh-hant/posts/89/</guid>
      <description>&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://image.baidu.com/search/down?url=https://tva1.sinaimg.cn//large/0072Vf1pgy1g1l3k211blj30ia04x74e.jpg&#34;&gt; 前陣子一直在做微信相關的業務，雖說不是什麼新技術，但之前一直沒有機會接觸到，然後踩了些坑，抽空整理記錄下。
微信支付一共分為7種，分別是：付款碼支付、JSAPI支付、Native支付、APP支付、H5支付、小程序支付、人臉支付。
此次業務中使用到的是微信JSAPI支付：用戶透過微信掃碼、關注公眾號等方式進入商家H5頁面，並在&lt;strong&gt;微信內&lt;/strong&gt;呼叫 JSSDK完成支付&lt;/p&gt;
&lt;p&gt;文件：&lt;a href=&#34;https://pay.weixin.qq.com/wiki/doc/api/index.html&#34;&gt;https://pay.weixin.qq.com/wiki/doc/api/index.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;SDK：[https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=11_1&lt;/p&gt;
&lt;p&gt;](&lt;a href=&#34;https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=11_1%29JSAPI&#34;&gt;https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=11_1)JSAPI&lt;/a&gt;支付需要在微信中的瀏覽器打開才能喚起微信支付，效果如下圖
&lt;img loading=&#34;lazy&#34; src=&#34;https://image.baidu.com/search/down?url=https://tva1.sinaimg.cn//large/0072Vf1pgy1g1l36yn1sej30p91hc40b.jpg&#34;&gt;
附上介面程式碼
程式碼中使用了模板引擎
html：&lt;/p&gt;
&lt;div class=&#34;am-modal-bd&#34;&gt;
	&lt;img src=&#34;{$competition\[&#39;avatar&#39;\]}&#34; alt=&#34;&#34;&gt;&lt;br&gt;
	&lt;span style=&#34;font-size: 13px;color: #72c6ef&#34;&gt;{$competition\[&#39;username&#39;\]}&lt;/span&gt;&lt;br&gt;
	&lt;span id=&#34;tips&#34; style=&#34;font-size: 13px&#34;&gt;&lt;/span&gt;
  &lt;ul class=&#34;ul\_box&#34;&gt;
	&lt;li&gt;
		&lt;div&gt;&lt;/div&gt;
		&lt;div class=&#34;label\_box&#34;&gt;
			&lt;label&gt;
				&lt;input type=&#34;radio&#34; name=&#34;price&#34; value=&#34;{$prices\[0\]}&#34; checked=&#34;&#34;&gt;
				&lt;div class=&#34;active&#34;&gt;&lt;span class=&#34;am-icon-diamond&#34;&gt;&lt;/span&gt; {$prices\[0\]}鑽&lt;/div&gt;
			&lt;/label&gt;
			&lt;label&gt;
				&lt;input type=&#34;radio&#34; name=&#34;price&#34; value=&#34;{$prices\[1\]}&#34;&gt;
				&lt;div&gt;&lt;span class=&#34;am-icon-diamond&#34;&gt;&lt;/span&gt; {$prices\[1\]}鑽&lt;/div&gt;
			&lt;/label&gt;
			&lt;label&gt;
				&lt;input type=&#34;radio&#34; name=&#34;price&#34; value=&#34;{$prices\[2\]}&#34;&gt;
				&lt;div&gt;&lt;span class=&#34;am-icon-diamond&#34;&gt;&lt;/span&gt; {$prices\[2\]}鑽&lt;/div&gt;
			&lt;/label&gt;
		&lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
		&lt;div&gt;&lt;/div&gt;
		&lt;div class=&#34;label\_box&#34;&gt;
			&lt;label&gt;
				&lt;input type=&#34;radio&#34; name=&#34;price&#34; value=&#34;{$prices\[3\]}&#34;&gt;
				&lt;div&gt;&lt;span class=&#34;am-icon-diamond&#34;&gt;&lt;/span&gt; {$prices\[3\]}鑽&lt;/div&gt;
			&lt;/label&gt;
			&lt;label&gt;
				&lt;input type=&#34;radio&#34; name=&#34;price&#34; value=&#34;{$prices\[4\]}&#34;&gt;
				&lt;div&gt;&lt;span class=&#34;am-icon-diamond&#34;&gt;&lt;/span&gt; {$prices\[4\]}鑽&lt;/div&gt;
			&lt;/label&gt;
			&lt;label&gt;
				&lt;input type=&#34;number&#34; name=&#34;price&#34; id=&#34;price&#34; class=&#34;input&#34; placeholder=&#34;自定義&#34;&gt;
			&lt;/label&gt;
		&lt;/div&gt;
	&lt;/li&gt;
  &lt;/ul&gt;
  &lt;span style=&#34;font-size: 13px&#34;&gt;註：1鑽=1元，1鑽={$activity\[&#39;offset&#39;\]}票&lt;/span&gt;&lt;br&gt;
  &lt;button type=&#34;button&#34; class=&#34;am-btn am-btn-primary  am-radius&#34; onclick=&#34;callpay()&#34; style=&#34;margin-top: 5px;&#34;&gt;立即微信支付&lt;/button&gt;
&lt;/div&gt;
&lt;p&gt;JavaScript：&lt;/p&gt;
&lt;p&gt;// 投票
var offset = {$activity[&amp;lsquo;offset&amp;rsquo;]};
$(&amp;rsquo;#tips&amp;rsquo;).html(&amp;lsquo;正在給{$competition[&amp;lsquo;code&amp;rsquo;]}號贈送{$prices[0]}鑽=&amp;rsquo;+({$prices[0]}*offset)+&amp;lsquo;票&amp;rsquo;);
$(&amp;rsquo;#vote&amp;rsquo;).click(function(){
$.post(&amp;rsquo;/index/index/detailed.html?cid={$cid}&amp;amp;aid={$aid}&amp;rsquo;,{
formhash :&amp;rsquo;{FORMHASH}&amp;rsquo;,
submit:&amp;lsquo;1&amp;rsquo;,
type:1,
openid:&amp;rsquo;{$_G[&amp;lsquo;member&amp;rsquo;][&amp;lsquo;openid&amp;rsquo;]}&amp;rsquo;
},function(res){
alert(res.msg);
if (res.code == 0) {
$(&amp;rsquo;.box-1 span&amp;rsquo;).text(res.data.all);
$(&amp;rsquo;.box-2 span&amp;rsquo;).text(res.data.rank);
$(&amp;rsquo;.box-3 span&amp;rsquo;).text(res.data.up + &amp;lsquo;票&amp;rsquo;);
}
});
})
/* jQuery物件級別外掛程式擴展 */
$.fn.extend({
/* 單選框 */
hlRadio:function () {
var radioEl=$(this);
radioEl.click(function () {
var price = 0;
price = $(&amp;lsquo;input:radio:checked&amp;rsquo;).val();
$(&amp;rsquo;#price&amp;rsquo;).val(&amp;rsquo;&amp;rsquo;);
$(&amp;rsquo;#tips&amp;rsquo;).html(&amp;lsquo;正在給{$competition[&amp;lsquo;code&amp;rsquo;]}號贈送&amp;rsquo;+price+&amp;lsquo;鑽=&amp;rsquo;+(price*offset)+&amp;lsquo;票&amp;rsquo;);
radioEl.siblings(&amp;ldquo;div&amp;rdquo;).removeClass(&amp;ldquo;active&amp;rdquo;);
$(this).siblings(&amp;ldquo;div&amp;rdquo;).addClass(&amp;ldquo;active&amp;rdquo;);
});
},
});
$(&amp;ldquo;input[name=&amp;lsquo;price&amp;rsquo;]&amp;rdquo;).hlRadio();
$(&amp;rsquo;#price&amp;rsquo;).bind(&amp;lsquo;input propertychange&amp;rsquo;, function(){
var price = 0;
price = $(&amp;rsquo;#price&amp;rsquo;).val();
$(&amp;rsquo;#tips&amp;rsquo;).html(&amp;lsquo;正在給{$competition[&amp;lsquo;code&amp;rsquo;]}號贈送&amp;rsquo;+price+&amp;lsquo;鑽=&amp;rsquo;+(price*offset)+&amp;lsquo;票&amp;rsquo;);
})&lt;/p&gt;</description>
    </item>
    <item>
      <title>[筆記]Git常用命令大全</title>
      <link>https://en.moejue.cn/zh-hant/posts/57/</link>
      <pubDate>Sat, 16 Jun 2018 08:56:21 +0000</pubDate>
      <guid>https://en.moejue.cn/zh-hant/posts/57/</guid>
      <description>&lt;p&gt;繼上一次之後，我抽空整理了一份比較完整的 Git 常用命令清單，並找到了一張非常棒、非常高清的導圖（1759*3162）。&lt;/p&gt;
&lt;p&gt;查看、新增、提交、刪除、找回、重置修改檔案&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git help &amp;lt;command&amp;gt; # 顯示 command 的說明&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git show # 顯示某次提交的內容 git show $id&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git co -- &amp;lt;file&amp;gt; # 捨棄工作區修改&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git co . # 捨棄工作區修改&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git add &amp;lt;file&amp;gt; # 將工作檔案修改提交到本地暫存區&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git add . # 將所有修改過的工作檔案提交暫存區&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git rm &amp;lt;file&amp;gt; # 從版本庫中刪除檔案&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git rm &amp;lt;file&amp;gt; --cached # 從版本庫中刪除檔案，但不刪除檔案&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git reset &amp;lt;file&amp;gt; # 從暫存區恢復到工作檔案&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git reset -- . # 從暫存區恢復到工作檔案&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git reset --hard # 恢復最近一次提交過的狀態，即放棄上次提交後的所有本次修改&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git ci &amp;lt;file&amp;gt; git ci . git ci -a # 將 git add, git rm 和 git ci 等操作都合併在一起執行 git ci -am &amp;quot;some comments&amp;quot;&lt;/code&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>在 Linux 上安裝 PHP 環境</title>
      <link>https://en.moejue.cn/zh-hant/posts/65/</link>
      <pubDate>Mon, 07 May 2018 06:52:32 +0000</pubDate>
      <guid>https://en.moejue.cn/zh-hant/posts/65/</guid>
      <description>&lt;p&gt;學習環境：Centos 7.2 正式版_64位&lt;/p&gt;
&lt;p&gt;# 更新來源
yum update&lt;/p&gt;
&lt;h1 id=&#34;安裝-nginx&#34;&gt;安裝 Nginx&lt;/h1&gt;
&lt;p&gt;yum install nginx -y&lt;/p&gt;
&lt;h1 id=&#34;安裝-mysql&#34;&gt;安裝 MySQL&lt;/h1&gt;
&lt;p&gt;wget &lt;a href=&#34;https://repo.mysql.com//mysql57-community-release-el7-11.noarch.rpm&#34;&gt;https://repo.mysql.com//mysql57-community-release-el7-11.noarch.rpm&lt;/a&gt;
yum localinstall mysql57-community-release-el7-11.noarch.rpm&lt;/p&gt;
&lt;h1 id=&#34;安裝-php-72&#34;&gt;安裝 PHP 7.2&lt;/h1&gt;
&lt;p&gt;rpm -Uvh &lt;a href=&#34;https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm&#34;&gt;https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm&lt;/a&gt;
rpm -Uvh &lt;a href=&#34;https://mirror.webtatic.com/yum/el7/webtatic-release.rpm&#34;&gt;https://mirror.webtatic.com/yum/el7/webtatic-release.rpm&lt;/a&gt;
yum update
yum install -y php72w-cli php72w-common php72w-dba php72w-devel php72w-fpm php72w-gd php72w-imap php72w-mbstring php72w-mysql php72w-pdo php72w-pdo_dblib php72w-pear php72w-pecl-igbinary php72w-pecl-xdebug php72w-process php72w-xml php72w-xmlrpc php72w-opcache php72w-pecl-memcached php72w-pecl-mongodb php72w-pecl-redis&lt;/p&gt;
&lt;h1 id=&#34;啟動服務&#34;&gt;啟動服務&lt;/h1&gt;
&lt;p&gt;service nginx start
service mysql start
service php-fmp start
/usr/sbin/php-fpm &amp;ndash;nodaemonize &amp;ndash;fpm-config /etc/php-fpm.conf &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Git簡單的使用步驟</title>
      <link>https://en.moejue.cn/zh-hant/posts/64/</link>
      <pubDate>Tue, 03 Apr 2018 12:04:32 +0000</pubDate>
      <guid>https://en.moejue.cn/zh-hant/posts/64/</guid>
      <description>&lt;p&gt;本文不闡述任何概念性知識，僅僅只是做一個筆記，簡單的使用步驟，如遇障礙，請Google一下&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用SSH 完成 Git 與 GitHub 的綁定&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;生成 &lt;code&gt;SSH key&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ssh-keygen -t rsa
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;指定 RSA 演算法生成金鑰，之後就會生成兩個檔案，分別為id_rsa和id_rsa.pub，即私鑰id_rsa和公鑰id_rsa.pub。對於這兩個檔案&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;
&lt;p&gt;添加 SSH key
github.com -&amp;gt; Settings -&amp;gt; SSH and GPG -&amp;gt; New SSH key
將公鑰id_rsa.pub的內容貼到Key處的位置（Titles的內容不填寫也沒關係），然後點擊Add SSH key 即可。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;驗證綁定是否成功&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ssh -T git@github.com
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;把本地專案推送到github的命令&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(1) 打開你的目錄&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;cd demo
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;(2) 初始化版本庫，用於生成git檔案&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git init
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;(3) 將所有檔案添加到暫存區&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git add *
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;(4) 提交目前工作空間的修改內容&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git commit -m &amp;#34;first commit&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;(5) 將儲存庫連接到遠端伺服器&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git remote add origin &amp;lt;server&amp;gt;(就是上面你儲存庫的地址)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;(6) 將改動推送到所添加的伺服器上&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git push -u origin master
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;在推送的時候如果出現如下錯誤：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;warning: redirecting to https://github.com/178146582/dabai.git/
To http://github.com/178146582/dabai.git
 ! [rejected]        master -&amp;gt; master (fetch first)
error: failed to push some refs to &amp;#39;http://github.com/178146582/dabai.git&amp;#39; hint: Updates were rejected because the remote contains work that you do hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., &amp;#39;git pull ...&amp;#39;) before pushing again.
hint: See the &amp;#39;Note about fast-forwards&amp;#39; in &amp;#39;git push --help&amp;#39; for details.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;查了一下錯誤的原因是github中的README.md檔案不在本地程式碼目錄中。所以我們把上面第六步分成兩步：&lt;/p&gt;</description>
    </item>
    <item>
      <title>利用.htaccess綁定子網域到子目錄</title>
      <link>https://en.moejue.cn/zh-hant/posts/58/</link>
      <pubDate>Mon, 22 Jan 2018 01:18:11 +0000</pubDate>
      <guid>https://en.moejue.cn/zh-hant/posts/58/</guid>
      <description>&lt;p&gt;一般情況下，一台虛擬主機只允許綁定一個域名到根目錄下。
使用過emlog的人，應該對其中的靜態連結不陌生，它就是典型的利用.htaccess檔案來對網頁進行域名轉向。
利用.htaccess綁定域名到子目錄，前提是你的空間伺服器必須支援Apache的rewrite功能，只有這樣才能使用.htaccess。如果你的空間是Linux伺服器，一般預設都已開啟。即可以實現綁定域名到子目錄、一個空間多個站點。&lt;/p&gt;
&lt;p&gt;下面是以 link.52ecy.cn 綁定到子目錄link為例的.htaccess程式碼。&lt;/p&gt;
&lt;p&gt;&amp;lt;IfModule mod_rewrite.c&amp;gt;
RewriteEngine On
RewriteBase /&lt;/p&gt;
&lt;h1 id=&#34;綁定link52ecycn-到子目錄link&#34;&gt;綁定link.52ecy.cn 到子目錄link&lt;/h1&gt;
&lt;p&gt;RewriteCond %{HTTP_HOST} ^link\.52ecy\.cn$ [NC]
RewriteCond %{REQUEST_URI} !^/link/
RewriteRule ^(.*)$ link/$1?Rewrite [L,QSA]
#可以綁定多個 只需重複上三行程式碼並更改一下域名、目錄名 就好了
&lt;/IfModule&gt;&lt;/p&gt;
&lt;p&gt;如果你已完成上面的步驟，你的子域名應該可以訪問了，但你會發現在瀏覽器上訪問「主域名+綁定的域名目錄」也可以訪問，可這並不是我們想要的。
接下來我們完成最後一步，在每一個綁定的目錄中，如link目錄中，也增加一個 .htaccess 檔案。
.htaccess程式碼如下：&lt;/p&gt;
&lt;p&gt;下面是以 music.xmgho.com 綁定到子目錄music為例的.htaccess程式碼。
即可以實現綁定域名到子目錄、一個空間多個站點。即可以實現綁定域名到子目錄、一個空間多個站點。即可以實現綁定域名到子目錄、一個空間多個站點。即可以實現綁定域名到子目錄、一個空間多個站點。&lt;/p&gt;
&lt;p&gt;&amp;lt;IfModule mod_rewrite.c&amp;gt;
RewriteEngine On
RewriteBase /
#只許綁定的域名訪問
RewriteCond %{HTTP_HOST} !^link\.52ecy\.cn$ [NC]
RewriteRule (.*) &lt;a href=&#34;http://link.52ecy.cn/$1&#34;&gt;http://link.52ecy.cn/$1&lt;/a&gt; [L,R=301]
#對綁定目錄下與 同名的目錄的處理
RewriteCond %{REQUEST_URI} ^\/link\/ [NC]
RewriteCond %{QUERY_STRING} !^(.*)?Rewrite
RewriteRule ^(.*)$ /%{REQUEST_URI}/%{REQUEST_URI}/$1?Rewrite [L,QSA]
&lt;/IfModule&gt;&lt;/p&gt;
&lt;p&gt;結語：
由於我的伺服器本身就支援子域名綁定到子目錄，所以我自己沒法測試，不過我讓朋友在阿里云的主機測試通過了，但阿里云限制了數量，多綁定的話會跳到根目錄。由此看來，並不是所有的伺服器商都支援這樣玩，還得自行測試。
最後，最重要的一點就是，你的域名得解析過來才有用的[哭笑~]&lt;/p&gt;</description>
    </item>
    <item>
      <title>筆記：Sublime Text3配置</title>
      <link>https://en.moejue.cn/zh-hant/posts/54/</link>
      <pubDate>Thu, 28 Dec 2017 13:49:37 +0000</pubDate>
      <guid>https://en.moejue.cn/zh-hant/posts/54/</guid>
      <description>&lt;p&gt;儲存一下Sublime Text3的配置資訊，省得下次又弄丟找不著了。&lt;/p&gt;
&lt;h2 id=&#34;配置&#34;&gt;配置：&lt;/h2&gt;
&lt;p&gt;{
&amp;ldquo;font_size&amp;rdquo;: 21,                        // 設定字體大小
&amp;ldquo;word_wrap&amp;rdquo;: true,                      // 自動換行
&amp;ldquo;update_check&amp;rdquo;: false,                  // 禁用更新檢查
&amp;ldquo;font_face&amp;rdquo;: &amp;ldquo;Courier New&amp;rdquo;,             // 設定字體
&amp;ldquo;highlight_modified_tabs&amp;rdquo;: true,        // 檔案修改高亮
&amp;ldquo;create_window_at_startup&amp;rdquo;: false,      // 取消啟動自動開啟新視窗
&amp;ldquo;open_files_in_new_window&amp;rdquo;: false,      // 取消開啟檔案生成新視窗
&amp;ldquo;highlight_line&amp;rdquo;: true,                 // 高亮顯示目前行
&amp;ldquo;show_encoding&amp;rdquo;: true,                  // 右下角顯示編碼類型
&amp;ldquo;open_files_in_new_window&amp;rdquo;: false,      // 禁止每次都在新視窗開啟
&amp;ldquo;caret_style&amp;rdquo;: &amp;ldquo;phase&amp;rdquo;,                 // 設定游標閃動方式
&amp;ldquo;line_padding_top&amp;rdquo;: 5,                  // 行上間距
&amp;ldquo;line_padding_bottom&amp;rdquo;: 5,               // 行下間距
&amp;ldquo;fade_fold_buttons&amp;rdquo;: false,             // 一直顯示程式碼收縮圖示
&amp;ldquo;translate_tabs_to_spaces&amp;rdquo;: false       // 使用空格替代Tab
}&lt;/p&gt;
&lt;h2 id=&#34;插件&#34;&gt;插件：&lt;/h2&gt;
&lt;p&gt;安裝插件管理器: 透過快捷鍵 ctrl+` 或者 View &amp;gt; Show Console 選單開啟控制台&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
