<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-tw"><generator uri="https://jekyllrb.com/" version="3.9.5">Jekyll</generator><link href="https://sinotec2.github.io/FAQ/feed.xml" rel="self" type="application/atom+xml" /><link href="https://sinotec2.github.io/FAQ/" rel="alternate" type="text/html" hreflang="zh-tw" /><updated>2024-04-18T08:46:16+08:00</updated><id>https://sinotec2.github.io/FAQ/feed.xml</id><title type="html">Dr. Kuang’s Utilities</title><subtitle>FAQ Notes</subtitle><author><name>yckuang</name><email>sinotec2@gmail.com</email></author><entry><title type="html">Plume-in-Grid</title><link href="https://sinotec2.github.io/FAQ/2023/11/10/PIG.html" rel="alternate" type="text/html" title="Plume-in-Grid" /><published>2023-11-10T00:00:00+08:00</published><updated>2023-11-10T00:00:00+08:00</updated><id>https://sinotec2.github.io/FAQ/2023/11/10/PIG</id><content type="html" xml:base="https://sinotec2.github.io/FAQ/2023/11/10/PIG.html"><![CDATA[<h2 id="背景">背景</h2>

<h2 id="臭氧pm25-和區域霧霾達標模擬指南2007">臭氧、PM2.5 和區域霧霾達標模擬指南(2007)</h2>

<ul>
  <li>Guidance on the Use of Models and Other Analyses for Demonstrating Attainment of Air Quality Goals for Ozone, PM2.5, and Regional Haze, by <a href="https://www.epa.gov/sites/default/files/2020-10/documents/final-03-pm-rh-guidance.pdf">EPA -454/B-07-002 April 2007</a></li>
</ul>

<p>15.3 What Horizontal Grid Cell Size Is Necessary?</p>

<blockquote>
  <p>For example, use of plume-in-grid algorithms for large point sources of NOx should be considered as an alternative with coarser than desired grid cells. And dispersion modeling of primary PM can be used to offset the need of fine spatial resolution in a grid model. 
例如，對於大型氮氧化物點源使用網格煙流演算法應被視為比所需網格單元更粗糙的替代方案。 一次顆粒物的擴散建模可用於抵消網格模型中精細空間解析度的需求。</p>
</blockquote>

<p>15.3.1 Horizontal Resolution Recommendations for Ozone</p>

<blockquote>
  <p>All ozone monitor locations within a nonattainment area should ordinarily be placed within the fine scale portion of a nested regional grid if nested models are used. States/Tribes choosing an urban grid or fine portion of a nested grid with cells 12 km or larger should consider applying plume-in-grid algorithms to major point sources of NOx. The use of plume-in-grid should be discussed with the appropriate EPA Regional Office.
如果使用嵌套模型，則未達標區域內的所有臭氧監測器位置通常應放置在嵌套區域網格的精細比例部分內。 選擇城市網格或單元格長度為 12 公里或更大的嵌套網格的精細部分的州/部落應考慮將網格煙流演算法應用於 NOx 的主要點源。 應與相應的 EPA 區域辦事處討論網格中煙流的使用。</p>
</blockquote>

<p>15.3.3 Horizontal Resolution Recommendations for Regional Haze</p>
<blockquote>
  <p>The glidepath analysis for regional haze focuses on Class I areas. Most of these are in remote or rural locations. Regional haze is not likely to be dominated by local sources. Further, light extinction is more likely to be dominated by secondary particulate matter, due to the efficiency of light scattering by secondary particles. All these attributes indicate that it will be necessary to model a regional scale domain for regional haze related applications. Because of the remoteness of Class I areas, grid cell sizes up to 36 km on a side should suffice for regional haze-related modeling. States may wish to perform diagnostic tests using plume-in- grid analyses, as well as finer horizontal resolution to determine if results may differ using more finely resolved emissions and meteorology. Guidance on vertical resolution presented in Section 15..4 is also applicable for regional haze-related applications.
區域霾滑行路徑分析重點在於I類區域。 其中大多數位於偏遠或農村地區。 區域性霧霾不太可能由當地來源主導。 此外，由於二次顆粒的光散射效率，消光更有可能由二次顆粒物質主導。 所有這些屬性表明，有必要為區域霧霾相關應用建立區域尺度域模型。 由於 I 類區域地處偏遠，邊緣長達 36 km 的網格單元足以滿足區域霧霾相關的建模。 各國可能希望使用網格煙流分析以及更精細的水平分辨率來進行診斷測試，以確定使用更精細解析的排放和氣象學結果是否可能有所不同。 在第 15..4 節中提出的垂直解析度指南也適用於區域霧霾相關應用。</p>
</blockquote>

<p>17.5 Are there Other Emissions Modeling Issues?</p>

<blockquote>
  <p>Elevated Point Sources Point sources need to be assigned to an appropriate model layer40 (the vertical modeling dimension). Depending on the air quality model that is being used, different emissions modeling steps can be taken. Models such as UAM-V and CAMX, expect input emissions files separately for layer-1 emissions and elevated point-source emissions. Additionally, elevated point sources may be flagged for treatment with a plume-in-grid (PinG) approach. For these models, emissions modelers must supply a criteria for specifying which point sources will be treated as elevated and as PinG sources. In this case, the air quality model calculates the plume rise of the point source emissions when the model is run.
高架點源 點源需要分配到適當的模型層40（垂直建模維度）。 根據所使用的空氣品質模型，可以採取不同的排放建模步驟。 UAM-V 和 CAMX 等模型期望分別針對第 1 層排放和升高的點源排放輸入排放文件。 此外，高架點光源可能會被標記為採用網格煙流 (PinG) 方法進行處理。 對於這些模型，排放建模者必須提供一個標準來指定哪些點源將被視為高架源和 PinG 源。 在這種情況下，空氣品質模型會計算模型運行時點源排放的煙流上升。</p>
</blockquote>

<h2 id="further-development-and-evaluation-of-models-3cmaq-apt2001">Further Development and Evaluation of Models-3/CMAQ-APT(2001)</h2>

<table>
  <thead>
    <tr>
      <th style="text-align: center">Product ID</th>
      <th style="text-align: center">Date Published</th>
      <th style="text-align: center">Pages</th>
      <th style="text-align: center">Document Type</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center"><a href="https://www.epri.com/research/products/1005161">1005161</a></td>
      <td style="text-align: center">Nov 09, 2001</td>
      <td style="text-align: center">142</td>
      <td style="text-align: center"><a href="https://restservice.epri.com/publicdownload/000000000001005161/0/Product">Technical Report</a></td>
    </tr>
  </tbody>
</table>

<h3 id="摘要">摘要</h3>

<p>Models-3/CMAQ-APT 是一種最先進的網格煙流模型，已應用於美國東北部 30 個發電廠的煙流。 本報告描述了該專案的結果以及模型的最新改進。</p>

<h3 id="背景-1">背景</h3>

<ul>
  <li>實驗和理論研究表明，富含氮氧化物 (NOx) 的煙流中臭氧和酸的形成速率與周圍背景大氣中的臭氧和酸形成速率顯著不同。 煙流和背景化學之間存在這種差異的原因是，煙流中的高 NO 濃度會導致氧化劑水平耗盡，直到發生足夠的煙流稀釋。</li>
  <li>空氣品質的三維 (3-D) 建模通常基於大氣的網格表示，其中假設化學濃度等大氣變數在每個網格單元內是均勻的。 然而，對於空間維度遠小於網格系統的來源，這種基於網格的方法可能會導致顯著的錯誤。</li>
  <li>EPRI 贊助開發了一種新的最先進的網格煙流 (PiG) 空氣品質模型，該模型可以解決這些問題並更真實地代表大氣中反應煙流的行為。</li>
  <li>此 PiG 模型由嵌入到基於三維網格的模型 Models-3 社區多尺度空氣品質建模系統 (Models-3/CMAQ) 中的反應煙流模型 SCICHEM 組成。 它被稱為具有高級煙流處理 (APT) 的 Models-3/CMAQ 或 Models-3/CMAQ-APT。</li>
</ul>

<h3 id="目標">目標</h3>

<p>描述 Models-3/CMAQ-APT 的一些最新改進及其在新領域的應用，以明確處理 30 個發電廠煙流。</p>

<h3 id="方法">方法</h3>

<ul>
  <li>計畫組於 1995 年 7 月將 Models-3/CMAQ-APT 應用於美國 NARSTO-Northeast 地區，具有 12 公里和 4 公里水平分辨率的兩個嵌套域，為期五天。30 個最大的 NOx 點使用PiG 處理明確模擬12 公里解析度域中的來源。</li>
  <li>其中 6 個來源位於 4 公里分辨率範圍內。 該團隊還對 12 公里分辨率域進行了「背景」模擬，其中忽略了 30 個點源的排放。</li>
  <li>對於此模擬，團隊應用了 Models-3/CMAQ 的原始煙狀網格 (PinG) 公式 (Models-3/CMAQ-PinG)。 背景模擬與基礎模擬和 APT 模擬結果之間的差異提供了在有或沒有 PiG 處理的情況下這些點源對 O3 和 HNO3 濃度的貢獻的測量。</li>
</ul>

<h3 id="結果">結果</h3>

<ul>
  <li>本報告概述了 Models-3/CMAQ-APT，並描述了自上次審查以來所做的改進。</li>
  <li>該文件還介紹了 NARSTO-Northeast 域的基礎和 Models-3/CMAQ-APT 網格中煙流模擬的結果。 它還討論了同一域的 Models-3/CMAQ-PinG 模擬結果。 提供了結論。</li>
</ul>

<h3 id="epri觀點">EPRI觀點</h3>

<ul>
  <li>專案結果表明，最好使用 Models-3/CMAQ-APT 處理主要 NOx 點源，因為如果不使用 PiG 處理，這些源順風處的 O3 和 <strong>HNO3</strong> 產量通常會被<strong>高估</strong>。</li>
  <li>Models-3/CMAQ-APT 和 Models-3/CMAQ-PinG 模擬之間的差異可能是由於 Models-3/CMAQ-PinG 中的煙流到網格傳輸早於 Models-3/CMAQ-APT。</li>
  <li>這些結果表明煙流到網格傳輸的時間非常有影響，應仔細選擇以確保準確的模擬。</li>
</ul>

<h2 id="國內應用">國內應用</h2>

<ul>
  <li><a href="https://www.taipower.com.tw/upload/18/深澳電廠空氣品質模式模擬結果性能評估-2010年10月臭氧模擬.pdf">深澳電廠</a></li>
  <li><a href="https://www.iot.gov.tw/dl-14930-9bc70364a1ba4beeba8b8006887db2ff.html">船舶航行對沿岸及港域空污預測模式之建立</a></li>
  <li><a href="https://report.nat.gov.tw/ReportFront/PageSystem/reportFileDownload/C09003644/001">火力電廠氮氧化物排放與大氣中臭氧濃度關聯性評估技術</a></li>
  <li><a href="https://www.epb.taichung.gov.tw/media/896812/111年_臺中市細懸浮微粒採樣與空品預報計畫_空噪科.pdf">111年_臺中市細懸浮微粒採樣與空品預報計畫</a></li>
</ul>]]></content><author><name>yckuang</name><email>sinotec2@gmail.com</email></author><category term="CMAQ," /><category term="CAMx" /><category term="PiG" /><summary type="html"><![CDATA[背景 臭氧、PM2.5 和區域霧霾達標模擬指南(2007) Guidance on the Use of Models and Other Analyses for Demonstrating Attainment of Air Quality Goals for Ozone, PM2.5, and Regional Haze, by EPA -454/B-07-002 April 2007 15.3 What Horizontal Grid Cell Size Is Necessary? For example, use of plume-in-grid algorithms for large point sources of NOx should be considered as an alternative with coarser than desired grid cells. And dispersion modeling of primary PM can be used to offset the need of fine spatial resolution in a grid model. 例如，對於大型氮氧化物點源使用網格煙流演算法應被視為比所需網格單元更粗糙的替代方案。 一次顆粒物的擴散建模可用於抵消網格模型中精細空間解析度的需求。 15.3.1 Horizontal Resolution Recommendations for Ozone All ozone monitor locations within a nonattainment area should ordinarily be placed within the fine scale portion of a nested regional grid if nested models are used. States/Tribes choosing an urban grid or fine portion of a nested grid with cells 12 km or larger should consider applying plume-in-grid algorithms to major point sources of NOx. The use of plume-in-grid should be discussed with the appropriate EPA Regional Office. 如果使用嵌套模型，則未達標區域內的所有臭氧監測器位置通常應放置在嵌套區域網格的精細比例部分內。 選擇城市網格或單元格長度為 12 公里或更大的嵌套網格的精細部分的州/部落應考慮將網格煙流演算法應用於 NOx 的主要點源。 應與相應的 EPA 區域辦事處討論網格中煙流的使用。 15.3.3 Horizontal Resolution Recommendations for Regional Haze The glidepath analysis for regional haze focuses on Class I areas. Most of these are in remote or rural locations. Regional haze is not likely to be dominated by local sources. Further, light extinction is more likely to be dominated by secondary particulate matter, due to the efficiency of light scattering by secondary particles. All these attributes indicate that it will be necessary to model a regional scale domain for regional haze related applications. Because of the remoteness of Class I areas, grid cell sizes up to 36 km on a side should suffice for regional haze-related modeling. States may wish to perform diagnostic tests using plume-in- grid analyses, as well as finer horizontal resolution to determine if results may differ using more finely resolved emissions and meteorology. Guidance on vertical resolution presented in Section 15..4 is also applicable for regional haze-related applications. 區域霾滑行路徑分析重點在於I類區域。 其中大多數位於偏遠或農村地區。 區域性霧霾不太可能由當地來源主導。 此外，由於二次顆粒的光散射效率，消光更有可能由二次顆粒物質主導。 所有這些屬性表明，有必要為區域霧霾相關應用建立區域尺度域模型。 由於 I 類區域地處偏遠，邊緣長達 36 km 的網格單元足以滿足區域霧霾相關的建模。 各國可能希望使用網格煙流分析以及更精細的水平分辨率來進行診斷測試，以確定使用更精細解析的排放和氣象學結果是否可能有所不同。 在第 15..4 節中提出的垂直解析度指南也適用於區域霧霾相關應用。 17.5 Are there Other Emissions Modeling Issues? Elevated Point Sources Point sources need to be assigned to an appropriate model layer40 (the vertical modeling dimension). Depending on the air quality model that is being used, different emissions modeling steps can be taken. Models such as UAM-V and CAMX, expect input emissions files separately for layer-1 emissions and elevated point-source emissions. Additionally, elevated point sources may be flagged for treatment with a plume-in-grid (PinG) approach. For these models, emissions modelers must supply a criteria for specifying which point sources will be treated as elevated and as PinG sources. In this case, the air quality model calculates the plume rise of the point source emissions when the model is run. 高架點源 點源需要分配到適當的模型層40（垂直建模維度）。 根據所使用的空氣品質模型，可以採取不同的排放建模步驟。 UAM-V 和 CAMX 等模型期望分別針對第 1 層排放和升高的點源排放輸入排放文件。 此外，高架點光源可能會被標記為採用網格煙流 (PinG) 方法進行處理。 對於這些模型，排放建模者必須提供一個標準來指定哪些點源將被視為高架源和 PinG 源。 在這種情況下，空氣品質模型會計算模型運行時點源排放的煙流上升。 Further Development and Evaluation of Models-3/CMAQ-APT(2001) Product ID Date Published Pages Document Type 1005161 Nov 09, 2001 142 Technical Report 摘要 Models-3/CMAQ-APT 是一種最先進的網格煙流模型，已應用於美國東北部 30 個發電廠的煙流。 本報告描述了該專案的結果以及模型的最新改進。 背景 實驗和理論研究表明，富含氮氧化物 (NOx) 的煙流中臭氧和酸的形成速率與周圍背景大氣中的臭氧和酸形成速率顯著不同。 煙流和背景化學之間存在這種差異的原因是，煙流中的高 NO 濃度會導致氧化劑水平耗盡，直到發生足夠的煙流稀釋。 空氣品質的三維 (3-D) 建模通常基於大氣的網格表示，其中假設化學濃度等大氣變數在每個網格單元內是均勻的。 然而，對於空間維度遠小於網格系統的來源，這種基於網格的方法可能會導致顯著的錯誤。 EPRI 贊助開發了一種新的最先進的網格煙流 (PiG) 空氣品質模型，該模型可以解決這些問題並更真實地代表大氣中反應煙流的行為。 此 PiG 模型由嵌入到基於三維網格的模型 Models-3 社區多尺度空氣品質建模系統 (Models-3/CMAQ) 中的反應煙流模型 SCICHEM 組成。 它被稱為具有高級煙流處理 (APT) 的 Models-3/CMAQ 或 Models-3/CMAQ-APT。 目標 描述 Models-3/CMAQ-APT 的一些最新改進及其在新領域的應用，以明確處理 30 個發電廠煙流。 方法 計畫組於 1995 年 7 月將 Models-3/CMAQ-APT 應用於美國 NARSTO-Northeast 地區，具有 12 公里和 4 公里水平分辨率的兩個嵌套域，為期五天。30 個最大的 NOx 點使用PiG 處理明確模擬12 公里解析度域中的來源。 其中 6 個來源位於 4 公里分辨率範圍內。 該團隊還對 12 公里分辨率域進行了「背景」模擬，其中忽略了 30 個點源的排放。 對於此模擬，團隊應用了 Models-3/CMAQ 的原始煙狀網格 (PinG) 公式 (Models-3/CMAQ-PinG)。 背景模擬與基礎模擬和 APT 模擬結果之間的差異提供了在有或沒有 PiG 處理的情況下這些點源對 O3 和 HNO3 濃度的貢獻的測量。 結果 本報告概述了 Models-3/CMAQ-APT，並描述了自上次審查以來所做的改進。 該文件還介紹了 NARSTO-Northeast 域的基礎和 Models-3/CMAQ-APT 網格中煙流模擬的結果。 它還討論了同一域的 Models-3/CMAQ-PinG 模擬結果。 提供了結論。 EPRI觀點 專案結果表明，最好使用 Models-3/CMAQ-APT 處理主要 NOx 點源，因為如果不使用 PiG 處理，這些源順風處的 O3 和 HNO3 產量通常會被高估。 Models-3/CMAQ-APT 和 Models-3/CMAQ-PinG 模擬之間的差異可能是由於 Models-3/CMAQ-PinG 中的煙流到網格傳輸早於 Models-3/CMAQ-APT。 這些結果表明煙流到網格傳輸的時間非常有影響，應仔細選擇以確保準確的模擬。 國內應用 深澳電廠 船舶航行對沿岸及港域空污預測模式之建立 火力電廠氮氧化物排放與大氣中臭氧濃度關聯性評估技術 111年_臺中市細懸浮微粒採樣與空品預報計畫]]></summary></entry><entry><title type="html">企業內部全文搜索</title><link href="https://sinotec2.github.io/FAQ/2023/10/27/DMS.html" rel="alternate" type="text/html" title="企業內部全文搜索" /><published>2023-10-27T00:00:00+08:00</published><updated>2023-10-27T00:00:00+08:00</updated><id>https://sinotec2.github.io/FAQ/2023/10/27/DMS</id><content type="html" xml:base="https://sinotec2.github.io/FAQ/2023/10/27/DMS.html"><![CDATA[<h2 id="背景">背景</h2>

<p>企業內部文件全文搜索系統，檔案形式可能包括pdf, doc等等，語文包括中文、英文，搜尋結果將納入AI系統的解析，你有什麼建議？</p>

<h3 id="bingchat">bingChat</h3>

<p>對於您的需求，我建議您可以考慮以下的開源全文搜索引擎：</p>

<ol>
  <li>
    <p><strong>Elasticsearch</strong>：Elasticsearch 是一個分散式的 RESTful 搜索和分析引擎，能夠解決越來越多的用例。作為 Elasticsearch 的核心，它可以用來同時存儲、搜索和分析大量數據。它通常被用作具有複雜搜索功能的核心引擎/技術。</p>
  </li>
  <li>
    <p><strong>Apache Solr</strong>：Solr 是一個開源的搜索平台，由 Apache Lucene 提供。它包括全文搜索、命中突出顯示、分面搜索、動態集群、數據庫整合等功能。</p>
  </li>
  <li>
    <p><strong>Whoosh</strong>：Whoosh 是一個快速、純 Python 的全文索引、搜索庫庫。</p>
  </li>
</ol>

<p>這些工具都可以處理多種文件格式（如 PDF、doc 等）和多種語言（包括中文和英文）。您可以根據您的具體需求和環境選擇最適合您的工具。</p>

<p>此外，如果您希望將搜索結果納入 AI 系統進行解析，您可能需要使用自然語言處理（NLP）工具來理解和分析文本內容。有許多開源的 NLP 工具庫，如 NLTK、SpaCy 和 Stanford CoreNLP 等，都可以用於這種目的。</p>

<p>請注意，在選擇和使用這些工具時，可能需要考慮到一些因素，如性能、可擴展性、社區支持以及與現有系統的兼容性等。希望這些信息對您有所幫助！</p>

<p>來源: 與 Bing 的交談， 2023/10/28
(1) 我是怎麼翻譯英文論文的（2023 更新 ChatGPT AI 翻譯工具） | by 王柏文 | 艾倫蘋果 | [Medium]. https://medium.com/allen365/eng-paper-b270fda2ebf1.
(2) 免费的在线文档翻译器——保留原文档的排版（Word、PDF、Excel、Powerpoint、OpenOffice、文本） - Online Doc Translator. https://www.onlinedoctranslator.com/zh-CN/.
(3) Google 學術搜尋. https://scholar.google.com.tw/?hl=zh-TW.
(4) undefined. https://chatdoc.com/chatdoc/.</p>

<p>(5) 企業使用開放原始碼軟體應注意之法律問題（台灣） - <a href="https://www.leetsai.com/%E8%91%97%E4%BD%9C%E6%AC%8A/legal-issues-that-companies-should-be-aware-of-when-using-open-source-software-taiwan?lang=zh-hant">Lee, Tsai &amp; Partners</a>.</p>

<h3 id="chatgptwebpilot">chatGPT+webpilot</h3>

<p>當您的需求不僅僅是全文搜索，還包括將搜索結果納入AI系統進行解析時，您需要一個更為強大和靈活的解決方案。以下是一些建議：</p>

<ol>
  <li><strong>Elasticsearch</strong>：
    <ul>
      <li><strong>描述</strong>：Elasticsearch是一個分佈式的RESTful搜索和分析引擎。</li>
      <li><strong>特點</strong>：除了強大的全文搜索功能外，Elasticsearch還提供了數據分析功能，可以與多種AI工具和平台集成。</li>
      <li><strong>中文支持</strong>：可以通過插件如<code class="language-plaintext highlighter-rouge">elasticsearch-analysis-ik</code>來支持中文分詞。</li>
      <li><strong>AI集成</strong>：Elasticsearch提供了一個名為Elastic Machine Learning的功能，可以用於異常檢測、預測等AI任務。此外，您還可以使用其API將數據輕鬆導入其他AI平台。</li>
      <li><a href="https://www.elastic.co/elasticsearch/">Elasticsearch官方網站</a></li>
    </ul>
  </li>
  <li><strong>Apache Tika</strong>：
    <ul>
      <li><strong>描述</strong>：Apache Tika是一個Java庫，可以從各種文件格式中提取元數據和文本。</li>
      <li><strong>特點</strong>：Tika支持PDF、DOC、DOCX、PPT、XLS、RTF、HTML、TXT等多種格式，並可以與Elasticsearch等搜索引擎集成。</li>
      <li><a href="https://tika.apache.org/">Apache Tika官方網站</a></li>
    </ul>
  </li>
  <li><strong>Apache Nutch</strong>：
    <ul>
      <li><strong>描述</strong>：Nutch是一個可擴展的Web爬蟲軟件，可以與Solr和Elasticsearch集成。</li>
      <li><strong>特點</strong>：Nutch可以爬取和索引多種文件格式的內容，並支持多語言搜索。</li>
      <li><a href="https://nutch.apache.org/">Apache Nutch官方網站</a></li>
    </ul>
  </li>
  <li><strong>AI平台集成</strong>：
    <ul>
      <li><strong>TensorFlow</strong>和<strong>PyTorch</strong>：這兩個都是流行的深度學習框架，可以用於文本分析、情感分析、文檔分類等任務。</li>
      <li><strong>BERT</strong>：BERT是一種預訓練的深度學習模型，特別適合於文本分析任務。</li>
      <li><strong>spaCy</strong>：這是一個自然語言處理（NLP）庫，支持多種語言，包括中文。</li>
    </ul>
  </li>
  <li><strong>安全性</strong>：
    <ul>
      <li>考慮到這是企業內部的文件，您需要確保所選的解決方案具有足夠的安全性，包括數據加密、用戶身份驗證和授權等。</li>
    </ul>
  </li>
  <li><strong>擴展性和性能</strong>：
    <ul>
      <li>考慮到AI解析可能需要大量的計算資源，確保所選的解決方案可以擴展以滿足未來的需求。</li>
    </ul>
  </li>
</ol>

<p>總之，建議您選擇一個強大的搜索引擎，如Elasticsearch，並將其與AI工具和平台集成，以實現全文搜索和AI解析的需求。此外，還需要考慮安全性、擴展性和性能等因素，以確保解決方案的可靠性和效率。</p>

<h3 id="claude2">claude2</h3>

<p>我建议可以考虑下列方案来实现企业内部文档的全文搜索系统:</p>

<ol>
  <li>
    <p>对不同格式的文档进行预处理,提取出文本内容。对于PDF可以使用开源工具如PDFMiner来提取文本。对于Word文档可以直接提取文本。</p>
  </li>
  <li>
    <p>对提取出的文本内容进行分词和索引。中文文本可以使用jieba、北大中文分词等中文分词工具进行分词。英文文本可以使用Lucene、ElasticSearch等全文搜索引擎提供的分词器进行分词。</p>
  </li>
  <li>
    <p>将分词后的内容上传到全文搜索引擎,如ElasticSearch、Solr等。这些搜索引擎可以对中文和英文都提供索引和搜索功能。</p>
  </li>
  <li>
    <p>在前端实现搜索界面,调用搜索引擎的API进行搜索。可以对搜索结果做一些智能处理,比如高亮显示关键词、按相关性排序等。</p>
  </li>
  <li>
    <p>可以将搜索结果中的关键信息提取出来生成摘要,便于用户快速浏览。可以使用TextRank等工具进行关键句提取。</p>
  </li>
  <li>
    <p>可以将AI技术应用于搜索结果的再排序。例如利用BERT等预训练语言模型对搜索结果进行再排序,使得与查询意图更相关的结果排在前面。</p>
  </li>
  <li>
    <p>对于用户的搜索行为进行跟踪,利用机器学习算法进行搜索结果的智能优化。</p>
  </li>
</ol>

<p>总之,合理使用全文搜索引擎、中文分词、AI技术可以实现针对中文英文的企业文档全文搜索。需要注意搜寻结果的可解释性和与用户意图的匹配程度。</p>]]></content><author><name>yckuang</name><email>sinotec2@gmail.com</email></author><category term="note_system," /><category term="SearchEngine" /><summary type="html"><![CDATA[背景 企業內部文件全文搜索系統，檔案形式可能包括pdf, doc等等，語文包括中文、英文，搜尋結果將納入AI系統的解析，你有什麼建議？ bingChat 對於您的需求，我建議您可以考慮以下的開源全文搜索引擎： Elasticsearch：Elasticsearch 是一個分散式的 RESTful 搜索和分析引擎，能夠解決越來越多的用例。作為 Elasticsearch 的核心，它可以用來同時存儲、搜索和分析大量數據。它通常被用作具有複雜搜索功能的核心引擎/技術。 Apache Solr：Solr 是一個開源的搜索平台，由 Apache Lucene 提供。它包括全文搜索、命中突出顯示、分面搜索、動態集群、數據庫整合等功能。 Whoosh：Whoosh 是一個快速、純 Python 的全文索引、搜索庫庫。 這些工具都可以處理多種文件格式（如 PDF、doc 等）和多種語言（包括中文和英文）。您可以根據您的具體需求和環境選擇最適合您的工具。 此外，如果您希望將搜索結果納入 AI 系統進行解析，您可能需要使用自然語言處理（NLP）工具來理解和分析文本內容。有許多開源的 NLP 工具庫，如 NLTK、SpaCy 和 Stanford CoreNLP 等，都可以用於這種目的。 請注意，在選擇和使用這些工具時，可能需要考慮到一些因素，如性能、可擴展性、社區支持以及與現有系統的兼容性等。希望這些信息對您有所幫助！ 來源: 與 Bing 的交談， 2023/10/28 (1) 我是怎麼翻譯英文論文的（2023 更新 ChatGPT AI 翻譯工具） | by 王柏文 | 艾倫蘋果 | [Medium]. https://medium.com/allen365/eng-paper-b270fda2ebf1. (2) 免费的在线文档翻译器——保留原文档的排版（Word、PDF、Excel、Powerpoint、OpenOffice、文本） - Online Doc Translator. https://www.onlinedoctranslator.com/zh-CN/. (3) Google 學術搜尋. https://scholar.google.com.tw/?hl=zh-TW. (4) undefined. https://chatdoc.com/chatdoc/. (5) 企業使用開放原始碼軟體應注意之法律問題（台灣） - Lee, Tsai &amp; Partners. chatGPT+webpilot 當您的需求不僅僅是全文搜索，還包括將搜索結果納入AI系統進行解析時，您需要一個更為強大和靈活的解決方案。以下是一些建議： Elasticsearch： 描述：Elasticsearch是一個分佈式的RESTful搜索和分析引擎。 特點：除了強大的全文搜索功能外，Elasticsearch還提供了數據分析功能，可以與多種AI工具和平台集成。 中文支持：可以通過插件如elasticsearch-analysis-ik來支持中文分詞。 AI集成：Elasticsearch提供了一個名為Elastic Machine Learning的功能，可以用於異常檢測、預測等AI任務。此外，您還可以使用其API將數據輕鬆導入其他AI平台。 Elasticsearch官方網站 Apache Tika： 描述：Apache Tika是一個Java庫，可以從各種文件格式中提取元數據和文本。 特點：Tika支持PDF、DOC、DOCX、PPT、XLS、RTF、HTML、TXT等多種格式，並可以與Elasticsearch等搜索引擎集成。 Apache Tika官方網站 Apache Nutch： 描述：Nutch是一個可擴展的Web爬蟲軟件，可以與Solr和Elasticsearch集成。 特點：Nutch可以爬取和索引多種文件格式的內容，並支持多語言搜索。 Apache Nutch官方網站 AI平台集成： TensorFlow和PyTorch：這兩個都是流行的深度學習框架，可以用於文本分析、情感分析、文檔分類等任務。 BERT：BERT是一種預訓練的深度學習模型，特別適合於文本分析任務。 spaCy：這是一個自然語言處理（NLP）庫，支持多種語言，包括中文。 安全性： 考慮到這是企業內部的文件，您需要確保所選的解決方案具有足夠的安全性，包括數據加密、用戶身份驗證和授權等。 擴展性和性能： 考慮到AI解析可能需要大量的計算資源，確保所選的解決方案可以擴展以滿足未來的需求。 總之，建議您選擇一個強大的搜索引擎，如Elasticsearch，並將其與AI工具和平台集成，以實現全文搜索和AI解析的需求。此外，還需要考慮安全性、擴展性和性能等因素，以確保解決方案的可靠性和效率。 claude2 我建议可以考虑下列方案来实现企业内部文档的全文搜索系统: 对不同格式的文档进行预处理,提取出文本内容。对于PDF可以使用开源工具如PDFMiner来提取文本。对于Word文档可以直接提取文本。 对提取出的文本内容进行分词和索引。中文文本可以使用jieba、北大中文分词等中文分词工具进行分词。英文文本可以使用Lucene、ElasticSearch等全文搜索引擎提供的分词器进行分词。 将分词后的内容上传到全文搜索引擎,如ElasticSearch、Solr等。这些搜索引擎可以对中文和英文都提供索引和搜索功能。 在前端实现搜索界面,调用搜索引擎的API进行搜索。可以对搜索结果做一些智能处理,比如高亮显示关键词、按相关性排序等。 可以将搜索结果中的关键信息提取出来生成摘要,便于用户快速浏览。可以使用TextRank等工具进行关键句提取。 可以将AI技术应用于搜索结果的再排序。例如利用BERT等预训练语言模型对搜索结果进行再排序,使得与查询意图更相关的结果排在前面。 对于用户的搜索行为进行跟踪,利用机器学习算法进行搜索结果的智能优化。 总之,合理使用全文搜索引擎、中文分词、AI技术可以实现针对中文英文的企业文档全文搜索。需要注意搜寻结果的可解释性和与用户意图的匹配程度。]]></summary></entry><entry><title type="html">如何撰寫程式文件</title><link href="https://sinotec2.github.io/FAQ/2023/10/05/PrmDoc.html" rel="alternate" type="text/html" title="如何撰寫程式文件" /><published>2023-10-05T00:00:00+08:00</published><updated>2023-10-05T00:00:00+08:00</updated><id>https://sinotec2.github.io/FAQ/2023/10/05/PrmDoc</id><content type="html" xml:base="https://sinotec2.github.io/FAQ/2023/10/05/PrmDoc.html"><![CDATA[<h2 id="背景">背景</h2>

<ul>
  <li>這一篇算是個補件。不知道專業領域別人是怎麼寫程式文件，內容寫些甚麼、使用什麼系統、這些個也沒有老師在教，雖然是參照了1~2位網友的介紹，心理總是不踏實。</li>
  <li>問問chatGPT，得到的答案還蠻令人安心的，因為個人過去就是這麼做的。(gpt4應該不會正好訪問到我的部落格吧)</li>
  <li>不過還是得挑剔一下chatGPT的回答、稍微補充一下
    <ol>
      <li>在甚麼編輯軟體平台上寫markdown，這點個人覺得還蠻重要的，但chatGPT沒有交代清楚。在這個平台上就要滿足基本的搜尋、連結、目錄、tag links等等功能。</li>
      <li>git只能儲存、版本管理，還不是一個理想的發布系統。有關發布其實還蠻多細節的。但他把這事賴給[Sphinx][Sphinx]。</li>
      <li>程式的串接是讓文件很難寫的一個原因，markdown可以輕鬆建立hyperlink，這點需要強調一下，他給的範例沒有這一個，是很可惜的。</li>
    </ol>
  </li>
</ul>

<h2 id="chatgpt的回答">chatGPT的回答</h2>

<h3 id="原則建議">原則建議</h3>

<div class="alert alert-danger" role="alert"><i class="fa fa-question-circle"></i> <b>Ask:</b> 有關程式編寫人員如何撰寫程式文件以供團隊使用，你有甚麼建議?</div>

<p>撰寫程式文件對於團隊合作和代碼維護非常重要。以下是一些撰寫程式文件以供團隊使用的建議：</p>

<p>選擇合適的工具和格式：</p>

<p>使用工具如<a href="https://markdown.tw/">Markdown</a>、<a href="https://zh.wikipedia.org/zh-tw/ReStructuredText">reStructuredText</a>或AsciiDoc等，以便輕鬆撰寫和格式化文件。
考慮使用版本控制系統（如Git）來管理程式文件，這樣可以追蹤文件的變更歷史。
提供清晰的概述：</p>

<p>在文件的開頭提供簡要但全面的概述，包括程式的目的、功能、用法和重要的注意事項。
詳細的安裝和設置指南：</p>

<p>如果需要，提供清晰的安裝和配置步驟，以便新團隊成員可以輕松地設置和運行程式。
示例和用法：</p>

<p>提供實際的示例代碼片段，以展示程式的使用方式和功能。
考慮包括數個不同情境下的示例，以涵蓋各種使用情況。</p>

<ul>
  <li>API文檔：如果您的程式包含公共API，則提供清晰的API文檔，包括函數、類、方法的描述、參數、返回值和範例。</li>
  <li>代碼結構和組織：
    <ul>
      <li>描述代碼的結構和組織，包括模塊、類和函數的說明。</li>
      <li>可以使用圖表或結構示意圖來視覺化程式的結構。</li>
    </ul>
  </li>
  <li>錯誤處理和除錯：提供有關如何處理錯誤和除錯程式的信息，以幫助團隊成員解決問題。</li>
  <li>更新和變更歷史：在文件中記錄程式的更新和變更歷史，包括版本號、日期和具體的變更內容。</li>
  <li>使用註釋和註解：使用註釋和註解來解釋代碼的關鍵部分、設計決策和可能的優化。</li>
  <li>提供聯絡資訊：包括您的聯絡資訊，以便其他團隊成員可以與您進行交流或提問問題。</li>
  <li>持續維護：確保文件與代碼同步更新，並根據需要定期檢查和修訂文件。</li>
  <li>考慮使用自動化工具：
    <ul>
      <li>考慮使用自動文檔生成工具（如[Sphinx]<a href="https://www.sphinx-doc.org/en/master/">Sphinx</a>或<a href="https://zh.wikipedia.org/zh-tw/Doxygen">[[2023-10-12]]</a>），</li>
      <li>以便自動生成部分文檔，例如API文檔。</li>
    </ul>
  </li>
</ul>

<p>最重要的是，文件應該易於閱讀、理解和搜索。好的程式文件可以幫助團隊成員更快速地上手，減少錯誤並提高代碼的可維護性。</p>

<h3 id="api文檔範例">API文檔範例</h3>

<div class="alert alert-danger" role="alert"><i class="fa fa-question-circle"></i> <b>Ask:</b> 你能提供一個API文件的範例或範本嗎?</div>

<p>當然，以下是一個簡單的API文檔範本，您可以根據您的實際需要進行擴展和修改：</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gh"># My API Documentation</span>

<span class="gu">## 概述</span>
這是一個簡單的API文檔範本，用於描述我們的API的功能和用法。

<span class="gu">## 基本信息</span>
<span class="p">-</span> <span class="gs">**API版本：**</span> v1
<span class="p">-</span> <span class="gs">**基本URL：**</span> <span class="sb">`https://api.example.com`</span>

<span class="gu">## 身份驗證</span>
我們的API需要使用Bearer令牌進行身份驗證。您需要在每個請求的標頭中包含<span class="sb">`Authorization`</span>頭部。

<span class="gu">## 資源</span>

<span class="gu">### 1. 使用者（Users）</span>

<span class="gu">#### 1.1 獲取所有使用者</span>
<span class="p">-</span> <span class="gs">**URL：**</span> <span class="sb">`/users`</span>
<span class="p">-</span> <span class="gs">**方法：**</span> GET
<span class="p">-</span> <span class="gs">**描述：**</span> 獲取所有註冊使用者的列表。

<span class="gu">#### 1.2 獲取特定使用者</span>
<span class="p">-</span> <span class="gs">**URL：**</span> <span class="sb">`/users/{user_id}`</span>
<span class="p">-</span> <span class="gs">**方法：**</span> GET
<span class="p">-</span> <span class="gs">**描述：**</span> 獲取特定使用者的詳細信息。

<span class="gu">#### 1.3 創建新使用者</span>
<span class="p">-</span> <span class="gs">**URL：**</span> <span class="sb">`/users`</span>
<span class="p">-</span> <span class="gs">**方法：**</span> POST
<span class="p">-</span> <span class="gs">**描述：**</span> 創建新使用者。

<span class="gs">**請求示例：**</span>
<span class="p">```</span><span class="nl">json
</span><span class="p">{</span><span class="w">
  </span><span class="nl">"username"</span><span class="p">:</span><span class="w"> </span><span class="s2">"newuser"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"password"</span><span class="p">:</span><span class="w"> </span><span class="s2">"password123"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="err">/```</span><span class="w">

</span><span class="err">####</span><span class="w"> </span><span class="mf">1.4</span><span class="w"> </span><span class="err">更新使用者信息</span><span class="w">
</span><span class="err">-</span><span class="w"> </span><span class="err">**URL：**</span><span class="w"> </span><span class="err">`/users/</span><span class="p">{</span><span class="err">user_id</span><span class="p">}</span><span class="err">`</span><span class="w">
</span><span class="err">-</span><span class="w"> </span><span class="err">**方法：**</span><span class="w"> </span><span class="err">PUT</span><span class="w">
</span><span class="err">-</span><span class="w"> </span><span class="err">**描述：**</span><span class="w"> </span><span class="err">更新特定使用者的信息。</span><span class="w">

</span><span class="err">**請求示例：**</span>
<span class="p">```</span>json
{
  "username": "updateduser"
}
/<span class="sb">```

#### 1.5 刪除使用者
- **URL：** `/users/{user_id}`
- **方法：** DELETE
- **描述：** 刪除特定使用者。

### 2. 產品（Products）

#### 2.1 獲取所有產品
- **URL：** `/products`
- **方法：** GET
- **描述：** 獲取所有產品的列表。

#### 2.2 獲取特定產品
- **URL：** `/products/{product_id}`
- **方法：** GET
- **描述：** 獲取特定產品的詳細信息。

## 錯誤處理
我們的API使用標準的HTTP狀態碼來指示請求的結果。當出現錯誤時，我們還提供一個包含錯誤詳情的JSON響應。

**示例：**
```</span>json
{
  "error": "錯誤消息"
}
/<span class="sb">```</span>

<span class="gu">## 結論</span>
這只是一個簡單的API文檔範本，您可以根據您的API的實際需要進行擴展和自定義。請確保提供詳細的描述、示例和錯誤處理信息，以幫助開發人員更輕鬆地使用您的API。

</code></pre></div></div>

<p>這只是一個基本的範本，您可以根據您的API的特定需求和端點進行修改和擴展。文檔應該包括有關API的所有重要信息，並提供清晰的示例以幫助開發人員使用它。</p>

<p>[Sphinx]:</p>]]></content><author><name>yckuang</name><email>sinotec2@gmail.com</email></author><category term="note_system" /><summary type="html"><![CDATA[背景 這一篇算是個補件。不知道專業領域別人是怎麼寫程式文件，內容寫些甚麼、使用什麼系統、這些個也沒有老師在教，雖然是參照了1~2位網友的介紹，心理總是不踏實。 問問chatGPT，得到的答案還蠻令人安心的，因為個人過去就是這麼做的。(gpt4應該不會正好訪問到我的部落格吧) 不過還是得挑剔一下chatGPT的回答、稍微補充一下 在甚麼編輯軟體平台上寫markdown，這點個人覺得還蠻重要的，但chatGPT沒有交代清楚。在這個平台上就要滿足基本的搜尋、連結、目錄、tag links等等功能。 git只能儲存、版本管理，還不是一個理想的發布系統。有關發布其實還蠻多細節的。但他把這事賴給[Sphinx][Sphinx]。 程式的串接是讓文件很難寫的一個原因，markdown可以輕鬆建立hyperlink，這點需要強調一下，他給的範例沒有這一個，是很可惜的。 chatGPT的回答 原則建議 Ask: 有關程式編寫人員如何撰寫程式文件以供團隊使用，你有甚麼建議? 撰寫程式文件對於團隊合作和代碼維護非常重要。以下是一些撰寫程式文件以供團隊使用的建議： 選擇合適的工具和格式： 使用工具如Markdown、reStructuredText或AsciiDoc等，以便輕鬆撰寫和格式化文件。 考慮使用版本控制系統（如Git）來管理程式文件，這樣可以追蹤文件的變更歷史。 提供清晰的概述： 在文件的開頭提供簡要但全面的概述，包括程式的目的、功能、用法和重要的注意事項。 詳細的安裝和設置指南： 如果需要，提供清晰的安裝和配置步驟，以便新團隊成員可以輕松地設置和運行程式。 示例和用法： 提供實際的示例代碼片段，以展示程式的使用方式和功能。 考慮包括數個不同情境下的示例，以涵蓋各種使用情況。 API文檔：如果您的程式包含公共API，則提供清晰的API文檔，包括函數、類、方法的描述、參數、返回值和範例。 代碼結構和組織： 描述代碼的結構和組織，包括模塊、類和函數的說明。 可以使用圖表或結構示意圖來視覺化程式的結構。 錯誤處理和除錯：提供有關如何處理錯誤和除錯程式的信息，以幫助團隊成員解決問題。 更新和變更歷史：在文件中記錄程式的更新和變更歷史，包括版本號、日期和具體的變更內容。 使用註釋和註解：使用註釋和註解來解釋代碼的關鍵部分、設計決策和可能的優化。 提供聯絡資訊：包括您的聯絡資訊，以便其他團隊成員可以與您進行交流或提問問題。 持續維護：確保文件與代碼同步更新，並根據需要定期檢查和修訂文件。 考慮使用自動化工具： 考慮使用自動文檔生成工具（如[Sphinx]Sphinx或[[2023-10-12]]）， 以便自動生成部分文檔，例如API文檔。 最重要的是，文件應該易於閱讀、理解和搜索。好的程式文件可以幫助團隊成員更快速地上手，減少錯誤並提高代碼的可維護性。 API文檔範例 Ask: 你能提供一個API文件的範例或範本嗎? 當然，以下是一個簡單的API文檔範本，您可以根據您的實際需要進行擴展和修改： # My API Documentation ## 概述 這是一個簡單的API文檔範本，用於描述我們的API的功能和用法。 ## 基本信息 - **API版本：** v1 - **基本URL：** `https://api.example.com` ## 身份驗證 我們的API需要使用Bearer令牌進行身份驗證。您需要在每個請求的標頭中包含`Authorization`頭部。 ## 資源 ### 1. 使用者（Users） #### 1.1 獲取所有使用者 - **URL：** `/users` - **方法：** GET - **描述：** 獲取所有註冊使用者的列表。 #### 1.2 獲取特定使用者 - **URL：** `/users/{user_id}` - **方法：** GET - **描述：** 獲取特定使用者的詳細信息。 #### 1.3 創建新使用者 - **URL：** `/users` - **方法：** POST - **描述：** 創建新使用者。 **請求示例：** ```json { "username": "newuser", "password": "password123" } /``` #### 1.4 更新使用者信息 - **URL：** `/users/{user_id}` - **方法：** PUT - **描述：** 更新特定使用者的信息。 **請求示例：** ```json { "username": "updateduser" } /``` #### 1.5 刪除使用者 - **URL：** `/users/{user_id}` - **方法：** DELETE - **描述：** 刪除特定使用者。 ### 2. 產品（Products） #### 2.1 獲取所有產品 - **URL：** `/products` - **方法：** GET - **描述：** 獲取所有產品的列表。 #### 2.2 獲取特定產品 - **URL：** `/products/{product_id}` - **方法：** GET - **描述：** 獲取特定產品的詳細信息。 ## 錯誤處理 我們的API使用標準的HTTP狀態碼來指示請求的結果。當出現錯誤時，我們還提供一個包含錯誤詳情的JSON響應。 **示例：** ```json { "error": "錯誤消息" } /``` ## 結論 這只是一個簡單的API文檔範本，您可以根據您的API的實際需要進行擴展和自定義。請確保提供詳細的描述、示例和錯誤處理信息，以幫助開發人員更輕鬆地使用您的API。 這只是一個基本的範本，您可以根據您的API的特定需求和端點進行修改和擴展。文檔應該包括有關API的所有重要信息，並提供清晰的示例以幫助開發人員使用它。 [Sphinx]:]]></summary></entry><entry><title type="html">ElasticView</title><link href="https://sinotec2.github.io/FAQ/2023/10/05/ElasticView.html" rel="alternate" type="text/html" title="ElasticView" /><published>2023-10-05T00:00:00+08:00</published><updated>2023-10-05T00:00:00+08:00</updated><id>https://sinotec2.github.io/FAQ/2023/10/05/ElasticView</id><content type="html" xml:base="https://sinotec2.github.io/FAQ/2023/10/05/ElasticView.html"><![CDATA[<h2 id="背景">背景</h2>

<ul>
  <li>這個套件功能是為文件檔案的全文搜索。因為是用golang寫的、而且是陸胞網友提供，只能拜託chatgpt幫忙寫說明、檢查有沒有“特別”的東西囉。</li>
</ul>

<h3 id="code">code</h3>

<ul>
  <li><a href="https://github.com/1340691923/ElasticView">github</a></li>
</ul>

<h3 id="使用">使用</h3>

<ul>
  <li><a href="http://www.elastic-view.cn/usage.html">usage</a></li>
</ul>

<h3 id="instance">instance</h3>

<p><a href="http://200.200.31.47:8090/">node03:8090</a></p>

<h2 id="cmd">cmd</h2>

<h3 id="elasticviewcmdbuildmaingo">ElasticView/cmd/build/main.go</h3>

<p>這段 GO 程式碼主要是用於編譯和打包一個名為 “ev” 的應用程式。以下是該程式碼的詳細說明：</p>

<ol>
  <li>
    <p><strong>引入的套件</strong>：程式碼引入了多個外部和內部套件，包括文件路徑操作、命令行參數解析、日誌記錄等。</p>
  </li>
  <li>
    <p><strong>初始化</strong>：在 <code class="language-plaintext highlighter-rouge">init</code> 函數中，程式碼初始化了一些命令行參數，例如程序的家目錄、二進制名稱和配置文件的路徑。</p>
  </li>
  <li>
    <p><strong>主函數</strong>：<code class="language-plaintext highlighter-rouge">main</code> 函數首先初始化配置，然後進行應用程式的編譯。如果編譯成功，它將輸出一條成功的日誌消息。</p>
  </li>
  <li>
    <p><strong>編譯函數</strong>：<code class="language-plaintext highlighter-rouge">BuildEvSvr</code> 函數負責編譯多個平台的二進制文件，例如 Linux、Darwin（macOS）和 Windows。編譯完成後，它會將這些二進制文件和配置文件打包成一個 ZIP 文件。</p>
  </li>
  <li><strong>輔助函數</strong>：
    <ul>
      <li><code class="language-plaintext highlighter-rouge">getExecutableName</code>：根據操作系統和架構返回可執行文件的名稱。</li>
      <li><code class="language-plaintext highlighter-rouge">buildBackend</code>：負責實際的編譯操作。</li>
      <li><code class="language-plaintext highlighter-rouge">newBuildConfig</code>：創建一個新的編譯配置。</li>
      <li><code class="language-plaintext highlighter-rouge">RunGoBuild</code>：運行 Go 編譯命令。</li>
    </ul>
  </li>
  <li>
    <p><strong>Build 結構體</strong>：這個結構體包含了多個方法，每個方法都是針對一個特定的平台和架構進行編譯。</p>
  </li>
  <li><strong>註釋掉的函數</strong>：<code class="language-plaintext highlighter-rouge">BuildVue</code> 函數被註釋掉了，它可能是用於編譯 Vue.js 前端應用程式的。</li>
</ol>

<h3 id="cmdev-climaingo">cmd/ev-cli/main.go</h3>

<pre><code class="language-GO">package main

func main(){

}
</code></pre>

<h3 id="cmdevmaingo">cmd/ev/main.go</h3>

<p>這段 GO 程式碼主要是用於初始化和運行一個名為 “ev” 的伺服器應用程式。以下是該程式碼的詳細說明：</p>

<ol>
  <li>
    <p><strong>引入的套件</strong>：程式碼引入了多個外部和內部套件，包括命令行參數解析、日誌記錄、操作系統信號處理等。</p>
  </li>
  <li>
    <p><strong>初始化</strong>：在 <code class="language-plaintext highlighter-rouge">init</code> 函數中，程式碼初始化了一些命令行參數，例如程序的家目錄、二進制名稱和配置文件的路徑。</p>
  </li>
  <li><strong>主函數</strong>：
    <ul>
      <li>使用 <code class="language-plaintext highlighter-rouge">server.Initialize</code> 函數初始化伺服器。</li>
      <li>使用 <code class="language-plaintext highlighter-rouge">svr.Init</code> 函數進行伺服器的進一步初始化。</li>
      <li>使用 <code class="language-plaintext highlighter-rouge">go listenToSystemSignals</code> 函數啟動一個協程來監聽系統信號，以便在接收到終止信號時優雅地關閉伺服器。</li>
      <li>使用 <code class="language-plaintext highlighter-rouge">svr.Run</code> 函數運行伺服器。</li>
    </ul>
  </li>
  <li>
    <p><strong>系統信號監聽</strong>：<code class="language-plaintext highlighter-rouge">listenToSystemSignals</code> 函數監聽系統信號，特別是中斷信號和終止信號。當接收到這些信號時，它會嘗試優雅地關閉伺服器，並在 30 秒的超時後強制關閉。</p>
  </li>
  <li><strong>錯誤處理</strong>：如果在初始化或運行伺服器的過程中遇到任何錯誤，程式碼將輸出一條錯誤消息並終止執行。</li>
</ol>

<h2 id="docsdocsgo">docs/docs.go</h2>

<p>這段 GO 程式碼是由 <code class="language-plaintext highlighter-rouge">swaggo/swag</code> 工具自動生成的，用於支援 Swagger 文檔生成。Swagger 是一個 API 規範和框架，用於設計、構建、文檔和使用 RESTful Web 服務。以下是該程式碼的詳細說明：</p>

<ol>
  <li>
    <p><strong>註釋</strong>：開頭的註釋明確指出這段程式碼是由 <code class="language-plaintext highlighter-rouge">swaggo/swag</code> 工具生成的，並且不應該被手動編輯。</p>
  </li>
  <li>
    <p><strong>docTemplate</strong>：這是一個常量，定義了 Swagger 文檔的基本模板。它包含了一些基本的 Swagger 規範字段，如 <code class="language-plaintext highlighter-rouge">schemes</code>、<code class="language-plaintext highlighter-rouge">swagger</code>、<code class="language-plaintext highlighter-rouge">info</code>、<code class="language-plaintext highlighter-rouge">host</code>、<code class="language-plaintext highlighter-rouge">basePath</code> 和 <code class="language-plaintext highlighter-rouge">paths</code>。這些字段的值將在運行時被填充。</p>
  </li>
  <li>
    <p><strong>SwaggerInfo</strong>：這是一個全局變量，它是 <code class="language-plaintext highlighter-rouge">swag.Spec</code> 的實例。它包含了 Swagger 文檔的一些基本信息，如版本、主機、基本路徑、方案、標題和描述。這些值可以在其他地方被修改，以定制 Swagger 文檔的內容。</p>
  </li>
  <li>
    <p><strong>init 函數</strong>：這是一個特殊的函數，它在包被導入時自動執行。在這個函數中，<code class="language-plaintext highlighter-rouge">SwaggerInfo</code> 被註冊到 <code class="language-plaintext highlighter-rouge">swag</code>，這樣當 <code class="language-plaintext highlighter-rouge">swag</code> 生成 Swagger 文檔時，它就可以使用這些信息。</p>
  </li>
</ol>

<p>總之，這段程式碼的主要目的是提供 Swagger 文檔的基本模板和信息，以便 <code class="language-plaintext highlighter-rouge">swaggo/swag</code> 工具可以使用它來生成完整的 Swagger 文檔。</p>

<h2 id="es-related-api">es related api</h2>

<h3 id="pkgapies_backup_controllergo">pkg/api/es_backup_controller.go</h3>

<p>這段 GO <a href="https://github.com/1340691923/ElasticView/blob/main/pkg/api/es_backup_controller.go">程式碼</a>定義了一個名為 <code class="language-plaintext highlighter-rouge">EsBackUpController</code> 的 API 控制器，該控制器提供了與 Elasticsearch 快照和備份相關的功能。以下是該程式碼的詳細說明：</p>

<ol>
  <li>
    <p><strong>引入的套件</strong>：程式碼引入了多個外部和內部套件，包括 DTO（Data Transfer Object）定義、Elasticsearch SDK 工廠、日誌記錄、HTTP 響應處理、工具函數和 <a href="#gin-web框架">Gin Web 框架</a>。</p>
  </li>
  <li><strong>EsBackUpController 結構體</strong>：
    <ul>
      <li><code class="language-plaintext highlighter-rouge">EsBackUpController</code> 是一個控制器結構體，它包含了基本控制器、日誌、Elasticsearch 客戶端服務和 Elasticsearch 備份服務的指針字段。</li>
      <li><code class="language-plaintext highlighter-rouge">NewEsBackUpController</code> 函數是 <code class="language-plaintext highlighter-rouge">EsBackUpController</code> 的構造函數，它接受基本控制器、日誌、Elasticsearch 客戶端服務和 Elasticsearch 備份服務作為參數，並返回一個新的 <code class="language-plaintext highlighter-rouge">EsBackUpController</code> 實例。</li>
    </ul>
  </li>
  <li><strong>API 方法</strong>：
    <ul>
      <li><strong>SnapshotRepositoryListAction</strong>：查詢 Elasticsearch 快照仓库列表。</li>
      <li><strong>SnapshotCreateRepositoryAction</strong>：新建 Elasticsearch 快照仓库。</li>
      <li><strong>CleanupeRepositoryAction</strong>：清理 Elasticsearch 快照仓库。</li>
      <li><strong>SnapshotDeleteRepositoryAction</strong>：刪除 Elasticsearch 快照仓库。</li>
      <li><strong>CreateSnapshotAction</strong>：創建 Elasticsearch 快照。</li>
      <li><strong>SnapshotListAction</strong>：查詢 Elasticsearch 快照列表。</li>
      <li><strong>SnapshotDeleteAction</strong>：刪除 Elasticsearch 快照。</li>
      <li><strong>SnapshotDetailAction</strong>：查詢 Elasticsearch 快照詳情。</li>
      <li><strong>SnapshotRestoreAction</strong>：將 Elasticsearch 索引恢复至快照時的狀態。</li>
      <li><strong>SnapshotStatusAction</strong>：獲取 Elasticsearch 快照的狀態。</li>
    </ul>
  </li>
</ol>

<p>每個 API 方法都首先解析和驗證請求數據，然後使用相應的服務進行操作，最後返回操作結果。</p>

<p>總之，這段程式碼定義了一個 API 控制器，它提供了與 Elasticsearch 快照和備份相關的功能。</p>

<h3 id="pkgapies_controllergo">pkg/api/es_controller.go</h3>

<p>這是一段 Go 語言的<a href="https://github.com/1340691923/ElasticView/blob/main/pkg/api/es_controller.go">程式碼</a>，主要與 Elasticsearch 有關。以下是該程式碼的中文說明：</p>

<ol>
  <li><strong>導入的套件</strong>：
    <ul>
      <li>引入了多個內部和外部的套件，包括 <code class="language-plaintext highlighter-rouge">bytes</code>, <code class="language-plaintext highlighter-rouge">errors</code>, <code class="language-plaintext highlighter-rouge">fmt</code>, <code class="language-plaintext highlighter-rouge">github.com/gin-gonic/gin</code> 等。</li>
    </ul>
  </li>
  <li><strong>EsController 結構</strong>：
    <ul>
      <li>定義了一個名為 <code class="language-plaintext highlighter-rouge">EsController</code> 的結構，該結構包含了多個屬性，如日誌、Elasticsearch 客戶端服務、JWT 服務等。</li>
    </ul>
  </li>
  <li><strong>NewEsController 函數</strong>：
    <ul>
      <li>這是一個建構函數，用於創建 <code class="language-plaintext highlighter-rouge">EsController</code> 的新實例。</li>
    </ul>
  </li>
  <li><strong>PingAction 函數</strong>：
    <ul>
      <li>用於檢查 Elasticsearch 的連接是否正常。如果密碼不為空，它會進行解密。然後，它會嘗試 ping Elasticsearch 並返回結果。</li>
    </ul>
  </li>
  <li><strong>CatAction 函數</strong>：
    <ul>
      <li>這是 Elasticsearch 的 CAT API 的實現。它可以執行多種 CAT 操作，如查看集群健康狀態、查看分片、查看索引等。</li>
    </ul>
  </li>
  <li><strong>RunDslAction 函數</strong>：
    <ul>
      <li>允許用戶運行 Elasticsearch 的 DSL 查詢。它還處理 GET 請求的特殊情況，並將 DSL 查詢的結果返回給用戶。</li>
    </ul>
  </li>
  <li><strong>SqlToDslAction 函數</strong>：
    <ul>
      <li>將 SQL 查詢轉換為 Elasticsearch 的 DSL 查詢。它使用 <code class="language-plaintext highlighter-rouge">elasticsql</code> 套件進行轉換。</li>
    </ul>
  </li>
  <li><strong>OptimizeAction 函數</strong>：
    <ul>
      <li>對 Elasticsearch 的索引進行多種操作，如刷新、清除緩存、合併等。</li>
    </ul>
  </li>
  <li><strong>RecoverCanWrite 函數</strong>：
    <ul>
      <li>如果 Elasticsearch 的索引因某種原因被設置為只讀，此函數將其恢復為可寫狀態。</li>
    </ul>
  </li>
</ol>

<p>整體來說，這段程式碼提供了一個 API 控制器，該控制器允許用戶執行多種與 Elasticsearch 相關的操作，如檢查連接、運行查詢、優化索引等。</p>

<h3 id="pkgapies_crud_controllergo">pkg/api/es_crud_controller.go</h3>

<p>這是一段 Go 語言的<a href="https://github.com/1340691923/ElasticView/blob/main/pkg/api/es_crud_controller.go">程式碼</a>，主要與 Elasticsearch 的 <a href="#crud">CRUD</a> 操作有關。以下是該程式碼的中文說明：</p>

<ol>
  <li><strong>導入的套件</strong>：
    <ul>
      <li>引入了多個內部和外部的套件，包括 <code class="language-plaintext highlighter-rouge">github.com/gin-gonic/gin</code>、<code class="language-plaintext highlighter-rouge">github.com/1340691923/ElasticView/pkg/dto</code> 等。</li>
    </ul>
  </li>
  <li><strong>EsCrudController 結構</strong>：
    <ul>
      <li>定義了一個名為 <code class="language-plaintext highlighter-rouge">EsCrudController</code> 的結構，該結構包含了多個屬性，如 Elasticsearch 客戶端服務、日誌和 <a href="#Navicat">Navicat</a> 服務。</li>
    </ul>
  </li>
  <li><strong>NewEsCrudController 函數</strong>：
    <ul>
      <li>這是一個建構函數，用於創建 <code class="language-plaintext highlighter-rouge">EsCrudController</code> 的新實例。</li>
    </ul>
  </li>
  <li><strong>GetList 函數</strong>：
    <ul>
      <li>這是一個可視化篩選獲取數據的函數。它首先綁定請求到 <code class="language-plaintext highlighter-rouge">crudFilter</code>，然後使用 Navicat 服務從 Elasticsearch 中獲取數據列表和數據計數。</li>
    </ul>
  </li>
  <li><strong>GetDSL 函數</strong>：
    <ul>
      <li>這是一個可視化獲取 DSL 查詢的函數。它首先綁定請求到 <code class="language-plaintext highlighter-rouge">crudFilter</code>，然後使用 Navicat 服務從 Elasticsearch 中獲取 DSL 查詢的結果。</li>
    </ul>
  </li>
  <li><strong>Download 函數</strong>：
    <ul>
      <li>這是一個下載功能的函數。它首先綁定請求到 <code class="language-plaintext highlighter-rouge">crudFilter</code>，然後使用 Navicat 服務從 Elasticsearch 中獲取需要下載的數據。最後，它使用 <code class="language-plaintext highlighter-rouge">DownloadExcel</code> 函數將數據下載為 Excel 文件。</li>
    </ul>
  </li>
</ol>

<p>整體來說，這段程式碼提供了一個 API 控制器，該控制器允許用戶執行多種與 Elasticsearch 相關的 CRUD 操作，如獲取數據列表、獲取 DSL 查詢的結果和下載數據。</p>

<h3 id="pkgapies_doc_controllergo">pkg/api/es_doc_controller.go</h3>

<p>這段<a href="https://github.com/1340691923/ElasticView/blob/main/pkg/api/es_doc_controller.go">程式碼</a>是一段以 Go 語言撰寫的 API 控制器代碼，針對 Elasticsearch 文檔的操作。以下是詳細說明：</p>

<ol>
  <li><strong>Package 和 Import</strong>:
    <ul>
      <li><code class="language-plaintext highlighter-rouge">package api</code>：此代碼是<code class="language-plaintext highlighter-rouge">api</code>包的一部分。</li>
      <li>後面的<code class="language-plaintext highlighter-rouge">import</code>語句導入了多個必要的包，這些包用於實現這個控制器的功能。</li>
    </ul>
  </li>
  <li><strong>EsDocController struct</strong>:
    <ul>
      <li>定義了一個名為<code class="language-plaintext highlighter-rouge">EsDocController</code>的結構體，代表 Elasticsearch 文檔控制器。它包含四個成員：<code class="language-plaintext highlighter-rouge">BaseController</code>(<a href="#pkgapibase_controllergo">ref</a>), <code class="language-plaintext highlighter-rouge">log</code>, <code class="language-plaintext highlighter-rouge">esClientService</code>, 和<code class="language-plaintext highlighter-rouge">esDocService</code>。</li>
    </ul>
  </li>
  <li><strong>NewEsDocController function</strong>:
    <ul>
      <li>是<code class="language-plaintext highlighter-rouge">EsDocController</code>的建構函數，用於初始化並返回一個新的<code class="language-plaintext highlighter-rouge">EsDocController</code>實例。</li>
    </ul>
  </li>
  <li><strong>DeleteRowByIDAction method</strong>:
    <ul>
      <li>此方法用於從 Elasticsearch 中刪除指定 ID 的文檔數據。首先，它嘗試綁定請求體到<code class="language-plaintext highlighter-rouge">esDocDeleteRowByID</code>。然後，使用<code class="language-plaintext highlighter-rouge">esClientService</code>取得 ES 客戶端，然後使用<code class="language-plaintext highlighter-rouge">esDocService</code>來執行實際的刪除操作。</li>
    </ul>
  </li>
  <li><strong>UpdateByIDAction method</strong>:
    <ul>
      <li>此方法用於更新 Elasticsearch 中特定 ID 的文檔數據。它的工作方式與<code class="language-plaintext highlighter-rouge">DeleteRowByIDAction</code>相似，只是在最後它呼叫<code class="language-plaintext highlighter-rouge">EsDocUpdateByID</code>方法來更新數據。</li>
    </ul>
  </li>
  <li><strong>InsertAction method</strong>:
    <ul>
      <li>此方法用於在 Elasticsearch 中插入新的文檔。它的工作流程與上面兩個方法類似，但在最後它呼叫<code class="language-plaintext highlighter-rouge">EsDocInsert</code>方法來插入數據。</li>
    </ul>
  </li>
</ol>

<p>在每個方法中，如果遇到錯誤，它都會通過調用<code class="language-plaintext highlighter-rouge">this.Error</code>方法發送一個帶有錯誤信息的響應。如果操作成功，它會通過調用<code class="language-plaintext highlighter-rouge">this.Success</code>方法發送一個成功的響應。</p>

<p>這些控制器方法基本上都是為了與 Elasticsearch 互動。它們先通過<code class="language-plaintext highlighter-rouge">esClientService</code>取得與 Elasticsearch 的連接，然後使用<code class="language-plaintext highlighter-rouge">esDocService</code>來執行特定的操作（如插入、更新或刪除）。</p>

<h3 id="pkgapies_index_controllergo">pkg/api/es_index_controller.go</h3>

<p>這段<a href="https://github.com/1340691923/ElasticView/blob/main/pkg/api/es_index_controller.go">程式碼</a>中，我們可以看到一個名為 <code class="language-plaintext highlighter-rouge">EsIndexController</code> 的控制器，它提供了多種與ElasticSearch索引互動的方法。此控制器基於<a href="#gin-web框架">Gin Web框架</a>構建。以下是該段程式碼的主要部分解析：</p>

<ol>
  <li>
    <p><strong>導入模組</strong>:
這段程式碼首先導入了必要的包。包括<a href="#gin-web框架">Gin Web框架</a>、ElasticView項目的包（這可能是此控制器所屬的主應用程序）以及ElasticSearch SDK的包。</p>
  </li>
  <li><strong>結構體</strong>:
    <ul>
      <li><code class="language-plaintext highlighter-rouge">EsIndexController</code>: 這個結構體作為與ElasticSearch索引操作的控制器。它內嵌了一個<code class="language-plaintext highlighter-rouge">BaseController</code>(<a href="#pkgapibase_controllergo">ref</a>)，這包含了一些常用的Web請求和響應處理方法。此結構體還包含了多個服務實例，用於幫助進行ElasticSearch操作。</li>
    </ul>
  </li>
  <li><strong>構造函數</strong>:
    <ul>
      <li><code class="language-plaintext highlighter-rouge">NewEsIndexController()</code>: 這個函數作為<code class="language-plaintext highlighter-rouge">EsIndexController</code>的構造函數，用於設定必要的依賴，如日誌和各種服務。</li>
    </ul>
  </li>
  <li><strong>端點</strong>:
接著是一系列與ElasticSearch互動的方法，例如建立索引、刪除索引、獲取設置等。</li>
</ol>

<p>總的來說，這段程式碼提供了一個清晰的控制器，專門用於管理ElasticSearch索引的各種操作。</p>

<h3 id="pkgapies_link_controllergo">pkg/api/es_link_controller.go</h3>

<p>這段程式碼是一個名為 <code class="language-plaintext highlighter-rouge">EsLinkController</code> 的控制器，該控制器似乎用於管理ElasticSearch連接。基於Gin Web框架，它提供了對ElasticSearch連接的<a href="#crud">增、刪、改、查</a>操作。以下是詳細的功能描述：</p>

<ol>
  <li><strong>結構體和依賴注入</strong>:
    <ul>
      <li><code class="language-plaintext highlighter-rouge">EsLinkController</code>: 這是主要的控制器結構體，其中嵌入了其他的服務和工具，如日誌（log）、ElasticSearch客戶端服務（esClientService）、數據庫連接（sqlx）、ElasticSearch緩存（esCache）和EsLink服務（esLinkService）等。</li>
      <li><code class="language-plaintext highlighter-rouge">NewEsLinkController()</code>: 構造函數，用於初始化<code class="language-plaintext highlighter-rouge">EsLinkController</code>結構體。</li>
    </ul>
  </li>
  <li><strong>功能端點</strong>:
    <ul>
      <li><code class="language-plaintext highlighter-rouge">ListAction()</code>: 獲取ElasticSearch連接列表。</li>
      <li><code class="language-plaintext highlighter-rouge">OptAction()</code>: 似乎是獲取某些操作選項的方法。它將每一個連接的ID和描述信息（Remark）添加到optList中。</li>
      <li><code class="language-plaintext highlighter-rouge">InsertAction()</code>: 新增ElasticSearch連接。它首先從請求中綁定一個<code class="language-plaintext highlighter-rouge">EsLinkModel</code>，然後進行一系列的操作以保存這個連接到數據庫中。包括對密碼加密和刷新EsLink列表的操作。</li>
      <li><code class="language-plaintext highlighter-rouge">UpdateAction()</code>: 更新一個已存在的ElasticSearch連接的信息。操作過程與插入相似，但是它會在數據庫中更新一條已存在的紀錄。</li>
      <li><code class="language-plaintext highlighter-rouge">DeleteAction()</code>: 刪除一個ElasticSearch連接。它會根據請求中的ID來刪除數據庫中對應的紀錄，並更新緩存。</li>
    </ul>
  </li>
  <li><strong>輔助功能</strong>:
    <ul>
      <li>在各功能端點中，都有對錯誤的處理，如果出現錯誤，會使用<code class="language-plaintext highlighter-rouge">this.Error()</code>方法返回錯誤信息。成功的操作會使用<code class="language-plaintext highlighter-rouge">this.Success()</code>方法返回成功信息。</li>
      <li>在新增和更新連接時，都有對連接密碼的加密操作。</li>
      <li>對ElasticSearch連接的增、刪、改操作後，都會進行刷新EsLink列表的操作。</li>
    </ul>
  </li>
</ol>

<p>總之，<code class="language-plaintext highlighter-rouge">EsLinkController</code>主要用於管理ElasticSearch連接，並提供了一系列<a href="#crud">CRUD</a>操作的方法。</p>

<h3 id="pkgapies_map_controllergo">pkg/api/es_map_controller.go</h3>

<p>這段<a href="https://github.com/1340691923/ElasticView/blob/main/pkg/api/es_map_controller.go">程式碼</a>是一個名為 <code class="language-plaintext highlighter-rouge">EsMappingController</code> 的控制器，該控制器似乎用於管理ElasticSearch的映射（Mapping）。基於<a href="#gin-web框架">Gin Web框架</a>，它提供了對ElasticSearch映射的查詢和修改操作。以下是詳細的功能描述：</p>

<ol>
  <li><strong>結構體和依賴注入</strong>:
    <ul>
      <li><code class="language-plaintext highlighter-rouge">EsMappingController</code>: 這是主要的控制器結構體，其中嵌入了其他的服務和工具，如日誌（log）、ElasticSearch客戶端服務（esClientService）和索引服務（indexService）。</li>
      <li><code class="language-plaintext highlighter-rouge">NewEsMappingController()</code>: 構造函數，用於初始化<code class="language-plaintext highlighter-rouge">EsMappingController</code>結構體。</li>
    </ul>
  </li>
  <li><strong>功能端點</strong>:
    <ul>
      <li><code class="language-plaintext highlighter-rouge">ListAction()</code>: 查詢ElasticSearch的映射列表。
        <ul>
          <li>首先從請求中綁定<code class="language-plaintext highlighter-rouge">EsMapGetProperties</code>。</li>
          <li>根據<code class="language-plaintext highlighter-rouge">EsConnectID</code>獲取ElasticSearch連接。</li>
          <li>通過<code class="language-plaintext highlighter-rouge">indexService</code>的<code class="language-plaintext highlighter-rouge">EsMappingList</code>方法獲取映射列表。</li>
          <li>返回映射列表和ElasticSearch的版本信息。</li>
        </ul>
      </li>
      <li><code class="language-plaintext highlighter-rouge">UpdateMappingAction()</code>: 更新ElasticSearch的映射。
        <ul>
          <li>首先從請求中綁定<code class="language-plaintext highlighter-rouge">UpdateMapping</code>。</li>
          <li>根據<code class="language-plaintext highlighter-rouge">EsConnect</code>獲取ElasticSearch連接。</li>
          <li>通過<code class="language-plaintext highlighter-rouge">indexService</code>的<code class="language-plaintext highlighter-rouge">UpdateMapping</code>方法更新映射。</li>
          <li>返回更新的結果。</li>
        </ul>
      </li>
    </ul>
  </li>
  <li><strong>輔助功能</strong>:
    <ul>
      <li>在各功能端點中，都有對錯誤的處理，如果出現錯誤，會使用<code class="language-plaintext highlighter-rouge">this.Error()</code>方法返回錯誤信息。成功的操作會使用<code class="language-plaintext highlighter-rouge">this.Success()</code>方法返回成功信息。</li>
    </ul>
  </li>
</ol>

<p>總之，<code class="language-plaintext highlighter-rouge">EsMappingController</code>主要用於管理ElasticSearch的映射，提供了查詢和更新映射的方法。</p>

<h3 id="pkgapies_task_controllergo">pkg/api/es_task_controller.go</h3>

<p>這段<a href="https://github.com/1340691923/ElasticView/blob/main/pkg/api/es_task_controller.go">程式碼</a>描述了一個名為 <code class="language-plaintext highlighter-rouge">EsTaskController</code> 的控制器，它與ElasticSearch中的任務（Tasks）相關。這個控制器提供了查看ElasticSearch任務列表以及取消指定任務的功能。以下是對其功能的詳細描述：</p>

<ol>
  <li><strong>結構體和依賴注入</strong>:
    <ul>
      <li><code class="language-plaintext highlighter-rouge">EsTaskController</code>: 這是主控制器結構體，其中嵌入了其他的服務和工具，如日誌（log）、ElasticSearch客戶端服務（esClientService）和任務服務（taskService）。</li>
      <li><code class="language-plaintext highlighter-rouge">NewEsTaskController()</code>: 構造函數，用於初始化<code class="language-plaintext highlighter-rouge">EsTaskController</code>結構體。</li>
    </ul>
  </li>
  <li><strong>功能端點</strong>:
    <ul>
      <li><code class="language-plaintext highlighter-rouge">ListAction()</code>: 查詢ElasticSearch的任務列表。
        <ul>
          <li>從請求中綁定<code class="language-plaintext highlighter-rouge">TaskList</code>。</li>
          <li>使用<code class="language-plaintext highlighter-rouge">EsConnect</code>從<code class="language-plaintext highlighter-rouge">esClientService</code>中獲取ElasticSearch連接。</li>
          <li>使用這個連接創建一個新的ElasticSearch服務。</li>
          <li>通過<code class="language-plaintext highlighter-rouge">taskService</code>的<code class="language-plaintext highlighter-rouge">TaskList</code>方法獲取任務列表。</li>
          <li>返回查詢到的任務列表。</li>
        </ul>
      </li>
      <li><code class="language-plaintext highlighter-rouge">CancelAction()</code>: 取消ElasticSearch中的指定任務。
        <ul>
          <li>從請求中綁定<code class="language-plaintext highlighter-rouge">CancelTask</code>。</li>
          <li>使用<code class="language-plaintext highlighter-rouge">EsConnect</code>從<code class="language-plaintext highlighter-rouge">esClientService</code>中獲取ElasticSearch連接。</li>
          <li>使用這個連接創建一個新的ElasticSearch服務。</li>
          <li>調用<code class="language-plaintext highlighter-rouge">taskService</code>的<code class="language-plaintext highlighter-rouge">Cancel</code>方法來取消指定的任務。</li>
          <li>如果操作成功，則返回成功響應。</li>
        </ul>
      </li>
    </ul>
  </li>
  <li><strong>輔助功能</strong>:
    <ul>
      <li>在每個功能端點中，對於出現的錯誤都進行了處理。如果遇到錯誤，它會使用<code class="language-plaintext highlighter-rouge">this.Error()</code>方法返回錯誤信息。對於成功的操作，會使用<code class="language-plaintext highlighter-rouge">this.Success()</code>方法返回成功消息。</li>
    </ul>
  </li>
</ol>

<p>總結：<code class="language-plaintext highlighter-rouge">EsTaskController</code>是一個專用於管理ElasticSearch任務的控制器，提供了查看任務列表和取消任務的功能。</p>

<h2 id="other-api">other api</h2>

<h3 id="pkgapibase_controllergo">pkg/api/base_controller.go</h3>

<p>這段 GO <a href="https://github.com/1340691923/ElasticView/blob/main/pkg/api/base_controller.go">程式碼</a>定義了一個名為 <code class="language-plaintext highlighter-rouge">BaseController</code> 的 API 控制器，它提供了一些基本的功能，特別是與 HTTP 請求和響應相關的功能。以下是該程式碼的詳細說明：</p>

<ol>
  <li>
    <p><strong>引入的套件</strong>：程式碼引入了多個外部和內部套件，包括 HTTP 請求處理、HTTP 響應處理、<a href="#gin-web框架">Gin Web 框架</a>等。</p>
  </li>
  <li>
    <p><strong>BaseController 結構體</strong>：</p>
    <ul>
      <li><code class="language-plaintext highlighter-rouge">BaseController</code> 是一個控制器結構體，它包含了兩個指針字段：<code class="language-plaintext highlighter-rouge">Request</code> 和 <code class="language-plaintext highlighter-rouge">Response</code>。這兩個字段分別來自 <code class="language-plaintext highlighter-rouge">request</code> 和 <code class="language-plaintext highlighter-rouge">response</code> 套件，用於處理 HTTP 請求和響應。</li>
      <li><code class="language-plaintext highlighter-rouge">NewBaseController</code> 函數是 <code class="language-plaintext highlighter-rouge">BaseController</code> 的構造函數，它接受一個請求和一個響應對象，並返回一個新的 <code class="language-plaintext highlighter-rouge">BaseController</code> 實例。</li>
      <li><code class="language-plaintext highlighter-rouge">getPostBody</code> 方法用於從 <a href="#gin-web框架">Gin</a> 的上下文中獲取 HTTP POST 請求的主體。它首先使用 <code class="language-plaintext highlighter-rouge">ctx.GetRawData</code> 方法獲取原始的請求主體，然後將其設置回上下文的請求主體，以便後續的處理器可以再次讀取它。</li>
    </ul>
  </li>
</ol>

<p>總之，這段程式碼定義了一個基本的 API 控制器，它提供了一些與 HTTP 請求和響應相關的基本功能。</p>

<h3 id="pkgapidsl_history_controllergo">pkg/api/dsl_history_controller.go</h3>

<p>這段 GO <a href="https://github.com/1340691923/ElasticView/blob/main/pkg/api/dsl_history_controller.go">程式碼</a>定義了一個名為 <code class="language-plaintext highlighter-rouge">DslHistoryController</code> 的 API 控制器，它提供了與 <a href="https://www.huanlintalk.com/2008/05/domain-specific-languages.html" title="Domain-Specific Languages - Huan-Lin 學習筆記.">DSL 語法</a>查詢歷史記錄相關的功能。以下是該程式碼的詳細說明：</p>

<ol>
  <li>
    <p><strong>引入的套件</strong>：程式碼引入了多個外部和內部套件，包括日誌記錄、SQL 存儲、JWT 處理、模型定義、HTTP 響應處理、工具函數和 <a href="#gin-web框架">Gin Web</a> 框架。</p>
  </li>
  <li><strong>DslHistoryController 結構體</strong>：
    <ul>
      <li><code class="language-plaintext highlighter-rouge">DslHistoryController</code> 是一個控制器結構體，它包含了 JWT 處理、SQL 存儲、日誌和基本控制器的指針字段。</li>
      <li><code class="language-plaintext highlighter-rouge">NewDslHistoryController</code> 函數是 <code class="language-plaintext highlighter-rouge">DslHistoryController</code> 的構造函數，它接受 JWT 處理、SQL 存儲、日誌和基本控制器作為參數，並返回一個新的 <code class="language-plaintext highlighter-rouge">DslHistoryController</code> 實例。</li>
    </ul>
  </li>
  <li><strong>ListAction 方法</strong>：
    <ul>
      <li>這個方法用於查詢 DSL 歷史記錄列表。</li>
      <li>首先，它解析 JWT 令牌以獲取用戶 ID。</li>
      <li>然後，它綁定請求參數到 <code class="language-plaintext highlighter-rouge">GmDslHistoryModel</code> 模型。</li>
      <li>使用模型的 <code class="language-plaintext highlighter-rouge">List</code> 和 <code class="language-plaintext highlighter-rouge">Count</code> 方法來獲取歷史記錄的列表和總數。</li>
      <li>最後，它返回查詢結果。</li>
    </ul>
  </li>
  <li><strong>CleanAction 方法</strong>：
    <ul>
      <li>這個方法用於清空 DSL 查詢記錄。</li>
      <li>首先，它解析 JWT 令牌以獲取用戶 ID。</li>
      <li>然後，它使用 <code class="language-plaintext highlighter-rouge">GmDslHistoryModel</code> 模型的 <code class="language-plaintext highlighter-rouge">Clean</code> 方法來清空用戶的 DSL 查詢記錄。</li>
      <li>最後，它返回操作成功的響應。</li>
    </ul>
  </li>
</ol>

<p>總之，這段程式碼定義了一個 API 控制器，它提供了查詢和清空 DSL 語法查詢歷史記錄的功能。如果您有其他問題或需要進一步的資訊，請告訴我。</p>

<h3 id="pkgapigm_operater_loggo">pkg/api/gm_operater_log.go</h3>

<p>這段<a href="https://github.com/1340691923/ElasticView/blob/main/pkg/api/gm_operater_log.go">程式碼</a>描述了一個名為 <code class="language-plaintext highlighter-rouge">GmOperaterController</code> 的控制器，專門處理與後台操作日誌（後台管理員操作紀錄）相關的功能。以下是對其功能和組件的詳細描述：</p>

<ol>
  <li><strong>結構體和依賴注入</strong>:
    <ul>
      <li><code class="language-plaintext highlighter-rouge">GmOperaterController</code>: 這是主控制器結構體。它包含了其他的服務和工具，如日誌（log）、設定（cfg）、SQL存儲（sqlx）和後台操作日誌服務（gmOperaterLogService）。</li>
      <li><code class="language-plaintext highlighter-rouge">NewGmOperaterController()</code>: 這是一個構造函數，用於初始化 <code class="language-plaintext highlighter-rouge">GmOperaterController</code> 結構體並注入依賴。</li>
    </ul>
  </li>
  <li><strong>功能端點</strong>:
    <ul>
      <li><code class="language-plaintext highlighter-rouge">ListAction()</code>: 此方法用於查看後台操作日誌。
        <ul>
          <li>首先，它嘗試從請求中綁定<code class="language-plaintext highlighter-rouge">GmOperaterLogList</code>數據結構。</li>
          <li>使用注入的<code class="language-plaintext highlighter-rouge">gmOperaterLogService</code>來獲取操作日誌列表和相應的日誌計數。</li>
          <li>如果操作成功，則返回成功響應，其中包括日誌列表和計數。否則，返回相應的錯誤。</li>
        </ul>
      </li>
    </ul>
  </li>
  <li><strong>輔助功能</strong>:
    <ul>
      <li>在<code class="language-plaintext highlighter-rouge">ListAction</code>功能中，對於出現的錯誤都進行了處理。如果遇到錯誤，它會使用<code class="language-plaintext highlighter-rouge">this.Error()</code>方法返回錯誤信息。對於成功的操作，則使用<code class="language-plaintext highlighter-rouge">this.Success()</code>方法返回成功消息。</li>
    </ul>
  </li>
</ol>

<p>總之，<code class="language-plaintext highlighter-rouge">GmOperaterController</code>是一個專門用於查看後台操作日誌的控制器。它依賴於多種服務和工具，如日誌、配置、SQL存儲和後台操作日誌服務，以提供必要的功能。</p>

<h3 id="pkgapiguid_controllergo">pkg/api/guid_controller.go</h3>

<p>這段<a href="https://github.com/1340691923/ElasticView/blob/main/pkg/api/guid_controller.go">程式碼</a>定義了一個名為 <code class="language-plaintext highlighter-rouge">GuidController</code> 的控制器，該控制器主要管理用戶的新手引導功能。以下是其主要組件和功能的分解：</p>

<ol>
  <li>
    <p><strong>導入套件</strong>：
這部分主要導入了所需的套件，包括日誌、JWT（JSON Web Tokens）處理、數據庫存儲和其他輔助工具。</p>
  </li>
  <li><strong>GuidController結構</strong>：
    <ul>
      <li><code class="language-plaintext highlighter-rouge">BaseController</code>：可能是一個基礎控制器，提供了一些基本的HTTP回應方法。</li>
      <li><code class="language-plaintext highlighter-rouge">log</code>：應用的日誌組件。</li>
      <li><code class="language-plaintext highlighter-rouge">jwtSvr</code>：用於處理JWT相關操作。</li>
      <li><code class="language-plaintext highlighter-rouge">esClientService</code>：與Elasticsearch相關的服務。</li>
      <li><code class="language-plaintext highlighter-rouge">sqlx</code>：用於數據庫操作的實例。</li>
    </ul>
  </li>
  <li><strong>方法</strong>：
    <ul>
      <li><code class="language-plaintext highlighter-rouge">Finish</code>：完成新手引導。該方法首先解析JWT獲取用戶資訊，然後將完成的新手引導紀錄存儲到數據庫。</li>
      <li><code class="language-plaintext highlighter-rouge">IsFinish</code>：檢查用戶是否完成新手引導。該方法會查詢數據庫以確定用戶是否已完成特定的新手引導。</li>
    </ul>
  </li>
  <li><strong>數據庫操作</strong>：
這部分程式碼使用了<code class="language-plaintext highlighter-rouge">sqlstore.SqlBuilder</code>來構建SQL查詢。它支持基於條件的查詢建立和其他數據庫相關操作。例如，在<code class="language-plaintext highlighter-rouge">IsFinish</code>方法中，它構建了一個查詢來計算符合特定條件的紀錄數。</li>
</ol>

<p>整體來說，<code class="language-plaintext highlighter-rouge">GuidController</code>是一個專門用於管理新手引導功能的控制器，讓開發人員能夠輕鬆地追踪和管理用戶是否已完成新手引導。</p>

<h3 id="pkgapimanager_role_controllergo">pkg/api/manager_role_controller.go</h3>

<p>這段<a href="https://github.com/1340691923/ElasticView/blob/main/pkg/api/manager_role_controller.go">代碼</a>定義了一個名為 <code class="language-plaintext highlighter-rouge">ManagerRoleController</code> 的控制器，該控制器主要負責GM(遊戲管理)角色的管理。以下是其主要組件和功能的分解：</p>

<ol>
  <li>
    <p><strong>導入套件</strong>：這部分導入了所需的套件，主要包括配置、日誌、數據模型、JWT（JSON Web Tokens）處理、數據庫存儲、<a href="#rbac">RBAC（基於角色的訪問控制）</a>等。</p>
  </li>
  <li>
    <p><strong>ManagerRoleController結構</strong>：這是GM角色的主控制器，具有一些主要屬性如日誌、配置、數據庫實例、JWT處理等。</p>
  </li>
  <li><strong>方法</strong>：
    <ul>
      <li><code class="language-plaintext highlighter-rouge">RolesAction</code>：獲取所有的GM角色。</li>
      <li><code class="language-plaintext highlighter-rouge">RolesAddAction</code>：新增一個GM角色。它還將新角色的API權限添加到RBAC系統。</li>
      <li><code class="language-plaintext highlighter-rouge">RolesUpdateAction</code>：更新GM角色的資訊。首先，它會檢查當前使用者是否有權限進行此操作。接著，它會更新數據庫中的角色資訊，並更新該角色的API權限。</li>
      <li><code class="language-plaintext highlighter-rouge">RolesDelAction</code>：刪除GM角色。在刪除之前，它會檢查當前使用者是否有權限進行此操作。</li>
      <li><code class="language-plaintext highlighter-rouge">RoleOptionAction</code>：獲取可用於下拉列表的GM角色資訊。</li>
    </ul>
  </li>
  <li><strong>注意事項</strong>：
    <ul>
      <li>某些操作會檢查當前使用者是否具有特定權限。例如，只有角色ID為1的使用者才能修改或刪除角色ID為1的角色。</li>
      <li>在添加、更新或刪除角色時，都涉及到RBAC的權限更新。</li>
    </ul>
  </li>
</ol>

<p>總體來說，<code class="language-plaintext highlighter-rouge">ManagerRoleController</code> 提供了一個用於管理GM角色的完整功能集，包括查詢、新增、更新、刪除等操作。這對於那些需要精細管理用戶權限的系統尤為重要。</p>

<h3 id="pkgapimanager_user_controllergo">pkg/api/manager_user_controller.go</h3>

<p>這段代碼提供了ElasticView系統中的用戶管理API。讓我們詳細分析一下：</p>

<ol>
  <li><strong>導入項目</strong>:
    <ul>
      <li>程式導入了多個輔助功能的包，包括配置、日誌記錄、JSON處理、時間處理、SQL儲存、JWT認證等。</li>
    </ul>
  </li>
  <li><strong>ManagerUserController結構</strong>:
    <ul>
      <li>這是主要的控制器結構，用於管理用戶。它具有多個屬性，如日誌、配置、數據庫連接等。</li>
    </ul>
  </li>
  <li><strong>NewManagerUserController</strong>:
    <ul>
      <li>此函數初始化一個新的<code class="language-plaintext highlighter-rouge">ManagerUserController</code>並返回它。</li>
    </ul>
  </li>
  <li><strong>用戶相關的方法</strong>:
    <ul>
      <li><code class="language-plaintext highlighter-rouge">Login</code>：允許用戶使用用戶名和密碼登錄，並返回一個令牌。</li>
      <li><code class="language-plaintext highlighter-rouge">ModifyPwd</code>：允許用戶修改自己的密碼。</li>
      <li><code class="language-plaintext highlighter-rouge">UserInfo</code>：返回用戶的詳細信息。</li>
      <li><code class="language-plaintext highlighter-rouge">LogoutAction</code>：使用戶登出。</li>
      <li><code class="language-plaintext highlighter-rouge">UserListAction</code>：返回BI用戶列表。</li>
      <li><code class="language-plaintext highlighter-rouge">DeleteUserAction</code>：允許刪除BI用戶。</li>
      <li><code class="language-plaintext highlighter-rouge">GetUserByIdAction</code>：根據ID獲取特定用戶的信息。</li>
      <li><code class="language-plaintext highlighter-rouge">UserUpdateAction</code>：允許修改BI用戶的信息。</li>
      <li><code class="language-plaintext highlighter-rouge">UserAddAction</code>：允許添加新的BI用戶。</li>
      <li><code class="language-plaintext highlighter-rouge">UrlConfig</code>：返回系統的路由配置。</li>
    </ul>
  </li>
</ol>

<p>每個方法都使用<a href="#gin-web框架">Gin Web框架</a>來接收請求和發送響應。</p>

<p>該控制器還有一些輔助方法，如<code class="language-plaintext highlighter-rouge">Error</code>和<code class="language-plaintext highlighter-rouge">Success</code>，用於簡化發送錯誤或成功響應的過程。</p>

<p>整體來說，這段代碼提供了一個完整的用戶管理系統的API接口，使開發人員能夠輕鬆地添加、修改、刪除和獲取用戶信息。</p>

<h2 id="dto">dto</h2>

<ul>
  <li>數據傳輸對象（Data Transfer Object，縮寫為<a href="#dto-description">DTO</a>）</li>
</ul>

<h3 id="pkgdtocommongo">pkg/dto/common.go</h3>

<p>這是一個定義數據傳輸對象（<a href="#dto-description">DTO</a>）的Go<a href="https://github.com/1340691923/ElasticView/blob/main/pkg/dto/datax.go">程式包</a>。<a href="#dto-description">DTO</a>常用於API間或系統的不同部分間的數據交換。讓我詳細解釋每個結構：</p>

<ol>
  <li><strong>Json</strong>:
    <ul>
      <li>這是一個簡單的結構，它是一個映射，鍵是字符串，值是任意類型。這樣的結構在Go中常用於動態地處理JSON數據。</li>
    </ul>
  </li>
  <li><strong>Sort</strong>:
    <ul>
      <li>這個結構用於描述如何對某些數據進行排序。</li>
      <li><code class="language-plaintext highlighter-rouge">Field</code> 是你想要排序的字段名。</li>
      <li><code class="language-plaintext highlighter-rouge">Ascending</code> 是一個布爾值，如果為真，則按照升序排序；如果為假，則按照降序排序。</li>
    </ul>
  </li>
  <li><strong>Page</strong>:
    <ul>
      <li>這是一個常用於分頁的結構。</li>
      <li><code class="language-plaintext highlighter-rouge">PageNum</code> 表示當前的頁碼。</li>
      <li><code class="language-plaintext highlighter-rouge">PageSize</code> 表示每頁的數據量。</li>
    </ul>
  </li>
  <li><strong>EsConnectID</strong>:
    <ul>
      <li>這個結構用於存儲Elasticsearch的連接ID。</li>
      <li><code class="language-plaintext highlighter-rouge">EsConnectID</code> 是Elasticsearch的連接ID，它使用<code class="language-plaintext highlighter-rouge">json:"es_connect"</code>標籤來指示在JSON中的欄位名稱為<code class="language-plaintext highlighter-rouge">es_connect</code>。</li>
    </ul>
  </li>
</ol>

<p>這個<code class="language-plaintext highlighter-rouge">dto</code>包提供的結構簡單而通用，能夠支撐許多基本的API功能，如分頁、排序和數據傳輸。</p>

<h3 id="pkgdtodataxgo">pkg/dto/datax.go</h3>

<p>這是一個<code class="language-plaintext highlighter-rouge">dto</code>包，主要用於定義與Datax相關的請求結構和一些方法。讓我解釋一下各個結構和方法：</p>

<ol>
  <li><strong>DataxInfoListReq</strong>:
    <ul>
      <li>這是獲取Datax信息列表的請求結構。</li>
      <li>包括了備註（<code class="language-plaintext highlighter-rouge">Remark</code>）、類型（<code class="language-plaintext highlighter-rouge">Typ</code>）、頁碼（<code class="language-plaintext highlighter-rouge">Page</code>）和每頁數量（<code class="language-plaintext highlighter-rouge">Limit</code>）。</li>
    </ul>
  </li>
  <li><strong>DataxInfoInsertReq</strong>:
    <ul>
      <li>這是插入Datax信息的請求結構。</li>
      <li>包括了IP地址、端口、數據庫名稱、用戶名、密碼、備註和類型。</li>
      <li>同時包含了一個<code class="language-plaintext highlighter-rouge">Validate</code>方法，用於驗證IP地址是否已填寫。</li>
    </ul>
  </li>
  <li><strong>DataxInfoDelReq</strong>:
    <ul>
      <li>這是刪除Datax信息的請求結構，只需要提供ID。</li>
    </ul>
  </li>
  <li><strong>DataxInfoTestLinkReq</strong>:
    <ul>
      <li>這是測試Datax連接的請求結構。</li>
      <li>結構與插入請求相似。</li>
    </ul>
  </li>
  <li><strong>TransferReq</strong>:
    <ul>
      <li>這是一個複雜的請求結構，涉及到數據傳輸。</li>
      <li>包括自增ID、Elasticsearch連接、選擇類型、備註、選擇表格、類型名稱、列信息、索引名稱等。</li>
      <li>它還有一個<code class="language-plaintext highlighter-rouge">ParseSelectType</code>方法，用於解析選擇的類型。</li>
    </ul>
  </li>
  <li><strong>SelectType</strong>:
    <ul>
      <li>這是一個選擇類型的結構，包括ID、備註和類型。</li>
    </ul>
  </li>
  <li><strong>TransferLogReq</strong>:
    <ul>
      <li>這是查詢傳輸日誌的請求結構，只需要提供Elasticsearch連接。</li>
    </ul>
  </li>
</ol>

<p>從上面的結構可以看出，這個<code class="language-plaintext highlighter-rouge">dto</code>包主要用於處理與Datax相關的數據交換和操作。Datax是一個用於大數據之間的ETL工具，可以幫助你高效地在不同的數據源之間傳輸數據。這個<code class="language-plaintext highlighter-rouge">dto</code>包可能是為了與一個後端服務交互，該後端服務管理Datax的配置和運行。</p>

<h3 id="pkgdtoes_aliasgo">pkg/dto/es_alias.go</h3>

<p>這是<code class="language-plaintext highlighter-rouge">dto</code>包中定義的一個小結構<code class="language-plaintext highlighter-rouge">EsAliasInfo</code>，它描述了Elasticsearch（縮寫為Es）的別名信息。以下是對這個結構的詳細解釋，程式碼詳見<a href="https://github.com/1340691923/ElasticView/blob/main/pkg/dto/es_alias.go">github</a>：</p>

<ol>
  <li><strong>EsConnect</strong>:整型字段，代表Elasticsearch的連接ID。</li>
  <li><strong>Settings</strong>:<code class="language-plaintext highlighter-rouge">Json</code>類型字段，代表Elasticsearch索引的設置信息。這裡的<code class="language-plaintext highlighter-rouge">Json</code>可能是一個定義為<code class="language-plaintext highlighter-rouge">map[string]interface{}</code>的別名。</li>
  <li><strong>IndexName</strong>:字符串字段，代表與別名相關聯的Elasticsearch索引的名稱。</li>
  <li><strong>AliasName</strong>:字符串字段，代表當前的Elasticsearch索引別名。</li>
  <li><strong>NewAliasNameList</strong>:字符串切片，代表新的Elasticsearch索引別名列表。這可能用於操作時批量添加多個別名。</li>
  <li><strong>NewIndexList</strong>:字符串切片，代表新的Elasticsearch索引列表。可能用於一次性指定多個索引。</li>
  <li><strong>Types</strong>:整型字段，其具體含義未在此給出，但可能與索引的類型或操作的類型相關。</li>
</ol>

<p>總之，<code class="language-plaintext highlighter-rouge">EsAliasInfo</code>結構描述了Elasticsearch索引的別名信息，並提供了對索引設置、索引名稱、別名以及新的別名和索引列表的字段。在Elasticsearch中，別名是一種指向一個或多個索引的參考，使得用戶可以使用單一的別名進行搜索，而不必指定具體的索引名稱。這提供了一種索引滾動和版本控制的機制，使得用戶可以輕鬆地升級和管理索引。</p>

<h3 id="pkgdtoes_catgo">pkg/dto/es_cat.go</h3>

<p>這是在<code class="language-plaintext highlighter-rouge">dto</code>包中定義的一個小結構<code class="language-plaintext highlighter-rouge">EsCat</code>，它描述了Elasticsearch（縮寫為Es）的”cat”操作相關的參數。Elasticsearch的<code class="language-plaintext highlighter-rouge">cat</code> API提供了各種關於叢集、索引和其他項目的快速概覽。以下是對該結構的詳細解釋，程式碼詳見<a href="https://github.com/1340691923/ElasticView/blob/main/pkg/dto/es_cat.go">github</a>：</p>

<ol>
  <li><strong>EsConnect</strong>:整型字段，代表Elasticsearch的連接ID。這可能是指定要查詢的Elasticsearch實例或叢集。</li>
  <li><strong>Cat</strong>:字符串字段，代表要執行的<code class="language-plaintext highlighter-rouge">cat</code>操作的具體類型。例如，”indices”表示查看所有索引的信息，”nodes”表示查看叢集中的所有節點的信息等。</li>
  <li><strong>IndexBytesFormat</strong>:字符串字段，可能是指定索引大小的格式化方式。例如，可以選擇”kb”、”mb”、”gb”等格式來表示索引的大小。這提供了一種方法來控制返回的數據的格式。</li>
</ol>

<p>總的來說，<code class="language-plaintext highlighter-rouge">EsCat</code>結構提供了一個方式來指定要查詢的Elasticsearch連接，以及如何使用<code class="language-plaintext highlighter-rouge">cat</code> API來獲取相關的信息和格式化返回的數據。</p>

<h3 id="pkgdtoes_crudgo">pkg/dto/es_crud.go</h3>

<p>這是在<code class="language-plaintext highlighter-rouge">dto</code>包中定義的三個<a href="(https://github.com/1340691923/ElasticView/blob/main/pkg/dto/es_crud.go)">結構</a><code class="language-plaintext highlighter-rouge">CrudFilter</code>、<code class="language-plaintext highlighter-rouge">AnalysisFilter</code>和<code class="language-plaintext highlighter-rouge">SortStruct</code>。它們似乎是用於描述與Elasticsearch或其他數據存儲交互的某些<a href="#crud">CRUD（創建、讀取、更新、刪除）</a>操作的過濾器和排序參數。以下是這些結構的詳細解釋：</p>

<ol>
  <li><strong>CrudFilter</strong>:
    <ul>
      <li><strong>Relation</strong>: 表示過濾條件之間的關係的結構。例如，它可以是”AND”或”OR”，表示所有過濾條件必須同時滿足或只需要滿足其中之一。</li>
      <li><strong>SortList</strong>: 一個<code class="language-plaintext highlighter-rouge">SortStruct</code>結構的切片，用於指定排序的列和排序規則。</li>
      <li><strong>EsConnect</strong>: 整型，表示要查詢的Elasticsearch連接ID。</li>
      <li><strong>IndexName</strong>: 要查詢的Elasticsearch索引的名稱。</li>
      <li><strong>Page</strong> 和 <strong>Limit</strong>: 分別用於指定分頁查詢的頁碼和每頁的記錄數量。</li>
    </ul>
  </li>
  <li><strong>AnalysisFilter</strong>:
    <ul>
      <li>表示複雜的過濾條件結構。它可以包含嵌套的過濾條件，每個過濾條件都有一個過濾類型（例如”term”、”range”等），以及具體的列名、比較運算符和值。它還可以指定子條件之間的關係，例如”AND”或”OR”。</li>
    </ul>
  </li>
  <li><strong>SortStruct</strong>:
    <ul>
      <li><strong>Col</strong>: 表示要排序的列名。</li>
      <li><strong>SortRule</strong>: 指定排序的規則，例如”asc”（升序）或”desc”（降序）。</li>
    </ul>
  </li>
</ol>

<p>這些結構的設計使得可以建立複雜的查詢過濾條件和排序規則，特別是<code class="language-plaintext highlighter-rouge">AnalysisFilter</code>結構，它允許嵌套的過濾條件和多層的關係定義，使得可以表示非常具體和詳細的查詢邏輯。</p>

<h3 id="pkgdtoes_docgo">pkg/dto/es_doc.go</h3>

<p>這兩個<a href="https://github.com/1340691923/ElasticView/blob/main/pkg/dto/es_doc.go">結構類型</a>似乎是用於與Elasticsearch交互，特別是在針對特定文檔ID進行更新和刪除操作時。讓我詳細解釋這些結構：</p>

<ol>
  <li><strong>EsDocUpdateByID</strong>:
    <ul>
      <li>這個結構用於在Elasticsearch中按文檔ID更新一個文檔。</li>
      <li><strong>EsConnect</strong>: 一個整型，表示要與之交互的Elasticsearch連接ID。</li>
      <li><strong>ID</strong>: 要更新的文檔的ID。</li>
      <li><strong>JSON</strong>: 一個<code class="language-plaintext highlighter-rouge">Json</code>類型，這可能是一個映射，表示要在文檔中更新的字段和它們的新值。</li>
      <li><strong>Type</strong>: 文檔的類型名稱。在舊版本的Elasticsearch中，這是必要的，但在新版本中，類型的概念已被棄用。</li>
      <li><strong>Index</strong>: 要更新文檔的索引名稱。</li>
    </ul>
  </li>
  <li><strong>EsDocDeleteRowByID</strong>:
    <ul>
      <li>這個結構用於在Elasticsearch中按文檔ID刪除一個文檔。</li>
      <li><strong>EsConnect</strong>: 一個整型，表示要與之交互的Elasticsearch連接ID。</li>
      <li><strong>ID</strong>: 要刪除的文檔的ID。</li>
      <li><strong>IndexName</strong>: 要刪除文檔的索引名稱。</li>
      <li><strong>Type</strong>: 文檔的類型名稱。</li>
    </ul>
  </li>
</ol>

<p>從這些結構可以看出，它們都是針對Elasticsearch中特定ID的文檔進行操作的，而<code class="language-plaintext highlighter-rouge">EsDocUpdateByID</code>結構還允許提供一個JSON體來表示更新。這些結構提供了一種組織和表示與Elasticsearch交互所需的數據的方法，使得更新和刪除操作更加結構化和明確。</p>

<h3 id="其他">其他</h3>

<p>其他DTO (資料傳輸物件) 結構，主要似乎與Elasticsearch以及一些內部操作有關，詳見<a href="https://github.com/1340691923/ElasticView/tree/main/pkg/dto">github</a>。簡要解釋每個套件及其結構如下。</p>

<ol>
  <li><strong>dto.EsIndexInfo</strong>:
    <ul>
      <li>代表一個Elasticsearch索引的相關資訊。</li>
    </ul>
  </li>
  <li><strong>dto.EsMapGetProperties</strong> 和 <strong>UpdateMapping</strong>:
    <ul>
      <li>這些結構主要是用來取得或更新Elasticsearch索引的mapping。</li>
    </ul>
  </li>
  <li><strong>dto.EsMappingInfo</strong>:
    <ul>
      <li>提供Elasticsearch索引mapping的詳細資訊。</li>
    </ul>
  </li>
  <li><strong>dto.EsOptimize</strong>:
    <ul>
      <li>用於優化Elasticsearch索引的結構。</li>
    </ul>
  </li>
  <li><strong>dto.EsReIndexInfo</strong> 和 <strong>dto.EsRest</strong>:
    <ul>
      <li>這些結構是用於重新索引和發送一般的REST請求到Elasticsearch。</li>
    </ul>
  </li>
  <li><strong>dto.TaskList</strong>、<strong>CancelTask</strong> 和 <strong>EsTaskInfo</strong>:
    <ul>
      <li>關於Elasticsearch的背景任務管理。</li>
    </ul>
  </li>
  <li><strong>dto.GmRoleModel</strong> 和相關結構:
    <ul>
      <li>似乎是一個內部用戶和角色管理系統的結構。</li>
    </ul>
  </li>
  <li><strong>dto.GmOperaterLogList</strong>:
    <ul>
      <li>表示操作日誌的相關資訊。</li>
    </ul>
  </li>
  <li><strong>dto.EsSnapshotInfo</strong> 和其他snapshot相關結構:
    <ul>
      <li>這些結構與Elasticsearch的snapshot操作有關，如建立、刪除、恢復等。</li>
    </ul>
  </li>
</ol>

<p>總之，這些DTO結構涵蓋了Elasticsearch的許多核心操作，並與一些內部的用戶和角色管理功能結合。這些結構將有助於建立一個全面的Elasticsearch管理工具或平台。</p>
<h2 id="infrastructure">Infrastructure</h2>

<h3 id="pkginfrastructureaccess_controlrbacgo">pkg/infrastructure/access_control/rbac.go</h3>

<p>這是一個名為<code class="language-plaintext highlighter-rouge">access_control</code>的<a href="https://github.com/1340691923/ElasticView/blob/main/pkg/infrastructure/access_control/rbac.go">套件</a>，主要用於RBAC (Role-Based Access Control) 角色基於的訪問控制。該套件使用了<code class="language-plaintext highlighter-rouge">casbin</code>(<a href="#casbin">ref</a>)，這是一個強大的、高效的開源訪問控制庫。</p>

<p>以下是代碼的詳細解釋：</p>

<ol>
  <li><strong>變量定義</strong>:
    <ul>
      <li><code class="language-plaintext highlighter-rouge">text</code>：它是一個<a href="#casbin">Casbin</a>的訪問控制模型定義，包括請求、政策、效應和匹配器。</li>
    </ul>
  </li>
  <li><strong>Rbac結構</strong>:
    <ul>
      <li>包括配置(<code class="language-plaintext highlighter-rouge">cfg</code>)、日誌(<code class="language-plaintext highlighter-rouge">log</code>)和<a href="#casbin">casbin</a>的執行器(<code class="language-plaintext highlighter-rouge">enforcer</code>)。</li>
    </ul>
  </li>
  <li><strong>NewRbac</strong> 函數:
    <ul>
      <li>初始化<code class="language-plaintext highlighter-rouge">Rbac</code>的實例。它首先從配置中獲取數據庫類型和數據源，然後使用這些資訊和casbin模型來創建<a href="#casbin">casbin</a>的執行器。</li>
      <li>如果在這個過程中出現任何錯誤，它會返回錯誤。</li>
    </ul>
  </li>
  <li><strong>LoadPolicy</strong> 函數:
    <ul>
      <li>從持久存儲加載政策到<code class="language-plaintext highlighter-rouge">enforcer</code>。</li>
    </ul>
  </li>
  <li><strong>Enforce</strong> 函數:
    <ul>
      <li>決定某個請求是否應該被允許。它接受一個參數列表（通常是subject, object, action），然後返回該請求是否被允許以及可能的錯誤。</li>
    </ul>
  </li>
  <li><strong>AddPolicy</strong> 函數:
    <ul>
      <li>向持久存儲添加一個新的政策。</li>
    </ul>
  </li>
  <li><strong>RemoveFilteredPolicy</strong> 函數:
    <ul>
      <li>從持久存儲中移除匹配給定過濾器的政策。</li>
    </ul>
  </li>
  <li><strong>SavePolicy</strong> 函數:
    <ul>
      <li>將當前的政策保存到持久存儲。</li>
    </ul>
  </li>
</ol>

<p>整體而言，這個套件提供了一個基於<code class="language-plaintext highlighter-rouge">casbin</code>的RBAC訪問控制系統的包裝器，使得在應用中實現訪問控制更為簡單。</p>

<h3 id="pkginfrastructureconfigconfiggo">pkg/infrastructure/config/config.go</h3>

<p><a href="https://github.com/1340691923/ElasticView/blob/main/pkg/infrastructure/config/config.go">這段代碼</a>是名為<code class="language-plaintext highlighter-rouge">config</code>的包，它用於管理應用程式的配置。代碼的功能與構成如下：</p>

<ol>
  <li><strong>引入包</strong>:
    <ul>
      <li>引入了標準庫包（如<code class="language-plaintext highlighter-rouge">log</code>, <code class="language-plaintext highlighter-rouge">os</code>, <code class="language-plaintext highlighter-rouge">path/filepath</code>等）以及一些外部庫包，用於文件操作、配置管理等。</li>
    </ul>
  </li>
  <li><strong>常數定義</strong>:
    <ul>
      <li><code class="language-plaintext highlighter-rouge">MysqlDbTyp</code> 和 <code class="language-plaintext highlighter-rouge">SqliteDbTyp</code>：分別代表mysql和sqlite數據庫的類型。</li>
    </ul>
  </li>
  <li><strong>CommandLineArgs結構體</strong>:
    <ul>
      <li>此結構定義了從命令行傳入的參數，如配置文件路徑、性能分析選項等。</li>
    </ul>
  </li>
  <li><strong>Config結構體</strong>:
    <ul>
      <li>代表應用的主要配置。</li>
      <li>包含日誌配置、端口、數據庫類型和參數、應用秘鑰等。</li>
    </ul>
  </li>
  <li><strong>GetDbType函數</strong>:
    <ul>
      <li>此函數返回數據庫類型字符串。基於<code class="language-plaintext highlighter-rouge">DbType</code>字段判定。</li>
    </ul>
  </li>
  <li><strong>CreateDbSource函數</strong>:
    <ul>
      <li>根據配置創建數據庫連接字符串。</li>
      <li>對於sqlite，確保數據目錄存在，並返回完整的數據庫路徑。</li>
      <li>對於mysql，返回標準的連接字符串。</li>
    </ul>
  </li>
  <li><strong>InitConfig函數</strong>:
    <ul>
      <li>負責初始化並返回<code class="language-plaintext highlighter-rouge">Config</code>對象。</li>
      <li>使用<code class="language-plaintext highlighter-rouge">viper</code>庫讀取和解析配置文件。</li>
      <li>配置文件的位置基於命令行參數。</li>
      <li>最後，日誌消息顯示配置文件已成功加載。</li>
    </ul>
  </li>
</ol>

<p>這段代碼主要關注於從配置文件中讀取配置以及提供生成數據庫連接字符串的功能。</p>

<h3 id="pkginfrastructurees_sdkpkgfactory">pkg/infrastructure/es_sdk/pkg/factory</h3>

<p><a href="https://github.com/1340691923/ElasticView/blob/main/pkg/infrastructure/es_sdk/pkg/factory/factory.go">這段代碼</a>似乎是一個工廠模式的實現，用於根據指定的Elasticsearch版本創建相應版本的ES客戶端。讓我解釋一下這段代碼的功能：</p>

<ol>
  <li><code class="language-plaintext highlighter-rouge">import</code> 語句導入了所需的包和模塊。</li>
  <li>定義了一個錯誤 <code class="language-plaintext highlighter-rouge">VerError</code>，該錯誤用於表示當前只支持版本6, 7和8的Elasticsearch。</li>
  <li><code class="language-plaintext highlighter-rouge">EsServiceMap</code> 是一個映射，其鍵是Elasticsearch的版本號（如6, 7, 8），值是相應版本的Elasticsearch客戶端建構函數。</li>
  <li><code class="language-plaintext highlighter-rouge">NewEsService</code> 是一個工廠方法。它根據提供的配置 <code class="language-plaintext highlighter-rouge">cfg</code> 中的版本號來返回對應的Elasticsearch客戶端或者返回一個錯誤（如果版本不被支持）。</li>
</ol>

<p>主要的邏輯是使用了一個映射 (<code class="language-plaintext highlighter-rouge">EsServiceMap</code>) 來避免多重的 <code class="language-plaintext highlighter-rouge">if-else</code> 或 <code class="language-plaintext highlighter-rouge">switch</code> 語句，從而使代碼更簡潔、可維護。</p>

<h3 id="pkginfrastructurees_sdkpkgproto">pkg/infrastructure/es_sdk/pkg/proto</h3>

<p>這些<a href="https://github.com/1340691923/ElasticView/tree/main/pkg/infrastructure/es_sdk/pkg/proto">程式碼片段</a>(共有12個檔案、總計700多行)似乎是一組與Elasticsearch客戶端版本6、7和8的整合和配置相關的Go結構體和功能。</p>

<p>以下是我從你提供的程式碼中觀察到的內容：</p>

<ol>
  <li><strong>aliases.go</strong>：這個檔案包含了一些與Elasticsearch別名操作相關的結構體。</li>
  <li><strong>cat_request.go</strong>：這裡定義了多個結構體，這些結構體代表了向Elasticsearch發送的”cat” API請求的各種參數。</li>
  <li><strong>cat_response.go</strong>：定義了與”cat” API響應相對應的結構體，用於接收和解析Elasticsearch的回應。</li>
  <li><strong>config.go</strong>：這是一個相對複雜的文件，包含了與Elasticsearch連接的配置相關的結構體和功能。它支持三個版本的Elasticsearch客戶端配置的轉換：版本6、7和8。這些功能可以根據給定的配置生成特定版本的Elasticsearch客戶端配置。還提供了一個方法來生成HTTP傳輸，考慮到証書和安全性。</li>
  <li><strong>create.go</strong>：這裡定義了一個結構體，用於表示向Elasticsearch發送的文檔創建請求的參數。
你提供了更多與Elasticsearch操作相關的Go程式碼。以下是我根據你提供的程式碼的摘要：</li>
  <li><strong>delete.go</strong>：定義了一個結構體<code class="language-plaintext highlighter-rouge">DeleteRequest</code>，它代表一個從Elasticsearch中刪除文檔的請求。其中包含了一些可能的請求參數，如<code class="language-plaintext highlighter-rouge">Refresh</code>、<code class="language-plaintext highlighter-rouge">Routing</code>和<code class="language-plaintext highlighter-rouge">Timeout</code>等。</li>
  <li><strong>indices.go</strong>：這個文件中定義了一些結構體，這些結構體代表了與Elasticsearch索引操作相關的請求，如：
    <ul>
      <li><code class="language-plaintext highlighter-rouge">IndicesPutSettingsRequest</code>：修改索引設置的請求。</li>
      <li><code class="language-plaintext highlighter-rouge">IndicesCreateRequest</code>：創建新索引的請求。</li>
      <li><code class="language-plaintext highlighter-rouge">IndicesDeleteRequest</code>：刪除索引的請求。</li>
      <li><code class="language-plaintext highlighter-rouge">ReindexRequest</code>：對索引進行重新索引的請求。</li>
      <li><code class="language-plaintext highlighter-rouge">IndicesGetSettingsRequest</code>：獲取索引設置的請求。</li>
      <li><code class="language-plaintext highlighter-rouge">IndicesPutMappingRequest</code>：修改或新增索引映射的請求。</li>
    </ul>
  </li>
  <li><strong>perform.go</strong>：定義了一個結構體<code class="language-plaintext highlighter-rouge">PerformRequestOptions</code>，它代表執行一個HTTP請求到Elasticsearch的選項。</li>
  <li><strong>response.go</strong>：這個文件包含了一個<code class="language-plaintext highlighter-rouge">Response</code>結構體和它的相關方法。該結構體封裝了從Elasticsearch接收的響應。其中的<code class="language-plaintext highlighter-rouge">NewResponse</code>方法將<code class="language-plaintext highlighter-rouge">io.ReadCloser</code>轉換為該<code class="language-plaintext highlighter-rouge">Response</code>結構體。<code class="language-plaintext highlighter-rouge">StatusErr</code>方法則檢查響應中的狀態是否表示錯誤。</li>
  <li><strong>search.go</strong>：定義了一個結構體<code class="language-plaintext highlighter-rouge">SearchRequest</code>，它代表一個向Elasticsearch提交的搜索請求。該結構體包含了眾多的請求參數，可用於細化搜索的行為。</li>
  <li><strong>update.go</strong>：定義了一個結構體<code class="language-plaintext highlighter-rouge">UpdateRequest</code>，用於表示更新Elasticsearch中文檔的請求。</li>
</ol>

<p>你這些程式碼基本上是定義了與Elasticsearch的各種交互請求的結構體。這些結構體非常有用，因為它們允許開發者以統一且結構化的方式進行請求，簡化與Elasticsearch之間的交互，同時也可以更容易地添加或修改請求的參數並提供了一個清晰的方法來設置和管理Elasticsearch客戶端的配置。。此外，由於Elasticsearch API通常具有很多選項，這些結構體也幫助確保API的參數被正確地設置和使用。</p>

<h3 id="pkginfrastructurees_sdkpkginterfacego">pkg/infrastructure/es_sdk/pkg/interface.go</h3>

<p>這段程式碼定義了一個名為<code class="language-plaintext highlighter-rouge">EsI</code>的interface，用於表示Elasticsearch的操作集合。從這些方法名稱和參數可以看出，它涵蓋了Elasticsearch的主要功能，例如索引管理、數據操作和快照管理。以下是一些代表性方法的簡單說明：</p>

<ol>
  <li><strong>Version</strong>: 取得Elasticsearch版本。</li>
  <li><strong>CatNodes</strong>: 查詢Elasticsearch集群中的節點。</li>
  <li><strong>ClusterStats</strong>: 獲取Elasticsearch集群的統計信息。</li>
  <li><strong>PerformRequest</strong>: 執行一個HTTP請求。</li>
  <li><strong>Ping</strong>: 檢查Elasticsearch是否可用。</li>
  <li><strong>Refresh</strong>: 刷新一個或多個索引。</li>
  <li><strong>Open/Close</strong>: 打開或關閉索引。</li>
  <li><strong>IndicesForcemerge</strong>: 強制合併索引。</li>
  <li><strong>DeleteByQuery</strong>: 根據查詢條件刪除數據。</li>
  <li><strong>SnapshotCreate/SnapshotDelete/RestoreSnapshot/SnapshotStatus</strong>: 快照相關操作。</li>
  <li><strong>GetIndices</strong>: 獲取索引列表。</li>
  <li><strong>Search</strong>: 執行搜索查詢。</li>
  <li><strong>CreateIndex/DeleteIndex/Reindex</strong>: 索引的創建、刪除和重新索引操作。</li>
  <li><strong>PutMapping/GetMapping</strong>: 索引映射的設定和獲取。</li>
  <li><strong>GetAliases/AddAliases/RemoveAliases/MoveToAnotherIndexAliases</strong>: 別名操作。</li>
  <li><strong>TaskList/TasksCancel</strong>: 任務管理。</li>
</ol>

<p>每個方法通常都接收一個<code class="language-plaintext highlighter-rouge">context.Context</code>作為第一個參數，用於控制請求的生命週期。而返回值通常都是一個<code class="language-plaintext highlighter-rouge">proto.Response</code>（表示Elasticsearch的HTTP響應）和一個<code class="language-plaintext highlighter-rouge">error</code>（表示可能的錯誤）。</p>

<p>這個接口提供了一個抽象層，使得不同版本或實現的Elasticsearch客戶端可以通過同一個接口進行操作。這有助於確保代碼的清晰性和可維護性。</p>

<h3 id="pkginfrastructurelogger">pkg/infrastructure/logger</h3>

<p><a href="https://github.com/1340691923/ElasticView/blob/main/pkg/infrastructure/logger/log.go">這段代碼</a>是初始化日誌引擎的模塊，主要使用了<code class="language-plaintext highlighter-rouge">zap</code>日誌庫和<code class="language-plaintext highlighter-rouge">file-rotatelogs</code>來進行日誌的輪替。</p>

<p>以下是該模塊的一些主要特點和功能：</p>

<ol>
  <li><strong>類型定義</strong>：
    <ul>
      <li><code class="language-plaintext highlighter-rouge">type AppLogger = zap.Logger</code>: 定義了一個名為<code class="language-plaintext highlighter-rouge">AppLogger</code>的日誌類型，它實際上就是<code class="language-plaintext highlighter-rouge">zap.Logger</code>的一個別名。</li>
    </ul>
  </li>
  <li><strong>getWriter函數</strong>：
    <ul>
      <li>這個內部函數用於獲取日誌寫入器，它使用<code class="language-plaintext highlighter-rouge">file-rotatelogs</code>來創建一個可以自動輪替的日誌文件。</li>
      <li><code class="language-plaintext highlighter-rouge">rotatelogs.New</code>: 定義了輪替日誌的命名和特性。例如，日誌每24小時輪替一次，最多保留指定的天數。</li>
    </ul>
  </li>
  <li><strong>zapConfig 和 encoder</strong>:
    <ul>
      <li>定義了日誌的格式和編碼方式。例如，將時間格式化為自定義的<code class="language-plaintext highlighter-rouge">util.TimeFormat</code>。</li>
    </ul>
  </li>
  <li><strong>級別過濾器</strong>:
    <ul>
      <li>這些<code class="language-plaintext highlighter-rouge">zap.LevelEnablerFunc</code>用於定義各個日誌級別的過濾條件。</li>
    </ul>
  </li>
  <li><strong>日誌文件的設定和路徑</strong>:
    <ul>
      <li>通過配置(<code class="language-plaintext highlighter-rouge">cfg</code>)來設定日誌保存的路徑和保存的天數。</li>
    </ul>
  </li>
  <li><strong>創建寫入器</strong>:
    <ul>
      <li>使用上面定義的<code class="language-plaintext highlighter-rouge">getWriter</code>函數創建不同級別日誌的寫入器。</li>
    </ul>
  </li>
  <li><strong>初始化核心日誌組件</strong>:
    <ul>
      <li>使用<code class="language-plaintext highlighter-rouge">zapcore.NewTee</code>組合多個日誌核心，這樣可以根據不同的級別將日誌寫入到不同的文件。</li>
      <li>如果啟用了調試模式(<code class="language-plaintext highlighter-rouge">cfg.DeBug</code>)，那麼所有級別的日誌也會輸出到控制臺。</li>
    </ul>
  </li>
  <li><strong>返回結果</strong>:
    <ul>
      <li>最後，使用組合的核心組件創建<code class="language-plaintext highlighter-rouge">zap.Logger</code>並返回。</li>
    </ul>
  </li>
</ol>

<p>總的來說，這段代碼實現了一個日誌初始化功能，能夠將不同級別的日誌輸出到不同的文件中，並支持日誌文件的自動輪替。</p>

<h3 id="pkginfrastructureweb_engineweb_enginego">pkg/infrastructure/web_engine/web_engine.go</h3>

<p><a href="https://github.com/1340691923/ElasticView/blob/main/pkg/infrastructure/web_engine/web_engine.go">web_engine.go代碼</a>的概述，主要著重於重要函數的說明：</p>

<ol>
  <li>
    <p><strong>初始化</strong>: 創建了一個全局的 <code class="language-plaintext highlighter-rouge">mockMap</code> 實例以追踪路由。還定義了一個 <code class="language-plaintext highlighter-rouge">authenticationPaths</code> 切片來存儲需要身份驗證的路徑。</p>
  </li>
  <li>
    <p><strong>RouterConfigGroup 和 RouterConfig</strong>: 這些是描述路由組和單個路由的資料結構。</p>
  </li>
  <li><strong>WebEngine</strong>: 這是對 Gin Engine 的封裝。它提供的功能如下:
    <ul>
      <li><code class="language-plaintext highlighter-rouge">NewWebEngine()</code>: 創建一個新的WebEngine。</li>
      <li><code class="language-plaintext highlighter-rouge">Run()</code>: 運行伺服器。</li>
      <li><code class="language-plaintext highlighter-rouge">Group(remark string, relativePath string, handlers ...gin.HandlerFunc)</code>: 用於創建路由組。</li>
      <li><code class="language-plaintext highlighter-rouge">GetAuthenticationPaths()</code>: 獲取需要身份驗證的路徑。</li>
      <li><code class="language-plaintext highlighter-rouge">GetRouterConfigGroups()</code>: 獲取路由配置組。</li>
    </ul>
  </li>
  <li><strong>MyRouterGroup</strong>: 這是對 Gin RouterGroup 的封裝，提供的功能如下:
    <ul>
      <li><code class="language-plaintext highlighter-rouge">Use(middleware ...gin.HandlerFunc)</code>: 應用中間件。</li>
      <li><code class="language-plaintext highlighter-rouge">Group(remark, relativePath string, handlers ...gin.HandlerFunc)</code>: 創建子組。</li>
      <li><code class="language-plaintext highlighter-rouge">BasePath()</code>: 獲取基礎路徑。</li>
      <li><code class="language-plaintext highlighter-rouge">Handle()</code>, <code class="language-plaintext highlighter-rouge">GET()</code>, <code class="language-plaintext highlighter-rouge">POST()</code>, <code class="language-plaintext highlighter-rouge">DELETE()</code>, 等: 這些方法用於處理不同的HTTP方法，並自定義參數如 <code class="language-plaintext highlighter-rouge">needAuth</code> 和 <code class="language-plaintext highlighter-rouge">remark</code>。</li>
      <li><code class="language-plaintext highlighter-rouge">StaticFile(relativePath, filepath string)</code>: 用於伺服靜態文件。</li>
      <li><code class="language-plaintext highlighter-rouge">Static(relativePath, root string)</code>: 用於伺服靜態目錄。</li>
      <li><code class="language-plaintext highlighter-rouge">StaticFS(relativePath string, fs http.FileSystem)</code>: 伺服從文件系統提供的靜態目錄。</li>
      <li><code class="language-plaintext highlighter-rouge">saveMockMap(remark, relativePath string, needAuth bool)</code>: 將路由保存到 <code class="language-plaintext highlighter-rouge">mockMap</code>。</li>
    </ul>
  </li>
  <li><strong>MockMap</strong>: 這是一個自定義的資料結構，主要用於存儲路由配置:
    <ul>
      <li><code class="language-plaintext highlighter-rouge">Store(data string, val RouterConfig)</code>: 儲存新的路由配置。</li>
      <li><code class="language-plaintext highlighter-rouge">Load(key string)</code>: 加載給定鍵的路由配置。</li>
      <li><code class="language-plaintext highlighter-rouge">Count()</code>: 返回存儲的路由配置的數量。</li>
      <li><code class="language-plaintext highlighter-rouge">Keys()</code>: 返回所有的鍵。</li>
      <li><code class="language-plaintext highlighter-rouge">Values()</code>: 返回所有的值。</li>
      <li><code class="language-plaintext highlighter-rouge">Range(fn func(key string, val []RouterConfig))</code>: 遍歷所有儲存的路由配置。</li>
    </ul>
  </li>
</ol>

<p>這個代碼的主要目的是提供一個更高級的封裝，以管理和跟踪路由配置，同時提供身份驗證和路由備註功能。</p>

<h2 id="jwt_svr">jwt_svr</h2>

<h3 id="pkgjwt_svrexception_msggo">pkg/jwt_svr/exception_msg.go</h3>

<div class="language-go highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">package</span> <span class="n">jwt_svr</span>

<span class="c">// 内置异常</span>
<span class="k">const</span> <span class="p">(</span>
	<span class="n">ERROR_AUTH_TOKEN</span> <span class="o">=</span> <span class="m">40006</span>
<span class="p">)</span>

<span class="k">var</span> <span class="n">TOKEN_ERROR</span> <span class="o">=</span> <span class="k">map</span><span class="p">[</span><span class="kt">int</span><span class="p">]</span><span class="kt">string</span><span class="p">{</span>
	<span class="n">ERROR_AUTH_TOKEN</span><span class="o">:</span> <span class="s">"Token生成失败"</span><span class="p">,</span>
<span class="p">}</span>
</code></pre></div></div>

<h3 id="pkgjwt_svrjwtgo">pkg/jwt_svr/jwt.go</h3>

<p>這是一個基於 Go 語言的 JSON Web Token (JWT) 處理層的<a href="https://github.com/1340691923/ElasticView/blob/main/pkg/jwt_svr/jwt.go">代碼片段</a>。以下是對主要函數和結構的描述，以及它們的參數和輸出。</p>

<h4 id="結構說明">結構說明：</h4>

<ol>
  <li><strong>Jwt</strong>:
    <ul>
      <li><code class="language-plaintext highlighter-rouge">cfg</code>: 應用的配置對象。</li>
      <li><code class="language-plaintext highlighter-rouge">log</code>: 應用的日誌對象。</li>
      <li><code class="language-plaintext highlighter-rouge">jwtSecret</code>: 用於簽名和驗證 JWT 的秘密。</li>
    </ul>
  </li>
  <li><strong>Claims</strong>:
    <ul>
      <li>JWT 的內部聲明結構，繼承了 <code class="language-plaintext highlighter-rouge">jwt.RegisteredClaims</code>。</li>
      <li>包括用戶ID、用戶名、真實名稱和角色ID。</li>
    </ul>
  </li>
</ol>

<h4 id="函數說明">函數說明：</h4>

<ol>
  <li><strong>NewJwt</strong>:
    <ul>
      <li><strong>用途</strong>: 創建新的 Jwt 對象。</li>
      <li><strong>參數</strong>:
        <ul>
          <li><code class="language-plaintext highlighter-rouge">cfg</code>: 應用的配置對象。</li>
          <li><code class="language-plaintext highlighter-rouge">log</code>: 應用的日誌對象。</li>
        </ul>
      </li>
      <li><strong>輸出</strong>: 新的 Jwt 對象。</li>
    </ul>
  </li>
  <li><strong>CreateToken</strong>:
    <ul>
      <li><strong>用途</strong>: 根據給定的用戶模型生成 JWT 令牌。</li>
      <li><strong>參數</strong>:
        <ul>
          <li><code class="language-plaintext highlighter-rouge">gmUser</code>: 一個表示用戶的模型。</li>
        </ul>
      </li>
      <li><strong>輸出</strong>:
        <ul>
          <li>生成的 JWT 令牌。</li>
          <li>錯誤信息。</li>
        </ul>
      </li>
    </ul>
  </li>
  <li><strong>ParseToken</strong>:
    <ul>
      <li><strong>用途</strong>: 解析和驗證給定的 JWT 令牌。</li>
      <li><strong>參數</strong>:
        <ul>
          <li><code class="language-plaintext highlighter-rouge">token</code>: 要解析的 JWT 令牌。</li>
        </ul>
      </li>
      <li><strong>輸出</strong>:
        <ul>
          <li>如果成功解析和驗證，則返回令牌中的聲明。</li>
          <li>錯誤信息。</li>
        </ul>
      </li>
    </ul>
  </li>
</ol>

<h4 id="其他說明">其他說明：</h4>

<ul>
  <li>代碼中使用了 <code class="language-plaintext highlighter-rouge">github.com/golang-jwt/jwt/v5</code> 庫來生成和解析 JWT。</li>
  <li><code class="language-plaintext highlighter-rouge">jwt.SigningMethodHS256</code> 是使用 HMAC SHA-256 算法的簽名方法。</li>
  <li>令牌有一個有效期限，設為 7 天。</li>
  <li>當令牌出現錯誤時，使用自定義的錯誤類型進行錯誤處理。</li>
</ul>

<p>這個 JWT 層的主要目的是為應用提供 JWT 的生成和解析功能，並在其中嵌入和檢索用戶信息。</p>

<h2 id="model">model</h2>

<h3 id="結構設定">結構設定</h3>

<p>當然可以！</p>

<p>這些 Go 程式碼段展示了幾個不同的資料庫模型。每個模型都用於代表一個特定的資料庫表格，並定義了該表中的欄位以及它們在 Go 中的表示方式。以下是每個模型的簡要描述：</p>

<ol>
  <li><strong>GmGuidModel</strong>：
    <ul>
      <li>描述：代表一個新手引導。</li>
      <li>欄位包括：<code class="language-plaintext highlighter-rouge">ID</code>, <code class="language-plaintext highlighter-rouge">Uid</code>, <code class="language-plaintext highlighter-rouge">GuidName</code>, <code class="language-plaintext highlighter-rouge">Created</code></li>
      <li>表名：<code class="language-plaintext highlighter-rouge">gm_guid</code></li>
    </ul>
  </li>
  <li><strong>DataxLinkInfoModel</strong>：
    <ul>
      <li>描述：Datax 連結資訊。</li>
      <li>欄位包括：<code class="language-plaintext highlighter-rouge">Id</code>, <code class="language-plaintext highlighter-rouge">Ip</code>, <code class="language-plaintext highlighter-rouge">Port</code>, <code class="language-plaintext highlighter-rouge">DbName</code>, <code class="language-plaintext highlighter-rouge">Username</code>, <code class="language-plaintext highlighter-rouge">Pwd</code>, <code class="language-plaintext highlighter-rouge">Remark</code>, <code class="language-plaintext highlighter-rouge">Typ</code>, <code class="language-plaintext highlighter-rouge">Updated</code>, <code class="language-plaintext highlighter-rouge">Created</code></li>
    </ul>
  </li>
  <li><strong>DataxListModel</strong>：
    <ul>
      <li>描述：Datax 列表資訊。</li>
      <li>欄位包括：<code class="language-plaintext highlighter-rouge">Id</code>, <code class="language-plaintext highlighter-rouge">FormData</code>, <code class="language-plaintext highlighter-rouge">Remark</code>, <code class="language-plaintext highlighter-rouge">Table_name</code>, <code class="language-plaintext highlighter-rouge">Index_name</code>, <code class="language-plaintext highlighter-rouge">Error_msg</code>, <code class="language-plaintext highlighter-rouge">Status</code>, <code class="language-plaintext highlighter-rouge">Dbcount</code>, <code class="language-plaintext highlighter-rouge">Escount</code>, <code class="language-plaintext highlighter-rouge">Updated</code>, <code class="language-plaintext highlighter-rouge">Created</code>, <code class="language-plaintext highlighter-rouge">EsConnect</code>, <code class="language-plaintext highlighter-rouge">CrontabSpec</code></li>
    </ul>
  </li>
  <li><strong>EsLinkModel</strong>：
    <ul>
      <li>描述：ES 連接資訊表。</li>
      <li>欄位包括：<code class="language-plaintext highlighter-rouge">ID</code>, <code class="language-plaintext highlighter-rouge">Ip</code>, <code class="language-plaintext highlighter-rouge">User</code>, <code class="language-plaintext highlighter-rouge">Pwd</code>, <code class="language-plaintext highlighter-rouge">Created</code>, <code class="language-plaintext highlighter-rouge">Updated</code>, <code class="language-plaintext highlighter-rouge">Remark</code>, <code class="language-plaintext highlighter-rouge">Version</code>, <code class="language-plaintext highlighter-rouge">RootPEM</code>, <code class="language-plaintext highlighter-rouge">CertPEM</code>, <code class="language-plaintext highlighter-rouge">KeyPEM</code></li>
      <li>注：這個模型還包含了一些安全性相關的欄位，如 <code class="language-plaintext highlighter-rouge">RootPEM</code>, <code class="language-plaintext highlighter-rouge">CertPEM</code>, <code class="language-plaintext highlighter-rouge">KeyPEM</code>，可能是用於 SSL/TLS 連接。</li>
    </ul>
  </li>
</ol>

<p>所有這些模型都提供了一個 <code class="language-plaintext highlighter-rouge">TableName</code> 方法，用於返回相應的資料庫表名。此外，這些模型可以用於 CRUD 操作，如查詢、插入、更新和刪除。</p>

<h3 id="pkgmodelcrudgo">pkg/model/crud.go</h3>

<p>這是一個基於 Go 語言的資料庫操作封裝層<a href="https://github.com/1340691923/ElasticView/blob/main/pkg/model/crud.go">代碼片段</a>。以下是對主要接口、函數和結構的描述。</p>

<h4 id="接口說明">接口說明：</h4>

<p><strong>Curd</strong>：一個資料庫基礎 CRUD 操作的接口，它定義了以下方法：</p>
<ul>
  <li><code class="language-plaintext highlighter-rouge">ProcessSqlWhere()</code>: 處理 SQL 的 WHERE 條件。</li>
  <li><code class="language-plaintext highlighter-rouge">TableName()</code>: 獲取數據表名。</li>
  <li><code class="language-plaintext highlighter-rouge">ProcessSqlInsert()</code>: 處理 SQL 的 INSERT 語句。</li>
  <li><code class="language-plaintext highlighter-rouge">ProcessSqlUpdate()</code>: 處理 SQL 的 UPDATE 語句。</li>
  <li><code class="language-plaintext highlighter-rouge">GetId()</code>: 獲取主鍵 ID。</li>
</ul>

<h4 id="函數說明-1">函數說明：</h4>

<ol>
  <li><strong>SearchList</strong>:
    <ul>
      <li><strong>用途</strong>: 查詢分頁的資料列表。</li>
      <li><strong>參數</strong>:
        <ul>
          <li><code class="language-plaintext highlighter-rouge">curd</code>: 實現了 Curd 接口的物件。</li>
          <li><code class="language-plaintext highlighter-rouge">page</code>, <code class="language-plaintext highlighter-rouge">limit</code>: 分頁信息。</li>
          <li><code class="language-plaintext highlighter-rouge">columns</code>: 要查詢的列。</li>
          <li><code class="language-plaintext highlighter-rouge">list</code>: 返回的資料列表。</li>
          <li><code class="language-plaintext highlighter-rouge">sqlx</code>: SQL 存儲實例。</li>
          <li><code class="language-plaintext highlighter-rouge">log</code>: 日誌實例。</li>
        </ul>
      </li>
      <li><strong>輸出</strong>: 錯誤信息。</li>
    </ul>
  </li>
  <li><strong>SearchAll</strong>:
    <ul>
      <li><strong>用途</strong>: 查詢所有資料。</li>
      <li><strong>參數</strong>: 同上，但沒有分頁信息。</li>
      <li><strong>輸出</strong>: 錯誤信息。</li>
    </ul>
  </li>
  <li><strong>Count</strong>:
    <ul>
      <li><strong>用途</strong>: 計算資料的總數。</li>
      <li><strong>輸出</strong>: 資料的總數和錯誤信息。</li>
    </ul>
  </li>
  <li><strong>Delete</strong>:
    <ul>
      <li><strong>用途</strong>: 刪除指定 ID 的資料。</li>
      <li><strong>輸出</strong>: 錯誤信息。</li>
    </ul>
  </li>
  <li><strong>Insert</strong>:
    <ul>
      <li><strong>用途</strong>: 插入新的資料。</li>
      <li><strong>輸出</strong>: 最後插入的 ID 和錯誤信息。</li>
    </ul>
  </li>
  <li><strong>Update</strong>:
    <ul>
      <li><strong>用途</strong>: 更新指定 ID 的資料。</li>
      <li><strong>輸出</strong>: 錯誤信息。</li>
    </ul>
  </li>
</ol>

<h4 id="其他說明-1">其他說明：</h4>

<ul>
  <li>代碼中使用了 <code class="language-plaintext highlighter-rouge">github.com/1340691923/ElasticView/pkg/infrastructure/sqlstore</code> 庫來實現 SQL 操作的建造器模式，可以更加靈活地組裝 SQL 語句。</li>
  <li>這個資料庫操作封裝層的目的是提供一套通用的 CRUD 操作，不需要每次針對特定的數據表重寫相同的 CRUD 方法，增加代碼的重用性和維護性。</li>
</ul>

<h3 id="pkgmodeldsl_historygo">pkg/model/dsl_history.go</h3>

<p>這段 <a href="https://github.com/1340691923/ElasticView/blob/main/pkg/model/dsl_history.go">Go 代碼</a>展開了一個稱為 <code class="language-plaintext highlighter-rouge">GmDslHistoryModel</code> 的數據庫實體模型，並包括對此模型的基本 CRUD 操作。以下是該代碼的詳細解釋：</p>

<h4 id="數據模型">數據模型：</h4>

<p><strong>GmDslHistoryModel</strong> 表示 <a href="https://www.huanlintalk.com/2008/05/domain-specific-languages.html" title="Domain-Specific Languages - Huan-Lin 學習筆記.">DSL</a> 歷史記錄：</p>
<ul>
  <li><code class="language-plaintext highlighter-rouge">ID</code>：數據的主鍵。</li>
  <li><code class="language-plaintext highlighter-rouge">Uid</code>：用戶ID。</li>
  <li><code class="language-plaintext highlighter-rouge">Method</code>：HTTP 方法。</li>
  <li><code class="language-plaintext highlighter-rouge">Path</code>：請求的路徑。</li>
  <li><code class="language-plaintext highlighter-rouge">Body</code>：請求的主體。</li>
  <li><code class="language-plaintext highlighter-rouge">Created</code>：創建時間。</li>
  <li><code class="language-plaintext highlighter-rouge">FilterDate</code>：過濾日期，用於查詢範圍內的數據。</li>
  <li><code class="language-plaintext highlighter-rouge">IndexName</code>：索引名稱。</li>
  <li><code class="language-plaintext highlighter-rouge">Page</code>, <code class="language-plaintext highlighter-rouge">Limit</code>：用於分頁的變量。</li>
  <li><code class="language-plaintext highlighter-rouge">Sqlx</code>：數據庫連接。</li>
  <li><code class="language-plaintext highlighter-rouge">log</code>：日誌工具。</li>
</ul>

<h4 id="方法說明">方法說明：</h4>

<ol>
  <li><strong>TableName()</strong>：
    <ul>
      <li><strong>用途</strong>：返回數據表的名稱。</li>
      <li><strong>輸出</strong>：數據表名 “gm_dsl_history”。</li>
    </ul>
  </li>
  <li><strong>Insert()</strong>：
    <ul>
      <li><strong>用途</strong>：在數據庫中插入一條新的記錄。</li>
      <li><strong>輸出</strong>：錯誤信息。</li>
    </ul>
  </li>
  <li><strong>Clean()</strong>：
    <ul>
      <li><strong>用途</strong>：根據 <code class="language-plaintext highlighter-rouge">Uid</code> 刪除記錄。</li>
      <li><strong>輸出</strong>：錯誤信息。</li>
    </ul>
  </li>
  <li><strong>List()</strong>：
    <ul>
      <li><strong>用途</strong>：獲取指定 <code class="language-plaintext highlighter-rouge">Uid</code> 的記錄列表，並可以通過 <code class="language-plaintext highlighter-rouge">IndexName</code> 和 <code class="language-plaintext highlighter-rouge">FilterDate</code> 進行額外的過濾。</li>
      <li><strong>輸出</strong>：記錄列表和錯誤信息。</li>
    </ul>
  </li>
  <li><strong>Count()</strong>：
    <ul>
      <li><strong>用途</strong>：計算指定 <code class="language-plaintext highlighter-rouge">Uid</code> 的記錄數，並可以通過 <code class="language-plaintext highlighter-rouge">IndexName</code> 和 <code class="language-plaintext highlighter-rouge">FilterDate</code> 進行額外的過濾。</li>
      <li><strong>輸出</strong>：記錄數和錯誤信息。</li>
    </ul>
  </li>
</ol>

<h4 id="其他詳細">其他詳細：</h4>

<ul>
  <li>代碼中使用了 <code class="language-plaintext highlighter-rouge">github.com/1340691923/ElasticView/pkg/infrastructure/sqlstore</code>(<a href="#sqlstore">ref</a>) 庫的 SQL 建造器模式來組建 SQL 語句，使得代碼更加清晰和易於維護。</li>
  <li>使用了 <code class="language-plaintext highlighter-rouge">gorm</code> 標籤來映射 Go 結構體到數據庫的表結構，儘管這裡的代碼並沒有直接使用 GORM 來進行數據庫操作。</li>
</ul>

<h3 id="pkgmodeles_connectgo">pkg/model/es_connect.go</h3>

<p>這段 <a href="https://github.com/1340691923/ElasticView/blob/main/pkg/model/es_connect.go">Go 程式碼</a>定義了一個名為 <code class="language-plaintext highlighter-rouge">EsConnect</code> 的資料結構，代表 Elasticsearch (簡稱 ES) 的連接設置。<code class="language-plaintext highlighter-rouge">EsConnect</code> 結構中的欄位大多與 ES 連接有關的安全性和身份驗證參數。</p>

<p><code class="language-plaintext highlighter-rouge">EsConnect</code> 的欄位概述如下：</p>

<ul>
  <li><strong>Ip</strong>：ES 伺服器的 IP 地址。</li>
  <li><strong>User</strong>：用於連接到 ES 伺服器的用戶名。</li>
  <li><strong>Pwd</strong>：用於連接到 ES 伺服器的密碼。</li>
  <li><strong>Version</strong>：ES 伺服器的版本。</li>
  <li><strong>RootPEM</strong>、<strong>CertPEM</strong>、<strong>KeyPEM</strong>：用於 SSL/TLS 連接的安全證書和密鑰。</li>
</ul>

<p>這個結構還定義了一個方法 <code class="language-plaintext highlighter-rouge">ToEsSdkCfg</code>，這個方法的功能是將 <code class="language-plaintext highlighter-rouge">EsConnect</code> 結構轉換為 <code class="language-plaintext highlighter-rouge">proto.Config</code> 結構，後者是用於 Elasticsearch SDK 的配置設置。</p>

<p>在 <code class="language-plaintext highlighter-rouge">ToEsSdkCfg</code> 方法中：</p>

<ul>
  <li>使用 <code class="language-plaintext highlighter-rouge">strings.Split</code> 將 <code class="language-plaintext highlighter-rouge">Ip</code> 字串（可能是逗號分隔的多個 IP 地址）分割為地址列表。</li>
  <li>設定 ES SDK 配置中的各種參數，大多數值都是直接或簡單的預設值。例如，CloudID、APIKey 和 ServiceToken 等都是空字串。</li>
  <li>將 <code class="language-plaintext highlighter-rouge">EsConnect</code> 中的 SSL/TLS 相關欄位（<code class="language-plaintext highlighter-rouge">RootPEM</code>、<code class="language-plaintext highlighter-rouge">CertPEM</code>、<code class="language-plaintext highlighter-rouge">KeyPEM</code>）賦值給 <code class="language-plaintext highlighter-rouge">proto.Config</code>。</li>
</ul>

<p>總的來說，這段程式碼提供了從一般的 Elasticsearch 連接設置到專為 Elasticsearch SDK 設計的配置的轉換功能。</p>

<h3 id="pkgmodelgm_operater_loggo">pkg/model/gm_operater_log.go</h3>

<p>https://github.com/1340691923/ElasticView/blob/main/pkg/model/gm_operater_log.go</p>

<h2 id="sqlstore">sqlstore</h2>

<h3 id="pkginfrastructuresqlstoredump_sqlgo">pkg/infrastructure/sqlstore/dump_sql.go</h3>

<p>這段<a href="https://github.com/1340691923/ElasticView/blob/main/pkg/infrastructure/sqlstore/dump_sql.go">Go程式碼</a>是名為<code class="language-plaintext highlighter-rouge">sqlstore</code>的套件，主要提供了一些實用工具函式，重點在於解釋給定特定參數的SQL字符串。以下是其內容的摘要：</p>

<ol>
  <li><strong>常量</strong>：
    <ul>
      <li><code class="language-plaintext highlighter-rouge">tmFmtWithMS</code>：時間格式，具有毫秒。</li>
      <li><code class="language-plaintext highlighter-rouge">tmFmtZero</code>：表示零的時間格式。</li>
      <li><code class="language-plaintext highlighter-rouge">nullStr</code>：代表SQL中的”NULL”。</li>
    </ul>
  </li>
  <li>
    <p><strong>函式</strong>：</p>

    <ul>
      <li><code class="language-plaintext highlighter-rouge">isPrintable(s string) bool</code>：檢查字符串中的所有字符是否可打印。</li>
      <li><code class="language-plaintext highlighter-rouge">ExplainSQL(...)</code>：這是最主要的函式。給定SQL和參數，它生成解釋過的SQL字符串。這個函式不是用來執行SQL，而是用於日誌記錄或說明用途，因為直接執行可能會導致SQL注入漏洞。</li>
    </ul>
  </li>
</ol>

<p>該函式的主要工作是將給定的參數（如整數、浮點數、時間、字符串等）正確地轉換成SQL中可以解釋的字符串格式。例如，它可以將Go的時間型態轉換為SQL接受的字符串格式。</p>

<p>此套件可能用於資料庫操作，特別是在記錄或打印SQL查詢時。</p>

<h3 id="pkginfrastructuresqlstorees_viewsql">pkg/infrastructure/sqlstore/es_view.sql</h3>

<p>您提供了一系列語句，這些<a href="https://github.com/1340691923/ElasticView/blob/main/pkg/infrastructure/sqlstore/es_view.sql">SQL語句</a>用於建立、刪除以及向一些資料表插入數據。以下是這些語句的摘要：</p>

<ol>
  <li><strong>es_link</strong>：
    <ul>
      <li>資料表描述了與Elasticsearch相關的連接信息，如IP、用戶名、密碼等。</li>
      <li>為<code class="language-plaintext highlighter-rouge">remark</code>列建立了一個唯一索引。</li>
      <li>向該表插入了一條記錄。</li>
    </ul>
  </li>
  <li><strong>gm_dsl_history</strong>：
    <ul>
      <li>資料表記錄了DSL的歷史查詢。</li>
    </ul>
  </li>
  <li><strong>gm_guid</strong>：
    <ul>
      <li>資料表記錄了用戶的GUID名稱。</li>
      <li>為<code class="language-plaintext highlighter-rouge">uid</code>和<code class="language-plaintext highlighter-rouge">guid_name</code>列建立了一個唯一索引。</li>
    </ul>
  </li>
  <li><strong>gm_role</strong>：
    <ul>
      <li>資料表記錄了角色信息，包括角色名稱、描述和角色列表。</li>
      <li>向該表插入了一條記錄。</li>
    </ul>
  </li>
  <li><strong>gm_user</strong>：
    <ul>
      <li>資料表記錄了用戶信息，如用戶名和密碼。</li>
      <li>為<code class="language-plaintext highlighter-rouge">username</code>列建立了一個唯一索引。</li>
      <li>向該表插入了一條記錄。</li>
    </ul>
  </li>
  <li><strong>datax_link_info</strong>：
    <ul>
      <li>資料表記錄了DataX的連接信息。</li>
      <li>為<code class="language-plaintext highlighter-rouge">remark</code>和<code class="language-plaintext highlighter-rouge">typ</code>列建立了一個唯一索引。</li>
    </ul>
  </li>
  <li><strong>datax_transfer_list</strong>：
    <ul>
      <li>資料表記錄了DataX的傳輸列表信息。</li>
      <li>為<code class="language-plaintext highlighter-rouge">remark</code>和<code class="language-plaintext highlighter-rouge">es_connect</code>列建立了一個唯一索引。</li>
    </ul>
  </li>
  <li><strong>search_index_config</strong>：
    <ul>
      <li>資料表記錄了搜索索引的配置。</li>
      <li>為<code class="language-plaintext highlighter-rouge">index_name</code>和<code class="language-plaintext highlighter-rouge">es_connect</code>列建立了一個唯一索引。</li>
    </ul>
  </li>
  <li><strong>mapping_alias_config</strong>：
    <ul>
      <li>資料表記錄了映射別名的配置。</li>
      <li>為<code class="language-plaintext highlighter-rouge">index_name</code>和<code class="language-plaintext highlighter-rouge">es_connect</code>列建立了一個唯一索引。</li>
    </ul>
  </li>
  <li><strong>gm_operater_log</strong>：
    <ul>
      <li>資料表記錄了操作者的日誌。</li>
    </ul>
  </li>
</ol>

<p>這些資料表涵蓋了多個功能和用途，包括用戶管理、角色管理、連接信息、日誌記錄等。</p>

<h3 id="pkginfrastructuresqlstoresqlxgo">pkg/infrastructure/sqlstore/sqlx.go</h3>

<p><a href="https://github.com/1340691923/ElasticView/blob/main/pkg/infrastructure/sqlstore/sqlx.go">sqlx.go</a>程式碼的繁體中文摘要：</p>

<ol>
  <li>
    <p><strong>引入套件</strong>:
該程式碼首先引入必要的函式庫/套件。這包括常見的 Go 套件以及一些專用於資料庫互動（如 <code class="language-plaintext highlighter-rouge">github.com/go-sql-driver/mysql</code>, <code class="language-plaintext highlighter-rouge">github.com/logoove/sqlite</code>, 和 <code class="language-plaintext highlighter-rouge">github.com/jmoiron/sqlx</code>）和日誌記錄的第三方函式庫（如 <code class="language-plaintext highlighter-rouge">go.uber.org/zap</code>）。</p>
  </li>
  <li><strong>結構體定義</strong>:
    <ul>
      <li><code class="language-plaintext highlighter-rouge">SqlStore</code>: 代表主要的 SQL 資料庫存儲。它持有一個資料庫連接 (<code class="language-plaintext highlighter-rouge">DB</code>) 和一個日誌記錄器的參照。</li>
    </ul>
  </li>
  <li><strong>SqlStore 方法</strong>:
    <ul>
      <li><code class="language-plaintext highlighter-rouge">Exec</code>, <code class="language-plaintext highlighter-rouge">Get</code>, <code class="language-plaintext highlighter-rouge">Select</code>, <code class="language-plaintext highlighter-rouge">Query</code>, 和 <code class="language-plaintext highlighter-rouge">Close</code>: 這些是在資料庫上執行 SQL 語句的實用功能。它們是 <code class="language-plaintext highlighter-rouge">sqlx</code> 套件提供的相應功能的封裝。</li>
      <li><code class="language-plaintext highlighter-rouge">initSqliteDb</code>: 此方法初始化 SQLite 資料庫。它執行一系列嵌入程序中的 SQL 語句（使用 <code class="language-plaintext highlighter-rouge">//go:embed</code> 指令）來設置資料庫架構。</li>
    </ul>
  </li>
  <li><strong>初始化</strong>:
    <ul>
      <li><code class="language-plaintext highlighter-rouge">newSqlStore</code>: 一個創建並返回新 <code class="language-plaintext highlighter-rouge">SqlStore</code> 實例的輔助函數。</li>
      <li><code class="language-plaintext highlighter-rouge">NewSqlStore</code>: 此函數基於配置初始化資料庫連接（MySQL 或 SQLite）。如果使用 SQLite，它還會通過調用 <code class="language-plaintext highlighter-rouge">initSqliteDb</code> 來初始化 SQLite 資料庫。</li>
    </ul>
  </li>
  <li>
    <p><strong>嵌入式 SQL 腳本</strong>:
<code class="language-plaintext highlighter-rouge">es_view.sql</code> 文件（可能包含 SQL 語句）被嵌入到程序中。它在 <code class="language-plaintext highlighter-rouge">initSqliteDb</code> 方法中用於設置 SQLite 資料庫。</p>
  </li>
  <li><strong>雜項</strong>:
    <ul>
      <li>該套件還在 <code class="language-plaintext highlighter-rouge">NewSqlStore</code> 函數中有一個簡單的背景 goroutine，每分鐘 ping 一次資料庫以確保它仍然連接。</li>
      <li>該套件似乎是與 Elasticsearch 相關的應用程序的一部分（從引入的名稱 <code class="language-plaintext highlighter-rouge">ElasticView</code> 和嵌入的 SQL 文件 <code class="language-plaintext highlighter-rouge">es_view.sql</code> 可見）。</li>
      <li><code class="language-plaintext highlighter-rouge">initSqliteDb</code> 函數通過檢查 <code class="language-plaintext highlighter-rouge">data</code> 目錄中的 <code class="language-plaintext highlighter-rouge">lock</code> 文件的存在來確保它只運行一次。</li>
    </ul>
  </li>
</ol>

<p><strong>注意事項</strong>:</p>
<ul>
  <li>該套件導入了 MySQL 和 SQLite 驅動程序，這意味著它可以基於配置連接到任一類型的資料庫。</li>
  <li>使用 <code class="language-plaintext highlighter-rouge">errors</code> 和 <code class="language-plaintext highlighter-rouge">log</code> 套件進行錯誤處理。該套件還使用 zap 日誌記錄庫，但似乎大部分日誌記錄使用的是標準的 log 套件。</li>
  <li>即使資料庫類型可能是 SQLite，也假設某些配置值（如 <code class="language-plaintext highlighter-rouge">Mysql.MaxOpenConns</code> 和 <code class="language-plaintext highlighter-rouge">Mysql.MaxIdleConns</code>）存在。最好確認這是否是預期的行為。</li>
</ul>

<h3 id="pkginfrastructuresqlstoresquirrelgo">pkg/infrastructure/sqlstore/squirrel.go</h3>

<p>以下是<a href="https://github.com/1340691923/ElasticView/blob/main/pkg/infrastructure/sqlstore/squirrel.go">這段程式碼</a>的繁體中文版本摘要:</p>

<p>這是一個名為 <code class="language-plaintext highlighter-rouge">sqlstore</code> 的包，它利用 <a href="https://github.com/Masterminds/squirrel"><code class="language-plaintext highlighter-rouge">squirrel</code></a> 套件(<a href="#squirrel">ref</a>)，一個用於構建 SQL 查詢的 Go 語言函式庫。</p>

<p><strong>主要部分</strong>:</p>

<ol>
  <li>
    <p><strong>引入套件</strong>:
這裡引入了必要的標準庫和 <code class="language-plaintext highlighter-rouge">squirrel</code> 套件。</p>
  </li>
  <li>
    <p><strong>建立 SQL 生成器</strong>:
<code class="language-plaintext highlighter-rouge">SqlBuilder</code> 是一個全局變數，它是 <code class="language-plaintext highlighter-rouge">squirrel.StatementBuilder</code> 的引用，用於開始建構 SQL 語句。</p>
  </li>
  <li>
    <p><strong>類型別名</strong>:
定義了多個類型別名，這些類型都是基於 <code class="language-plaintext highlighter-rouge">squirrel</code> 套件的，例如 <code class="language-plaintext highlighter-rouge">Eq</code>、<code class="language-plaintext highlighter-rouge">Or</code>、<code class="language-plaintext highlighter-rouge">And</code> 等等。這讓使用者可以在此包的上下文中方便地使用這些函數，而無需參照到 <code class="language-plaintext highlighter-rouge">squirrel</code>。</p>
  </li>
  <li>
    <p><strong>工具函數</strong>:</p>
    <ul>
      <li><code class="language-plaintext highlighter-rouge">CreatePage</code>: 根據給定的頁碼和每頁的項目數，該函數返回起始項目的索引。這對於實現分頁查詢很有用。</li>
      <li><code class="language-plaintext highlighter-rouge">CreateLike</code>: 給定一個字符串，此函數會返回該字符串的模糊查詢版本，即前後都有 <code class="language-plaintext highlighter-rouge">%</code> 的字符串。這通常用於 SQL 的 <code class="language-plaintext highlighter-rouge">LIKE</code> 操作。</li>
      <li><code class="language-plaintext highlighter-rouge">Placeholders</code>: 根據給定的數字 <code class="language-plaintext highlighter-rouge">n</code>，此函數返回 <code class="language-plaintext highlighter-rouge">n</code> 個 SQL 占位符，並用逗號分隔。例如，<code class="language-plaintext highlighter-rouge">Placeholders(3)</code> 將返回 <code class="language-plaintext highlighter-rouge">?,?,?</code>。這對於動態生成 SQL 查詢，尤其是插入和更新多個值時很有用。</li>
    </ul>
  </li>
</ol>

<p><strong>觀察與建議</strong>:
這個包主要是作為一個 SQL 語句建構工具的包裝，提供了更方便的功能和類型別名。如果你想使用這個包進行 SQL 查詢的建構，這確實可以使你的程式碼更簡潔，也更容易閱讀。</p>

<h2 id="esv8-主程式">ESv8 主程式</h2>

<h3 id="pkginfrastructurees_sdkpkgv8esgo_1">pkg/infrastructure/es_sdk/pkg/v8/es.go_1</h3>

<p>這個包是針對Go中的ElasticSearch V8客戶端的封裝。以下是該包的主要組件和功能的概述：</p>

<ul>
  <li>導入：這個包導入了許多套件，特別是ElasticSearch V8客戶端（github.com/elastic/go-elasticsearch/v8）。
    <ul>
      <li>結構體 EsClient8：定義了一個名為EsClient8的結構體，它包含了一個指向ElasticSearch V8客戶端的指針。</li>
      <li>初始化：使用NewEsClient8函數可以創建新的EsClient8實例。init方法用於初始化ElasticSearch客戶端。</li>
    </ul>
  </li>
  <li>基本操作：
    <ul>
      <li>Version：返回客戶端版本。</li>
      <li>Ping：檢查ElasticSearch伺服器是否在運行。</li>
    </ul>
  </li>
  <li>索引操作：例如GetMapping、Refresh、Open、Flush等函數，允許您執行各種索引相關的操作。</li>
  <li>快照操作：包括創建、刪除、恢復等快照操作。</li>
  <li>請求執行：PerformRequest：允許您執行任意HTTP請求。</li>
  <li>其他操作：如清除索引緩存、強制合併、按查詢刪除等操作。</li>
</ul>

<p>以下是<code class="language-plaintext highlighter-rouge">EsClient8</code>結構體中每個方法的詳細介紹：</p>

<ol>
  <li><strong>NewEsClient8</strong>：
    <ul>
      <li>用途：建立一個新的ElasticSearch V8客戶端實例。</li>
      <li>參數：<code class="language-plaintext highlighter-rouge">cfg</code>是配置參數。</li>
      <li>返回值：ElasticSearch的接口實例和可能的錯誤。</li>
    </ul>
  </li>
  <li><strong>init</strong>：
    <ul>
      <li>用途：初始化ElasticSearch V8客戶端。</li>
      <li>參數：<code class="language-plaintext highlighter-rouge">config</code>是ElasticSearch V8客戶端的配置。</li>
      <li>返回值：可能的錯誤。</li>
    </ul>
  </li>
  <li><strong>Version</strong>：
    <ul>
      <li>用途：返回客戶端的版本號。</li>
      <li>返回值：版本號8。</li>
    </ul>
  </li>
  <li><strong>Ping</strong>：
    <ul>
      <li>用途：確認ElasticSearch伺服器是否運行。</li>
      <li>參數：<code class="language-plaintext highlighter-rouge">ctx</code>是操作的上下文。</li>
      <li>返回值：回應對象和可能的錯誤。</li>
    </ul>
  </li>
  <li><strong>GetMapping</strong>：
    <ul>
      <li>用途：獲取指定索引的映射信息。</li>
      <li>參數：<code class="language-plaintext highlighter-rouge">ctx</code>是操作的上下文；<code class="language-plaintext highlighter-rouge">indexNames</code>是索引名稱的列表。</li>
      <li>返回值：回應對象和可能的錯誤。</li>
    </ul>
  </li>
  <li><strong>SnapshotCreate</strong>：
    <ul>
      <li>用途：創建一個新的快照。</li>
      <li>參數：<code class="language-plaintext highlighter-rouge">ctx</code>是操作的上下文；<code class="language-plaintext highlighter-rouge">repository</code>是存儲庫名稱；<code class="language-plaintext highlighter-rouge">snapshot</code>是快照名稱；其他參數包括是否等待完成和請求的JSON體。</li>
      <li>返回值：回應對象和可能的錯誤。</li>
    </ul>
  </li>
  <li><strong>PerformRequest</strong>：
    <ul>
      <li>用途：執行一個HTTP請求。</li>
      <li>參數：<code class="language-plaintext highlighter-rouge">ctx</code>是操作的上下文；<code class="language-plaintext highlighter-rouge">req</code>是要執行的HTTP請求。</li>
      <li>返回值：回應對象和可能的錯誤。</li>
    </ul>
  </li>
  <li><strong>SnapshotDelete</strong>：
    <ul>
      <li>用途：刪除一個指定的快照。</li>
      <li>參數：<code class="language-plaintext highlighter-rouge">ctx</code>是操作的上下文；<code class="language-plaintext highlighter-rouge">repository</code>是存儲庫名稱；<code class="language-plaintext highlighter-rouge">snapshot</code>是要刪除的快照名稱。</li>
      <li>返回值：回應對象和可能的錯誤。</li>
    </ul>
  </li>
  <li><strong>RestoreSnapshot</strong>：
    <ul>
      <li>用途：恢復一個指定的快照。</li>
      <li>參數：包括操作的上下文、存儲庫名稱、快照名稱等。</li>
      <li>返回值：回應對象和可能的錯誤。</li>
    </ul>
  </li>
  <li><strong>Refresh</strong>：
    <ul>
      <li>用途：刷新一或多個索引。</li>
      <li>參數：<code class="language-plaintext highlighter-rouge">ctx</code>是操作的上下文；<code class="language-plaintext highlighter-rouge">indexNames</code>是索引名稱的列表。</li>
      <li>返回值：回應對象和可能的錯誤。</li>
    </ul>
  </li>
</ol>

<h3 id="pkginfrastructurees_sdkpkgv8esgo_2">pkg/infrastructure/es_sdk/pkg/v8/es.go_2</h3>

<ol>
  <li><strong>Open</strong>:
    <ul>
      <li><strong>用途</strong>：用於開啟指定的Elasticsearch索引。</li>
      <li><strong>參數</strong>：
        <ul>
          <li><code class="language-plaintext highlighter-rouge">ctx</code>: 上下文，用於處理超時和取消請求。</li>
          <li><code class="language-plaintext highlighter-rouge">indexNames</code>: 需要開啟的索引名稱列表。</li>
        </ul>
      </li>
      <li><strong>返回值</strong>：返回一個<code class="language-plaintext highlighter-rouge">proto.Response</code>以及可能的錯誤。</li>
    </ul>
  </li>
  <li><strong>Flush</strong>:
    <ul>
      <li><strong>用途</strong>：將索引的數據強制同步到磁盤。</li>
      <li><strong>參數</strong>：
        <ul>
          <li><code class="language-plaintext highlighter-rouge">ctx</code>: 上下文。</li>
          <li><code class="language-plaintext highlighter-rouge">indexNames</code>: 需要同步的索引名稱列表。</li>
        </ul>
      </li>
      <li><strong>返回值</strong>：返回一個<code class="language-plaintext highlighter-rouge">proto.Response</code>以及可能的錯誤。</li>
    </ul>
  </li>
  <li><strong>IndicesClearCache</strong>:
    <ul>
      <li><strong>用途</strong>：清除指定索引的快取。</li>
      <li><strong>參數</strong>：
        <ul>
          <li><code class="language-plaintext highlighter-rouge">ctx</code>: 上下文。</li>
          <li><code class="language-plaintext highlighter-rouge">indexNames</code>: 需要清除快取的索引名稱列表。</li>
        </ul>
      </li>
      <li><strong>返回值</strong>：返回一個<code class="language-plaintext highlighter-rouge">proto.Response</code>以及可能的錯誤。</li>
    </ul>
  </li>
  <li><strong>IndicesClose</strong>:
    <ul>
      <li><strong>用途</strong>：關閉指定的Elasticsearch索引。</li>
      <li><strong>參數</strong>：
        <ul>
          <li><code class="language-plaintext highlighter-rouge">ctx</code>: 上下文。</li>
          <li><code class="language-plaintext highlighter-rouge">indexNames</code>: 需要關閉的索引名稱列表。</li>
        </ul>
      </li>
      <li><strong>返回值</strong>：返回一個<code class="language-plaintext highlighter-rouge">proto.Response</code>以及可能的錯誤。</li>
    </ul>
  </li>
  <li><strong>IndicesForcemerge</strong>:
    <ul>
      <li><strong>用途</strong>：對指定的Elasticsearch索引執行forcemerge操作，通常用於優化索引。</li>
      <li><strong>參數</strong>：
        <ul>
          <li><code class="language-plaintext highlighter-rouge">ctx</code>: 上下文。</li>
          <li><code class="language-plaintext highlighter-rouge">indexNames</code>: 需要forcemerge的索引名稱列表。</li>
          <li><code class="language-plaintext highlighter-rouge">maxNumSegments</code>: 最大段數。</li>
        </ul>
      </li>
      <li><strong>返回值</strong>：返回一個<code class="language-plaintext highlighter-rouge">proto.Response</code>以及可能的錯誤。</li>
    </ul>
  </li>
  <li><strong>DeleteByQuery</strong>:
    <ul>
      <li><strong>用途</strong>：根據指定的查詢刪除文檔。</li>
      <li><strong>參數</strong>：
        <ul>
          <li><code class="language-plaintext highlighter-rouge">ctx</code>: 上下文。</li>
          <li><code class="language-plaintext highlighter-rouge">indexNames</code>: 要操作的索引名稱列表。</li>
          <li><code class="language-plaintext highlighter-rouge">documents</code>: 文檔列表。</li>
          <li><code class="language-plaintext highlighter-rouge">body</code>: 查詢主體。</li>
        </ul>
      </li>
      <li><strong>返回值</strong>：返回一個<code class="language-plaintext highlighter-rouge">proto.Response</code>以及可能的錯誤。</li>
    </ul>
  </li>
  <li><strong>SnapshotStatus</strong>:
    <ul>
      <li><strong>用途</strong>：獲取快照的狀態。</li>
      <li><strong>參數</strong>：
        <ul>
          <li><code class="language-plaintext highlighter-rouge">ctx</code>: 上下文。</li>
          <li><code class="language-plaintext highlighter-rouge">repository</code>: 存儲庫名稱。</li>
          <li><code class="language-plaintext highlighter-rouge">snapshot</code>: 快照名稱列表。</li>
          <li><code class="language-plaintext highlighter-rouge">ignoreUnavailable</code>: 是否忽略不可用的。</li>
        </ul>
      </li>
      <li><strong>返回值</strong>：返回一個<code class="language-plaintext highlighter-rouge">proto.Response</code>以及可能的錯誤。</li>
    </ul>
  </li>
  <li><strong>SnapshotGetRepository</strong>:
    <ul>
      <li><strong>用途</strong>：獲取指定的快照存儲庫的信息。</li>
      <li><strong>參數</strong>：
        <ul>
          <li><code class="language-plaintext highlighter-rouge">ctx</code>: 上下文。</li>
          <li><code class="language-plaintext highlighter-rouge">repository</code>: 存儲庫名稱列表。</li>
        </ul>
      </li>
      <li><strong>返回值</strong>：返回一個<code class="language-plaintext highlighter-rouge">proto.Response</code>以及可能的錯誤。</li>
    </ul>
  </li>
  <li><strong>SnapshotCreateRepository</strong>:
    <ul>
      <li><strong>用途</strong>：創建一個新的快照存儲庫。</li>
      <li><strong>參數</strong>：
        <ul>
          <li><code class="language-plaintext highlighter-rouge">ctx</code>: 上下文。</li>
          <li><code class="language-plaintext highlighter-rouge">repository</code>: 存儲庫名稱。</li>
          <li><code class="language-plaintext highlighter-rouge">reqJson</code>: 存儲庫的設定和配置。</li>
        </ul>
      </li>
      <li><strong>返回值</strong>：返回一個<code class="language-plaintext highlighter-rouge">proto.Response</code>以及可能的錯誤。</li>
    </ul>
  </li>
  <li><strong>SnapshotDeleteRepository</strong>:
    <ul>
      <li><strong>用途</strong>：刪除指定的快照存儲庫。</li>
      <li><strong>參數</strong>：
        <ul>
          <li><code class="language-plaintext highlighter-rouge">ctx</code>: 上下文。</li>
          <li><code class="language-plaintext highlighter-rouge">repository</code>: 存儲庫名稱列表。</li>
        </ul>
      </li>
      <li><strong>返回值</strong>：返回一個<code class="language-plaintext highlighter-rouge">proto.Response</code>以及可能的錯誤。</li>
    </ul>
  </li>
  <li><strong>GetIndices</strong>:
    <ul>
      <li><strong>用途</strong>：獲取Elasticsearch中的索引信息。</li>
      <li><strong>參數</strong>：
        <ul>
          <li><code class="language-plaintext highlighter-rouge">ctx</code>: 上下文。</li>
          <li><code class="language-plaintext highlighter-rouge">catRequest</code>: 一系列的選項和參數，用於定制返回的信息。</li>
        </ul>
      </li>
      <li><strong>返回值</strong>：返回一個<code class="language-plaintext highlighter-rouge">proto.Response</code>以及可能的錯誤。</li>
    </ul>
  </li>
</ol>

<p>這個包是一個高級API封裝，它使得使用ElasticSearch V8在Go中更加方便。對於每一個函數，你可以透過查看其名稱和參數來推測其具體功能，並根據你的需要來使用。</p>

<h3 id="pkginfrastructurees_sdkpkgv8esgo_3">pkg/infrastructure/es_sdk/pkg/v8/es.go_3</h3>

<p>這裡有一組函數，它們都屬於<code class="language-plaintext highlighter-rouge">EsClient8</code>這個結構體，用於與Elasticsearch進行互動。以下是這些函數的介紹：</p>

<ol>
  <li><strong>CatHealth</strong>
    <ul>
      <li><strong>用途</strong>: 查詢Elasticsearch的健康狀態。</li>
      <li><strong>參數</strong>:
        <ul>
          <li><code class="language-plaintext highlighter-rouge">ctx</code>: 上下文</li>
          <li><code class="language-plaintext highlighter-rouge">catRequest</code>: 健康狀態的查詢參數。</li>
        </ul>
      </li>
      <li><strong>返回值</strong>:
        <ul>
          <li><code class="language-plaintext highlighter-rouge">res</code>: Elasticsearch的回應。</li>
          <li><code class="language-plaintext highlighter-rouge">err</code>: 錯誤信息。</li>
        </ul>
      </li>
    </ul>
  </li>
  <li><strong>CatShards</strong>
    <ul>
      <li><strong>用途</strong>: 查詢Elasticsearch的分片信息。</li>
      <li><strong>參數</strong>:
        <ul>
          <li><code class="language-plaintext highlighter-rouge">ctx</code>: 上下文</li>
          <li><code class="language-plaintext highlighter-rouge">catRequest</code>: 分片的查詢參數。</li>
        </ul>
      </li>
      <li><strong>返回值</strong>:
        <ul>
          <li><code class="language-plaintext highlighter-rouge">res</code>: Elasticsearch的回應。</li>
          <li><code class="language-plaintext highlighter-rouge">err</code>: 錯誤信息。</li>
        </ul>
      </li>
    </ul>
  </li>
  <li><strong>CatCount</strong>
    <ul>
      <li><strong>用途</strong>: 查詢Elasticsearch中的文檔數量。</li>
      <li><strong>參數</strong>:
        <ul>
          <li><code class="language-plaintext highlighter-rouge">ctx</code>: 上下文</li>
          <li><code class="language-plaintext highlighter-rouge">catRequest</code>: 文檔數量的查詢參數。</li>
        </ul>
      </li>
      <li><strong>返回值</strong>:
        <ul>
          <li><code class="language-plaintext highlighter-rouge">res</code>: Elasticsearch的回應。</li>
          <li><code class="language-plaintext highlighter-rouge">err</code>: 錯誤信息。</li>
        </ul>
      </li>
    </ul>
  </li>
  <li><strong>CatAllocationRequest</strong>
    <ul>
      <li><strong>用途</strong>: 查詢Elasticsearch的資源分配。</li>
      <li><strong>參數</strong>:
        <ul>
          <li><code class="language-plaintext highlighter-rouge">ctx</code>: 上下文</li>
          <li><code class="language-plaintext highlighter-rouge">catRequest</code>: 資源分配的查詢參數。</li>
        </ul>
      </li>
      <li><strong>返回值</strong>:
        <ul>
          <li><code class="language-plaintext highlighter-rouge">res</code>: Elasticsearch的回應。</li>
          <li><code class="language-plaintext highlighter-rouge">err</code>: 錯誤信息。</li>
        </ul>
      </li>
    </ul>
  </li>
  <li><strong>CatAliases</strong>
    <ul>
      <li><strong>用途</strong>: 查詢Elasticsearch的別名。</li>
      <li><strong>參數</strong>:
        <ul>
          <li><code class="language-plaintext highlighter-rouge">ctx</code>: 上下文</li>
          <li><code class="language-plaintext highlighter-rouge">catRequest</code>: 別名的查詢參數。</li>
        </ul>
      </li>
      <li><strong>返回值</strong>:
        <ul>
          <li><code class="language-plaintext highlighter-rouge">res</code>: Elasticsearch的回應。</li>
          <li><code class="language-plaintext highlighter-rouge">err</code>: 錯誤信息。</li>
        </ul>
      </li>
    </ul>
  </li>
  <li><strong>IndicesSegmentsRequest</strong>
    <ul>
      <li><strong>用途</strong>: 查詢Elasticsearch的指數段信息。</li>
      <li><strong>參數</strong>:
        <ul>
          <li><code class="language-plaintext highlighter-rouge">ctx</code>: 上下文</li>
          <li><code class="language-plaintext highlighter-rouge">human</code>: 是否返回易於閱讀的結果。</li>
        </ul>
      </li>
      <li><strong>返回值</strong>:
        <ul>
          <li><code class="language-plaintext highlighter-rouge">res</code>: Elasticsearch的回應。</li>
          <li><code class="language-plaintext highlighter-rouge">err</code>: 錯誤信息。</li>
        </ul>
      </li>
    </ul>
  </li>
  <li><strong>ClusterStats</strong>
    <ul>
      <li><strong>用途</strong>: 查詢Elasticsearch集群的統計信息。</li>
      <li><strong>參數</strong>:
        <ul>
          <li><code class="language-plaintext highlighter-rouge">ctx</code>: 上下文</li>
          <li><code class="language-plaintext highlighter-rouge">human</code>: 是否返回易於閱讀的結果。</li>
        </ul>
      </li>
      <li><strong>返回值</strong>:
        <ul>
          <li><code class="language-plaintext highlighter-rouge">res</code>: Elasticsearch的回應。</li>
          <li><code class="language-plaintext highlighter-rouge">err</code>: 錯誤信息。</li>
        </ul>
      </li>
    </ul>
  </li>
  <li><strong>CatNodes</strong>
    <ul>
      <li><strong>用途</strong>: 查詢Elasticsearch的節點信息。</li>
      <li><strong>參數</strong>:
        <ul>
          <li><code class="language-plaintext highlighter-rouge">ctx</code>: 上下文</li>
          <li><code class="language-plaintext highlighter-rouge">h</code>: 顯示的欄位列表。</li>
        </ul>
      </li>
      <li><strong>返回值</strong>:
        <ul>
          <li><code class="language-plaintext highlighter-rouge">res</code>: Elasticsearch的回應。</li>
          <li><code class="language-plaintext highlighter-rouge">err</code>: 錯誤信息。</li>
        </ul>
      </li>
    </ul>
  </li>
  <li><strong>Delete</strong>
    <ul>
      <li><strong>用途</strong>: 從Elasticsearch中刪除文檔。</li>
      <li><strong>參數</strong>:
        <ul>
          <li><code class="language-plaintext highlighter-rouge">ctx</code>: 上下文</li>
          <li><code class="language-plaintext highlighter-rouge">deleteRequest</code>: 刪除的參數。</li>
        </ul>
      </li>
      <li><strong>返回值</strong>:
        <ul>
          <li><code class="language-plaintext highlighter-rouge">res</code>: Elasticsearch的回應。</li>
          <li><code class="language-plaintext highlighter-rouge">err</code>: 錯誤信息。</li>
        </ul>
      </li>
    </ul>
  </li>
  <li><strong>Update</strong>
    <ul>
      <li><strong>用途</strong>: 更新Elasticsearch中的文檔。</li>
      <li><strong>參數</strong>:
        <ul>
          <li><code class="language-plaintext highlighter-rouge">ctx</code>: 上下文</li>
          <li><code class="language-plaintext highlighter-rouge">updateRequest</code>: 更新的參數。</li>
          <li><code class="language-plaintext highlighter-rouge">body</code>: 更新的內容。</li>
        </ul>
      </li>
      <li><strong>返回值</strong>:
        <ul>
          <li><code class="language-plaintext highlighter-rouge">res</code>: Elasticsearch的回應。</li>
          <li><code class="language-plaintext highlighter-rouge">err</code>: 錯誤信息。</li>
        </ul>
      </li>
    </ul>
  </li>
</ol>

<p>每個函數主要都是通過<code class="language-plaintext highlighter-rouge">Do</code>方法發送請求到Elasticsearch，然後返回Elasticsearch的回應和任何可能的錯誤。</p>

<h3 id="pkginfrastructurees_sdkpkgv8esgo_4">pkg/infrastructure/es_sdk/pkg/v8/es.go_4</h3>

<p>好的，我將對每一個函數提供簡短的解釋和概述。</p>

<ol>
  <li><strong>Create</strong>
    <ul>
      <li>用途：在Elasticsearch中創建一個文檔。</li>
      <li>參數：<code class="language-plaintext highlighter-rouge">ctx</code> (上下文)，<code class="language-plaintext highlighter-rouge">createRequest</code> (創建文檔的請求資訊)，<code class="language-plaintext highlighter-rouge">body</code> (文檔的主體內容)。</li>
      <li>返回值：<code class="language-plaintext highlighter-rouge">res</code> (響應資訊)，<code class="language-plaintext highlighter-rouge">err</code> (可能的錯誤)。</li>
    </ul>
  </li>
  <li><strong>Search</strong>
    <ul>
      <li>用途：在Elasticsearch中進行搜索。</li>
      <li>參數：<code class="language-plaintext highlighter-rouge">ctx</code> (上下文)，<code class="language-plaintext highlighter-rouge">searchRequest</code> (搜索的請求資訊)，<code class="language-plaintext highlighter-rouge">query</code> (搜索查詢的主體)。</li>
      <li>返回值：<code class="language-plaintext highlighter-rouge">res</code> (響應資訊)，<code class="language-plaintext highlighter-rouge">err</code> (可能的錯誤)。</li>
    </ul>
  </li>
  <li><strong>IndicesPutSettingsRequest</strong>
    <ul>
      <li>用途：更新Elasticsearch索引的設置。</li>
      <li>參數：<code class="language-plaintext highlighter-rouge">ctx</code> (上下文)，<code class="language-plaintext highlighter-rouge">indexSettingsRequest</code> (索引設置請求資訊)，<code class="language-plaintext highlighter-rouge">body</code> (設置的主體)。</li>
      <li>返回值：<code class="language-plaintext highlighter-rouge">res</code> (響應資訊)，<code class="language-plaintext highlighter-rouge">err</code> (可能的錯誤)。</li>
    </ul>
  </li>
  <li><strong>CreateIndex</strong>
    <ul>
      <li>用途：在Elasticsearch中創建一個新的索引。</li>
      <li>參數：<code class="language-plaintext highlighter-rouge">ctx</code> (上下文)，<code class="language-plaintext highlighter-rouge">indexCreateRequest</code> (創建索引的請求資訊)，<code class="language-plaintext highlighter-rouge">body</code> (索引配置的主體)。</li>
      <li>返回值：<code class="language-plaintext highlighter-rouge">res</code> (響應資訊)，<code class="language-plaintext highlighter-rouge">err</code> (可能的錯誤)。</li>
    </ul>
  </li>
  <li><strong>DeleteIndex</strong>
    <ul>
      <li>用途：刪除Elasticsearch中的一個或多個索引。</li>
      <li>參數：<code class="language-plaintext highlighter-rouge">ctx</code> (上下文)，<code class="language-plaintext highlighter-rouge">indicesDeleteRequest</code> (刪除索引的請求資訊)。</li>
      <li>返回值：<code class="language-plaintext highlighter-rouge">res</code> (響應資訊)，<code class="language-plaintext highlighter-rouge">err</code> (可能的錯誤)。</li>
    </ul>
  </li>
  <li><strong>Reindex</strong>
    <ul>
      <li>用途：在Elasticsearch中重新索引文檔。</li>
      <li>參數：<code class="language-plaintext highlighter-rouge">ctx</code> (上下文)，<code class="language-plaintext highlighter-rouge">reindexRequest</code> (重新索引的請求資訊)，<code class="language-plaintext highlighter-rouge">body</code> (重新索引的主體)。</li>
      <li>返回值：<code class="language-plaintext highlighter-rouge">res</code> (響應資訊)，<code class="language-plaintext highlighter-rouge">err</code> (可能的錯誤)。</li>
    </ul>
  </li>
  <li><strong>IndicesGetSettingsRequest</strong>
    <ul>
      <li>用途：獲取Elasticsearch索引的設置。</li>
      <li>參數：<code class="language-plaintext highlighter-rouge">ctx</code> (上下文)，<code class="language-plaintext highlighter-rouge">indicesGetSettingsRequest</code> (獲取索引設置的請求資訊)。</li>
      <li>返回值：<code class="language-plaintext highlighter-rouge">res</code> (響應資訊)，<code class="language-plaintext highlighter-rouge">err</code> (可能的錯誤)。</li>
    </ul>
  </li>
  <li><strong>PutMapping</strong>
    <ul>
      <li>用途：在Elasticsearch中更新或新增索引映射。</li>
      <li>參數：<code class="language-plaintext highlighter-rouge">ctx</code> (上下文)，<code class="language-plaintext highlighter-rouge">indicesPutMappingRequest</code> (放置映射的請求資訊)，<code class="language-plaintext highlighter-rouge">body</code> (映射的主體)。</li>
      <li>返回值：<code class="language-plaintext highlighter-rouge">res</code> (響應資訊)，<code class="language-plaintext highlighter-rouge">err</code> (可能的錯誤)。</li>
    </ul>
  </li>
  <li><strong>GetAliases</strong>
    <ul>
      <li>用途：獲取Elasticsearch中索引的別名。</li>
      <li>參數：<code class="language-plaintext highlighter-rouge">ctx</code> (上下文)，<code class="language-plaintext highlighter-rouge">indexNames</code> (索引名稱列表)。</li>
      <li>返回值：<code class="language-plaintext highlighter-rouge">res</code> (響應資訊)，<code class="language-plaintext highlighter-rouge">err</code> (可能的錯誤)。</li>
    </ul>
  </li>
  <li><strong>AddAliases</strong>
    <ul>
      <li>用途：為Elasticsearch中的索引添加別名。</li>
      <li>參數：<code class="language-plaintext highlighter-rouge">ctx</code> (上下文)，<code class="language-plaintext highlighter-rouge">indexName</code> (索引名稱列表)，<code class="language-plaintext highlighter-rouge">aliasName</code> (別名)。</li>
      <li>返回值：<code class="language-plaintext highlighter-rouge">res</code> (響應資訊)，<code class="language-plaintext highlighter-rouge">err</code> (可能的錯誤)。</li>
    </ul>
  </li>
</ol>

<p>這些函數基本上都是在Elasticsearch中執行常見操作，並使用了<code class="language-plaintext highlighter-rouge">esapi</code>和<code class="language-plaintext highlighter-rouge">esutil</code>這兩個套件來簡化與Elasticsearch的交互。返回值通常是Elasticsearch的響應和一個可能的錯誤。</p>

<h3 id="pkginfrastructurees_sdkpkgv8esgo_5">pkg/infrastructure/es_sdk/pkg/v8/es.go_5</h3>

<p>您提供了四個函數的定義，我將為您進行詳細解釋：</p>

<ol>
  <li><strong>RemoveAliases</strong>
    <ul>
      <li>用途：從Elasticsearch索引中移除別名。</li>
      <li>參數：
        <ul>
          <li><code class="language-plaintext highlighter-rouge">ctx</code> (上下文)</li>
          <li><code class="language-plaintext highlighter-rouge">indexName</code> (索引名稱列表)</li>
          <li><code class="language-plaintext highlighter-rouge">aliasName</code> (別名列表)</li>
        </ul>
      </li>
      <li>返回值：
        <ul>
          <li><code class="language-plaintext highlighter-rouge">res</code> (響應資訊，其中包含HTTP響應的狀態碼、標頭和主體)</li>
          <li><code class="language-plaintext highlighter-rouge">err</code> (可能的錯誤)</li>
        </ul>
      </li>
    </ul>
  </li>
  <li><strong>MoveToAnotherIndexAliases</strong>
    <ul>
      <li>用途：移動別名到另一個Elasticsearch索引。</li>
      <li>參數：
        <ul>
          <li><code class="language-plaintext highlighter-rouge">ctx</code> (上下文)</li>
          <li><code class="language-plaintext highlighter-rouge">body</code> (含有移動別名的操作資訊的主體)</li>
        </ul>
      </li>
      <li>返回值：
        <ul>
          <li><code class="language-plaintext highlighter-rouge">res</code> (響應資訊)</li>
          <li><code class="language-plaintext highlighter-rouge">err</code> (可能的錯誤)</li>
        </ul>
      </li>
    </ul>
  </li>
  <li><strong>TaskList</strong>
    <ul>
      <li>用途：獲取Elasticsearch中的任務列表。</li>
      <li>參數：
        <ul>
          <li><code class="language-plaintext highlighter-rouge">ctx</code> (上下文)</li>
        </ul>
      </li>
      <li>返回值：
        <ul>
          <li><code class="language-plaintext highlighter-rouge">res</code> (響應資訊)</li>
          <li><code class="language-plaintext highlighter-rouge">err</code> (可能的錯誤)</li>
        </ul>
      </li>
    </ul>
  </li>
  <li><strong>TasksCancel</strong>
    <ul>
      <li>用途：取消Elasticsearch中的指定任務。</li>
      <li>參數：
        <ul>
          <li><code class="language-plaintext highlighter-rouge">ctx</code> (上下文)</li>
          <li><code class="language-plaintext highlighter-rouge">taskId</code> (要取消的任務的ID)</li>
        </ul>
      </li>
      <li>返回值：
        <ul>
          <li><code class="language-plaintext highlighter-rouge">res</code> (響應資訊)</li>
          <li><code class="language-plaintext highlighter-rouge">err</code> (可能的錯誤)</li>
        </ul>
      </li>
    </ul>
  </li>
</ol>

<p>每個函數的工作流程都很相似。首先，使用Elasticsearch的客戶端(<code class="language-plaintext highlighter-rouge">this.client</code>)進行相應的操作，如刪除別名、更新別名、獲取任務列表或取消任務。接著，如果操作成功，將HTTP響應轉換為<code class="language-plaintext highlighter-rouge">proto.Response</code>對象。如果在這過程中遇到任何錯誤，函數將返回這個錯誤。</p>

<h2 id="terminology">Terminology</h2>

<h3 id="dsl">DSL</h3>

<p>DSL 是 Domain-Specific Language 的縮寫，中文譯為「特定領域語言」（或譯「領域特定語言」），也就是開發人員為了解決特定領域的問題所定義的專用語言⁴。例如，HTML 是針對網頁結構的語言，JSON 是針對資料結構的語言等等⁵。相較於通用目的語言 (GPL 或 General-purpose Language，如 Swift 本身)，DSL 的語法會更簡潔，邏輯更簡單⁵。</p>

<p>以下是一個 DSL 的範例¹：</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"query"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"match_all"</span><span class="p">:</span><span class="w"> </span><span class="p">{}</span><span class="w"> </span><span class="err">//your</span><span class="w"> </span><span class="err">query</span><span class="w"> </span><span class="err">parameter</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>基本的查詢結構如下²：</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="err">QUERY_NAME:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="err">ARGUMENT:</span><span class="w"> </span><span class="err">VALUE</span><span class="p">,</span><span class="w">
    </span><span class="err">ARGUMENT:</span><span class="w"> </span><span class="err">VALUE</span><span class="p">,</span><span class="err">...</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>特定欄位查詢結構如下²：</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="err">QUERY_NAME:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="err">FIELD_NAME:</span><span class="w"> </span><span class="p">{</span><span class="w">
      </span><span class="err">ARGUMENT:</span><span class="w"> </span><span class="err">VALUE</span><span class="p">,</span><span class="w">
      </span><span class="err">ARGUMENT:</span><span class="w"> </span><span class="err">VALUE</span><span class="p">,</span><span class="err">...</span><span class="w">
    </span><span class="p">}</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>查詢語法範例²：</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"query"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"match"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
      </span><span class="nl">"field"</span><span class="p">:</span><span class="w"> </span><span class="s2">"value"</span><span class="w">
    </span><span class="p">}</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>這些都是 DSL 的基本結構和使用方式。</p>

<p>來源: 與 Bing 的交談， 2023/10/25
(1) 開發人員的逆襲： Domain-Specific Languages - <a href="https://www.huanlintalk.com/2008/05/domain-specific-languages.html">Huan-Lin 學習筆記</a>.
(2) Swift DSL 實作：利用 Swift UI 寫出簡單又明瞭的 Auto Layout DSL - <a href="https://www.appcoda.com.tw/swift-dsl/">AppCoda 中文版</a>.
(3) DSL - Domain Specific Language 簡介 - <a href="https://blog.maxkit.com.tw/2013/12/dsl-domain-specific-language.html">Maxkit</a>.
(4) Day07 Kibana - Query DSL 語法結構 - iT 邦幫忙::一起幫忙解決難題，拯救 IT 人的一天、<a href="https://ithelp.ithome.com.tw/articles/10263378">ithome</a>.
(5) Swift DSL 實作：利用 Swift UI 寫出簡單又明瞭的 Auto Layout DSL - <a href="https://bing.com/search?q=DSL+%e8%aa%9e%e6%b3%95">AppCoda 中文版</a>.
(6) undefined. <a href="https://www.elastic.co/guide/en/elasticsearch/guide/current/query-dsl-intro.html.">elastic.co</a></p>

<h3 id="crud">CRUD</h3>

<p>“Elasticsearch 的 CRUD 操作” 是指在 Elasticsearch 中進行創建（Create）、讀取（Read）、更新（Update）和刪除（Delete）操作。這些操作是數據庫交互的基礎⁴。</p>

<ul>
  <li><strong>創建</strong>：在 Elasticsearch 中添加新的文檔或索引⁴。</li>
  <li><strong>讀取</strong>：從 Elasticsearch 中獲取特定的文檔或索引的資訊⁵。</li>
  <li><strong>更新</strong>：修改 Elasticsearch 中已存在的文檔或索引⁴。</li>
  <li><strong>刪除</strong>：移除 Elasticsearch 中的特定文檔或索引⁵。</li>
</ul>

<p>這些操作使得用戶可以靈活地管理和操作 Elasticsearch 中的數據⁴⁵。如果您需要更多詳細資訊，請告訴我。</p>

<p>來源: 與 Bing 的交談， 2023/10/25
(1) Elasticsearch（二）—— es的文档、索引的CRUD操作 - <a href="https://blog.csdn.net/hxxjxw/article/details/107518490">CSDN博客</a>.
(2) Elasticsearch-文档的 CRUD-腾讯云开发者社区-<a href="https://cloud.tencent.com/developer/article/1487248">腾讯云</a>.
(3) Elasticsearch CRUD基本操作 - 狼爷 - <a href="https://www.cnblogs.com/powercto/p/14438907.html">博客园</a>.
(4) ES索引的基本操作(CRUD)<em>es crud-<a href="https://blog.csdn.net/weixin_37692493/article/details/107898936">CSDN博客</a>.
(5) Elasticsearch-文档的 CRUD-腾讯云开发者社区-<a href="https://bing.com/search?q=Elasticsearch+%e7%9a%84+CRUD+%e6%93%8d%e4%bd%9c">腾讯云</a>.
(6) ElasticSearch的CRUD操作</em>“_shards" : { "total" : 42, "successful" : <a href="https://blog.csdn.net/qq_44671288/article/details/108887844">25-CSDN博客</a>.</p>

<p>有關CRUD的程式：</p>

<p>./pkg/api/<a href="#pkgapies_crud_controllergo">es_crud_controller.go</a>：
./pkg/dto/<a href="#pkgdtoes_crudgo">es_crud.go</a>
./pkg/model/crud.go
./pkg/web/es_crud.go</p>

<h3 id="gin-web框架">gin Web框架</h3>

<p>Gin 是一個使用 Go 語言開發的 Web 框架¹²。它提供了類似於 Martini 的 API，但性能比 Martini 快 40 倍¹²。以下是一些 Gin 的主要特性：</p>

<ul>
  <li><strong>快速</strong>：基於 Radix 樹的路由，小內存佔用¹²。</li>
  <li><strong>支援中間件</strong>：傳入的 HTTP 請求可以由一系列中間件和最終操作來處理¹²。</li>
  <li><strong>Crash 處理</strong>：Gin 可以 catch 一個發生在 HTTP 請求中的 panic 並 recover 它¹²。</li>
  <li><strong>JSON 驗證</strong>：Gin 可以解析並驗證請求的 JSON，例如檢查所需值的存在¹²。</li>
  <li><strong>路由組</strong>：Gin 幫助您更好地組織您的路由，例如，按照需要授權和不需要授權和不同 API 版本進行分組¹²。</li>
</ul>

<p>這些只是 Gin 的一部分功能，實際上還有許多其他功能和特性。如果您需要更多詳細資訊，請告訴我。¹²</p>

<p>來源: 與 Bing 的交談， 2023/10/26
(1) Gin Web Framework. <a href="https://gin-gonic.com/zh-cn/">gin-gonic</a>.
(2) Gin Web Framework. <a href="https://gin-gonic.com/">gin-gonic</a>.
(3) 文档 | Gin Web Framework. <a href="https://gin-gonic.com/zh-cn/docs/">gin-gonic</a>.
(4) Gin-Web-Framework官方指南中文（上篇） - <a href="https://cloud.tencent.com/developer/article/1530535">腾讯云</a>.</p>

<h3 id="navicat">Navicat</h3>

<p>Navicat 是一款強大的資料庫管理和設計工具，支援 Windows、macOS 和 Linux¹²。它具有直觀的圖形用戶界面，讓使用者可以輕鬆地管理多種資料庫，包括 MySQL、Redis、PostgreSQL、MongoDB、MariaDB、SQL Server、Oracle 和 SQLite¹²。</p>

<p>Navicat 提供了許多功能，包括資料庫建立、管理和維護，以及資料庫監控等¹²。此外，它還提供了協同合作工具，讓團隊可以隨時隨地即時協作¹²。</p>

<p>總的來說，Navicat 是一個全面的資料庫管理解決方案，適合各種規模的企業和團隊使用¹²。希望這些信息對您有所幫助！</p>

<p>來源: 與 Bing 的交談， 2023/10/26
(1) Navicat GUI | 支援 MySQL、Redis、PostgreSQL、MongoDB、MariaDB、SQL Server、Oracle 和 SQLite 的資料庫管理. <a href="https://navicat.com/cht">Navicat</a>.
(2) Navicat GUI | DB Admin Tool for MySQL, Redis, PostgreSQL, MongoDB, MariaDB, SQL Server, Oracle &amp; SQLite client. <a href="https://navicat.com/en">Navicat</a>.</p>

<h3 id="rbac">RBAC</h3>

<p>RBAC，全名為基於角色的訪問控制（Role-Based Access Control），是資訊安全領域中一種廣為使用的存取控制機制¹。不同於強制存取控制以及自由選定存取控制直接賦予使用者權限，RBAC是將權限賦予角色¹。</p>

<p>在一個組織中，會因為不同的作業功能產生不同的角色，執行某項操作的權限會被賦予特定的角色¹。組織成員或者工作人員（抑或其它系統使用者）則被賦予不同的角色，這些使用者通過被賦予角色來取得執行某項電腦系統功能的權限¹。</p>

<p>例如，一個人在公司中的職位可以稱為「角色」。但是，角色在 RBAC 中具有更技術性的定義：它是在公司系統中使用的一組明確定義的能力或權限²。每個內部使用者至少會被指派一個角色，有些使用者可能有多個角色²。</p>

<p>RBAC 提供了细粒度的控制，提供了一种简单、可管理的访问管理方法，与单独分配权限相比，这种方法更不容易出错⁴。希望這些信息對您有所幫助！</p>

<p>來源: 與 Bing 的交談， 2023/10/26
(1) 以角色為基礎的存取控制 - <a href="https://zh.wikipedia.org/zh-tw/以角色為基礎的存取控制">維基百科，自由的百科全書</a>.
(2) 什麼是基於角色的存取控制 (RBAC)？ | <a href="https://www.cloudflare.com/zh-tw/learning/access-management/role-based-access-control-rbac/">Cloudflare</a>.
(3) 什么是基于角色的访问控制 (RBAC)？示例、好处等 - <a href="https://blog.csdn.net/allway2/article/details/126973312">CSDN博客</a>.
(4) 什么是基于角色的访问控制（RBAC）？ | <a href="https://www.cloudflare.com/zh-cn/learning/access-management/role-based-access-control-rbac/">Cloudflare</a>.
(5) 在应用程序中实现基于角色的访问控制 - <a href="https://learn.microsoft.com/zh-cn/azure/active-directory/develop/howto-implement-rbac-for-apps">Microsoft Entra</a>.</p>

<h3 id="dto-description">DTO description</h3>

<p>數據傳輸對象（Data Transfer Object，縮寫為DTO）是在計算機編程中，用於在兩個進程之間傳輸數據的對象¹²。這種模式通常用於遠端介面（如Web服務）的昂貴操作，其中成本的主體是客戶和伺服器之間的來回通信時間¹²。</p>

<p>為了降低這種呼叫次數，使用DTO可以聚合本來需要多次通信傳輸的資料¹²。DTO的資料的變異子與訪問子（mutator和accessor）、語法分析（parser）、序列化（serializer）時不會有任何儲存、取得、序列化和反序列化的異常¹²。</p>

<p>換句話說，DTO是一種簡單對象，不含任何業務邏輯，但可包含序列化和反序列化以用於傳輸資料¹²。希望這些信息對您有所幫助！</p>

<p>來源: 與 Bing 的交談， 2023/10/26
(1) 資料傳輸對象 - <a href="https://zh.wikipedia.org/zh-tw/資料傳輸對象">維基百科，自由的百科全書</a>.
(2) 数据传输对象 - <a href="https://zh.wikipedia.org/wiki/数据传输对象">维基百科，自由的百科全书</a>.
(3) 簡易快捷存取Yaml文件的API @Minecraft 我的世界（當個創世神） 哈啦板 - <a href="https://forum.gamer.com.tw/Co.php?bsn=18673&amp;sn=932365">巴哈姆特</a>.
(4) 淺析VO、DTO、DO、BO的概念、區別和用處 - <a href="https://www.twblogs.net/a/5ebc068986ec4d75d119f32f">台部落</a>.
(5) undefined. <a href="https://msdn.microsoft.com/en-us/library/ms978717.aspx">MS.com</a>.
(6) undefined. <a href="http://martinfowler.com/eaaCatalog/dataTransferObject.html">martinfowler</a>.</p>

<h3 id="casbin">casbin</h3>

<p>Casbin 是一個強大和高效的開放源碼訪問控制庫¹。它支持各種訪問控制模型，以強制全面執行授權¹。以下是一些 Casbin 的主要特性：</p>

<ul>
  <li><strong>支援多種訪問控制模型</strong>：例如，RBAC（基於角色的訪問控制）、ABAC（基於屬性的訪問控制）等¹。</li>
  <li><strong>靈活的策略管理</strong>：策略可以通過文件或數據庫來管理，並且可以動態更改¹。</li>
  <li><strong>支援多種語言</strong>：包括 Go、Java、Node.js、PHP、Python、C#、Delphi、Rust、C++、Lua、Dart 和 Elixir 等¹。</li>
</ul>

<p>Casbin 的使用非常直觀，只需要在策略文件中列出主體、對象和所需的允許操作（或根據您的需求的任何其他格式）即可強制執行一組規則¹。開發人員/管理員可以通過模型文件完全控制授權的佈局、執行和條件¹。</p>

<p>請注意，Casbin 不負責身份驗證（例如，在用戶登錄時驗證用戶名和密碼），也不管理用戶列表或角色列表¹。這些通常由項目自身來管理¹。</p>

<p>來源: 與 Bing 的交談， 2023/10/26
(1) 概述 | <a href="https://casbin.org/zh/docs/overview/">Casbin</a>.
(2) casbin最牛逼的权限管理 - <a href="https://juejin.cn/post/7031734011638579213">掘金</a>.
(3) 开始使用 | <a href="https://casbin.org/zh/docs/get-started/">Casbin</a>.</p>

<h3 id="swagger">Swagger</h3>

<p>Swagger 是一套開放源碼的 API 開發工具，它遵循 OpenAPI Specification（OpenAPI 規範，也簡稱 OAS）⁵。Swagger 可以貫穿於整個 API 生態，如 API 的設計、編寫 API 文檔、測試和部署⁵。它可以幫助設計、構建、記錄和使用 REST API³。Swagger 提供了一個視覺化的界面，將各個 API 條列出來，包含了 API 所需的參數以及參數格式等，甚至可以透過這個頁面直接對後端的 API 做操作⁴。</p>

<p>Swagger 的主要目標是：</p>
<ul>
  <li>最小化連接解耦服務所需的工作量³。</li>
  <li>提供一種通用的，和編程語言無關的 API 描述規範⁵。</li>
</ul>

<p>Swagger 提供了兩種主要的工具：</p>
<ul>
  <li><strong>開源工具</strong>：這些工具可以創建、更新和分享 OpenAPI 定義¹。</li>
  <li><strong>SwaggerHub</strong>：這是一個平台解決方案，用於支持大規模的 OpenAPI 工作流程¹。</li>
</ul>

<p>此外，Swagger 還提供了 Swagger UI 和 Swagger 產生器等工具²。這些工具可以自動生成 API 文檔，並能在線上進行測試，正好可以解決文件維護與修改的問題²。因此，無論是個人開發者還是團隊，都可以通過 Swagger 來提高他們的開發效率並降低 API 文件的維護成本¹⁴。</p>

<p>來源: 與 Bing 的交談， 2023/10/26
(1) Swagger详细了解一下（长文谨慎阅读）-腾讯云开发者社区-<a href="https://cloud.tencent.com/developer/article/1621396">腾讯云</a>.
(2) ASP.NET Core web API documentation with Swagger / <a href="https://learn.microsoft.com/en-us/aspnet/core/tutorials/web-api-help-pages-using-swagger?view=aspnetcore-7.0">OpenAPI</a>.
(3) [NestJS 帶你飛！] DAY26 - Swagger (上) - iT 邦幫忙::一起幫忙解決難題，<a href="https://ithelp.ithome.com.tw/articles/10280346">拯救 IT 人的一天</a>.
(4) API Documentation &amp; Design Tools for Teams | <a href="https://swagger.io/">Swagger</a>.
(5) [Day09]使用Swagger自動建立清晰明瞭的REST API文件 - 我與 ASP.NET Core 的 30天 - <a href="https://ithelp.ithome.com.tw/articles/10242295">iT 邦幫忙</a>.
(6) undefined. <a href="https://swagger.io/tools/swagger-editor/">Swagger</a></p>

<h3 id="underline-in-go-import">underline in Go import</h3>

<p>這是 Go 語言的 import 語句，用於導入需要的套件。在這個例子中，導入了兩個套件：</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">database/sql</code>：這是 Go 語言的標準庫，提供了一個與 SQL 數據庫進行交互的接口²。</li>
  <li><code class="language-plaintext highlighter-rouge">_ "embed"</code>：這裡的 <code class="language-plaintext highlighter-rouge">_</code> 是一個匿名導入。當導入一個套件但不使用它的任何導出時，可以使用匿名導入。在這種情況下，只有該套件的初始化函數會被調用，而不會使用該套件的其他部分。<code class="language-plaintext highlighter-rouge">embed</code> 套件是 Go 1.16 版本引入的新特性，允許在 Go 程序中嵌入文件和文件夾¹。</li>
</ul>

<p>所以，<code class="language-plaintext highlighter-rouge">import ("database/sql" _ "embed")</code> 的意思是導入 <code class="language-plaintext highlighter-rouge">database/sql</code> 套件並使用它，同時導入 <code class="language-plaintext highlighter-rouge">embed</code> 套件但只調用其初始化函數。這種做法常見於需要初始化驅動或者需要觸發包級別變數的初始化等情況。例如，在許多數據庫驅動中，我們會看到 <code class="language-plaintext highlighter-rouge">_ "github.com/go-sql-driver/mysql"</code> 的導入，目的就是為了註冊該驅動，使得 <code class="language-plaintext highlighter-rouge">database/sql</code> 套件可以與 MySQL 數據庫進行交互。²</p>

<p>來源: 與 Bing 的交談， 2023/10/26
(1) mssql package - github.com/microsoft/go-mssqldb - <a href="https://pkg.go.dev/github.com/microsoft/go-mssqldb">Go Packages</a>.
(2) Blog: Go embed for better SQL query management | <a href="https://wawand.co/blog/posts/go-embed-sql/">Wawandco</a>.
(3) Insert BLOB from a file into a sql script to embed H2 database. <a href="https://stackoverflow.com/questions/38353487/insert-blob-from-a-file-into-a-sql-script-to-embed-h2-database">stackoverflow</a>.
(4) undefined.<a href="https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/configure-the-network-packet-size-server-configuration-option">microsoft</a>.</p>

<h3 id="squirrel">squirrel</h3>

<p>Squirrel 是一個用於 Go 語言的 SQL 查詢構建庫¹²。它可以幫助你從可組合的部分構建 SQL 查詢²。以下是一些關於 Squirrel 的主要特點：</p>

<ul>
  <li>
    <p><strong>流暢的 SQL 生成</strong>：Squirrel 提供了一種流暢的接口來生成 SQL 查詢¹²。例如，你可以使用 <code class="language-plaintext highlighter-rouge">sq.Select("*").From("users").Join("emails USING (email_id)")</code> 來創建一個查詢²。</p>
  </li>
  <li>
    <p><strong>靈活的查詢構建</strong>：Squirrel 可以使條件查詢構建變得非常容易²。例如，如果你有一個查詢字符串 <code class="language-plaintext highlighter-rouge">q</code>，你可以使用 <code class="language-plaintext highlighter-rouge">users = users.Where("name LIKE ?", fmt.Sprint("%", q, "%"))</code> 來添加一個 WHERE 子句²。</p>
  </li>
  <li>
    <p><strong>直接執行查詢</strong>：Squirrel 也可以直接執行查詢²。例如，你可以使用 <code class="language-plaintext highlighter-rouge">rows, err := three_stooges.RunWith(db).Query()</code> 來執行一個查詢²。</p>
  </li>
  <li>
    <p><strong>支持 PostgreSQL</strong>：Squirrel 支持 PostgreSQL 的占位符格式²。例如，你可以使用 <code class="language-plaintext highlighter-rouge">psql := sq.StatementBuilder.PlaceholderFormat(sq.Dollar)</code> 來設置占位符格式²。</p>
  </li>
</ul>

<p>請注意，Squirrel 不是一個 ORM²。它只是一個幫助你構建 SQL 查詢的庫¹²。如果你需要一個 ORM，那麼你可能需要尋找其他的庫或者框架。</p>

<p>來源: 與 Bing 的交談， 2023/10/26
(1) GitHub - Masterminds/squirrel: Fluent SQL generation for golang. https://github.com/Masterminds/squirrel.
(2) squirrel package - github.com/Masterminds/squirrel - Go Packages. https://pkg.go.dev/github.com/Masterminds/squirrel.
(3) SQL Query Builders - Awesome Go / Golang. https://awesome-go.com/sql-query-builders/.
(4) GitHub - elgris/sqrl: Fluent SQL generation for golang. https://github.com/elgris/sqrl.</p>]]></content><author><name>yckuang</name><email>sinotec2@gmail.com</email></author><category term="note_system," /><summary type="html"><![CDATA[背景 這個套件功能是為文件檔案的全文搜索。因為是用golang寫的、而且是陸胞網友提供，只能拜託chatgpt幫忙寫說明、檢查有沒有“特別”的東西囉。 code github 使用 usage instance node03:8090 cmd ElasticView/cmd/build/main.go 這段 GO 程式碼主要是用於編譯和打包一個名為 “ev” 的應用程式。以下是該程式碼的詳細說明： 引入的套件：程式碼引入了多個外部和內部套件，包括文件路徑操作、命令行參數解析、日誌記錄等。 初始化：在 init 函數中，程式碼初始化了一些命令行參數，例如程序的家目錄、二進制名稱和配置文件的路徑。 主函數：main 函數首先初始化配置，然後進行應用程式的編譯。如果編譯成功，它將輸出一條成功的日誌消息。 編譯函數：BuildEvSvr 函數負責編譯多個平台的二進制文件，例如 Linux、Darwin（macOS）和 Windows。編譯完成後，它會將這些二進制文件和配置文件打包成一個 ZIP 文件。 輔助函數： getExecutableName：根據操作系統和架構返回可執行文件的名稱。 buildBackend：負責實際的編譯操作。 newBuildConfig：創建一個新的編譯配置。 RunGoBuild：運行 Go 編譯命令。 Build 結構體：這個結構體包含了多個方法，每個方法都是針對一個特定的平台和架構進行編譯。 註釋掉的函數：BuildVue 函數被註釋掉了，它可能是用於編譯 Vue.js 前端應用程式的。 cmd/ev-cli/main.go package main func main(){ } cmd/ev/main.go 這段 GO 程式碼主要是用於初始化和運行一個名為 “ev” 的伺服器應用程式。以下是該程式碼的詳細說明： 引入的套件：程式碼引入了多個外部和內部套件，包括命令行參數解析、日誌記錄、操作系統信號處理等。 初始化：在 init 函數中，程式碼初始化了一些命令行參數，例如程序的家目錄、二進制名稱和配置文件的路徑。 主函數： 使用 server.Initialize 函數初始化伺服器。 使用 svr.Init 函數進行伺服器的進一步初始化。 使用 go listenToSystemSignals 函數啟動一個協程來監聽系統信號，以便在接收到終止信號時優雅地關閉伺服器。 使用 svr.Run 函數運行伺服器。 系統信號監聽：listenToSystemSignals 函數監聽系統信號，特別是中斷信號和終止信號。當接收到這些信號時，它會嘗試優雅地關閉伺服器，並在 30 秒的超時後強制關閉。 錯誤處理：如果在初始化或運行伺服器的過程中遇到任何錯誤，程式碼將輸出一條錯誤消息並終止執行。 docs/docs.go 這段 GO 程式碼是由 swaggo/swag 工具自動生成的，用於支援 Swagger 文檔生成。Swagger 是一個 API 規範和框架，用於設計、構建、文檔和使用 RESTful Web 服務。以下是該程式碼的詳細說明： 註釋：開頭的註釋明確指出這段程式碼是由 swaggo/swag 工具生成的，並且不應該被手動編輯。 docTemplate：這是一個常量，定義了 Swagger 文檔的基本模板。它包含了一些基本的 Swagger 規範字段，如 schemes、swagger、info、host、basePath 和 paths。這些字段的值將在運行時被填充。 SwaggerInfo：這是一個全局變量，它是 swag.Spec 的實例。它包含了 Swagger 文檔的一些基本信息，如版本、主機、基本路徑、方案、標題和描述。這些值可以在其他地方被修改，以定制 Swagger 文檔的內容。 init 函數：這是一個特殊的函數，它在包被導入時自動執行。在這個函數中，SwaggerInfo 被註冊到 swag，這樣當 swag 生成 Swagger 文檔時，它就可以使用這些信息。 總之，這段程式碼的主要目的是提供 Swagger 文檔的基本模板和信息，以便 swaggo/swag 工具可以使用它來生成完整的 Swagger 文檔。 es related api pkg/api/es_backup_controller.go 這段 GO 程式碼定義了一個名為 EsBackUpController 的 API 控制器，該控制器提供了與 Elasticsearch 快照和備份相關的功能。以下是該程式碼的詳細說明： 引入的套件：程式碼引入了多個外部和內部套件，包括 DTO（Data Transfer Object）定義、Elasticsearch SDK 工廠、日誌記錄、HTTP 響應處理、工具函數和 Gin Web 框架。 EsBackUpController 結構體： EsBackUpController 是一個控制器結構體，它包含了基本控制器、日誌、Elasticsearch 客戶端服務和 Elasticsearch 備份服務的指針字段。 NewEsBackUpController 函數是 EsBackUpController 的構造函數，它接受基本控制器、日誌、Elasticsearch 客戶端服務和 Elasticsearch 備份服務作為參數，並返回一個新的 EsBackUpController 實例。 API 方法： SnapshotRepositoryListAction：查詢 Elasticsearch 快照仓库列表。 SnapshotCreateRepositoryAction：新建 Elasticsearch 快照仓库。 CleanupeRepositoryAction：清理 Elasticsearch 快照仓库。 SnapshotDeleteRepositoryAction：刪除 Elasticsearch 快照仓库。 CreateSnapshotAction：創建 Elasticsearch 快照。 SnapshotListAction：查詢 Elasticsearch 快照列表。 SnapshotDeleteAction：刪除 Elasticsearch 快照。 SnapshotDetailAction：查詢 Elasticsearch 快照詳情。 SnapshotRestoreAction：將 Elasticsearch 索引恢复至快照時的狀態。 SnapshotStatusAction：獲取 Elasticsearch 快照的狀態。 每個 API 方法都首先解析和驗證請求數據，然後使用相應的服務進行操作，最後返回操作結果。 總之，這段程式碼定義了一個 API 控制器，它提供了與 Elasticsearch 快照和備份相關的功能。 pkg/api/es_controller.go 這是一段 Go 語言的程式碼，主要與 Elasticsearch 有關。以下是該程式碼的中文說明： 導入的套件： 引入了多個內部和外部的套件，包括 bytes, errors, fmt, github.com/gin-gonic/gin 等。 EsController 結構： 定義了一個名為 EsController 的結構，該結構包含了多個屬性，如日誌、Elasticsearch 客戶端服務、JWT 服務等。 NewEsController 函數： 這是一個建構函數，用於創建 EsController 的新實例。 PingAction 函數： 用於檢查 Elasticsearch 的連接是否正常。如果密碼不為空，它會進行解密。然後，它會嘗試 ping Elasticsearch 並返回結果。 CatAction 函數： 這是 Elasticsearch 的 CAT API 的實現。它可以執行多種 CAT 操作，如查看集群健康狀態、查看分片、查看索引等。 RunDslAction 函數： 允許用戶運行 Elasticsearch 的 DSL 查詢。它還處理 GET 請求的特殊情況，並將 DSL 查詢的結果返回給用戶。 SqlToDslAction 函數： 將 SQL 查詢轉換為 Elasticsearch 的 DSL 查詢。它使用 elasticsql 套件進行轉換。 OptimizeAction 函數： 對 Elasticsearch 的索引進行多種操作，如刷新、清除緩存、合併等。 RecoverCanWrite 函數： 如果 Elasticsearch 的索引因某種原因被設置為只讀，此函數將其恢復為可寫狀態。 整體來說，這段程式碼提供了一個 API 控制器，該控制器允許用戶執行多種與 Elasticsearch 相關的操作，如檢查連接、運行查詢、優化索引等。 pkg/api/es_crud_controller.go 這是一段 Go 語言的程式碼，主要與 Elasticsearch 的 CRUD 操作有關。以下是該程式碼的中文說明： 導入的套件： 引入了多個內部和外部的套件，包括 github.com/gin-gonic/gin、github.com/1340691923/ElasticView/pkg/dto 等。 EsCrudController 結構： 定義了一個名為 EsCrudController 的結構，該結構包含了多個屬性，如 Elasticsearch 客戶端服務、日誌和 Navicat 服務。 NewEsCrudController 函數： 這是一個建構函數，用於創建 EsCrudController 的新實例。 GetList 函數： 這是一個可視化篩選獲取數據的函數。它首先綁定請求到 crudFilter，然後使用 Navicat 服務從 Elasticsearch 中獲取數據列表和數據計數。 GetDSL 函數： 這是一個可視化獲取 DSL 查詢的函數。它首先綁定請求到 crudFilter，然後使用 Navicat 服務從 Elasticsearch 中獲取 DSL 查詢的結果。 Download 函數： 這是一個下載功能的函數。它首先綁定請求到 crudFilter，然後使用 Navicat 服務從 Elasticsearch 中獲取需要下載的數據。最後，它使用 DownloadExcel 函數將數據下載為 Excel 文件。 整體來說，這段程式碼提供了一個 API 控制器，該控制器允許用戶執行多種與 Elasticsearch 相關的 CRUD 操作，如獲取數據列表、獲取 DSL 查詢的結果和下載數據。 pkg/api/es_doc_controller.go 這段程式碼是一段以 Go 語言撰寫的 API 控制器代碼，針對 Elasticsearch 文檔的操作。以下是詳細說明： Package 和 Import: package api：此代碼是api包的一部分。 後面的import語句導入了多個必要的包，這些包用於實現這個控制器的功能。 EsDocController struct: 定義了一個名為EsDocController的結構體，代表 Elasticsearch 文檔控制器。它包含四個成員：BaseController(ref), log, esClientService, 和esDocService。 NewEsDocController function: 是EsDocController的建構函數，用於初始化並返回一個新的EsDocController實例。 DeleteRowByIDAction method: 此方法用於從 Elasticsearch 中刪除指定 ID 的文檔數據。首先，它嘗試綁定請求體到esDocDeleteRowByID。然後，使用esClientService取得 ES 客戶端，然後使用esDocService來執行實際的刪除操作。 UpdateByIDAction method: 此方法用於更新 Elasticsearch 中特定 ID 的文檔數據。它的工作方式與DeleteRowByIDAction相似，只是在最後它呼叫EsDocUpdateByID方法來更新數據。 InsertAction method: 此方法用於在 Elasticsearch 中插入新的文檔。它的工作流程與上面兩個方法類似，但在最後它呼叫EsDocInsert方法來插入數據。 在每個方法中，如果遇到錯誤，它都會通過調用this.Error方法發送一個帶有錯誤信息的響應。如果操作成功，它會通過調用this.Success方法發送一個成功的響應。 這些控制器方法基本上都是為了與 Elasticsearch 互動。它們先通過esClientService取得與 Elasticsearch 的連接，然後使用esDocService來執行特定的操作（如插入、更新或刪除）。 pkg/api/es_index_controller.go 這段程式碼中，我們可以看到一個名為 EsIndexController 的控制器，它提供了多種與ElasticSearch索引互動的方法。此控制器基於Gin Web框架構建。以下是該段程式碼的主要部分解析： 導入模組: 這段程式碼首先導入了必要的包。包括Gin Web框架、ElasticView項目的包（這可能是此控制器所屬的主應用程序）以及ElasticSearch SDK的包。 結構體: EsIndexController: 這個結構體作為與ElasticSearch索引操作的控制器。它內嵌了一個BaseController(ref)，這包含了一些常用的Web請求和響應處理方法。此結構體還包含了多個服務實例，用於幫助進行ElasticSearch操作。 構造函數: NewEsIndexController(): 這個函數作為EsIndexController的構造函數，用於設定必要的依賴，如日誌和各種服務。 端點: 接著是一系列與ElasticSearch互動的方法，例如建立索引、刪除索引、獲取設置等。 總的來說，這段程式碼提供了一個清晰的控制器，專門用於管理ElasticSearch索引的各種操作。 pkg/api/es_link_controller.go 這段程式碼是一個名為 EsLinkController 的控制器，該控制器似乎用於管理ElasticSearch連接。基於Gin Web框架，它提供了對ElasticSearch連接的增、刪、改、查操作。以下是詳細的功能描述： 結構體和依賴注入: EsLinkController: 這是主要的控制器結構體，其中嵌入了其他的服務和工具，如日誌（log）、ElasticSearch客戶端服務（esClientService）、數據庫連接（sqlx）、ElasticSearch緩存（esCache）和EsLink服務（esLinkService）等。 NewEsLinkController(): 構造函數，用於初始化EsLinkController結構體。 功能端點: ListAction(): 獲取ElasticSearch連接列表。 OptAction(): 似乎是獲取某些操作選項的方法。它將每一個連接的ID和描述信息（Remark）添加到optList中。 InsertAction(): 新增ElasticSearch連接。它首先從請求中綁定一個EsLinkModel，然後進行一系列的操作以保存這個連接到數據庫中。包括對密碼加密和刷新EsLink列表的操作。 UpdateAction(): 更新一個已存在的ElasticSearch連接的信息。操作過程與插入相似，但是它會在數據庫中更新一條已存在的紀錄。 DeleteAction(): 刪除一個ElasticSearch連接。它會根據請求中的ID來刪除數據庫中對應的紀錄，並更新緩存。 輔助功能: 在各功能端點中，都有對錯誤的處理，如果出現錯誤，會使用this.Error()方法返回錯誤信息。成功的操作會使用this.Success()方法返回成功信息。 在新增和更新連接時，都有對連接密碼的加密操作。 對ElasticSearch連接的增、刪、改操作後，都會進行刷新EsLink列表的操作。 總之，EsLinkController主要用於管理ElasticSearch連接，並提供了一系列CRUD操作的方法。 pkg/api/es_map_controller.go 這段程式碼是一個名為 EsMappingController 的控制器，該控制器似乎用於管理ElasticSearch的映射（Mapping）。基於Gin Web框架，它提供了對ElasticSearch映射的查詢和修改操作。以下是詳細的功能描述： 結構體和依賴注入: EsMappingController: 這是主要的控制器結構體，其中嵌入了其他的服務和工具，如日誌（log）、ElasticSearch客戶端服務（esClientService）和索引服務（indexService）。 NewEsMappingController(): 構造函數，用於初始化EsMappingController結構體。 功能端點: ListAction(): 查詢ElasticSearch的映射列表。 首先從請求中綁定EsMapGetProperties。 根據EsConnectID獲取ElasticSearch連接。 通過indexService的EsMappingList方法獲取映射列表。 返回映射列表和ElasticSearch的版本信息。 UpdateMappingAction(): 更新ElasticSearch的映射。 首先從請求中綁定UpdateMapping。 根據EsConnect獲取ElasticSearch連接。 通過indexService的UpdateMapping方法更新映射。 返回更新的結果。 輔助功能: 在各功能端點中，都有對錯誤的處理，如果出現錯誤，會使用this.Error()方法返回錯誤信息。成功的操作會使用this.Success()方法返回成功信息。 總之，EsMappingController主要用於管理ElasticSearch的映射，提供了查詢和更新映射的方法。 pkg/api/es_task_controller.go 這段程式碼描述了一個名為 EsTaskController 的控制器，它與ElasticSearch中的任務（Tasks）相關。這個控制器提供了查看ElasticSearch任務列表以及取消指定任務的功能。以下是對其功能的詳細描述： 結構體和依賴注入: EsTaskController: 這是主控制器結構體，其中嵌入了其他的服務和工具，如日誌（log）、ElasticSearch客戶端服務（esClientService）和任務服務（taskService）。 NewEsTaskController(): 構造函數，用於初始化EsTaskController結構體。 功能端點: ListAction(): 查詢ElasticSearch的任務列表。 從請求中綁定TaskList。 使用EsConnect從esClientService中獲取ElasticSearch連接。 使用這個連接創建一個新的ElasticSearch服務。 通過taskService的TaskList方法獲取任務列表。 返回查詢到的任務列表。 CancelAction(): 取消ElasticSearch中的指定任務。 從請求中綁定CancelTask。 使用EsConnect從esClientService中獲取ElasticSearch連接。 使用這個連接創建一個新的ElasticSearch服務。 調用taskService的Cancel方法來取消指定的任務。 如果操作成功，則返回成功響應。 輔助功能: 在每個功能端點中，對於出現的錯誤都進行了處理。如果遇到錯誤，它會使用this.Error()方法返回錯誤信息。對於成功的操作，會使用this.Success()方法返回成功消息。 總結：EsTaskController是一個專用於管理ElasticSearch任務的控制器，提供了查看任務列表和取消任務的功能。 other api pkg/api/base_controller.go 這段 GO 程式碼定義了一個名為 BaseController 的 API 控制器，它提供了一些基本的功能，特別是與 HTTP 請求和響應相關的功能。以下是該程式碼的詳細說明： 引入的套件：程式碼引入了多個外部和內部套件，包括 HTTP 請求處理、HTTP 響應處理、Gin Web 框架等。 BaseController 結構體： BaseController 是一個控制器結構體，它包含了兩個指針字段：Request 和 Response。這兩個字段分別來自 request 和 response 套件，用於處理 HTTP 請求和響應。 NewBaseController 函數是 BaseController 的構造函數，它接受一個請求和一個響應對象，並返回一個新的 BaseController 實例。 getPostBody 方法用於從 Gin 的上下文中獲取 HTTP POST 請求的主體。它首先使用 ctx.GetRawData 方法獲取原始的請求主體，然後將其設置回上下文的請求主體，以便後續的處理器可以再次讀取它。 總之，這段程式碼定義了一個基本的 API 控制器，它提供了一些與 HTTP 請求和響應相關的基本功能。 pkg/api/dsl_history_controller.go 這段 GO 程式碼定義了一個名為 DslHistoryController 的 API 控制器，它提供了與 DSL 語法查詢歷史記錄相關的功能。以下是該程式碼的詳細說明： 引入的套件：程式碼引入了多個外部和內部套件，包括日誌記錄、SQL 存儲、JWT 處理、模型定義、HTTP 響應處理、工具函數和 Gin Web 框架。 DslHistoryController 結構體： DslHistoryController 是一個控制器結構體，它包含了 JWT 處理、SQL 存儲、日誌和基本控制器的指針字段。 NewDslHistoryController 函數是 DslHistoryController 的構造函數，它接受 JWT 處理、SQL 存儲、日誌和基本控制器作為參數，並返回一個新的 DslHistoryController 實例。 ListAction 方法： 這個方法用於查詢 DSL 歷史記錄列表。 首先，它解析 JWT 令牌以獲取用戶 ID。 然後，它綁定請求參數到 GmDslHistoryModel 模型。 使用模型的 List 和 Count 方法來獲取歷史記錄的列表和總數。 最後，它返回查詢結果。 CleanAction 方法： 這個方法用於清空 DSL 查詢記錄。 首先，它解析 JWT 令牌以獲取用戶 ID。 然後，它使用 GmDslHistoryModel 模型的 Clean 方法來清空用戶的 DSL 查詢記錄。 最後，它返回操作成功的響應。 總之，這段程式碼定義了一個 API 控制器，它提供了查詢和清空 DSL 語法查詢歷史記錄的功能。如果您有其他問題或需要進一步的資訊，請告訴我。 pkg/api/gm_operater_log.go 這段程式碼描述了一個名為 GmOperaterController 的控制器，專門處理與後台操作日誌（後台管理員操作紀錄）相關的功能。以下是對其功能和組件的詳細描述： 結構體和依賴注入: GmOperaterController: 這是主控制器結構體。它包含了其他的服務和工具，如日誌（log）、設定（cfg）、SQL存儲（sqlx）和後台操作日誌服務（gmOperaterLogService）。 NewGmOperaterController(): 這是一個構造函數，用於初始化 GmOperaterController 結構體並注入依賴。 功能端點: ListAction(): 此方法用於查看後台操作日誌。 首先，它嘗試從請求中綁定GmOperaterLogList數據結構。 使用注入的gmOperaterLogService來獲取操作日誌列表和相應的日誌計數。 如果操作成功，則返回成功響應，其中包括日誌列表和計數。否則，返回相應的錯誤。 輔助功能: 在ListAction功能中，對於出現的錯誤都進行了處理。如果遇到錯誤，它會使用this.Error()方法返回錯誤信息。對於成功的操作，則使用this.Success()方法返回成功消息。 總之，GmOperaterController是一個專門用於查看後台操作日誌的控制器。它依賴於多種服務和工具，如日誌、配置、SQL存儲和後台操作日誌服務，以提供必要的功能。 pkg/api/guid_controller.go 這段程式碼定義了一個名為 GuidController 的控制器，該控制器主要管理用戶的新手引導功能。以下是其主要組件和功能的分解： 導入套件： 這部分主要導入了所需的套件，包括日誌、JWT（JSON Web Tokens）處理、數據庫存儲和其他輔助工具。 GuidController結構： BaseController：可能是一個基礎控制器，提供了一些基本的HTTP回應方法。 log：應用的日誌組件。 jwtSvr：用於處理JWT相關操作。 esClientService：與Elasticsearch相關的服務。 sqlx：用於數據庫操作的實例。 方法： Finish：完成新手引導。該方法首先解析JWT獲取用戶資訊，然後將完成的新手引導紀錄存儲到數據庫。 IsFinish：檢查用戶是否完成新手引導。該方法會查詢數據庫以確定用戶是否已完成特定的新手引導。 數據庫操作： 這部分程式碼使用了sqlstore.SqlBuilder來構建SQL查詢。它支持基於條件的查詢建立和其他數據庫相關操作。例如，在IsFinish方法中，它構建了一個查詢來計算符合特定條件的紀錄數。 整體來說，GuidController是一個專門用於管理新手引導功能的控制器，讓開發人員能夠輕鬆地追踪和管理用戶是否已完成新手引導。 pkg/api/manager_role_controller.go 這段代碼定義了一個名為 ManagerRoleController 的控制器，該控制器主要負責GM(遊戲管理)角色的管理。以下是其主要組件和功能的分解： 導入套件：這部分導入了所需的套件，主要包括配置、日誌、數據模型、JWT（JSON Web Tokens）處理、數據庫存儲、RBAC（基於角色的訪問控制）等。 ManagerRoleController結構：這是GM角色的主控制器，具有一些主要屬性如日誌、配置、數據庫實例、JWT處理等。 方法： RolesAction：獲取所有的GM角色。 RolesAddAction：新增一個GM角色。它還將新角色的API權限添加到RBAC系統。 RolesUpdateAction：更新GM角色的資訊。首先，它會檢查當前使用者是否有權限進行此操作。接著，它會更新數據庫中的角色資訊，並更新該角色的API權限。 RolesDelAction：刪除GM角色。在刪除之前，它會檢查當前使用者是否有權限進行此操作。 RoleOptionAction：獲取可用於下拉列表的GM角色資訊。 注意事項： 某些操作會檢查當前使用者是否具有特定權限。例如，只有角色ID為1的使用者才能修改或刪除角色ID為1的角色。 在添加、更新或刪除角色時，都涉及到RBAC的權限更新。 總體來說，ManagerRoleController 提供了一個用於管理GM角色的完整功能集，包括查詢、新增、更新、刪除等操作。這對於那些需要精細管理用戶權限的系統尤為重要。 pkg/api/manager_user_controller.go 這段代碼提供了ElasticView系統中的用戶管理API。讓我們詳細分析一下： 導入項目: 程式導入了多個輔助功能的包，包括配置、日誌記錄、JSON處理、時間處理、SQL儲存、JWT認證等。 ManagerUserController結構: 這是主要的控制器結構，用於管理用戶。它具有多個屬性，如日誌、配置、數據庫連接等。 NewManagerUserController: 此函數初始化一個新的ManagerUserController並返回它。 用戶相關的方法: Login：允許用戶使用用戶名和密碼登錄，並返回一個令牌。 ModifyPwd：允許用戶修改自己的密碼。 UserInfo：返回用戶的詳細信息。 LogoutAction：使用戶登出。 UserListAction：返回BI用戶列表。 DeleteUserAction：允許刪除BI用戶。 GetUserByIdAction：根據ID獲取特定用戶的信息。 UserUpdateAction：允許修改BI用戶的信息。 UserAddAction：允許添加新的BI用戶。 UrlConfig：返回系統的路由配置。 每個方法都使用Gin Web框架來接收請求和發送響應。 該控制器還有一些輔助方法，如Error和Success，用於簡化發送錯誤或成功響應的過程。 整體來說，這段代碼提供了一個完整的用戶管理系統的API接口，使開發人員能夠輕鬆地添加、修改、刪除和獲取用戶信息。 dto 數據傳輸對象（Data Transfer Object，縮寫為DTO） pkg/dto/common.go 這是一個定義數據傳輸對象（DTO）的Go程式包。DTO常用於API間或系統的不同部分間的數據交換。讓我詳細解釋每個結構： Json: 這是一個簡單的結構，它是一個映射，鍵是字符串，值是任意類型。這樣的結構在Go中常用於動態地處理JSON數據。 Sort: 這個結構用於描述如何對某些數據進行排序。 Field 是你想要排序的字段名。 Ascending 是一個布爾值，如果為真，則按照升序排序；如果為假，則按照降序排序。 Page: 這是一個常用於分頁的結構。 PageNum 表示當前的頁碼。 PageSize 表示每頁的數據量。 EsConnectID: 這個結構用於存儲Elasticsearch的連接ID。 EsConnectID 是Elasticsearch的連接ID，它使用json:"es_connect"標籤來指示在JSON中的欄位名稱為es_connect。 這個dto包提供的結構簡單而通用，能夠支撐許多基本的API功能，如分頁、排序和數據傳輸。 pkg/dto/datax.go 這是一個dto包，主要用於定義與Datax相關的請求結構和一些方法。讓我解釋一下各個結構和方法： DataxInfoListReq: 這是獲取Datax信息列表的請求結構。 包括了備註（Remark）、類型（Typ）、頁碼（Page）和每頁數量（Limit）。 DataxInfoInsertReq: 這是插入Datax信息的請求結構。 包括了IP地址、端口、數據庫名稱、用戶名、密碼、備註和類型。 同時包含了一個Validate方法，用於驗證IP地址是否已填寫。 DataxInfoDelReq: 這是刪除Datax信息的請求結構，只需要提供ID。 DataxInfoTestLinkReq: 這是測試Datax連接的請求結構。 結構與插入請求相似。 TransferReq: 這是一個複雜的請求結構，涉及到數據傳輸。 包括自增ID、Elasticsearch連接、選擇類型、備註、選擇表格、類型名稱、列信息、索引名稱等。 它還有一個ParseSelectType方法，用於解析選擇的類型。 SelectType: 這是一個選擇類型的結構，包括ID、備註和類型。 TransferLogReq: 這是查詢傳輸日誌的請求結構，只需要提供Elasticsearch連接。 從上面的結構可以看出，這個dto包主要用於處理與Datax相關的數據交換和操作。Datax是一個用於大數據之間的ETL工具，可以幫助你高效地在不同的數據源之間傳輸數據。這個dto包可能是為了與一個後端服務交互，該後端服務管理Datax的配置和運行。 pkg/dto/es_alias.go 這是dto包中定義的一個小結構EsAliasInfo，它描述了Elasticsearch（縮寫為Es）的別名信息。以下是對這個結構的詳細解釋，程式碼詳見github： EsConnect:整型字段，代表Elasticsearch的連接ID。 Settings:Json類型字段，代表Elasticsearch索引的設置信息。這裡的Json可能是一個定義為map[string]interface{}的別名。 IndexName:字符串字段，代表與別名相關聯的Elasticsearch索引的名稱。 AliasName:字符串字段，代表當前的Elasticsearch索引別名。 NewAliasNameList:字符串切片，代表新的Elasticsearch索引別名列表。這可能用於操作時批量添加多個別名。 NewIndexList:字符串切片，代表新的Elasticsearch索引列表。可能用於一次性指定多個索引。 Types:整型字段，其具體含義未在此給出，但可能與索引的類型或操作的類型相關。 總之，EsAliasInfo結構描述了Elasticsearch索引的別名信息，並提供了對索引設置、索引名稱、別名以及新的別名和索引列表的字段。在Elasticsearch中，別名是一種指向一個或多個索引的參考，使得用戶可以使用單一的別名進行搜索，而不必指定具體的索引名稱。這提供了一種索引滾動和版本控制的機制，使得用戶可以輕鬆地升級和管理索引。 pkg/dto/es_cat.go 這是在dto包中定義的一個小結構EsCat，它描述了Elasticsearch（縮寫為Es）的”cat”操作相關的參數。Elasticsearch的cat API提供了各種關於叢集、索引和其他項目的快速概覽。以下是對該結構的詳細解釋，程式碼詳見github： EsConnect:整型字段，代表Elasticsearch的連接ID。這可能是指定要查詢的Elasticsearch實例或叢集。 Cat:字符串字段，代表要執行的cat操作的具體類型。例如，”indices”表示查看所有索引的信息，”nodes”表示查看叢集中的所有節點的信息等。 IndexBytesFormat:字符串字段，可能是指定索引大小的格式化方式。例如，可以選擇”kb”、”mb”、”gb”等格式來表示索引的大小。這提供了一種方法來控制返回的數據的格式。 總的來說，EsCat結構提供了一個方式來指定要查詢的Elasticsearch連接，以及如何使用cat API來獲取相關的信息和格式化返回的數據。 pkg/dto/es_crud.go 這是在dto包中定義的三個結構CrudFilter、AnalysisFilter和SortStruct。它們似乎是用於描述與Elasticsearch或其他數據存儲交互的某些CRUD（創建、讀取、更新、刪除）操作的過濾器和排序參數。以下是這些結構的詳細解釋： CrudFilter: Relation: 表示過濾條件之間的關係的結構。例如，它可以是”AND”或”OR”，表示所有過濾條件必須同時滿足或只需要滿足其中之一。 SortList: 一個SortStruct結構的切片，用於指定排序的列和排序規則。 EsConnect: 整型，表示要查詢的Elasticsearch連接ID。 IndexName: 要查詢的Elasticsearch索引的名稱。 Page 和 Limit: 分別用於指定分頁查詢的頁碼和每頁的記錄數量。 AnalysisFilter: 表示複雜的過濾條件結構。它可以包含嵌套的過濾條件，每個過濾條件都有一個過濾類型（例如”term”、”range”等），以及具體的列名、比較運算符和值。它還可以指定子條件之間的關係，例如”AND”或”OR”。 SortStruct: Col: 表示要排序的列名。 SortRule: 指定排序的規則，例如”asc”（升序）或”desc”（降序）。 這些結構的設計使得可以建立複雜的查詢過濾條件和排序規則，特別是AnalysisFilter結構，它允許嵌套的過濾條件和多層的關係定義，使得可以表示非常具體和詳細的查詢邏輯。 pkg/dto/es_doc.go 這兩個結構類型似乎是用於與Elasticsearch交互，特別是在針對特定文檔ID進行更新和刪除操作時。讓我詳細解釋這些結構： EsDocUpdateByID: 這個結構用於在Elasticsearch中按文檔ID更新一個文檔。 EsConnect: 一個整型，表示要與之交互的Elasticsearch連接ID。 ID: 要更新的文檔的ID。 JSON: 一個Json類型，這可能是一個映射，表示要在文檔中更新的字段和它們的新值。 Type: 文檔的類型名稱。在舊版本的Elasticsearch中，這是必要的，但在新版本中，類型的概念已被棄用。 Index: 要更新文檔的索引名稱。 EsDocDeleteRowByID: 這個結構用於在Elasticsearch中按文檔ID刪除一個文檔。 EsConnect: 一個整型，表示要與之交互的Elasticsearch連接ID。 ID: 要刪除的文檔的ID。 IndexName: 要刪除文檔的索引名稱。 Type: 文檔的類型名稱。 從這些結構可以看出，它們都是針對Elasticsearch中特定ID的文檔進行操作的，而EsDocUpdateByID結構還允許提供一個JSON體來表示更新。這些結構提供了一種組織和表示與Elasticsearch交互所需的數據的方法，使得更新和刪除操作更加結構化和明確。 其他 其他DTO (資料傳輸物件) 結構，主要似乎與Elasticsearch以及一些內部操作有關，詳見github。簡要解釋每個套件及其結構如下。 dto.EsIndexInfo: 代表一個Elasticsearch索引的相關資訊。 dto.EsMapGetProperties 和 UpdateMapping: 這些結構主要是用來取得或更新Elasticsearch索引的mapping。 dto.EsMappingInfo: 提供Elasticsearch索引mapping的詳細資訊。 dto.EsOptimize: 用於優化Elasticsearch索引的結構。 dto.EsReIndexInfo 和 dto.EsRest: 這些結構是用於重新索引和發送一般的REST請求到Elasticsearch。 dto.TaskList、CancelTask 和 EsTaskInfo: 關於Elasticsearch的背景任務管理。 dto.GmRoleModel 和相關結構: 似乎是一個內部用戶和角色管理系統的結構。 dto.GmOperaterLogList: 表示操作日誌的相關資訊。 dto.EsSnapshotInfo 和其他snapshot相關結構: 這些結構與Elasticsearch的snapshot操作有關，如建立、刪除、恢復等。 總之，這些DTO結構涵蓋了Elasticsearch的許多核心操作，並與一些內部的用戶和角色管理功能結合。這些結構將有助於建立一個全面的Elasticsearch管理工具或平台。 Infrastructure pkg/infrastructure/access_control/rbac.go 這是一個名為access_control的套件，主要用於RBAC (Role-Based Access Control) 角色基於的訪問控制。該套件使用了casbin(ref)，這是一個強大的、高效的開源訪問控制庫。 以下是代碼的詳細解釋： 變量定義: text：它是一個Casbin的訪問控制模型定義，包括請求、政策、效應和匹配器。 Rbac結構: 包括配置(cfg)、日誌(log)和casbin的執行器(enforcer)。 NewRbac 函數: 初始化Rbac的實例。它首先從配置中獲取數據庫類型和數據源，然後使用這些資訊和casbin模型來創建casbin的執行器。 如果在這個過程中出現任何錯誤，它會返回錯誤。 LoadPolicy 函數: 從持久存儲加載政策到enforcer。 Enforce 函數: 決定某個請求是否應該被允許。它接受一個參數列表（通常是subject, object, action），然後返回該請求是否被允許以及可能的錯誤。 AddPolicy 函數: 向持久存儲添加一個新的政策。 RemoveFilteredPolicy 函數: 從持久存儲中移除匹配給定過濾器的政策。 SavePolicy 函數: 將當前的政策保存到持久存儲。 整體而言，這個套件提供了一個基於casbin的RBAC訪問控制系統的包裝器，使得在應用中實現訪問控制更為簡單。 pkg/infrastructure/config/config.go 這段代碼是名為config的包，它用於管理應用程式的配置。代碼的功能與構成如下： 引入包: 引入了標準庫包（如log, os, path/filepath等）以及一些外部庫包，用於文件操作、配置管理等。 常數定義: MysqlDbTyp 和 SqliteDbTyp：分別代表mysql和sqlite數據庫的類型。 CommandLineArgs結構體: 此結構定義了從命令行傳入的參數，如配置文件路徑、性能分析選項等。 Config結構體: 代表應用的主要配置。 包含日誌配置、端口、數據庫類型和參數、應用秘鑰等。 GetDbType函數: 此函數返回數據庫類型字符串。基於DbType字段判定。 CreateDbSource函數: 根據配置創建數據庫連接字符串。 對於sqlite，確保數據目錄存在，並返回完整的數據庫路徑。 對於mysql，返回標準的連接字符串。 InitConfig函數: 負責初始化並返回Config對象。 使用viper庫讀取和解析配置文件。 配置文件的位置基於命令行參數。 最後，日誌消息顯示配置文件已成功加載。 這段代碼主要關注於從配置文件中讀取配置以及提供生成數據庫連接字符串的功能。 pkg/infrastructure/es_sdk/pkg/factory 這段代碼似乎是一個工廠模式的實現，用於根據指定的Elasticsearch版本創建相應版本的ES客戶端。讓我解釋一下這段代碼的功能： import 語句導入了所需的包和模塊。 定義了一個錯誤 VerError，該錯誤用於表示當前只支持版本6, 7和8的Elasticsearch。 EsServiceMap 是一個映射，其鍵是Elasticsearch的版本號（如6, 7, 8），值是相應版本的Elasticsearch客戶端建構函數。 NewEsService 是一個工廠方法。它根據提供的配置 cfg 中的版本號來返回對應的Elasticsearch客戶端或者返回一個錯誤（如果版本不被支持）。 主要的邏輯是使用了一個映射 (EsServiceMap) 來避免多重的 if-else 或 switch 語句，從而使代碼更簡潔、可維護。 pkg/infrastructure/es_sdk/pkg/proto 這些程式碼片段(共有12個檔案、總計700多行)似乎是一組與Elasticsearch客戶端版本6、7和8的整合和配置相關的Go結構體和功能。 以下是我從你提供的程式碼中觀察到的內容： aliases.go：這個檔案包含了一些與Elasticsearch別名操作相關的結構體。 cat_request.go：這裡定義了多個結構體，這些結構體代表了向Elasticsearch發送的”cat” API請求的各種參數。 cat_response.go：定義了與”cat” API響應相對應的結構體，用於接收和解析Elasticsearch的回應。 config.go：這是一個相對複雜的文件，包含了與Elasticsearch連接的配置相關的結構體和功能。它支持三個版本的Elasticsearch客戶端配置的轉換：版本6、7和8。這些功能可以根據給定的配置生成特定版本的Elasticsearch客戶端配置。還提供了一個方法來生成HTTP傳輸，考慮到証書和安全性。 create.go：這裡定義了一個結構體，用於表示向Elasticsearch發送的文檔創建請求的參數。 你提供了更多與Elasticsearch操作相關的Go程式碼。以下是我根據你提供的程式碼的摘要： delete.go：定義了一個結構體DeleteRequest，它代表一個從Elasticsearch中刪除文檔的請求。其中包含了一些可能的請求參數，如Refresh、Routing和Timeout等。 indices.go：這個文件中定義了一些結構體，這些結構體代表了與Elasticsearch索引操作相關的請求，如： IndicesPutSettingsRequest：修改索引設置的請求。 IndicesCreateRequest：創建新索引的請求。 IndicesDeleteRequest：刪除索引的請求。 ReindexRequest：對索引進行重新索引的請求。 IndicesGetSettingsRequest：獲取索引設置的請求。 IndicesPutMappingRequest：修改或新增索引映射的請求。 perform.go：定義了一個結構體PerformRequestOptions，它代表執行一個HTTP請求到Elasticsearch的選項。 response.go：這個文件包含了一個Response結構體和它的相關方法。該結構體封裝了從Elasticsearch接收的響應。其中的NewResponse方法將io.ReadCloser轉換為該Response結構體。StatusErr方法則檢查響應中的狀態是否表示錯誤。 search.go：定義了一個結構體SearchRequest，它代表一個向Elasticsearch提交的搜索請求。該結構體包含了眾多的請求參數，可用於細化搜索的行為。 update.go：定義了一個結構體UpdateRequest，用於表示更新Elasticsearch中文檔的請求。 你這些程式碼基本上是定義了與Elasticsearch的各種交互請求的結構體。這些結構體非常有用，因為它們允許開發者以統一且結構化的方式進行請求，簡化與Elasticsearch之間的交互，同時也可以更容易地添加或修改請求的參數並提供了一個清晰的方法來設置和管理Elasticsearch客戶端的配置。。此外，由於Elasticsearch API通常具有很多選項，這些結構體也幫助確保API的參數被正確地設置和使用。 pkg/infrastructure/es_sdk/pkg/interface.go 這段程式碼定義了一個名為EsI的interface，用於表示Elasticsearch的操作集合。從這些方法名稱和參數可以看出，它涵蓋了Elasticsearch的主要功能，例如索引管理、數據操作和快照管理。以下是一些代表性方法的簡單說明： Version: 取得Elasticsearch版本。 CatNodes: 查詢Elasticsearch集群中的節點。 ClusterStats: 獲取Elasticsearch集群的統計信息。 PerformRequest: 執行一個HTTP請求。 Ping: 檢查Elasticsearch是否可用。 Refresh: 刷新一個或多個索引。 Open/Close: 打開或關閉索引。 IndicesForcemerge: 強制合併索引。 DeleteByQuery: 根據查詢條件刪除數據。 SnapshotCreate/SnapshotDelete/RestoreSnapshot/SnapshotStatus: 快照相關操作。 GetIndices: 獲取索引列表。 Search: 執行搜索查詢。 CreateIndex/DeleteIndex/Reindex: 索引的創建、刪除和重新索引操作。 PutMapping/GetMapping: 索引映射的設定和獲取。 GetAliases/AddAliases/RemoveAliases/MoveToAnotherIndexAliases: 別名操作。 TaskList/TasksCancel: 任務管理。 每個方法通常都接收一個context.Context作為第一個參數，用於控制請求的生命週期。而返回值通常都是一個proto.Response（表示Elasticsearch的HTTP響應）和一個error（表示可能的錯誤）。 這個接口提供了一個抽象層，使得不同版本或實現的Elasticsearch客戶端可以通過同一個接口進行操作。這有助於確保代碼的清晰性和可維護性。 pkg/infrastructure/logger 這段代碼是初始化日誌引擎的模塊，主要使用了zap日誌庫和file-rotatelogs來進行日誌的輪替。 以下是該模塊的一些主要特點和功能： 類型定義： type AppLogger = zap.Logger: 定義了一個名為AppLogger的日誌類型，它實際上就是zap.Logger的一個別名。 getWriter函數： 這個內部函數用於獲取日誌寫入器，它使用file-rotatelogs來創建一個可以自動輪替的日誌文件。 rotatelogs.New: 定義了輪替日誌的命名和特性。例如，日誌每24小時輪替一次，最多保留指定的天數。 zapConfig 和 encoder: 定義了日誌的格式和編碼方式。例如，將時間格式化為自定義的util.TimeFormat。 級別過濾器: 這些zap.LevelEnablerFunc用於定義各個日誌級別的過濾條件。 日誌文件的設定和路徑: 通過配置(cfg)來設定日誌保存的路徑和保存的天數。 創建寫入器: 使用上面定義的getWriter函數創建不同級別日誌的寫入器。 初始化核心日誌組件: 使用zapcore.NewTee組合多個日誌核心，這樣可以根據不同的級別將日誌寫入到不同的文件。 如果啟用了調試模式(cfg.DeBug)，那麼所有級別的日誌也會輸出到控制臺。 返回結果: 最後，使用組合的核心組件創建zap.Logger並返回。 總的來說，這段代碼實現了一個日誌初始化功能，能夠將不同級別的日誌輸出到不同的文件中，並支持日誌文件的自動輪替。 pkg/infrastructure/web_engine/web_engine.go web_engine.go代碼的概述，主要著重於重要函數的說明： 初始化: 創建了一個全局的 mockMap 實例以追踪路由。還定義了一個 authenticationPaths 切片來存儲需要身份驗證的路徑。 RouterConfigGroup 和 RouterConfig: 這些是描述路由組和單個路由的資料結構。 WebEngine: 這是對 Gin Engine 的封裝。它提供的功能如下: NewWebEngine(): 創建一個新的WebEngine。 Run(): 運行伺服器。 Group(remark string, relativePath string, handlers ...gin.HandlerFunc): 用於創建路由組。 GetAuthenticationPaths(): 獲取需要身份驗證的路徑。 GetRouterConfigGroups(): 獲取路由配置組。 MyRouterGroup: 這是對 Gin RouterGroup 的封裝，提供的功能如下: Use(middleware ...gin.HandlerFunc): 應用中間件。 Group(remark, relativePath string, handlers ...gin.HandlerFunc): 創建子組。 BasePath(): 獲取基礎路徑。 Handle(), GET(), POST(), DELETE(), 等: 這些方法用於處理不同的HTTP方法，並自定義參數如 needAuth 和 remark。 StaticFile(relativePath, filepath string): 用於伺服靜態文件。 Static(relativePath, root string): 用於伺服靜態目錄。 StaticFS(relativePath string, fs http.FileSystem): 伺服從文件系統提供的靜態目錄。 saveMockMap(remark, relativePath string, needAuth bool): 將路由保存到 mockMap。 MockMap: 這是一個自定義的資料結構，主要用於存儲路由配置: Store(data string, val RouterConfig): 儲存新的路由配置。 Load(key string): 加載給定鍵的路由配置。 Count(): 返回存儲的路由配置的數量。 Keys(): 返回所有的鍵。 Values(): 返回所有的值。 Range(fn func(key string, val []RouterConfig)): 遍歷所有儲存的路由配置。 這個代碼的主要目的是提供一個更高級的封裝，以管理和跟踪路由配置，同時提供身份驗證和路由備註功能。 jwt_svr pkg/jwt_svr/exception_msg.go package jwt_svr // 内置异常 const ( ERROR_AUTH_TOKEN = 40006 ) var TOKEN_ERROR = map[int]string{ ERROR_AUTH_TOKEN: "Token生成失败", } pkg/jwt_svr/jwt.go 這是一個基於 Go 語言的 JSON Web Token (JWT) 處理層的代碼片段。以下是對主要函數和結構的描述，以及它們的參數和輸出。 結構說明： Jwt: cfg: 應用的配置對象。 log: 應用的日誌對象。 jwtSecret: 用於簽名和驗證 JWT 的秘密。 Claims: JWT 的內部聲明結構，繼承了 jwt.RegisteredClaims。 包括用戶ID、用戶名、真實名稱和角色ID。 函數說明： NewJwt: 用途: 創建新的 Jwt 對象。 參數: cfg: 應用的配置對象。 log: 應用的日誌對象。 輸出: 新的 Jwt 對象。 CreateToken: 用途: 根據給定的用戶模型生成 JWT 令牌。 參數: gmUser: 一個表示用戶的模型。 輸出: 生成的 JWT 令牌。 錯誤信息。 ParseToken: 用途: 解析和驗證給定的 JWT 令牌。 參數: token: 要解析的 JWT 令牌。 輸出: 如果成功解析和驗證，則返回令牌中的聲明。 錯誤信息。 其他說明： 代碼中使用了 github.com/golang-jwt/jwt/v5 庫來生成和解析 JWT。 jwt.SigningMethodHS256 是使用 HMAC SHA-256 算法的簽名方法。 令牌有一個有效期限，設為 7 天。 當令牌出現錯誤時，使用自定義的錯誤類型進行錯誤處理。 這個 JWT 層的主要目的是為應用提供 JWT 的生成和解析功能，並在其中嵌入和檢索用戶信息。 model 結構設定 當然可以！ 這些 Go 程式碼段展示了幾個不同的資料庫模型。每個模型都用於代表一個特定的資料庫表格，並定義了該表中的欄位以及它們在 Go 中的表示方式。以下是每個模型的簡要描述： GmGuidModel： 描述：代表一個新手引導。 欄位包括：ID, Uid, GuidName, Created 表名：gm_guid DataxLinkInfoModel： 描述：Datax 連結資訊。 欄位包括：Id, Ip, Port, DbName, Username, Pwd, Remark, Typ, Updated, Created DataxListModel： 描述：Datax 列表資訊。 欄位包括：Id, FormData, Remark, Table_name, Index_name, Error_msg, Status, Dbcount, Escount, Updated, Created, EsConnect, CrontabSpec EsLinkModel： 描述：ES 連接資訊表。 欄位包括：ID, Ip, User, Pwd, Created, Updated, Remark, Version, RootPEM, CertPEM, KeyPEM 注：這個模型還包含了一些安全性相關的欄位，如 RootPEM, CertPEM, KeyPEM，可能是用於 SSL/TLS 連接。 所有這些模型都提供了一個 TableName 方法，用於返回相應的資料庫表名。此外，這些模型可以用於 CRUD 操作，如查詢、插入、更新和刪除。 pkg/model/crud.go 這是一個基於 Go 語言的資料庫操作封裝層代碼片段。以下是對主要接口、函數和結構的描述。 接口說明： Curd：一個資料庫基礎 CRUD 操作的接口，它定義了以下方法： ProcessSqlWhere(): 處理 SQL 的 WHERE 條件。 TableName(): 獲取數據表名。 ProcessSqlInsert(): 處理 SQL 的 INSERT 語句。 ProcessSqlUpdate(): 處理 SQL 的 UPDATE 語句。 GetId(): 獲取主鍵 ID。 函數說明： SearchList: 用途: 查詢分頁的資料列表。 參數: curd: 實現了 Curd 接口的物件。 page, limit: 分頁信息。 columns: 要查詢的列。 list: 返回的資料列表。 sqlx: SQL 存儲實例。 log: 日誌實例。 輸出: 錯誤信息。 SearchAll: 用途: 查詢所有資料。 參數: 同上，但沒有分頁信息。 輸出: 錯誤信息。 Count: 用途: 計算資料的總數。 輸出: 資料的總數和錯誤信息。 Delete: 用途: 刪除指定 ID 的資料。 輸出: 錯誤信息。 Insert: 用途: 插入新的資料。 輸出: 最後插入的 ID 和錯誤信息。 Update: 用途: 更新指定 ID 的資料。 輸出: 錯誤信息。 其他說明： 代碼中使用了 github.com/1340691923/ElasticView/pkg/infrastructure/sqlstore 庫來實現 SQL 操作的建造器模式，可以更加靈活地組裝 SQL 語句。 這個資料庫操作封裝層的目的是提供一套通用的 CRUD 操作，不需要每次針對特定的數據表重寫相同的 CRUD 方法，增加代碼的重用性和維護性。 pkg/model/dsl_history.go 這段 Go 代碼展開了一個稱為 GmDslHistoryModel 的數據庫實體模型，並包括對此模型的基本 CRUD 操作。以下是該代碼的詳細解釋： 數據模型： GmDslHistoryModel 表示 DSL 歷史記錄： ID：數據的主鍵。 Uid：用戶ID。 Method：HTTP 方法。 Path：請求的路徑。 Body：請求的主體。 Created：創建時間。 FilterDate：過濾日期，用於查詢範圍內的數據。 IndexName：索引名稱。 Page, Limit：用於分頁的變量。 Sqlx：數據庫連接。 log：日誌工具。 方法說明： TableName()： 用途：返回數據表的名稱。 輸出：數據表名 “gm_dsl_history”。 Insert()： 用途：在數據庫中插入一條新的記錄。 輸出：錯誤信息。 Clean()： 用途：根據 Uid 刪除記錄。 輸出：錯誤信息。 List()： 用途：獲取指定 Uid 的記錄列表，並可以通過 IndexName 和 FilterDate 進行額外的過濾。 輸出：記錄列表和錯誤信息。 Count()： 用途：計算指定 Uid 的記錄數，並可以通過 IndexName 和 FilterDate 進行額外的過濾。 輸出：記錄數和錯誤信息。 其他詳細： 代碼中使用了 github.com/1340691923/ElasticView/pkg/infrastructure/sqlstore(ref) 庫的 SQL 建造器模式來組建 SQL 語句，使得代碼更加清晰和易於維護。 使用了 gorm 標籤來映射 Go 結構體到數據庫的表結構，儘管這裡的代碼並沒有直接使用 GORM 來進行數據庫操作。 pkg/model/es_connect.go 這段 Go 程式碼定義了一個名為 EsConnect 的資料結構，代表 Elasticsearch (簡稱 ES) 的連接設置。EsConnect 結構中的欄位大多與 ES 連接有關的安全性和身份驗證參數。 EsConnect 的欄位概述如下： Ip：ES 伺服器的 IP 地址。 User：用於連接到 ES 伺服器的用戶名。 Pwd：用於連接到 ES 伺服器的密碼。 Version：ES 伺服器的版本。 RootPEM、CertPEM、KeyPEM：用於 SSL/TLS 連接的安全證書和密鑰。 這個結構還定義了一個方法 ToEsSdkCfg，這個方法的功能是將 EsConnect 結構轉換為 proto.Config 結構，後者是用於 Elasticsearch SDK 的配置設置。 在 ToEsSdkCfg 方法中： 使用 strings.Split 將 Ip 字串（可能是逗號分隔的多個 IP 地址）分割為地址列表。 設定 ES SDK 配置中的各種參數，大多數值都是直接或簡單的預設值。例如，CloudID、APIKey 和 ServiceToken 等都是空字串。 將 EsConnect 中的 SSL/TLS 相關欄位（RootPEM、CertPEM、KeyPEM）賦值給 proto.Config。 總的來說，這段程式碼提供了從一般的 Elasticsearch 連接設置到專為 Elasticsearch SDK 設計的配置的轉換功能。 pkg/model/gm_operater_log.go https://github.com/1340691923/ElasticView/blob/main/pkg/model/gm_operater_log.go sqlstore pkg/infrastructure/sqlstore/dump_sql.go 這段Go程式碼是名為sqlstore的套件，主要提供了一些實用工具函式，重點在於解釋給定特定參數的SQL字符串。以下是其內容的摘要： 常量： tmFmtWithMS：時間格式，具有毫秒。 tmFmtZero：表示零的時間格式。 nullStr：代表SQL中的”NULL”。 函式： isPrintable(s string) bool：檢查字符串中的所有字符是否可打印。 ExplainSQL(...)：這是最主要的函式。給定SQL和參數，它生成解釋過的SQL字符串。這個函式不是用來執行SQL，而是用於日誌記錄或說明用途，因為直接執行可能會導致SQL注入漏洞。 該函式的主要工作是將給定的參數（如整數、浮點數、時間、字符串等）正確地轉換成SQL中可以解釋的字符串格式。例如，它可以將Go的時間型態轉換為SQL接受的字符串格式。 此套件可能用於資料庫操作，特別是在記錄或打印SQL查詢時。 pkg/infrastructure/sqlstore/es_view.sql 您提供了一系列語句，這些SQL語句用於建立、刪除以及向一些資料表插入數據。以下是這些語句的摘要： es_link： 資料表描述了與Elasticsearch相關的連接信息，如IP、用戶名、密碼等。 為remark列建立了一個唯一索引。 向該表插入了一條記錄。 gm_dsl_history： 資料表記錄了DSL的歷史查詢。 gm_guid： 資料表記錄了用戶的GUID名稱。 為uid和guid_name列建立了一個唯一索引。 gm_role： 資料表記錄了角色信息，包括角色名稱、描述和角色列表。 向該表插入了一條記錄。 gm_user： 資料表記錄了用戶信息，如用戶名和密碼。 為username列建立了一個唯一索引。 向該表插入了一條記錄。 datax_link_info： 資料表記錄了DataX的連接信息。 為remark和typ列建立了一個唯一索引。 datax_transfer_list： 資料表記錄了DataX的傳輸列表信息。 為remark和es_connect列建立了一個唯一索引。 search_index_config： 資料表記錄了搜索索引的配置。 為index_name和es_connect列建立了一個唯一索引。 mapping_alias_config： 資料表記錄了映射別名的配置。 為index_name和es_connect列建立了一個唯一索引。 gm_operater_log： 資料表記錄了操作者的日誌。 這些資料表涵蓋了多個功能和用途，包括用戶管理、角色管理、連接信息、日誌記錄等。 pkg/infrastructure/sqlstore/sqlx.go sqlx.go程式碼的繁體中文摘要： 引入套件: 該程式碼首先引入必要的函式庫/套件。這包括常見的 Go 套件以及一些專用於資料庫互動（如 github.com/go-sql-driver/mysql, github.com/logoove/sqlite, 和 github.com/jmoiron/sqlx）和日誌記錄的第三方函式庫（如 go.uber.org/zap）。 結構體定義: SqlStore: 代表主要的 SQL 資料庫存儲。它持有一個資料庫連接 (DB) 和一個日誌記錄器的參照。 SqlStore 方法: Exec, Get, Select, Query, 和 Close: 這些是在資料庫上執行 SQL 語句的實用功能。它們是 sqlx 套件提供的相應功能的封裝。 initSqliteDb: 此方法初始化 SQLite 資料庫。它執行一系列嵌入程序中的 SQL 語句（使用 //go:embed 指令）來設置資料庫架構。 初始化: newSqlStore: 一個創建並返回新 SqlStore 實例的輔助函數。 NewSqlStore: 此函數基於配置初始化資料庫連接（MySQL 或 SQLite）。如果使用 SQLite，它還會通過調用 initSqliteDb 來初始化 SQLite 資料庫。 嵌入式 SQL 腳本: es_view.sql 文件（可能包含 SQL 語句）被嵌入到程序中。它在 initSqliteDb 方法中用於設置 SQLite 資料庫。 雜項: 該套件還在 NewSqlStore 函數中有一個簡單的背景 goroutine，每分鐘 ping 一次資料庫以確保它仍然連接。 該套件似乎是與 Elasticsearch 相關的應用程序的一部分（從引入的名稱 ElasticView 和嵌入的 SQL 文件 es_view.sql 可見）。 initSqliteDb 函數通過檢查 data 目錄中的 lock 文件的存在來確保它只運行一次。 注意事項: 該套件導入了 MySQL 和 SQLite 驅動程序，這意味著它可以基於配置連接到任一類型的資料庫。 使用 errors 和 log 套件進行錯誤處理。該套件還使用 zap 日誌記錄庫，但似乎大部分日誌記錄使用的是標準的 log 套件。 即使資料庫類型可能是 SQLite，也假設某些配置值（如 Mysql.MaxOpenConns 和 Mysql.MaxIdleConns）存在。最好確認這是否是預期的行為。 pkg/infrastructure/sqlstore/squirrel.go 以下是這段程式碼的繁體中文版本摘要: 這是一個名為 sqlstore 的包，它利用 squirrel 套件(ref)，一個用於構建 SQL 查詢的 Go 語言函式庫。 主要部分: 引入套件: 這裡引入了必要的標準庫和 squirrel 套件。 建立 SQL 生成器: SqlBuilder 是一個全局變數，它是 squirrel.StatementBuilder 的引用，用於開始建構 SQL 語句。 類型別名: 定義了多個類型別名，這些類型都是基於 squirrel 套件的，例如 Eq、Or、And 等等。這讓使用者可以在此包的上下文中方便地使用這些函數，而無需參照到 squirrel。 工具函數: CreatePage: 根據給定的頁碼和每頁的項目數，該函數返回起始項目的索引。這對於實現分頁查詢很有用。 CreateLike: 給定一個字符串，此函數會返回該字符串的模糊查詢版本，即前後都有 % 的字符串。這通常用於 SQL 的 LIKE 操作。 Placeholders: 根據給定的數字 n，此函數返回 n 個 SQL 占位符，並用逗號分隔。例如，Placeholders(3) 將返回 ?,?,?。這對於動態生成 SQL 查詢，尤其是插入和更新多個值時很有用。 觀察與建議: 這個包主要是作為一個 SQL 語句建構工具的包裝，提供了更方便的功能和類型別名。如果你想使用這個包進行 SQL 查詢的建構，這確實可以使你的程式碼更簡潔，也更容易閱讀。 ESv8 主程式 pkg/infrastructure/es_sdk/pkg/v8/es.go_1 這個包是針對Go中的ElasticSearch V8客戶端的封裝。以下是該包的主要組件和功能的概述： 導入：這個包導入了許多套件，特別是ElasticSearch V8客戶端（github.com/elastic/go-elasticsearch/v8）。 結構體 EsClient8：定義了一個名為EsClient8的結構體，它包含了一個指向ElasticSearch V8客戶端的指針。 初始化：使用NewEsClient8函數可以創建新的EsClient8實例。init方法用於初始化ElasticSearch客戶端。 基本操作： Version：返回客戶端版本。 Ping：檢查ElasticSearch伺服器是否在運行。 索引操作：例如GetMapping、Refresh、Open、Flush等函數，允許您執行各種索引相關的操作。 快照操作：包括創建、刪除、恢復等快照操作。 請求執行：PerformRequest：允許您執行任意HTTP請求。 其他操作：如清除索引緩存、強制合併、按查詢刪除等操作。 以下是EsClient8結構體中每個方法的詳細介紹： NewEsClient8： 用途：建立一個新的ElasticSearch V8客戶端實例。 參數：cfg是配置參數。 返回值：ElasticSearch的接口實例和可能的錯誤。 init： 用途：初始化ElasticSearch V8客戶端。 參數：config是ElasticSearch V8客戶端的配置。 返回值：可能的錯誤。 Version： 用途：返回客戶端的版本號。 返回值：版本號8。 Ping： 用途：確認ElasticSearch伺服器是否運行。 參數：ctx是操作的上下文。 返回值：回應對象和可能的錯誤。 GetMapping： 用途：獲取指定索引的映射信息。 參數：ctx是操作的上下文；indexNames是索引名稱的列表。 返回值：回應對象和可能的錯誤。 SnapshotCreate： 用途：創建一個新的快照。 參數：ctx是操作的上下文；repository是存儲庫名稱；snapshot是快照名稱；其他參數包括是否等待完成和請求的JSON體。 返回值：回應對象和可能的錯誤。 PerformRequest： 用途：執行一個HTTP請求。 參數：ctx是操作的上下文；req是要執行的HTTP請求。 返回值：回應對象和可能的錯誤。 SnapshotDelete： 用途：刪除一個指定的快照。 參數：ctx是操作的上下文；repository是存儲庫名稱；snapshot是要刪除的快照名稱。 返回值：回應對象和可能的錯誤。 RestoreSnapshot： 用途：恢復一個指定的快照。 參數：包括操作的上下文、存儲庫名稱、快照名稱等。 返回值：回應對象和可能的錯誤。 Refresh： 用途：刷新一或多個索引。 參數：ctx是操作的上下文；indexNames是索引名稱的列表。 返回值：回應對象和可能的錯誤。 pkg/infrastructure/es_sdk/pkg/v8/es.go_2 Open: 用途：用於開啟指定的Elasticsearch索引。 參數： ctx: 上下文，用於處理超時和取消請求。 indexNames: 需要開啟的索引名稱列表。 返回值：返回一個proto.Response以及可能的錯誤。 Flush: 用途：將索引的數據強制同步到磁盤。 參數： ctx: 上下文。 indexNames: 需要同步的索引名稱列表。 返回值：返回一個proto.Response以及可能的錯誤。 IndicesClearCache: 用途：清除指定索引的快取。 參數： ctx: 上下文。 indexNames: 需要清除快取的索引名稱列表。 返回值：返回一個proto.Response以及可能的錯誤。 IndicesClose: 用途：關閉指定的Elasticsearch索引。 參數： ctx: 上下文。 indexNames: 需要關閉的索引名稱列表。 返回值：返回一個proto.Response以及可能的錯誤。 IndicesForcemerge: 用途：對指定的Elasticsearch索引執行forcemerge操作，通常用於優化索引。 參數： ctx: 上下文。 indexNames: 需要forcemerge的索引名稱列表。 maxNumSegments: 最大段數。 返回值：返回一個proto.Response以及可能的錯誤。 DeleteByQuery: 用途：根據指定的查詢刪除文檔。 參數： ctx: 上下文。 indexNames: 要操作的索引名稱列表。 documents: 文檔列表。 body: 查詢主體。 返回值：返回一個proto.Response以及可能的錯誤。 SnapshotStatus: 用途：獲取快照的狀態。 參數： ctx: 上下文。 repository: 存儲庫名稱。 snapshot: 快照名稱列表。 ignoreUnavailable: 是否忽略不可用的。 返回值：返回一個proto.Response以及可能的錯誤。 SnapshotGetRepository: 用途：獲取指定的快照存儲庫的信息。 參數： ctx: 上下文。 repository: 存儲庫名稱列表。 返回值：返回一個proto.Response以及可能的錯誤。 SnapshotCreateRepository: 用途：創建一個新的快照存儲庫。 參數： ctx: 上下文。 repository: 存儲庫名稱。 reqJson: 存儲庫的設定和配置。 返回值：返回一個proto.Response以及可能的錯誤。 SnapshotDeleteRepository: 用途：刪除指定的快照存儲庫。 參數： ctx: 上下文。 repository: 存儲庫名稱列表。 返回值：返回一個proto.Response以及可能的錯誤。 GetIndices: 用途：獲取Elasticsearch中的索引信息。 參數： ctx: 上下文。 catRequest: 一系列的選項和參數，用於定制返回的信息。 返回值：返回一個proto.Response以及可能的錯誤。 這個包是一個高級API封裝，它使得使用ElasticSearch V8在Go中更加方便。對於每一個函數，你可以透過查看其名稱和參數來推測其具體功能，並根據你的需要來使用。 pkg/infrastructure/es_sdk/pkg/v8/es.go_3 這裡有一組函數，它們都屬於EsClient8這個結構體，用於與Elasticsearch進行互動。以下是這些函數的介紹： CatHealth 用途: 查詢Elasticsearch的健康狀態。 參數: ctx: 上下文 catRequest: 健康狀態的查詢參數。 返回值: res: Elasticsearch的回應。 err: 錯誤信息。 CatShards 用途: 查詢Elasticsearch的分片信息。 參數: ctx: 上下文 catRequest: 分片的查詢參數。 返回值: res: Elasticsearch的回應。 err: 錯誤信息。 CatCount 用途: 查詢Elasticsearch中的文檔數量。 參數: ctx: 上下文 catRequest: 文檔數量的查詢參數。 返回值: res: Elasticsearch的回應。 err: 錯誤信息。 CatAllocationRequest 用途: 查詢Elasticsearch的資源分配。 參數: ctx: 上下文 catRequest: 資源分配的查詢參數。 返回值: res: Elasticsearch的回應。 err: 錯誤信息。 CatAliases 用途: 查詢Elasticsearch的別名。 參數: ctx: 上下文 catRequest: 別名的查詢參數。 返回值: res: Elasticsearch的回應。 err: 錯誤信息。 IndicesSegmentsRequest 用途: 查詢Elasticsearch的指數段信息。 參數: ctx: 上下文 human: 是否返回易於閱讀的結果。 返回值: res: Elasticsearch的回應。 err: 錯誤信息。 ClusterStats 用途: 查詢Elasticsearch集群的統計信息。 參數: ctx: 上下文 human: 是否返回易於閱讀的結果。 返回值: res: Elasticsearch的回應。 err: 錯誤信息。 CatNodes 用途: 查詢Elasticsearch的節點信息。 參數: ctx: 上下文 h: 顯示的欄位列表。 返回值: res: Elasticsearch的回應。 err: 錯誤信息。 Delete 用途: 從Elasticsearch中刪除文檔。 參數: ctx: 上下文 deleteRequest: 刪除的參數。 返回值: res: Elasticsearch的回應。 err: 錯誤信息。 Update 用途: 更新Elasticsearch中的文檔。 參數: ctx: 上下文 updateRequest: 更新的參數。 body: 更新的內容。 返回值: res: Elasticsearch的回應。 err: 錯誤信息。 每個函數主要都是通過Do方法發送請求到Elasticsearch，然後返回Elasticsearch的回應和任何可能的錯誤。 pkg/infrastructure/es_sdk/pkg/v8/es.go_4 好的，我將對每一個函數提供簡短的解釋和概述。 Create 用途：在Elasticsearch中創建一個文檔。 參數：ctx (上下文)，createRequest (創建文檔的請求資訊)，body (文檔的主體內容)。 返回值：res (響應資訊)，err (可能的錯誤)。 Search 用途：在Elasticsearch中進行搜索。 參數：ctx (上下文)，searchRequest (搜索的請求資訊)，query (搜索查詢的主體)。 返回值：res (響應資訊)，err (可能的錯誤)。 IndicesPutSettingsRequest 用途：更新Elasticsearch索引的設置。 參數：ctx (上下文)，indexSettingsRequest (索引設置請求資訊)，body (設置的主體)。 返回值：res (響應資訊)，err (可能的錯誤)。 CreateIndex 用途：在Elasticsearch中創建一個新的索引。 參數：ctx (上下文)，indexCreateRequest (創建索引的請求資訊)，body (索引配置的主體)。 返回值：res (響應資訊)，err (可能的錯誤)。 DeleteIndex 用途：刪除Elasticsearch中的一個或多個索引。 參數：ctx (上下文)，indicesDeleteRequest (刪除索引的請求資訊)。 返回值：res (響應資訊)，err (可能的錯誤)。 Reindex 用途：在Elasticsearch中重新索引文檔。 參數：ctx (上下文)，reindexRequest (重新索引的請求資訊)，body (重新索引的主體)。 返回值：res (響應資訊)，err (可能的錯誤)。 IndicesGetSettingsRequest 用途：獲取Elasticsearch索引的設置。 參數：ctx (上下文)，indicesGetSettingsRequest (獲取索引設置的請求資訊)。 返回值：res (響應資訊)，err (可能的錯誤)。 PutMapping 用途：在Elasticsearch中更新或新增索引映射。 參數：ctx (上下文)，indicesPutMappingRequest (放置映射的請求資訊)，body (映射的主體)。 返回值：res (響應資訊)，err (可能的錯誤)。 GetAliases 用途：獲取Elasticsearch中索引的別名。 參數：ctx (上下文)，indexNames (索引名稱列表)。 返回值：res (響應資訊)，err (可能的錯誤)。 AddAliases 用途：為Elasticsearch中的索引添加別名。 參數：ctx (上下文)，indexName (索引名稱列表)，aliasName (別名)。 返回值：res (響應資訊)，err (可能的錯誤)。 這些函數基本上都是在Elasticsearch中執行常見操作，並使用了esapi和esutil這兩個套件來簡化與Elasticsearch的交互。返回值通常是Elasticsearch的響應和一個可能的錯誤。 pkg/infrastructure/es_sdk/pkg/v8/es.go_5 您提供了四個函數的定義，我將為您進行詳細解釋： RemoveAliases 用途：從Elasticsearch索引中移除別名。 參數： ctx (上下文) indexName (索引名稱列表) aliasName (別名列表) 返回值： res (響應資訊，其中包含HTTP響應的狀態碼、標頭和主體) err (可能的錯誤) MoveToAnotherIndexAliases 用途：移動別名到另一個Elasticsearch索引。 參數： ctx (上下文) body (含有移動別名的操作資訊的主體) 返回值： res (響應資訊) err (可能的錯誤) TaskList 用途：獲取Elasticsearch中的任務列表。 參數： ctx (上下文) 返回值： res (響應資訊) err (可能的錯誤) TasksCancel 用途：取消Elasticsearch中的指定任務。 參數： ctx (上下文) taskId (要取消的任務的ID) 返回值： res (響應資訊) err (可能的錯誤) 每個函數的工作流程都很相似。首先，使用Elasticsearch的客戶端(this.client)進行相應的操作，如刪除別名、更新別名、獲取任務列表或取消任務。接著，如果操作成功，將HTTP響應轉換為proto.Response對象。如果在這過程中遇到任何錯誤，函數將返回這個錯誤。 Terminology DSL DSL 是 Domain-Specific Language 的縮寫，中文譯為「特定領域語言」（或譯「領域特定語言」），也就是開發人員為了解決特定領域的問題所定義的專用語言⁴。例如，HTML 是針對網頁結構的語言，JSON 是針對資料結構的語言等等⁵。相較於通用目的語言 (GPL 或 General-purpose Language，如 Swift 本身)，DSL 的語法會更簡潔，邏輯更簡單⁵。 以下是一個 DSL 的範例¹： { "query": { "match_all": {} //your query parameter } } 基本的查詢結構如下²： { QUERY_NAME: { ARGUMENT: VALUE, ARGUMENT: VALUE,... } } 特定欄位查詢結構如下²： { QUERY_NAME: { FIELD_NAME: { ARGUMENT: VALUE, ARGUMENT: VALUE,... } } } 查詢語法範例²： { "query": { "match": { "field": "value" } } } 這些都是 DSL 的基本結構和使用方式。 來源: 與 Bing 的交談， 2023/10/25 (1) 開發人員的逆襲： Domain-Specific Languages - Huan-Lin 學習筆記. (2) Swift DSL 實作：利用 Swift UI 寫出簡單又明瞭的 Auto Layout DSL - AppCoda 中文版. (3) DSL - Domain Specific Language 簡介 - Maxkit. (4) Day07 Kibana - Query DSL 語法結構 - iT 邦幫忙::一起幫忙解決難題，拯救 IT 人的一天、ithome. (5) Swift DSL 實作：利用 Swift UI 寫出簡單又明瞭的 Auto Layout DSL - AppCoda 中文版. (6) undefined. elastic.co CRUD “Elasticsearch 的 CRUD 操作” 是指在 Elasticsearch 中進行創建（Create）、讀取（Read）、更新（Update）和刪除（Delete）操作。這些操作是數據庫交互的基礎⁴。 創建：在 Elasticsearch 中添加新的文檔或索引⁴。 讀取：從 Elasticsearch 中獲取特定的文檔或索引的資訊⁵。 更新：修改 Elasticsearch 中已存在的文檔或索引⁴。 刪除：移除 Elasticsearch 中的特定文檔或索引⁵。 這些操作使得用戶可以靈活地管理和操作 Elasticsearch 中的數據⁴⁵。如果您需要更多詳細資訊，請告訴我。 來源: 與 Bing 的交談， 2023/10/25 (1) Elasticsearch（二）—— es的文档、索引的CRUD操作 - CSDN博客. (2) Elasticsearch-文档的 CRUD-腾讯云开发者社区-腾讯云. (3) Elasticsearch CRUD基本操作 - 狼爷 - 博客园. (4) ES索引的基本操作(CRUD)es crud-CSDN博客. (5) Elasticsearch-文档的 CRUD-腾讯云开发者社区-腾讯云. (6) ElasticSearch的CRUD操作“_shards" : { "total" : 42, "successful" : 25-CSDN博客. 有關CRUD的程式： ./pkg/api/es_crud_controller.go： ./pkg/dto/es_crud.go ./pkg/model/crud.go ./pkg/web/es_crud.go gin Web框架 Gin 是一個使用 Go 語言開發的 Web 框架¹²。它提供了類似於 Martini 的 API，但性能比 Martini 快 40 倍¹²。以下是一些 Gin 的主要特性： 快速：基於 Radix 樹的路由，小內存佔用¹²。 支援中間件：傳入的 HTTP 請求可以由一系列中間件和最終操作來處理¹²。 Crash 處理：Gin 可以 catch 一個發生在 HTTP 請求中的 panic 並 recover 它¹²。 JSON 驗證：Gin 可以解析並驗證請求的 JSON，例如檢查所需值的存在¹²。 路由組：Gin 幫助您更好地組織您的路由，例如，按照需要授權和不需要授權和不同 API 版本進行分組¹²。 這些只是 Gin 的一部分功能，實際上還有許多其他功能和特性。如果您需要更多詳細資訊，請告訴我。¹² 來源: 與 Bing 的交談， 2023/10/26 (1) Gin Web Framework. gin-gonic. (2) Gin Web Framework. gin-gonic. (3) 文档 | Gin Web Framework. gin-gonic. (4) Gin-Web-Framework官方指南中文（上篇） - 腾讯云. Navicat Navicat 是一款強大的資料庫管理和設計工具，支援 Windows、macOS 和 Linux¹²。它具有直觀的圖形用戶界面，讓使用者可以輕鬆地管理多種資料庫，包括 MySQL、Redis、PostgreSQL、MongoDB、MariaDB、SQL Server、Oracle 和 SQLite¹²。 Navicat 提供了許多功能，包括資料庫建立、管理和維護，以及資料庫監控等¹²。此外，它還提供了協同合作工具，讓團隊可以隨時隨地即時協作¹²。 總的來說，Navicat 是一個全面的資料庫管理解決方案，適合各種規模的企業和團隊使用¹²。希望這些信息對您有所幫助！ 來源: 與 Bing 的交談， 2023/10/26 (1) Navicat GUI | 支援 MySQL、Redis、PostgreSQL、MongoDB、MariaDB、SQL Server、Oracle 和 SQLite 的資料庫管理. Navicat. (2) Navicat GUI | DB Admin Tool for MySQL, Redis, PostgreSQL, MongoDB, MariaDB, SQL Server, Oracle &amp; SQLite client. Navicat. RBAC RBAC，全名為基於角色的訪問控制（Role-Based Access Control），是資訊安全領域中一種廣為使用的存取控制機制¹。不同於強制存取控制以及自由選定存取控制直接賦予使用者權限，RBAC是將權限賦予角色¹。 在一個組織中，會因為不同的作業功能產生不同的角色，執行某項操作的權限會被賦予特定的角色¹。組織成員或者工作人員（抑或其它系統使用者）則被賦予不同的角色，這些使用者通過被賦予角色來取得執行某項電腦系統功能的權限¹。 例如，一個人在公司中的職位可以稱為「角色」。但是，角色在 RBAC 中具有更技術性的定義：它是在公司系統中使用的一組明確定義的能力或權限²。每個內部使用者至少會被指派一個角色，有些使用者可能有多個角色²。 RBAC 提供了细粒度的控制，提供了一种简单、可管理的访问管理方法，与单独分配权限相比，这种方法更不容易出错⁴。希望這些信息對您有所幫助！ 來源: 與 Bing 的交談， 2023/10/26 (1) 以角色為基礎的存取控制 - 維基百科，自由的百科全書. (2) 什麼是基於角色的存取控制 (RBAC)？ | Cloudflare. (3) 什么是基于角色的访问控制 (RBAC)？示例、好处等 - CSDN博客. (4) 什么是基于角色的访问控制（RBAC）？ | Cloudflare. (5) 在应用程序中实现基于角色的访问控制 - Microsoft Entra. DTO description 數據傳輸對象（Data Transfer Object，縮寫為DTO）是在計算機編程中，用於在兩個進程之間傳輸數據的對象¹²。這種模式通常用於遠端介面（如Web服務）的昂貴操作，其中成本的主體是客戶和伺服器之間的來回通信時間¹²。 為了降低這種呼叫次數，使用DTO可以聚合本來需要多次通信傳輸的資料¹²。DTO的資料的變異子與訪問子（mutator和accessor）、語法分析（parser）、序列化（serializer）時不會有任何儲存、取得、序列化和反序列化的異常¹²。 換句話說，DTO是一種簡單對象，不含任何業務邏輯，但可包含序列化和反序列化以用於傳輸資料¹²。希望這些信息對您有所幫助！ 來源: 與 Bing 的交談， 2023/10/26 (1) 資料傳輸對象 - 維基百科，自由的百科全書. (2) 数据传输对象 - 维基百科，自由的百科全书. (3) 簡易快捷存取Yaml文件的API @Minecraft 我的世界（當個創世神） 哈啦板 - 巴哈姆特. (4) 淺析VO、DTO、DO、BO的概念、區別和用處 - 台部落. (5) undefined. MS.com. (6) undefined. martinfowler. casbin Casbin 是一個強大和高效的開放源碼訪問控制庫¹。它支持各種訪問控制模型，以強制全面執行授權¹。以下是一些 Casbin 的主要特性： 支援多種訪問控制模型：例如，RBAC（基於角色的訪問控制）、ABAC（基於屬性的訪問控制）等¹。 靈活的策略管理：策略可以通過文件或數據庫來管理，並且可以動態更改¹。 支援多種語言：包括 Go、Java、Node.js、PHP、Python、C#、Delphi、Rust、C++、Lua、Dart 和 Elixir 等¹。 Casbin 的使用非常直觀，只需要在策略文件中列出主體、對象和所需的允許操作（或根據您的需求的任何其他格式）即可強制執行一組規則¹。開發人員/管理員可以通過模型文件完全控制授權的佈局、執行和條件¹。 請注意，Casbin 不負責身份驗證（例如，在用戶登錄時驗證用戶名和密碼），也不管理用戶列表或角色列表¹。這些通常由項目自身來管理¹。 來源: 與 Bing 的交談， 2023/10/26 (1) 概述 | Casbin. (2) casbin最牛逼的权限管理 - 掘金. (3) 开始使用 | Casbin. Swagger Swagger 是一套開放源碼的 API 開發工具，它遵循 OpenAPI Specification（OpenAPI 規範，也簡稱 OAS）⁵。Swagger 可以貫穿於整個 API 生態，如 API 的設計、編寫 API 文檔、測試和部署⁵。它可以幫助設計、構建、記錄和使用 REST API³。Swagger 提供了一個視覺化的界面，將各個 API 條列出來，包含了 API 所需的參數以及參數格式等，甚至可以透過這個頁面直接對後端的 API 做操作⁴。 Swagger 的主要目標是： 最小化連接解耦服務所需的工作量³。 提供一種通用的，和編程語言無關的 API 描述規範⁵。 Swagger 提供了兩種主要的工具： 開源工具：這些工具可以創建、更新和分享 OpenAPI 定義¹。 SwaggerHub：這是一個平台解決方案，用於支持大規模的 OpenAPI 工作流程¹。 此外，Swagger 還提供了 Swagger UI 和 Swagger 產生器等工具²。這些工具可以自動生成 API 文檔，並能在線上進行測試，正好可以解決文件維護與修改的問題²。因此，無論是個人開發者還是團隊，都可以通過 Swagger 來提高他們的開發效率並降低 API 文件的維護成本¹⁴。 來源: 與 Bing 的交談， 2023/10/26 (1) Swagger详细了解一下（长文谨慎阅读）-腾讯云开发者社区-腾讯云. (2) ASP.NET Core web API documentation with Swagger / OpenAPI. (3) [NestJS 帶你飛！] DAY26 - Swagger (上) - iT 邦幫忙::一起幫忙解決難題，拯救 IT 人的一天. (4) API Documentation &amp; Design Tools for Teams | Swagger. (5) [Day09]使用Swagger自動建立清晰明瞭的REST API文件 - 我與 ASP.NET Core 的 30天 - iT 邦幫忙. (6) undefined. Swagger underline in Go import 這是 Go 語言的 import 語句，用於導入需要的套件。在這個例子中，導入了兩個套件： database/sql：這是 Go 語言的標準庫，提供了一個與 SQL 數據庫進行交互的接口²。 _ "embed"：這裡的 _ 是一個匿名導入。當導入一個套件但不使用它的任何導出時，可以使用匿名導入。在這種情況下，只有該套件的初始化函數會被調用，而不會使用該套件的其他部分。embed 套件是 Go 1.16 版本引入的新特性，允許在 Go 程序中嵌入文件和文件夾¹。 所以，import ("database/sql" _ "embed") 的意思是導入 database/sql 套件並使用它，同時導入 embed 套件但只調用其初始化函數。這種做法常見於需要初始化驅動或者需要觸發包級別變數的初始化等情況。例如，在許多數據庫驅動中，我們會看到 _ "github.com/go-sql-driver/mysql" 的導入，目的就是為了註冊該驅動，使得 database/sql 套件可以與 MySQL 數據庫進行交互。² 來源: 與 Bing 的交談， 2023/10/26 (1) mssql package - github.com/microsoft/go-mssqldb - Go Packages. (2) Blog: Go embed for better SQL query management | Wawandco. (3) Insert BLOB from a file into a sql script to embed H2 database. stackoverflow. (4) undefined.microsoft. squirrel Squirrel 是一個用於 Go 語言的 SQL 查詢構建庫¹²。它可以幫助你從可組合的部分構建 SQL 查詢²。以下是一些關於 Squirrel 的主要特點： 流暢的 SQL 生成：Squirrel 提供了一種流暢的接口來生成 SQL 查詢¹²。例如，你可以使用 sq.Select("*").From("users").Join("emails USING (email_id)") 來創建一個查詢²。 靈活的查詢構建：Squirrel 可以使條件查詢構建變得非常容易²。例如，如果你有一個查詢字符串 q，你可以使用 users = users.Where("name LIKE ?", fmt.Sprint("%", q, "%")) 來添加一個 WHERE 子句²。 直接執行查詢：Squirrel 也可以直接執行查詢²。例如，你可以使用 rows, err := three_stooges.RunWith(db).Query() 來執行一個查詢²。 支持 PostgreSQL：Squirrel 支持 PostgreSQL 的占位符格式²。例如，你可以使用 psql := sq.StatementBuilder.PlaceholderFormat(sq.Dollar) 來設置占位符格式²。 請注意，Squirrel 不是一個 ORM²。它只是一個幫助你構建 SQL 查詢的庫¹²。如果你需要一個 ORM，那麼你可能需要尋找其他的庫或者框架。 來源: 與 Bing 的交談， 2023/10/26 (1) GitHub - Masterminds/squirrel: Fluent SQL generation for golang. https://github.com/Masterminds/squirrel. (2) squirrel package - github.com/Masterminds/squirrel - Go Packages. https://pkg.go.dev/github.com/Masterminds/squirrel. (3) SQL Query Builders - Awesome Go / Golang. https://awesome-go.com/sql-query-builders/. (4) GitHub - elgris/sqrl: Fluent SQL generation for golang. https://github.com/elgris/sqrl.]]></summary></entry><entry><title type="html">Oculus</title><link href="https://sinotec2.github.io/FAQ/2023/10/05/oculus.html" rel="alternate" type="text/html" title="Oculus" /><published>2023-10-05T00:00:00+08:00</published><updated>2023-10-05T00:00:00+08:00</updated><id>https://sinotec2.github.io/FAQ/2023/10/05/oculus</id><content type="html" xml:base="https://sinotec2.github.io/FAQ/2023/10/05/oculus.html"><![CDATA[<h2 id="背景">背景</h2>

<ul>
  <li>VR 這一題可大可小。如果不難又不貴，為什麼我們自己不能做？剩下的問題就變得是筆記系統的威力了，如果只做少數的幾次，每次有需要從頭開始複習，這個比較耗時間。</li>
  <li>其實跟其他軟體一樣，費時費事的都是在domain endpoint，好的腳本難得、好的畫面、好的題材，這實在是幫不上忙了。</li>
</ul>

<h3 id="bing-chat-introduction">bing chat introduction</h3>

<p>Meta Oculus⁴ 是 Meta 公司旗下的一家美國虛擬實境科技公司，由帕爾默·拉奇與布倫丹·艾瑞比成立。他們的首件產品 Oculus Rift 是一款逼真的虛擬實境頭戴式顯示器，且目前已經在市面上販售⁴。Facebook於2014年3月同意以20億美元現金及Facebook股票收購Oculus VR⁴。</p>

<p>Oculus 的產品包括：</p>
<ol>
  <li><strong>Meta Quest 2</strong>：這是他們到目前為止最新、最先進的 All-In-One VR 系統²。以無與倫比的自由度探索龐大遊戲庫，發掘各種令人驚豔的遊戲和沉浸式體驗²。</li>
  <li><strong>Meta Quest 3</strong>：這是由 Meta 推出的第二款主打混合現實功能一體機³。機器內首發採用高通驍龍XR2 gen 2處理器，採用了Pancake結構透鏡，並不支持面部識別和眼球追蹤技術，機身集成了2個彩色攝像頭和1個深度傳感器支持混合現實功能³。</li>
</ol>

<p>請注意，詳細的產品規格和功能可能會因地區和時間而有所變化。您可以訪問他們的<a href="^1^">官方網站</a>以獲得最新的產品資訊。</p>

<p>來源: 與 Bing 的交談， 2023/10/28
(1) Oculus - <a href="https://zh.wikipedia.org/zh-tw/Oculus">維基百科</a>，自由的百科全書.</p>

<table>
  <tbody>
    <tr>
      <td>(2) Meta Quest 2：我們最先進的全新 All-In-One VR 頭戴式裝置</td>
      <td><a href="https://www.meta.com/tw/quest/products/quest-2/tech-specs/">Oculus</a>.</td>
    </tr>
  </tbody>
</table>

<p>(3) Oculus - 維基百科，<a href="https://bing.com/search?q=Oculus+%e7%94%a2%e5%93%81%e4%bb%8b%e7%b4%b9">自由的百科全書</a>.</p>

<table>
  <tbody>
    <tr>
      <td>(4) Meta Quest VR 頭戴式裝置、配件和設備</td>
      <td><a href="https://www.meta.com/tw/quest/">Meta Quest</a>.</td>
    </tr>
  </tbody>
</table>

<p>(5) Oculus Quest 2 揭曉，更輕、VR效能更高、價格更親民 有線連接模式可取代 Oculus Rift 系列. https://www.cool3c.com/article/156736.
(6) Meta 棄用 Oculus 改名 Meta Quest VR，讓元宇宙概念更清晰 | TechNews 科技新報. https://technews.tw/2022/01/30/oculus-quest-2-just-officially-renamed-meta-quest/.
(7) 【心得】虛擬實境裝置 HTC Vive 開箱＆硬體介紹 @Steam 綜合討論板 哈啦板 - 巴哈姆特. https://forum.gamer.com.tw/C.php?bsn=60599&amp;snA=8760.
(8) undefined. https://www.oculus.com/quest-2/removable-facial-interface-alert.
(9) undefined. https://www.meta.com/smart-glasses/#faq進一步瞭解最新資訊.</p>]]></content><author><name>yckuang</name><email>sinotec2@gmail.com</email></author><category term="note_system," /><summary type="html"><![CDATA[背景 VR 這一題可大可小。如果不難又不貴，為什麼我們自己不能做？剩下的問題就變得是筆記系統的威力了，如果只做少數的幾次，每次有需要從頭開始複習，這個比較耗時間。 其實跟其他軟體一樣，費時費事的都是在domain endpoint，好的腳本難得、好的畫面、好的題材，這實在是幫不上忙了。 bing chat introduction Meta Oculus⁴ 是 Meta 公司旗下的一家美國虛擬實境科技公司，由帕爾默·拉奇與布倫丹·艾瑞比成立。他們的首件產品 Oculus Rift 是一款逼真的虛擬實境頭戴式顯示器，且目前已經在市面上販售⁴。Facebook於2014年3月同意以20億美元現金及Facebook股票收購Oculus VR⁴。 Oculus 的產品包括： Meta Quest 2：這是他們到目前為止最新、最先進的 All-In-One VR 系統²。以無與倫比的自由度探索龐大遊戲庫，發掘各種令人驚豔的遊戲和沉浸式體驗²。 Meta Quest 3：這是由 Meta 推出的第二款主打混合現實功能一體機³。機器內首發採用高通驍龍XR2 gen 2處理器，採用了Pancake結構透鏡，並不支持面部識別和眼球追蹤技術，機身集成了2個彩色攝像頭和1個深度傳感器支持混合現實功能³。 請注意，詳細的產品規格和功能可能會因地區和時間而有所變化。您可以訪問他們的官方網站以獲得最新的產品資訊。 來源: 與 Bing 的交談， 2023/10/28 (1) Oculus - 維基百科，自由的百科全書. (2) Meta Quest 2：我們最先進的全新 All-In-One VR 頭戴式裝置 Oculus. (3) Oculus - 維基百科，自由的百科全書. (4) Meta Quest VR 頭戴式裝置、配件和設備 Meta Quest. (5) Oculus Quest 2 揭曉，更輕、VR效能更高、價格更親民 有線連接模式可取代 Oculus Rift 系列. https://www.cool3c.com/article/156736. (6) Meta 棄用 Oculus 改名 Meta Quest VR，讓元宇宙概念更清晰 | TechNews 科技新報. https://technews.tw/2022/01/30/oculus-quest-2-just-officially-renamed-meta-quest/. (7) 【心得】虛擬實境裝置 HTC Vive 開箱＆硬體介紹 @Steam 綜合討論板 哈啦板 - 巴哈姆特. https://forum.gamer.com.tw/C.php?bsn=60599&amp;snA=8760. (8) undefined. https://www.oculus.com/quest-2/removable-facial-interface-alert. (9) undefined. https://www.meta.com/smart-glasses/#faq進一步瞭解最新資訊.]]></summary></entry><entry><title type="html">空氣污染天氣類型</title><link href="https://sinotec2.github.io/FAQ/2023/09/27/APClass.html" rel="alternate" type="text/html" title="空氣污染天氣類型" /><published>2023-09-27T00:00:00+08:00</published><updated>2023-09-27T00:00:00+08:00</updated><id>https://sinotec2.github.io/FAQ/2023/09/27/APClass</id><content type="html" xml:base="https://sinotec2.github.io/FAQ/2023/09/27/APClass.html"><![CDATA[<h2 id="背景">背景</h2>

<ul>
  <li>好發空氣污染的天氣類型、境外可能來源軌跡類別、本地空氣動力特性等等定性研究，已經非常充分多元了，但如何將這些定性的原則，列成客觀的數據關係(topology)，則是機器學習、乃至於空氣污染AI預報的關鍵因素。</li>
</ul>

<h2 id="污染的天氣類型研究成果網頁資訊">污染的天氣類型研究成果網頁資訊</h2>

<h3 id="莊銘棟研究副技師">莊銘棟研究副技師</h3>

<p>【專欄】從氣象播報預測空氣污染物高濃度事件
 | 數理科學, 漫步科研, 科普專欄</p>

<p>作者 ／ 莊銘棟研究副技師（<a href="https://newsletter.sinica.edu.tw/29669/">中研院院環境變遷研究中心2022-12-29</a>）
 天氣類型研究在臺灣</p>

<ul>
  <li>早在 1993 年，學者<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup>就歸納出天氣預報的 24 種天氣類型，並探討這 24 種天氣類型與臺灣空氣品質的相關性分析，其中有 7 種污染天氣類型可適用空氣污染潛勢預報，分別是：
    <ul>
      <li>冬季高壓迴流污染型、</li>
      <li>夏季高壓迴流污染型、</li>
      <li>夏季低壓迴流污染型、</li>
      <li>微弱低壓梯度污染型、</li>
      <li>鋒面前緣污染型、</li>
      <li>鋒面通過污染型及</li>
      <li>熱帶低壓污染型。</li>
    </ul>
  </li>
  <li>後來，學者李清勝等（1997）<sup id="fnref:2" role="doc-noteref"><a href="#fn:2" class="footnote" rel="footnote">2</a></sup>將天氣類型擴展至 51 種，由於該研究是環保署委託執行的計畫，因此他們分類的天氣類型是提供環保署的人員可以學習並判斷是否會形成空氣污染事件日，這種方法稱為「類比法」，簡單來說，你只要背熟這 51 種天氣類型，將氣象播報的天氣圖去對比 51 種天氣類型，哪一種最像你要對比的天氣預測圖，就可以有效預測未來是否會發生空氣污染事件日。但是後來這 51 種天氣類型並沒有被持續使用。</li>
  <li>2008 年，Chuang et al.<sup id="fnref:3" role="doc-noteref"><a href="#fn:3" class="footnote" rel="footnote">3</a></sup>針對大臺北地區，將這些複雜的天氣類型分類，根據形成 PM2.5 事件的大氣動力學原理而予以簡化分為七種類型，其中
    <ul>
      <li>亞洲大陸高壓迴流（HPPC）、亞洲大陸高壓冷鋒前暖區（WAF）、颱風（TYP）、太平洋高壓西伸（PHP）以及微弱西南氣流（WSW）五種類型與複雜地形的影響有關，</li>
      <li>其他兩類型分別為微弱高壓籠罩型（WHP）及亞州大陸高壓推擠型（HPP）。
(編按中央大學鄭芳宜教授團隊也發表台灣地區污染的天氣類型<sup id="fnref:4" role="doc-noteref"><a href="#fn:4" class="footnote" rel="footnote">4</a></sup>、<sup id="fnref:5" role="doc-noteref"><a href="#fn:5" class="footnote" rel="footnote">5</a></sup>)</li>
    </ul>
  </li>
  <li>Lai et al.（2015）<sup id="fnref:6" role="doc-noteref"><a href="#fn:6" class="footnote" rel="footnote">6</a></sup>針對 PM2.5 也歸納出 9 種天氣類型以及 2 種混和型。</li>
  <li>而最近，我們又將 Chuang et al.（2008）的七種擴展為 11 種 PM2.5 及 O3 的污染天氣類型，這 11 種 污染天氣類型列示如表 1。以上的研究，皆需要每天的天氣圖一張一張的審視，一張一張的判別，都是非常耗費時間的研究。
<img src="https://newsletter.sinica.edu.tw/wp-content/uploads/2022/12/3-3_16-615x1024.jpg" alt="" /></li>
</ul>

<p>Su, S.H., Chang, C.W., Chen, W.T., 2020. The temporal evolution of PM2.5 pollution events in Taiwan: Clustering and the association with synoptic weather. Atmosphere 11, 1265.</p>

<h3 id="鄭芳宜教授專訪">鄭芳宜教授專訪</h3>

<ul>
  <li>source <a href="https://rsprc.ntu.edu.tw/zh-tw/m01-3/air-pollution/1305-1081030-air-science.html">風險社會與政策研究中心風險社會與政策研究中心(2019/10/30)</a></li>
  <li>【採訪紀實】從大氣科學看空污：PM2.5的「季節性」與「地域性」</li>
  <li>臺灣常碰到的大氣情況，粗分為三種：高壓迴流型、弱綜觀、東北季風型
    <ul>
      <li>高壓迴流是指高壓離開臺灣，但是環境風場繞回臺灣、西半部又處在背風面的情況；另外也會預期下一波的天氣系統，可能鋒面又會一波波地影響臺灣。</li>
      <li>在下一波鋒面還沒有開始影響、前一波冷高壓系統遠離臺灣的時候，附近沒有什麼明顯的天氣系統，整個環境會變得很弱，定義為弱綜觀。</li>
      <li>當風較強時，會把臺灣些污染物帶走，但也有可能把境外的污染物帶進臺灣，所以東北季風可能是一種境內夾雜著境外污染的問題；當冷高壓系統遠離臺灣轉為高壓迴流或是弱綜觀的時候，就可以預期空品會越來越糟，因為整個環境的風場變弱了。</li>
    </ul>
  </li>
  <li>根據臺灣過去40年大氣的數據，我們的風確實減弱了，這與氣候變遷導致空污變得嚴重有關聯嗎？
    <ul>
      <li>確實除了風減弱之外，發現大氣變得更穩定， 極端穩定，會造成空品非常不好</li>
    </ul>
  </li>
  <li>秋冬季節時，境外與境內污染對臺灣空污的問題，尤其是PM2.5的占比是逐年遞增還是遞減的趨勢？境外與境內各占比多少？
    <ul>
      <li>根據2018年一篇針對2010年到2017年中國排放量的分析文獻指出，硫氧化物降低超過6成、氮氧化物也有超過2成降低。</li>
      <li>在我們的研究上也做了10年左右的境外污染資料分析，以近3年來看境外污染的事件比起10年前少了超過10次。</li>
    </ul>
  </li>
  <li>
    <p>而境內污染，有時空污的嚴重多半是臺灣本地所造成的。同樣回歸到天氣的角度來看境內問題，當大環境是東北季風的條件下，可以去了解這個時間點境內、境外的占比是多少，至於境外污染的嚴重程度，北部空品區受到境外污染影響時可能可以達到7成，但在不嚴重的條件下，境外污染可能只有1成或2成，取決於大氣變動。</p>
  </li>
  <li>而當大環境是屬於高壓迴流，或是沒有明顯的天氣系統時，就不該談論到境外污染對臺灣的影響，因為此時境外污染的影響都是小於不到0.5成的情況；這樣的高污染原則上是發生在大環境、高壓迴流風場很弱的條件下，所以大部分的污染物或PM2.5來源都是臺灣本地排放，應該要把改善的著力點放在境內污染。</li>
</ul>

<h3 id="環境部官網">環境部官網</h3>

<p>首頁&gt;空品科普&gt;空品小百科&gt;臺灣空品時空特徵&gt;臺灣西部各地受地形與氣候影響的空氣品質特徵為何？(<a href="https://airtw.moenv.gov.tw/CHT/Encyclopedia/pedia08/pedia8_5.aspx">網站更新日期：2023-9-27</a>)</p>

<ul>
  <li>北部空品區
    <ul>
      <li>在季節轉換之際，大環境多為弱綜觀天氣型態，未受明顯天氣系統影響，風速偏弱，大氣較穩定加上盆地地形，擴散條件較差，污染物主要來自本土排放，影響時間稍長。</li>
      <li>夏天北部高污染天氣類型主要來自是西南季風和副熱帶高壓天氣型態，盛行風場為南風至西南風，污染物除來自本區域內排放，亦有中南部地區污染物往北部傳送，因為環境穩定度高，盆地地形也不利擴散，導致北部空品區空氣品質稍差，影響時間長。</li>
      <li>冬天在大陸冷高壓影響下，風向為東北風，風速較強勁，主要污染物多來自境外傳輸，影響時間較短，但污染物濃度較高。隨著高壓東移，轉為高壓迴流天氣型態，主要風向逐漸轉成東風，受北方境外污染影響變小，空氣品質才有機會逐漸好轉。</li>
    </ul>
  </li>
  <li>竹苗空品區
    <ul>
      <li>春秋時期，大環境為弱綜觀天氣型態，主要風向為東風，因境內較多丘陵山脈，且位於中央山脈背風面，污染物來自本土內的排放，擴散不利條件下，易堆積造成空污事件發生，持續時間偏長。</li>
      <li>夏天是西南氣流和副熱帶高壓天氣型態，主要風向以西南風、南風為主，污染物有往北傳送的現象，但境內多山脈丘陵，迎風面多降雨，因此污染事件發生不多。</li>
      <li>冬天因北方大陸冷高壓，主要風向以東北風為主，將雙北、桃園地區污染物向南運輸，若風速又更強勁，中國大陸霾害也會有影響。高壓迴流也是冬天常見天氣，風向逐漸轉成東風，然而，中南部污染物受到偏南風影響，污染物有北送現象，造成高污染事件發生，影響時間長。</li>
    </ul>
  </li>
  <li>中部空品區
    <ul>
      <li>春秋之際，大陸冷高壓活躍於中、高緯度地區，臺灣附近風向主要為東風，但由於中部空品區位於背風側，主要受海陸風影響，污染物主要來自本土排放，白天吹向內陸，晚上吹向沿海一帶，污染物持續累積，影響時間較長。</li>
      <li>夏天多為西南季風及副熱帶高壓天氣型態，南部平原污染物由南向北送，導致空污發生，但中部為迎風面有大量降雨可稀釋空氣污染物，因此影響時間較短。副熱帶高壓伴隨下沉氣流，空氣穩定、濕度小，加上中部大多為盆地，四周高山導致內陸污染物不利擴散，空污影響時間較長。</li>
      <li>冬天在大陸冷高壓和高壓迴流交替影響下，盛行風為東北風至東風。高壓迴流情況時，中部地區位於背風側伴隨氣流過山下沉氣流，平均風速較低，不利擴散，污染物主要來自本土地區排放。冬季東北風一波一波南下，期間則受到高壓迴流影響，空污持續時間較久。</li>
    </ul>
  </li>
  <li>雲嘉南空品區
    <ul>
      <li>雲嘉南空品區在春秋季節，以弱綜觀天氣型態為主，周圍風場為微弱東風和東南風，污染物主要來自本土排放，藉由白天盛行海風傳送至內陸，晚上由陸風吹回至平原一帶，污染物持續累積不利擴散，影響時間長。</li>
      <li>夏天多為西南季風和副熱帶高壓天氣型態，兩者主要風向為西南風，雲嘉南擴散條件佳，此外，夏天為中南部地區主要降雨季節，因此雲嘉南地區在夏季時空氣品質較好。</li>
      <li>當冬天吹拂東北季風時，雲嘉南空品區位於東北季風下風區，北方污染物隨著東北季風而南下，河川枯水期之揚塵亦會影響，導致容易發生高污染事件，污染物較易累積。高壓迴流天氣型態下，環境風場逐漸轉為東風至東南風，雲嘉南地區屬背風側，平均風速較低，降雨量也偏少，期間污染物主要來自本土地區排放，不利於污染物擴散，影響時間長。</li>
    </ul>
  </li>
  <li>高屏空品區
    <ul>
      <li>高屏空品區在春秋季節，冷暖交替變化，以弱綜觀天氣型態為主，周圍風場為微弱東風和東南風，污染物主要來自本土排放，藉由白天盛行海風傳送至內陸，晚上由陸風吹回至平原一帶，污染物持續累積不利擴散，影響時間長。</li>
      <li>夏天多為西南季風和副熱帶高壓天氣型態，兩者主要風向為西南風，高屏一帶擴散條件佳，污染物易向北傳送。此外，夏天亦為南部地區主要降雨季節，使得高屏地區夏季時，空氣品質較好。</li>
      <li>冬天，高屏位於東北季風尾流弱風區，北方污染物隨著東北季風而南下，河川枯水期之揚塵亦會影響，導致容易發生高污染事件。高壓迴流天氣型態下，環境風場逐漸轉為東風，高屏地區屬背風側，平均風速較低，降雨量也偏少，不利於污染物擴散，影響時間長。</li>
    </ul>
  </li>
</ul>

<h3 id="冬季的空品週期">冬季的空品週期</h3>

<p><a href="https://airtw.moenv.gov.tw/CHT/Encyclopedia/pedia08/pedia8_6.aspx">首頁&gt;空品科普&gt;空品小百科&gt;臺灣空品時空特徵&gt;冬季的空品週期</a></p>

<p>冬季的天氣型態依時序變化可分為:高壓影響、高壓出海、高壓迴流、鋒面通過</p>

<ul>
  <li>高壓影響
    <ul>
      <li>依高壓的強弱有時候會聽到寒流、大陸冷氣團等用詞，在相對影響範圍較廣的大陸冷高壓南下過程中，臺灣已開始受高壓邊緣影響，此時臺灣附近風向常為偏北風至東北風。當高壓中心移至北緯30度附近時，風向仍為偏北風至東北風，通常受冷高壓影響時風速較強。風速較強的區域，擴散條件較好，但是高屏地區因位於尾流弱風區，污染物易累積，導致大氣擴散不良，空氣品質常常較其他地區來得差。</li>
      <li>但若東北風伴隨境外污染物移入，則原擴散良好區域也可能發生高濃度空氣污染的現象。</li>
      <li>在相對影響範圍較廣的大陸冷高壓南下過程中，臺灣已開始受高壓邊緣影響，此時臺灣附近風向常為偏北風至東北風。當高壓中心移至北緯30度附近時，風向仍為偏北風至東北風，通常受冷高壓影響時風速較強</li>
    </ul>
  </li>
  <li>高壓出海並東移
    <ul>
      <li>當大陸冷高壓出海後，高壓中心持續向東移動的過程，影響臺灣地區之風場由東北風轉為偏東風。在偏東風吹拂下，由於中央山脈的阻隔，東風遇地形產生繞流，臺灣海峽上易產生背風渦旋。臺灣西半部位於背風面，天氣較為穩定，加上風速較弱，污染物容易在大氣中累積，不利擴散，因此西半部空氣品質普遍較差。</li>
      <li>當大陸冷高壓出海後，高壓中心持續向東移動的過程，影響臺灣地區之風場由東北風轉為偏東風。在偏東風吹拂下，由於中央山脈的阻隔，東風遇地形產生繞流，臺灣海峽上易產生背風渦旋</li>
    </ul>
  </li>
  <li>高壓迴流
    <ul>
      <li>當大陸冷高壓出海後，高壓中心繼續向東移動，影響臺灣地區之環流風場轉成東風至東南風。偏東風吹拂下，由於中央山脈的阻隔，風遇到地形產生繞流，臺灣海峽上易產生背風渦旋，因臺灣西半部位於背風面，受到氣流沉降作用影響，天氣較為穩定，加上風場微弱，污染物容易在大氣中累積，不利擴散。</li>
      <li>高壓迴流天氣型態主要發生於秋季至隔年春季，此期間因東北季風易將境外污染物一波波移入，使得臺灣附近空氣污染物濃度之背景值提升，而高壓迴流天氣型態又使大氣擴散條件不佳，因此每年 11 月至隔年 4 月有較多高污染事件發生。</li>
      <li>當大陸冷高壓出海後，高壓中心繼續向東移動，影響臺灣地區之環流風場轉成東風至東南風。偏東風吹拂下，由於中央山脈的阻隔，風遇到地形產生繞流</li>
    </ul>
  </li>
  <li>鋒面通過
    <ul>
      <li>鋒面通過或鋒面影響時易伴隨降雨現象，降雨有機會洗除空氣污染物，洗除程度須視降雨強度及降雨持續時間而定。</li>
      <li>當鋒面通過臺灣後，降雨趨緩，臺灣地區由暖區轉為冷區，氣溫下降，風向由偏南風轉為偏北風，風速較強，然而偏北風可能挾帶境外污染物南下影響臺灣，受境外污染物影響之區域及時段，使污染物濃度上升。這裡提到的氣溫下降，風向改變，其實就是受到開始高壓的影響啦，而天氣型態又繼續下一個周期的循環，影響著臺灣的天氣與空氣。</li>
    </ul>
  </li>
</ul>

<p><img src="https://airtw.moenv.gov.tw/images/pedia/pedia4_9_1.png" alt="" /></p>

<table>
  <thead>
    <tr>
      <th style="text-align: center"><img src="https://airtw.moenv.gov.tw/images/pedia/pedia4_9_2.png" alt="" /></th>
      <th style="text-align: center"><img src="https://airtw.moenv.gov.tw/images/pedia/pedia4_9_3.png" alt="" /></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">高壓影響</td>
      <td style="text-align: center">高壓出海並東移</td>
    </tr>
    <tr>
      <td style="text-align: center"><img src="https://airtw.moenv.gov.tw/images/pedia/pedia4_9_4.png" alt="" /></td>
      <td style="text-align: center"><img src="https://airtw.moenv.gov.tw/images/pedia/pedia4_9_5.png" alt="" /></td>
    </tr>
    <tr>
      <td style="text-align: center">高壓迴流</td>
      <td style="text-align: center">鋒面通過</td>
    </tr>
  </tbody>
</table>

<h2 id="天氣預報的機器學習">天氣預報的機器學習</h2>

<h3 id="短期高解析度極端預報">短期高解析度極端預報</h3>

<ul>
  <li>強降雨
    <ul>
      <li>Google DeepMind 機器學習進軍天氣預報，打敗傳統預測法(<a href="https://technews.tw/2021/10/14/deepmind-dgm-nowcasting-the-next-hour-of-rain/">愛范兒,2021 年 10 月 14 日 8:15科技新報</a>)
        <ul>
          <li>DeepMind 認為，為了使即時預報更有價值，必須提供準確預測，充分考慮不確定性，以及大雨預測有統計性顯著改善。同時天氣感測進步使高解析度雷達高頻率使用，往往每 5 分鐘一次、解析度為 1 公里。這些高品質數據為機器學習技術介入提供機會。</li>
          <li>DeepMind DGM 學習數據機率分佈，並曾基於 2016~2018 年英國雷達記錄的大量降雨事件資料庫訓練。之後可在單個輝達 V100 GPU 運行僅 1 秒多就提供即時預報。</li>
        </ul>
      </li>
      <li>利用觀測環境參數與機器學習預報大台北都會區的午後雷陣雨(<a href="https://www.es.ntnu.edu.tw/wp-content/uploads/2021/10/ESSSP2021書面報告_楊天瑞.pdf">楊天瑞、王重傑(2021) 臺師大地科系暑期學生專題研究</a>)
        <ul>
          <li>先分別分析測站資料、探空資料與是否有午後對流發生的相關係數(有午後個案天數當作 1，無午後個案計做 0)，將相關係數差的資料排除，以提高機器學習的效率。</li>
        </ul>
      </li>
    </ul>
  </li>
  <li>展小區域災害性天氣即時預報系統<a href="https://www.itdr.tw/dispPageBox/getFile/GetView.aspx?FileLocation=PJ-SITEVC%5CFiles%5CPrjFiles%5C199%5C&amp;FileFullName=精簡報告.pdf&amp;FileName=SR5975108630r7ubv.PDF">計畫編號：107-1502-02-17-03中央氣象局預報中心呂國臣</a></li>
</ul>

<h3 id="3天預報">3天預報</h3>

<ul>
  <li>林定宜(2009)台灣北部地區氣溫预報之物理過程探(<a href="https://photino.cwb.gov.tw/rdcweb/lib/cd/cd07mb/MB/PDF/48/No.1/48.1-04.pdf">氣象學報第48卷第1期pp59-81</a>)
    <ul>
      <li>本文主要探討台灣北部地區氣溫預報的物理過程。作者指出氣溫是決定天氣變化的重要因素之一，高低溫的預測也是天氣預報的重要項目。然而，過去國內對局地高低溫預測的研究較少且缺乏系統性的分析與整理，使得預報員在預測高低溫時沒有固定的流程可遵循。因此，本研究旨在使用現有的預報作業資源，通過統計分析、個案物理過程分析和預報原理，配合預報實務，使預報員能夠理解局地高低溫預測的基本技術和流程，減少誤差，並試圖建立高低溫預測的流程，作為日後預報員的參考。研究運用統計資料和探空資料，對不同天氣型態的個案進行研究，找出850hPa氣溫和地面日高低溫之相關性，以建立氣溫預報的概念模式。研究結果顯示不同氣象型態和不同台灣北部地區之間的地面溫度和850hPa溫度的差異。透過研究分析和實務經驗，本文歸納了一些氣溫預報的基本原則。總之，本文的主要目的是通過分析和研究台灣北部地區的氣溫預報物理過程，提高氣溫預報的準確性和可靠性。
        <h3 id="10天預報">10天預報</h3>
      </li>
    </ul>
  </li>
  <li>區域性中長期智慧降雨預報輔助土石災害預警系統之建構(<a href="https://tech.swcb.gov.tw/api/File/1893">胡明哲(2022)農委會水保局計畫編號111 保發-8.1-保-01-06-001(20)</a>)
    <ul>
      <li>利用 Windy 天氣預報（歐洲 ECMWF 模式、美國 GFS模式）之相關影像資料，結合臺灣本島之降雨氣象雷達觀測資訊、既有雨量站歷史降雨資料（可應用於土石流濳勢溪流影響範圍與大規模崩塌濳勢區影響範圍），利用深度學習模式 CNN、RNN 以及 LSTM，建立中期數值天氣預報、雷達觀測、與降雨預測之人工智慧深度學習模式，</li>
      <li>針對易發生土石災害的重點地區，提供短至中長期的降雨預報資訊，以期達到爭取防災操作時間、未來十日土石災害預警。</li>
    </ul>
  </li>
  <li>Google釋出全球天氣模型預報基準WeatherBench 2，推動機器學習氣象應用發展(<a href="https://www.ithome.com.tw/news/158548">ithome李建興2023-09-01發表</a>)</li>
  <li>颱風梅雨天氣守視與防災<a href="https://246.swcb.gov.tw/Content/WebCourse/27/颱風梅雨天氣守視與防災.pdf">蒲金標</a></li>
  <li>葉天降 滕春慈 黃麗玫 馮欽賜 張庭槐(2012)中央氣象局數值天氣預報作業系統(一)歷史演進<a href="https://photino.cwb.gov.tw/rdcweb/lib/cd/cd07mb/4804_web/MB_48-4_forWeb-4.pdf">氣象學報第48卷第4期pp53~68</a></li>
  <li>葉天降、馮欽賜、柳再明、陳得松、黃康寧、陳雯美、汪鳳如、洪景山(2012)中央氣象局數值天氣預報作業系統(二)預報模式概況<a href="https://photino.cwb.gov.tw/rdcweb/lib/cd/cd07mb/MB/PDF/48/No.4/48-4_5.pdf">氣象學報第48卷第4期pp53~68</a></li>
</ul>

<h3 id="長期預報">長期預報</h3>

<ul>
  <li>劉復誠(1990)中央氣象局長期天氣預報之綜合評介<a href="https://photino.cwb.gov.tw/rdcweb/lib/cd/cd07mb/MB/PDF/36/No.1/03.pdf">氣象學報第三十六卷第一期pp35~52</a></li>
  <li>俞家忠(2004)台灣地區春季綜觀尺度天氣預報指引之研究 - 中央氣象局<a href="https://photino.cwb.gov.tw/rdcweb/lib/cd/cd03cons/compilation/2004a/10.pdf">MOTC-CWB-93-2M-10</a>
    <ul>
      <li></li>
    </ul>
  </li>
</ul>
<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:1" role="doc-endnote">
      <p>楊宏宇，1993。臺灣地區空氣品質與天氣類型分類相關性研究。文化大學地學研究所博士論文，台北市。 <a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:2" role="doc-endnote">
      <p>李清勝、俞家忠、王天胤，1997：導致台灣地區高污染之氣象分析與預報，環保署研究報告 EPA-86-E3L1-09-01。 <a href="#fnref:2" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:3" role="doc-endnote">
      <p>Chuang, M.T., Lee, C.T., Chiang, P.C., Wang, C.F., Chang, Y.Y., 2008. The effects of synoptical weather pattern and complex terrain on the formation of aerosol events in the greater Taipei area. Science of the Total Environment, 399, 128-146. <a href="#fnref:3" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:4" role="doc-endnote">
      <p>Hsu, C.H., Cheng, F.Y., 2016. Classification of weather patterns to study the influence of meteorological characteristics on PM2.5 concentrations in Yunlin County, Taiwan. Atmospheric Environment 144, 397-408. <a href="#fnref:4" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:5" role="doc-endnote">
      <p>Hsu, C.H., Cheng, F.Y., 2019. Synoptic weather patterns and associated air pollution in Taiwan. Aerosol and Air Quality Research 19, 1139-1151. <a href="#fnref:5" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:6" role="doc-endnote">
      <p>Lai, L,W., 2015. Fine particulate matter events associated with synoptic weather patterns, long-range transport paths and mixing height in the Taipei Basin, Taiwan. Atmospheric Environment 113, 50-62. <a href="#fnref:6" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>]]></content><author><name>yckuang</name><email>sinotec2@gmail.com</email></author><category term="WRF" /><category term="airquality" /><summary type="html"><![CDATA[背景 好發空氣污染的天氣類型、境外可能來源軌跡類別、本地空氣動力特性等等定性研究，已經非常充分多元了，但如何將這些定性的原則，列成客觀的數據關係(topology)，則是機器學習、乃至於空氣污染AI預報的關鍵因素。 污染的天氣類型研究成果網頁資訊 莊銘棟研究副技師 【專欄】從氣象播報預測空氣污染物高濃度事件 | 數理科學, 漫步科研, 科普專欄 作者 ／ 莊銘棟研究副技師（中研院院環境變遷研究中心2022-12-29） 天氣類型研究在臺灣 早在 1993 年，學者1就歸納出天氣預報的 24 種天氣類型，並探討這 24 種天氣類型與臺灣空氣品質的相關性分析，其中有 7 種污染天氣類型可適用空氣污染潛勢預報，分別是： 冬季高壓迴流污染型、 夏季高壓迴流污染型、 夏季低壓迴流污染型、 微弱低壓梯度污染型、 鋒面前緣污染型、 鋒面通過污染型及 熱帶低壓污染型。 後來，學者李清勝等（1997）2將天氣類型擴展至 51 種，由於該研究是環保署委託執行的計畫，因此他們分類的天氣類型是提供環保署的人員可以學習並判斷是否會形成空氣污染事件日，這種方法稱為「類比法」，簡單來說，你只要背熟這 51 種天氣類型，將氣象播報的天氣圖去對比 51 種天氣類型，哪一種最像你要對比的天氣預測圖，就可以有效預測未來是否會發生空氣污染事件日。但是後來這 51 種天氣類型並沒有被持續使用。 2008 年，Chuang et al.3針對大臺北地區，將這些複雜的天氣類型分類，根據形成 PM2.5 事件的大氣動力學原理而予以簡化分為七種類型，其中 亞洲大陸高壓迴流（HPPC）、亞洲大陸高壓冷鋒前暖區（WAF）、颱風（TYP）、太平洋高壓西伸（PHP）以及微弱西南氣流（WSW）五種類型與複雜地形的影響有關， 其他兩類型分別為微弱高壓籠罩型（WHP）及亞州大陸高壓推擠型（HPP）。 (編按中央大學鄭芳宜教授團隊也發表台灣地區污染的天氣類型4、5) Lai et al.（2015）6針對 PM2.5 也歸納出 9 種天氣類型以及 2 種混和型。 而最近，我們又將 Chuang et al.（2008）的七種擴展為 11 種 PM2.5 及 O3 的污染天氣類型，這 11 種 污染天氣類型列示如表 1。以上的研究，皆需要每天的天氣圖一張一張的審視，一張一張的判別，都是非常耗費時間的研究。 Su, S.H., Chang, C.W., Chen, W.T., 2020. The temporal evolution of PM2.5 pollution events in Taiwan: Clustering and the association with synoptic weather. Atmosphere 11, 1265. 鄭芳宜教授專訪 source 風險社會與政策研究中心風險社會與政策研究中心(2019/10/30) 【採訪紀實】從大氣科學看空污：PM2.5的「季節性」與「地域性」 臺灣常碰到的大氣情況，粗分為三種：高壓迴流型、弱綜觀、東北季風型 高壓迴流是指高壓離開臺灣，但是環境風場繞回臺灣、西半部又處在背風面的情況；另外也會預期下一波的天氣系統，可能鋒面又會一波波地影響臺灣。 在下一波鋒面還沒有開始影響、前一波冷高壓系統遠離臺灣的時候，附近沒有什麼明顯的天氣系統，整個環境會變得很弱，定義為弱綜觀。 當風較強時，會把臺灣些污染物帶走，但也有可能把境外的污染物帶進臺灣，所以東北季風可能是一種境內夾雜著境外污染的問題；當冷高壓系統遠離臺灣轉為高壓迴流或是弱綜觀的時候，就可以預期空品會越來越糟，因為整個環境的風場變弱了。 根據臺灣過去40年大氣的數據，我們的風確實減弱了，這與氣候變遷導致空污變得嚴重有關聯嗎？ 確實除了風減弱之外，發現大氣變得更穩定， 極端穩定，會造成空品非常不好 秋冬季節時，境外與境內污染對臺灣空污的問題，尤其是PM2.5的占比是逐年遞增還是遞減的趨勢？境外與境內各占比多少？ 根據2018年一篇針對2010年到2017年中國排放量的分析文獻指出，硫氧化物降低超過6成、氮氧化物也有超過2成降低。 在我們的研究上也做了10年左右的境外污染資料分析，以近3年來看境外污染的事件比起10年前少了超過10次。 而境內污染，有時空污的嚴重多半是臺灣本地所造成的。同樣回歸到天氣的角度來看境內問題，當大環境是東北季風的條件下，可以去了解這個時間點境內、境外的占比是多少，至於境外污染的嚴重程度，北部空品區受到境外污染影響時可能可以達到7成，但在不嚴重的條件下，境外污染可能只有1成或2成，取決於大氣變動。 而當大環境是屬於高壓迴流，或是沒有明顯的天氣系統時，就不該談論到境外污染對臺灣的影響，因為此時境外污染的影響都是小於不到0.5成的情況；這樣的高污染原則上是發生在大環境、高壓迴流風場很弱的條件下，所以大部分的污染物或PM2.5來源都是臺灣本地排放，應該要把改善的著力點放在境內污染。 環境部官網 首頁&gt;空品科普&gt;空品小百科&gt;臺灣空品時空特徵&gt;臺灣西部各地受地形與氣候影響的空氣品質特徵為何？(網站更新日期：2023-9-27) 北部空品區 在季節轉換之際，大環境多為弱綜觀天氣型態，未受明顯天氣系統影響，風速偏弱，大氣較穩定加上盆地地形，擴散條件較差，污染物主要來自本土排放，影響時間稍長。 夏天北部高污染天氣類型主要來自是西南季風和副熱帶高壓天氣型態，盛行風場為南風至西南風，污染物除來自本區域內排放，亦有中南部地區污染物往北部傳送，因為環境穩定度高，盆地地形也不利擴散，導致北部空品區空氣品質稍差，影響時間長。 冬天在大陸冷高壓影響下，風向為東北風，風速較強勁，主要污染物多來自境外傳輸，影響時間較短，但污染物濃度較高。隨著高壓東移，轉為高壓迴流天氣型態，主要風向逐漸轉成東風，受北方境外污染影響變小，空氣品質才有機會逐漸好轉。 竹苗空品區 春秋時期，大環境為弱綜觀天氣型態，主要風向為東風，因境內較多丘陵山脈，且位於中央山脈背風面，污染物來自本土內的排放，擴散不利條件下，易堆積造成空污事件發生，持續時間偏長。 夏天是西南氣流和副熱帶高壓天氣型態，主要風向以西南風、南風為主，污染物有往北傳送的現象，但境內多山脈丘陵，迎風面多降雨，因此污染事件發生不多。 冬天因北方大陸冷高壓，主要風向以東北風為主，將雙北、桃園地區污染物向南運輸，若風速又更強勁，中國大陸霾害也會有影響。高壓迴流也是冬天常見天氣，風向逐漸轉成東風，然而，中南部污染物受到偏南風影響，污染物有北送現象，造成高污染事件發生，影響時間長。 中部空品區 春秋之際，大陸冷高壓活躍於中、高緯度地區，臺灣附近風向主要為東風，但由於中部空品區位於背風側，主要受海陸風影響，污染物主要來自本土排放，白天吹向內陸，晚上吹向沿海一帶，污染物持續累積，影響時間較長。 夏天多為西南季風及副熱帶高壓天氣型態，南部平原污染物由南向北送，導致空污發生，但中部為迎風面有大量降雨可稀釋空氣污染物，因此影響時間較短。副熱帶高壓伴隨下沉氣流，空氣穩定、濕度小，加上中部大多為盆地，四周高山導致內陸污染物不利擴散，空污影響時間較長。 冬天在大陸冷高壓和高壓迴流交替影響下，盛行風為東北風至東風。高壓迴流情況時，中部地區位於背風側伴隨氣流過山下沉氣流，平均風速較低，不利擴散，污染物主要來自本土地區排放。冬季東北風一波一波南下，期間則受到高壓迴流影響，空污持續時間較久。 雲嘉南空品區 雲嘉南空品區在春秋季節，以弱綜觀天氣型態為主，周圍風場為微弱東風和東南風，污染物主要來自本土排放，藉由白天盛行海風傳送至內陸，晚上由陸風吹回至平原一帶，污染物持續累積不利擴散，影響時間長。 夏天多為西南季風和副熱帶高壓天氣型態，兩者主要風向為西南風，雲嘉南擴散條件佳，此外，夏天為中南部地區主要降雨季節，因此雲嘉南地區在夏季時空氣品質較好。 當冬天吹拂東北季風時，雲嘉南空品區位於東北季風下風區，北方污染物隨著東北季風而南下，河川枯水期之揚塵亦會影響，導致容易發生高污染事件，污染物較易累積。高壓迴流天氣型態下，環境風場逐漸轉為東風至東南風，雲嘉南地區屬背風側，平均風速較低，降雨量也偏少，期間污染物主要來自本土地區排放，不利於污染物擴散，影響時間長。 高屏空品區 高屏空品區在春秋季節，冷暖交替變化，以弱綜觀天氣型態為主，周圍風場為微弱東風和東南風，污染物主要來自本土排放，藉由白天盛行海風傳送至內陸，晚上由陸風吹回至平原一帶，污染物持續累積不利擴散，影響時間長。 夏天多為西南季風和副熱帶高壓天氣型態，兩者主要風向為西南風，高屏一帶擴散條件佳，污染物易向北傳送。此外，夏天亦為南部地區主要降雨季節，使得高屏地區夏季時，空氣品質較好。 冬天，高屏位於東北季風尾流弱風區，北方污染物隨著東北季風而南下，河川枯水期之揚塵亦會影響，導致容易發生高污染事件。高壓迴流天氣型態下，環境風場逐漸轉為東風，高屏地區屬背風側，平均風速較低，降雨量也偏少，不利於污染物擴散，影響時間長。 冬季的空品週期 首頁&gt;空品科普&gt;空品小百科&gt;臺灣空品時空特徵&gt;冬季的空品週期 冬季的天氣型態依時序變化可分為:高壓影響、高壓出海、高壓迴流、鋒面通過 高壓影響 依高壓的強弱有時候會聽到寒流、大陸冷氣團等用詞，在相對影響範圍較廣的大陸冷高壓南下過程中，臺灣已開始受高壓邊緣影響，此時臺灣附近風向常為偏北風至東北風。當高壓中心移至北緯30度附近時，風向仍為偏北風至東北風，通常受冷高壓影響時風速較強。風速較強的區域，擴散條件較好，但是高屏地區因位於尾流弱風區，污染物易累積，導致大氣擴散不良，空氣品質常常較其他地區來得差。 但若東北風伴隨境外污染物移入，則原擴散良好區域也可能發生高濃度空氣污染的現象。 在相對影響範圍較廣的大陸冷高壓南下過程中，臺灣已開始受高壓邊緣影響，此時臺灣附近風向常為偏北風至東北風。當高壓中心移至北緯30度附近時，風向仍為偏北風至東北風，通常受冷高壓影響時風速較強 高壓出海並東移 當大陸冷高壓出海後，高壓中心持續向東移動的過程，影響臺灣地區之風場由東北風轉為偏東風。在偏東風吹拂下，由於中央山脈的阻隔，東風遇地形產生繞流，臺灣海峽上易產生背風渦旋。臺灣西半部位於背風面，天氣較為穩定，加上風速較弱，污染物容易在大氣中累積，不利擴散，因此西半部空氣品質普遍較差。 當大陸冷高壓出海後，高壓中心持續向東移動的過程，影響臺灣地區之風場由東北風轉為偏東風。在偏東風吹拂下，由於中央山脈的阻隔，東風遇地形產生繞流，臺灣海峽上易產生背風渦旋 高壓迴流 當大陸冷高壓出海後，高壓中心繼續向東移動，影響臺灣地區之環流風場轉成東風至東南風。偏東風吹拂下，由於中央山脈的阻隔，風遇到地形產生繞流，臺灣海峽上易產生背風渦旋，因臺灣西半部位於背風面，受到氣流沉降作用影響，天氣較為穩定，加上風場微弱，污染物容易在大氣中累積，不利擴散。 高壓迴流天氣型態主要發生於秋季至隔年春季，此期間因東北季風易將境外污染物一波波移入，使得臺灣附近空氣污染物濃度之背景值提升，而高壓迴流天氣型態又使大氣擴散條件不佳，因此每年 11 月至隔年 4 月有較多高污染事件發生。 當大陸冷高壓出海後，高壓中心繼續向東移動，影響臺灣地區之環流風場轉成東風至東南風。偏東風吹拂下，由於中央山脈的阻隔，風遇到地形產生繞流 鋒面通過 鋒面通過或鋒面影響時易伴隨降雨現象，降雨有機會洗除空氣污染物，洗除程度須視降雨強度及降雨持續時間而定。 當鋒面通過臺灣後，降雨趨緩，臺灣地區由暖區轉為冷區，氣溫下降，風向由偏南風轉為偏北風，風速較強，然而偏北風可能挾帶境外污染物南下影響臺灣，受境外污染物影響之區域及時段，使污染物濃度上升。這裡提到的氣溫下降，風向改變，其實就是受到開始高壓的影響啦，而天氣型態又繼續下一個周期的循環，影響著臺灣的天氣與空氣。 高壓影響 高壓出海並東移 高壓迴流 鋒面通過 天氣預報的機器學習 短期高解析度極端預報 強降雨 Google DeepMind 機器學習進軍天氣預報，打敗傳統預測法(愛范兒,2021 年 10 月 14 日 8:15科技新報) DeepMind 認為，為了使即時預報更有價值，必須提供準確預測，充分考慮不確定性，以及大雨預測有統計性顯著改善。同時天氣感測進步使高解析度雷達高頻率使用，往往每 5 分鐘一次、解析度為 1 公里。這些高品質數據為機器學習技術介入提供機會。 DeepMind DGM 學習數據機率分佈，並曾基於 2016~2018 年英國雷達記錄的大量降雨事件資料庫訓練。之後可在單個輝達 V100 GPU 運行僅 1 秒多就提供即時預報。 利用觀測環境參數與機器學習預報大台北都會區的午後雷陣雨(楊天瑞、王重傑(2021) 臺師大地科系暑期學生專題研究) 先分別分析測站資料、探空資料與是否有午後對流發生的相關係數(有午後個案天數當作 1，無午後個案計做 0)，將相關係數差的資料排除，以提高機器學習的效率。 展小區域災害性天氣即時預報系統計畫編號：107-1502-02-17-03中央氣象局預報中心呂國臣 3天預報 林定宜(2009)台灣北部地區氣溫预報之物理過程探(氣象學報第48卷第1期pp59-81) 本文主要探討台灣北部地區氣溫預報的物理過程。作者指出氣溫是決定天氣變化的重要因素之一，高低溫的預測也是天氣預報的重要項目。然而，過去國內對局地高低溫預測的研究較少且缺乏系統性的分析與整理，使得預報員在預測高低溫時沒有固定的流程可遵循。因此，本研究旨在使用現有的預報作業資源，通過統計分析、個案物理過程分析和預報原理，配合預報實務，使預報員能夠理解局地高低溫預測的基本技術和流程，減少誤差，並試圖建立高低溫預測的流程，作為日後預報員的參考。研究運用統計資料和探空資料，對不同天氣型態的個案進行研究，找出850hPa氣溫和地面日高低溫之相關性，以建立氣溫預報的概念模式。研究結果顯示不同氣象型態和不同台灣北部地區之間的地面溫度和850hPa溫度的差異。透過研究分析和實務經驗，本文歸納了一些氣溫預報的基本原則。總之，本文的主要目的是通過分析和研究台灣北部地區的氣溫預報物理過程，提高氣溫預報的準確性和可靠性。 10天預報 區域性中長期智慧降雨預報輔助土石災害預警系統之建構(胡明哲(2022)農委會水保局計畫編號111 保發-8.1-保-01-06-001(20)) 利用 Windy 天氣預報（歐洲 ECMWF 模式、美國 GFS模式）之相關影像資料，結合臺灣本島之降雨氣象雷達觀測資訊、既有雨量站歷史降雨資料（可應用於土石流濳勢溪流影響範圍與大規模崩塌濳勢區影響範圍），利用深度學習模式 CNN、RNN 以及 LSTM，建立中期數值天氣預報、雷達觀測、與降雨預測之人工智慧深度學習模式， 針對易發生土石災害的重點地區，提供短至中長期的降雨預報資訊，以期達到爭取防災操作時間、未來十日土石災害預警。 Google釋出全球天氣模型預報基準WeatherBench 2，推動機器學習氣象應用發展(ithome李建興2023-09-01發表) 颱風梅雨天氣守視與防災蒲金標 葉天降 滕春慈 黃麗玫 馮欽賜 張庭槐(2012)中央氣象局數值天氣預報作業系統(一)歷史演進氣象學報第48卷第4期pp53~68 葉天降、馮欽賜、柳再明、陳得松、黃康寧、陳雯美、汪鳳如、洪景山(2012)中央氣象局數值天氣預報作業系統(二)預報模式概況氣象學報第48卷第4期pp53~68 長期預報 劉復誠(1990)中央氣象局長期天氣預報之綜合評介氣象學報第三十六卷第一期pp35~52 俞家忠(2004)台灣地區春季綜觀尺度天氣預報指引之研究 - 中央氣象局MOTC-CWB-93-2M-10 楊宏宇，1993。臺灣地區空氣品質與天氣類型分類相關性研究。文化大學地學研究所博士論文，台北市。 &#8617; 李清勝、俞家忠、王天胤，1997：導致台灣地區高污染之氣象分析與預報，環保署研究報告 EPA-86-E3L1-09-01。 &#8617; Chuang, M.T., Lee, C.T., Chiang, P.C., Wang, C.F., Chang, Y.Y., 2008. The effects of synoptical weather pattern and complex terrain on the formation of aerosol events in the greater Taipei area. Science of the Total Environment, 399, 128-146. &#8617; Hsu, C.H., Cheng, F.Y., 2016. Classification of weather patterns to study the influence of meteorological characteristics on PM2.5 concentrations in Yunlin County, Taiwan. Atmospheric Environment 144, 397-408. &#8617; Hsu, C.H., Cheng, F.Y., 2019. Synoptic weather patterns and associated air pollution in Taiwan. Aerosol and Air Quality Research 19, 1139-1151. &#8617; Lai, L,W., 2015. Fine particulate matter events associated with synoptic weather patterns, long-range transport paths and mixing height in the Taipei Basin, Taiwan. Atmospheric Environment 113, 50-62. &#8617;]]></summary></entry><entry><title type="html">FastChat的裝置與應用</title><link href="https://sinotec2.github.io/FAQ/2023/09/05/FastChat.html" rel="alternate" type="text/html" title="FastChat的裝置與應用" /><published>2023-09-05T00:00:00+08:00</published><updated>2023-09-05T00:00:00+08:00</updated><id>https://sinotec2.github.io/FAQ/2023/09/05/FastChat</id><content type="html" xml:base="https://sinotec2.github.io/FAQ/2023/09/05/FastChat.html"><![CDATA[<h2 id="背景">背景</h2>

<ul>
  <li><a href="https://github.com/SkywalkerDarren/chatWeb" title="SkywalkerDarren(2022) ChatWeb 可以抓取任何網頁或從 PDF、DOCX、TXT 文件中提取文本，並生成嵌入式摘要。 它還可以根據文本內容回答您的問題。 它是使用基於gpt3.5的chatAPI和embeddingAPI以及向量數據庫來實現的。">chatWeb</a>安裝在<a href="http://200.200.31.47:7860/">node03:7860</a>之後，對模型的核心計算使用別人的機器，總覺得有點過意不去，希望能用自己的機器來執行全套系統看看，畢竟還是要了解整個布建需要哪些軟/硬體。就去發現了<a href="https://lmsys.org/about/" title="Large Model Systems Organization (LMSYS Org)開放研究組織。該組織由UC Berkeley的學生和教職員與UCSD和CMU合作創立。他們的目標是通過共同開發開放模型、數據集、系統和評估工具，使大型模型對每個人都可用。他們的工作涉及機器學習和系統的研究。他們訓練大型語言模型並使其廣泛可用，同時開發分佈式系統來加速模型的訓練和推理。該組織的成員包括UC Berkeley、UCSD、CMU和MBZUAI等機構的學生和教職員。">lmsys</a>在2023/4月公開的這套<a href="https://github.com/lm-sys/FastChat" title="FastChat 是一個開放平台，用於訓練、服務和評估基於大型語言模型的聊天機器人。 核心功能包括：最先進模型（例如 Vicuna）的權重、訓練代碼和評估代碼，以及具有 Web UI 和 OpenAI 兼容 RESTful API 的分佈式多模型服務系統。">FastChat</a>。</li>
  <li>除了<a href="https://github.com/lm-sys/FastChat" title="FastChat 是一個開放平台，用於訓練、服務和評估基於大型語言模型的聊天機器人。 核心功能包括：最先進模型（例如 Vicuna）的權重、訓練代碼和評估代碼，以及具有 Web UI 和 OpenAI 兼容 RESTful API 的分佈式多模型服務系統。">官網</a>之外，另有不多的中文介紹，如<知乎>網友[薛定谔的皮丘(2023/08)][9][^2]以及[Hok(2023/04)][10][^3]，想讀中文介紹的讀者也可以去訪問他們的筆記。</知乎></li>
  <li>這裡除了留存一些技術心得以外，併同前面<a href="https://github.com/SkywalkerDarren/chatWeb" title="SkywalkerDarren(2022) ChatWeb 可以抓取任何網頁或從 PDF、DOCX、TXT 文件中提取文本，並生成嵌入式摘要。 它還可以根據文本內容回答您的問題。 它是使用基於gpt3.5的chatAPI和embeddingAPI以及向量數據庫來實現的。">chatWeb</a>的經驗想法，也對未來語言模型在局地的應用架構有些總結。</li>
  <li>落地實例可以點選<a href="http://200.200.32.195:55081" title="⚔️ Chatbot Arena ⚔️ : Benchmarking LLMs in the Wild on the DEVP workstation">這裡</a>(公司內網)。</li>
</ul>

<h3 id="lmsys簡介">lmsys簡介</h3>

<ul>
  <li><a href="https://lmsys.org/about/" title="Large Model Systems Organization (LMSYS Org)開放研究組織。該組織由UC Berkeley的學生和教職員與UCSD和CMU合作創立。他們的目標是通過共同開發開放模型、數據集、系統和評估工具，使大型模型對每個人都可用。他們的工作涉及機器學習和系統的研究。他們訓練大型語言模型並使其廣泛可用，同時開發分佈式系統來加速模型的訓練和推理。該組織的成員包括UC Berkeley、UCSD、CMU和MBZUAI等機構的學生和教職員。">lmsys</a>這個由美國學術界組成的開放研究組織，除了來自於頂尖的3所大學(UC Berkeley, UCSD and CMU)的研究師生之外，主要的功能在建構一個大型語言模型的競賽擂台<a href="https://chat.lmsys.org/?arena" title="⚔️Chatbot Arena ⚔️ : Benchmarking LLMs in the Wild">ChatBot Arena</a>，讓有興趣挑戰的同儕，可以在此鍛鍊進步。</li>
  <li>該擂台所使用的模型都是目前私人公司與開放領域發展最新的語言模型，模型推理計算使用該機構的GPU，擂台的界面程式則是此處要引進的這套<a href="https://github.com/lm-sys/FastChat" title="FastChat 是一個開放平台，用於訓練、服務和評估基於大型語言模型的聊天機器人。 核心功能包括：最先進模型（例如 Vicuna）的權重、訓練代碼和評估代碼，以及具有 Web UI 和 OpenAI 兼容 RESTful API 的分佈式多模型服務系統。">FastChat</a>。</li>
  <li><a href="https://chat.lmsys.org/?arena" title="⚔️Chatbot Arena ⚔️ : Benchmarking LLMs in the Wild">ChatBot Arena</a>的排行榜公開在<a href="https://zh.wikipedia.org/zh-tw/Hugging_Face" title="Hugging Face是一家美國公司，專門開發用於構建機器學習應用的工具。該公司的代表產品是其為自然語言處理應用構建的transformers庫，以及允許使用者共享機器學習模型和資料集的平台">HuggingFace</a>的平台空間<a href="https://huggingface.co/spaces/lmsys/chatbot-arena-leaderboard" title="Leaderboard/該排行榜基於以下三個基準。(1)Chatbot Arena - 眾包、隨機的戰鬥平台。 我們使用 50K+ 用戶投票來計算 Elo 評級。(2)MT-Bench - 一組具有挑戰性的多回合問題。 我們使用 GPT-4 對模型響應進行評分。(3)MMLU (5-shot) - 衡量模型在 57 項任務上的多任務準確性的測試。">lmsys/chatbot-arena-leaderboard</a>。</li>
  <li>最新一版比試結果公開在<a href="https://doi.org/10.48550/arXiv.2306.05685" title="Zheng, L., Chiang, W.-L., Sheng, Y., Zhuang, S., Wu, Z., Zhuang, Y., Lin, Z., Li, Z., Li, D., Xing, E.P., Zhang, H., Gonzalez, J.E., Stoica, I. (2023). **Judging LLM-as-a-judge with MT-Bench and Chatbot Arena**.">arXiv(2023/06)</a><sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup>，第1名為GPT4，前5名全為私人單位發展知產品。</li>
</ul>

<h3 id="fastchat簡介">FastChat簡介</h3>

<p><a href="https://github.com/lm-sys/FastChat" title="FastChat 是一個開放平台，用於訓練、服務和評估基於大型語言模型的聊天機器人。 核心功能包括：最先進模型（例如 Vicuna）的權重、訓練代碼和評估代碼，以及具有 Web UI 和 OpenAI 兼容 RESTful API 的分佈式多模型服務系統。">FastChat</a>界面獲得2萬7千多個github好評。依據其原版修訂應用版本有3千多個。由145個作者共同貢獻。核心功能包括多模型服務系統、API、評估工具等，其特色有下列幾點(by <a href="https://github.com/SkywalkerDarren/chatWeb" title="SkywalkerDarren(2022) ChatWeb 可以抓取任何網頁或從 PDF、DOCX、TXT 文件中提取文本，並生成嵌入式摘要。 它還可以根據文本內容回答您的問題。 它是使用基於gpt3.5的chatAPI和embeddingAPI以及向量數據庫來實現的。">chatWeb</a>)</p>

<ul>
  <li>多模型服務系統的特色包括：
    <ul>
      <li>支援多種模型：該系統支援多種模型，包括LLama 2、Vicuna、Alpaca、Baize、ChatGLM、Dolly、Falcon、FastChat-T5、GPT4ALL、Guanaco、MTP、OpenAssistant、RedPajama、StableLM、WizardLM等等。</li>
      <li>分散式服務：該系統是一個分散式的多模型服務系統，可以同時運行多個模型。</li>
      <li>支援多種平台：該系統支援多種平台，包括CPU、GPU、Intel XPU、Metal Backend等，並提供了相應的指令和配置方式。</li>
      <li>高效性能：該系統通過優化和分佈式架構，提供了高效的模型服務性能，能夠處理大量的用戶請求。</li>
      <li>易於使用：該系統提供了詳細的安裝和使用文檔，用戶可以根據文檔進行快速部署和配置。</li>
    </ul>
  </li>
  <li>API：該系統提供了網頁界面和OpenAI兼容的RESTful API，方便用戶進行模型服務和交換。可以像openAI一樣，經提供token後，使用雲端服務業者所提供的推理計算資源。</li>
  <li>“評估工具”的特色如下：
    <ul>
      <li>使用MT-bench進行評估：評估工具使用MT-bench，一組具有挑戰性的多輪開放式問題，來評估模型的品質。</li>
      <li>自動化評估流程：評估工具使用強大的LLM（如GPT-4）作為評判，自動評估模型的回答品質。</li>
      <li>提供指導：評估工具提供了運行MT-bench的指示，以及使用fastchat/llm_judge進行評估的指示。</li>
    </ul>
  </li>
</ul>

<h3 id="fastchat架構">FastChat架構</h3>

<ul>
  <li>以下說明為<a href="https://github.com/SkywalkerDarren/chatWeb" title="SkywalkerDarren(2022) ChatWeb 可以抓取任何網頁或從 PDF、DOCX、TXT 文件中提取文本，並生成嵌入式摘要。 它還可以根據文本內容回答您的問題。 它是使用基於gpt3.5的chatAPI和embeddingAPI以及向量數據庫來實現的。">chatWeb</a>執行結果</li>
  <li><code class="language-plaintext highlighter-rouge">fastchat.serve.controller</code>
    <ul>
      <li>“<code class="language-plaintext highlighter-rouge">fastchat.serve.controller</code>“是FastChat中的一個模組，它的功能是管理分散式的模型工作器(<code class="language-plaintext highlighter-rouge">model worker</code>)。</li>
      <li>模型工作器是負責托管一個或多個模型的服務器，而控制器則負責協調這些模型工作器和與用戶交互的Web服務器之間的通信。控制器管理模型工作器的註冊、分配請求給適當的模型工作器以進行處理，並將結果返回給用戶UI。</li>
      <li>簡而言之，”<code class="language-plaintext highlighter-rouge">fastchat.serve.controller</code>“的功能是管理和協調FastChat中的模型工作器，以實現分散式的多模型服務。</li>
    </ul>
  </li>
  <li><code class="language-plaintext highlighter-rouge">fastchat.serve.model_worker</code>
    <ul>
      <li>用於大型語言模型的聊天機器人訓練、提供服務和評估。為最耗費計算資源的部分。</li>
      <li>它是FastChat的核心組件之一，負責承擔模型的運算和處理輸入輸出。</li>
      <li>可以使用任何形式的計算資源，包括遠端或局地CPU、GPU、Intel XPU、Metal Backend等等。</li>
      <li>模型工作器（<code class="language-plaintext highlighter-rouge">model_worker</code>）通常與FastChat的控制器（<code class="language-plaintext highlighter-rouge">controller</code>）一起使用。</li>
    </ul>
  </li>
  <li><code class="language-plaintext highlighter-rouge">fastchat.serve.gradio_web_server</code>(<code class="language-plaintext highlighter-rouge">server_multi</code>)
    <ul>
      <li>啟動一個單單/多標籤的Gradio伺服器，其中包括Chatbot Arena的標籤。</li>
      <li>web_server單模式版本：與一般chatbot並沒有太大的差異。可調整temperature及topP等2個參數值。</li>
      <li>多模式版本(<code class="language-plaintext highlighter-rouge">server_multi</code>)：這個功能可以讓你在網頁上同時展示多個模型，並與這些模型進行對話。</li>
    </ul>
  </li>
</ul>

<h2 id="ip-and-portal-arrangements">ip and portal arrangements</h2>

<h3 id="3個埠的關係">3個埠的關係</h3>

<p><a href="https://github.com/lm-sys/FastChat" title="FastChat 是一個開放平台，用於訓練、服務和評估基於大型語言模型的聊天機器人。 核心功能包括：最先進模型（例如 Vicuna）的權重、訓練代碼和評估代碼，以及具有 Web UI 和 OpenAI 兼容 RESTful API 的分佈式多模型服務系統。">FastChat</a>會需要3個埠(不能重複。如不給定，三支程式內設都會是21001，只能用一次)</p>

<ol>
  <li>控制埠( $addc=http://${ip}:21001內設)，搭配controller-address(作業埠需要)/controller-url(UI埠需要)之引數</li>
  <li>作業埠( $add=http://${ip}:$port)。引數worker-address只需設定一次。</li>
  <li>UI埠( $addu=http://${ip}:$port1)，為使用者最後看到的界面。</li>
</ol>

<p>安裝與其餘設定詳見<a href="https://github.com/jondurbin/FastChat">jondurbin/FastChat</a>。此處詳解devp(ip=200.200.32.195)上的啟動方式。(<a href="http://200.200.32.195:55081" title="⚔️ Chatbot Arena ⚔️ : Benchmarking LLMs in the Wild on the DEVP workstation">結果位址</a>)</p>

<p><img src="https://github.com/sinotec2/FAQ/raw/main/attachments/2023-09-05-15-51-50.png" alt="" /></p>

<h3 id="控制埠的啟動">控制埠的啟動</h3>

<ul>
  <li>控制埠為其他2埠作業的核心，因此其ip必須讓所有的埠都能順利取用。</li>
  <li>如不指定host，則會是內設值localhost。如果為localhost，則其他2埠也必須設在localhost，因其他機器都無法存取控制埠。</li>
  <li>控制埠與UI埠的關係較為單純，為簡單的一對一。</li>
  <li>控制埠與模型作業埠的關係是一對多，因此需要每個作業埠都能呼叫得到的IP。</li>
</ul>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>python3 <span class="nt">-m</span> fastchat.serve.controller <span class="nt">--host</span> <span class="nv">$ip</span> &amp;
</code></pre></div></div>

<h3 id="模型作業埠">模型作業埠</h3>

<ul>
  <li>model-path可以指定到特定的模型。不一定是lmsys。優秀的公開模型如<a href="https://huggingface.co/lmsys/vicuna-33b-v1.3">lmsys/vicuna-33b-v1.3</a>、<a href="https://huggingface.co/mosaicml/mpt-30b-chat">mosaicml/mpt-30b-chat</a>及<a href="https://huggingface.co/WizardLM/WizardLM-13B-V1.1">WizardLM/WizardLM-13B-V1.1</a></li>
  <li>上接控制埠。所有的輸入及輸出都會通過控制埠到(從)UI埠。</li>
  <li>同一個控制埠及UI埠可以(同時)接受多個模型作業埠的呼叫，只要將作業開在不同的埠就好了。</li>
  <li>必須指定該機器可以提供的device，否則內設為gpu。</li>
  <li>模型作業埠的位址似乎沒有特別的作用。提供給測試用而已(詳下)。</li>
</ul>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>python3 <span class="nt">-m</span> fastchat.serve.model_worker <span class="nt">--model-path</span> lmsys/vicuna-7b-v1.5-16k <span class="se">\</span>
<span class="nt">--host</span> <span class="nv">$ip</span> <span class="se">\</span>
<span class="nt">--worker-address</span> <span class="nv">$add</span> <span class="se">\</span>
<span class="nt">--controller-address</span> <span class="nv">$addc</span> <span class="nt">--port</span> <span class="nv">$port</span> <span class="nt">--device</span> cpu &amp;
</code></pre></div></div>

<h3 id="測試模型是否正常運作">測試模型是否正常運作</h3>

<ul>
  <li>啟動命令列模式之chatbot</li>
  <li>需指定作業埠專屬的位址。</li>
  <li>啟動做為測試的模型名稱也必須與作業模型一致。</li>
  <li>此處不需(不可)再指定<code class="language-plaintext highlighter-rouge">device</code>、沒有模式路徑(<code class="language-plaintext highlighter-rouge">model-path</code>)</li>
</ul>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>python3 <span class="nt">-m</span> fastchat.serve.test_message <span class="nt">--model-name</span> vicuna-7b-v1.5-16k <span class="nt">--worker-address</span> <span class="nv">$add</span>
</code></pre></div></div>

<h3 id="webui程式埠">webui程式埠</h3>

<ul>
  <li>需要設定2組位址，一個是控制埠(<code class="language-plaintext highlighter-rouge">controller-url</code>)，一個是使用者會連上的最後位址。</li>
</ul>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>python3 <span class="nt">-m</span> fastchat.serve.gradio_web_server <span class="nt">--host</span> <span class="nv">$ip</span> <span class="nt">--port</span> <span class="nv">$port1</span> <span class="nt">--controller-url</span> <span class="nv">$addc</span>
</code></pre></div></div>

<ul>
  <li>如果模型的名稱不在<a href="https://github.com/lm-sys/FastChat" title="FastChat 是一個開放平台，用於訓練、服務和評估基於大型語言模型的聊天機器人。 核心功能包括：最先進模型（例如 Vicuna）的權重、訓練代碼和評估代碼，以及具有 Web UI 和 OpenAI 兼容 RESTful API 的分佈式多模型服務系統。">FastChat</a>套件資料庫內，畫面會出現<code class="language-plaintext highlighter-rouge">Add the description at fastchat/model/model_registry.py	</code></li>
  <li>直接修改該程式新增模型的相關敘述即可</li>
  <li>依序是簡稱、全名、來源、說明</li>
  <li>輸入後，程式會自己調用相關說明顯示在畫面上。</li>
</ul>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">#/nas2/kuang/.conda/envs/YOLOv8/lib/python3.9/site-packages/fastchat/model/model_registry.py
</span><span class="p">...</span>
<span class="n">register_model_info</span><span class="p">(</span>
    <span class="p">[</span><span class="s">"gpt-4"</span><span class="p">],</span> <span class="s">"ChatGPT-4"</span><span class="p">,</span> <span class="s">"https://openai.com/research/gpt-4"</span><span class="p">,</span> <span class="s">"ChatGPT-4 by OpenAI"</span>
<span class="p">)</span>
</code></pre></div></div>

<h2 id="設定成果">設定成果</h2>

<h3 id="落地實例">落地實例</h3>

<ul>
  <li>可以點選<a href="http://200.200.32.195:55081" title="⚔️ Chatbot Arena ⚔️ : Benchmarking LLMs in the Wild on the DEVP workstation">這裡</a>(公司內網)。</li>
</ul>

<h3 id="單模型界面使用說明">單模型界面使用說明</h3>

<ul>
  <li>單模型界面也包括在雙模型界面之內，因此並不需要另外執行<code class="language-plaintext highlighter-rouge">fastchat.serve.gradio_web_server</code></li>
  <li>除了說明欄之外，此處需要選取一個模型來交談。可以直接點選或由右邊的下來選單來選擇。UI會列出控制埠納進的所有模型名稱。</li>
</ul>

<p><img src="https://github.com/sinotec2/FAQ/raw/main/attachments/2023-09-05-16-23-23.png" alt="" />
<img src="https://github.com/sinotec2/FAQ/raw/main/attachments/2023-09-05-16-25-48.png" alt="" /></p>

<ul>
  <li>文字輸入欄：輸入文字按下enter或者是Send鍵，出現在對話框中即為接受輸入。</li>
  <li>其次，UI提供了投票選項，對個別使用並不會回傳結果。按下”Clear History”會清除對話框內容。</li>
  <li>由於系統並沒有使用者資料庫，因此對話並不會記錄下來。</li>
  <li>之外，<a href="https://github.com/lm-sys/FastChat" title="FastChat 是一個開放平台，用於訓練、服務和評估基於大型語言模型的聊天機器人。 核心功能包括：最先進模型（例如 Vicuna）的權重、訓練代碼和評估代碼，以及具有 Web UI 和 OpenAI 兼容 RESTful API 的分佈式多模型服務系統。">FastChat</a>還提供了2個模型參數(Parameters)讓使用者可以下拉選擇，左右調整，讓模型推理結果更符合使用者的需求。</li>
</ul>

<h3 id="雙模型界面使用說明">雙模型界面使用說明</h3>

<ul>
  <li>chatbot擂台有2個頁面
    <ul>
      <li>battle頁面會隨機選取2個模型來回答問題，讓使用者盲目評分，看哪一個模型答得好。算是盲樣測試。</li>
      <li>右側的side by side則是由使用者自行指定2個已知名稱的模型進行比對。</li>
    </ul>
  </li>
</ul>

<table>
  <thead>
    <tr>
      <th style="text-align: center"><img src="https://github.com/sinotec2/FAQ/raw/main/attachments/2023-09-06-09-02-35.png" alt="" /></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center"><br />雙(多)模型頁面選擇&lt;/br&gt;</td>
    </tr>
  </tbody>
</table>

<h3 id="idle-and-refresh">idle and refresh</h3>

<ul>
  <li>如果界面閒置太久，會出現<code class="language-plaintext highlighter-rouge">THIS SESSION HAS BEEN INACTIVE FOR TOO LONG. PLEASE REFRESH THIS PAGE.</code>訊息，並且拒絕運作</li>
  <li>只需重新整理頁面即可啟動</li>
</ul>

<h3 id="cpu-運作情形">CPU 運作情形</h3>

<p>單一模型運作約會消耗工作站一半的計算容量。約45~47個核心。</p>

<p><img src="https://github.com/sinotec2/FAQ/raw/main/attachments/2023-09-06-09-29-23.png" alt="" /></p>

<h3 id="tmux">tmux</h3>

<p>使用<a href="https://sinotec2.github.io/Focus-on-Air-Quality/utilities/OperationSystem/tmux">tmux</a>指令，讓程式在背景運作。避免終端機關閉、網路斷線後程式隨即停止。</p>

<h3 id="模型參數">模型參數</h3>

<p><a href="https://github.com/lm-sys/FastChat" title="FastChat 是一個開放平台，用於訓練、服務和評估基於大型語言模型的聊天機器人。 核心功能包括：最先進模型（例如 Vicuna）的權重、訓練代碼和評估代碼，以及具有 Web UI 和 OpenAI 兼容 RESTful API 的分佈式多模型服務系統。">FastChat</a>提供了2個模型參數讓使用者可以調整答案的語文內容。以下是chatGPT對這2類參數的解釋。</p>

<ul>
  <li>temperature (chatGPT)
    <ul>
      <li>在大型語言模型中，”temperature” 是一個控制生成文本多樣性的參數。這個參數通常用於生成隨機性的文本輸出。較高的溫度值會產生更多的隨機性，而較低的溫度值會產生較少的隨機性。</li>
      <li>具體來說，當使用較高的溫度值時，模型生成的文本更具變化性，可能包含更多不同的詞彙和結構變化，這使得生成的文本看起來更加多樣化。然而，這種多樣性可能會導致生成的文本變得不那麼連貫和隨意。</li>
    </ul>
  </li>
  <li>top (chatGPT)
    <ul>
      <li>在大型語言模型中，”top” 參數通常用於控制生成文本時的詞彙選擇。這個參數決定了在生成文本時模型將考慮多少個最有可能的詞彙選擇。有top-k及top-P 2種參數。(<a href="https://github.com/lm-sys/FastChat" title="FastChat 是一個開放平台，用於訓練、服務和評估基於大型語言模型的聊天機器人。 核心功能包括：最先進模型（例如 Vicuna）的權重、訓練代碼和評估代碼，以及具有 Web UI 和 OpenAI 兼容 RESTful API 的分佈式多模型服務系統。">FastChat</a>提供的是top-P參數。)
        <ul>
          <li>具體來說，”top-k” 是一種選擇性截斷策略，用於生成文本中的詞彙。當使用 “top-k” 時，模型會在詞彙表中選擇概率排名前 k 高的詞彙，然後從這 k 個詞彙中選擇下一個詞彙。這樣可以確保生成的文本中的詞彙是模型認為最有可能的詞彙，有助於提高文本的一致性和可讀性。</li>
          <li>相反，”top-p”（也稱為 nucleus sampling）是一種根據詞彙概率質量分佈的截斷策略。當使用 “top-p” 時，模型會在詞彙表中根據詞彙的累積概率質量（由高到低排序）來選擇詞彙，直到累積概率質量達到或超過一個給定的閾值（通常是一個很小的數值）。這樣可以確保生成的文本中的詞彙是概率質量較高的詞彙，但同時保持了一定的隨機性，因為累積概率質量可能會包含多個詞彙</li>
        </ul>
      </li>
      <li>這兩種截斷策略可以幫助控制生成文本時的多樣性和可控性。較大的 “top-k” 或 “top-p” 值會導致生成的文本更多樣，而較小的值會導致生成的文本更加一致。</li>
    </ul>
  </li>
</ul>

<h2 id="rethiking">Rethiking</h2>

<ul>
  <li>CPU執行語言模型的推演實在不是一個好的方案，對計算型的工作站而言太吃力了。還是要思考其他的方案，如雲端的GPU計算服務。這一點<a href="https://github.com/lm-sys/FastChat" title="FastChat 是一個開放平台，用於訓練、服務和評估基於大型語言模型的聊天機器人。 核心功能包括：最先進模型（例如 Vicuna）的權重、訓練代碼和評估代碼，以及具有 Web UI 和 OpenAI 兼容 RESTful API 的分佈式多模型服務系統。">FastChat</a>宣稱是有這個類似openAI API功能選項的，還需要花時間來落實。</li>
  <li><a href="https://github.com/lm-sys/FastChat" title="FastChat 是一個開放平台，用於訓練、服務和評估基於大型語言模型的聊天機器人。 核心功能包括：最先進模型（例如 Vicuna）的權重、訓練代碼和評估代碼，以及具有 Web UI 和 OpenAI 兼容 RESTful API 的分佈式多模型服務系統。">FastChat</a>沒有好的歷史資料庫來保存使用者過去的對話。這個問題還蠻困擾的。每次都需要有充分的提示，chatbot才會正確回應。相關程式及資料庫、是否會員系統等，部件都還有待尋找。</li>
  <li><a href="https://github.com/SkywalkerDarren/chatWeb" title="SkywalkerDarren(2022) ChatWeb 可以抓取任何網頁或從 PDF、DOCX、TXT 文件中提取文本，並生成嵌入式摘要。 它還可以根據文本內容回答您的問題。 它是使用基於gpt3.5的chatAPI和embeddingAPI以及向量數據庫來實現的。">chatWeb</a>的核心語言模型是GPT3.5，有點老舊，應可以更換成公開版的GPT4。這2個套件應該有點整併，並且將計算放在指定雲端而不是openAI，畢竟openAI販賣的不是雲端計算。</li>
  <li>怎麼降低temperature設定，讓語言模型可以更貼近實際檔案知識，這點除了用<a href="https://github.com/SkywalkerDarren/chatWeb" title="SkywalkerDarren(2022) ChatWeb 可以抓取任何網頁或從 PDF、DOCX、TXT 文件中提取文本，並生成嵌入式摘要。 它還可以根據文本內容回答您的問題。 它是使用基於gpt3.5的chatAPI和embeddingAPI以及向量數據庫來實現的。">chatWeb</a>之外，還需要有具有監督性質的規範，讓語言模型可以輕鬆切換進入環工的多樣性領域。</li>
  <li>這裡似乎還有很多的<a href="https://chat.openai.com/share/029f3f0f-7f68-436d-8145-66a75ef63d0f" title="在AI領域，prompting engineer 是一個角色或職位，其主要職責是設計、構建和優化用於訓練和操作大型語言模型（如GPT-3、BERT等）的提示（prompts）或輸入文本。">prompting engineer</a>工作，諸如：你是一個環評專家…、土水專家、空品模式專家等等。</li>
</ul>

<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:1" role="doc-endnote">
      <p>Zheng, L., Chiang, W.-L., Sheng, Y., Zhuang, S., Wu, Z., Zhuang, Y., Lin, Z., Li, Z., Li, D., Xing, E.P., Zhang, H., Gonzalez, J.E., Stoica, I. (2023). <strong>Judging LLM-as-a-judge with MT-Bench and Chatbot Arena</strong>. <a href="https://doi.org/10.48550/arXiv.2306.05685">doi</a> <a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>]]></content><author><name>yckuang</name><email>sinotec2@gmail.com</email></author><category term="AI" /><category term="chat" /><summary type="html"><![CDATA[背景 chatWeb安裝在node03:7860之後，對模型的核心計算使用別人的機器，總覺得有點過意不去，希望能用自己的機器來執行全套系統看看，畢竟還是要了解整個布建需要哪些軟/硬體。就去發現了lmsys在2023/4月公開的這套FastChat。 除了官網之外，另有不多的中文介紹，如網友[薛定谔的皮丘(2023/08)][9][^2]以及[Hok(2023/04)][10][^3]，想讀中文介紹的讀者也可以去訪問他們的筆記。 這裡除了留存一些技術心得以外，併同前面chatWeb的經驗想法，也對未來語言模型在局地的應用架構有些總結。 落地實例可以點選這裡(公司內網)。 lmsys簡介 lmsys這個由美國學術界組成的開放研究組織，除了來自於頂尖的3所大學(UC Berkeley, UCSD and CMU)的研究師生之外，主要的功能在建構一個大型語言模型的競賽擂台ChatBot Arena，讓有興趣挑戰的同儕，可以在此鍛鍊進步。 該擂台所使用的模型都是目前私人公司與開放領域發展最新的語言模型，模型推理計算使用該機構的GPU，擂台的界面程式則是此處要引進的這套FastChat。 ChatBot Arena的排行榜公開在HuggingFace的平台空間lmsys/chatbot-arena-leaderboard。 最新一版比試結果公開在arXiv(2023/06)1，第1名為GPT4，前5名全為私人單位發展知產品。 FastChat簡介 FastChat界面獲得2萬7千多個github好評。依據其原版修訂應用版本有3千多個。由145個作者共同貢獻。核心功能包括多模型服務系統、API、評估工具等，其特色有下列幾點(by chatWeb) 多模型服務系統的特色包括： 支援多種模型：該系統支援多種模型，包括LLama 2、Vicuna、Alpaca、Baize、ChatGLM、Dolly、Falcon、FastChat-T5、GPT4ALL、Guanaco、MTP、OpenAssistant、RedPajama、StableLM、WizardLM等等。 分散式服務：該系統是一個分散式的多模型服務系統，可以同時運行多個模型。 支援多種平台：該系統支援多種平台，包括CPU、GPU、Intel XPU、Metal Backend等，並提供了相應的指令和配置方式。 高效性能：該系統通過優化和分佈式架構，提供了高效的模型服務性能，能夠處理大量的用戶請求。 易於使用：該系統提供了詳細的安裝和使用文檔，用戶可以根據文檔進行快速部署和配置。 API：該系統提供了網頁界面和OpenAI兼容的RESTful API，方便用戶進行模型服務和交換。可以像openAI一樣，經提供token後，使用雲端服務業者所提供的推理計算資源。 “評估工具”的特色如下： 使用MT-bench進行評估：評估工具使用MT-bench，一組具有挑戰性的多輪開放式問題，來評估模型的品質。 自動化評估流程：評估工具使用強大的LLM（如GPT-4）作為評判，自動評估模型的回答品質。 提供指導：評估工具提供了運行MT-bench的指示，以及使用fastchat/llm_judge進行評估的指示。 FastChat架構 以下說明為chatWeb執行結果 fastchat.serve.controller “fastchat.serve.controller“是FastChat中的一個模組，它的功能是管理分散式的模型工作器(model worker)。 模型工作器是負責托管一個或多個模型的服務器，而控制器則負責協調這些模型工作器和與用戶交互的Web服務器之間的通信。控制器管理模型工作器的註冊、分配請求給適當的模型工作器以進行處理，並將結果返回給用戶UI。 簡而言之，”fastchat.serve.controller“的功能是管理和協調FastChat中的模型工作器，以實現分散式的多模型服務。 fastchat.serve.model_worker 用於大型語言模型的聊天機器人訓練、提供服務和評估。為最耗費計算資源的部分。 它是FastChat的核心組件之一，負責承擔模型的運算和處理輸入輸出。 可以使用任何形式的計算資源，包括遠端或局地CPU、GPU、Intel XPU、Metal Backend等等。 模型工作器（model_worker）通常與FastChat的控制器（controller）一起使用。 fastchat.serve.gradio_web_server(server_multi) 啟動一個單單/多標籤的Gradio伺服器，其中包括Chatbot Arena的標籤。 web_server單模式版本：與一般chatbot並沒有太大的差異。可調整temperature及topP等2個參數值。 多模式版本(server_multi)：這個功能可以讓你在網頁上同時展示多個模型，並與這些模型進行對話。 ip and portal arrangements 3個埠的關係 FastChat會需要3個埠(不能重複。如不給定，三支程式內設都會是21001，只能用一次) 控制埠( $addc=http://${ip}:21001內設)，搭配controller-address(作業埠需要)/controller-url(UI埠需要)之引數 作業埠( $add=http://${ip}:$port)。引數worker-address只需設定一次。 UI埠( $addu=http://${ip}:$port1)，為使用者最後看到的界面。 安裝與其餘設定詳見jondurbin/FastChat。此處詳解devp(ip=200.200.32.195)上的啟動方式。(結果位址) 控制埠的啟動 控制埠為其他2埠作業的核心，因此其ip必須讓所有的埠都能順利取用。 如不指定host，則會是內設值localhost。如果為localhost，則其他2埠也必須設在localhost，因其他機器都無法存取控制埠。 控制埠與UI埠的關係較為單純，為簡單的一對一。 控制埠與模型作業埠的關係是一對多，因此需要每個作業埠都能呼叫得到的IP。 python3 -m fastchat.serve.controller --host $ip &amp; 模型作業埠 model-path可以指定到特定的模型。不一定是lmsys。優秀的公開模型如lmsys/vicuna-33b-v1.3、mosaicml/mpt-30b-chat及WizardLM/WizardLM-13B-V1.1 上接控制埠。所有的輸入及輸出都會通過控制埠到(從)UI埠。 同一個控制埠及UI埠可以(同時)接受多個模型作業埠的呼叫，只要將作業開在不同的埠就好了。 必須指定該機器可以提供的device，否則內設為gpu。 模型作業埠的位址似乎沒有特別的作用。提供給測試用而已(詳下)。 python3 -m fastchat.serve.model_worker --model-path lmsys/vicuna-7b-v1.5-16k \ --host $ip \ --worker-address $add \ --controller-address $addc --port $port --device cpu &amp; 測試模型是否正常運作 啟動命令列模式之chatbot 需指定作業埠專屬的位址。 啟動做為測試的模型名稱也必須與作業模型一致。 此處不需(不可)再指定device、沒有模式路徑(model-path) python3 -m fastchat.serve.test_message --model-name vicuna-7b-v1.5-16k --worker-address $add webui程式埠 需要設定2組位址，一個是控制埠(controller-url)，一個是使用者會連上的最後位址。 python3 -m fastchat.serve.gradio_web_server --host $ip --port $port1 --controller-url $addc 如果模型的名稱不在FastChat套件資料庫內，畫面會出現Add the description at fastchat/model/model_registry.py 直接修改該程式新增模型的相關敘述即可 依序是簡稱、全名、來源、說明 輸入後，程式會自己調用相關說明顯示在畫面上。 #/nas2/kuang/.conda/envs/YOLOv8/lib/python3.9/site-packages/fastchat/model/model_registry.py ... register_model_info( ["gpt-4"], "ChatGPT-4", "https://openai.com/research/gpt-4", "ChatGPT-4 by OpenAI" ) 設定成果 落地實例 可以點選這裡(公司內網)。 單模型界面使用說明 單模型界面也包括在雙模型界面之內，因此並不需要另外執行fastchat.serve.gradio_web_server 除了說明欄之外，此處需要選取一個模型來交談。可以直接點選或由右邊的下來選單來選擇。UI會列出控制埠納進的所有模型名稱。 文字輸入欄：輸入文字按下enter或者是Send鍵，出現在對話框中即為接受輸入。 其次，UI提供了投票選項，對個別使用並不會回傳結果。按下”Clear History”會清除對話框內容。 由於系統並沒有使用者資料庫，因此對話並不會記錄下來。 之外，FastChat還提供了2個模型參數(Parameters)讓使用者可以下拉選擇，左右調整，讓模型推理結果更符合使用者的需求。 雙模型界面使用說明 chatbot擂台有2個頁面 battle頁面會隨機選取2個模型來回答問題，讓使用者盲目評分，看哪一個模型答得好。算是盲樣測試。 右側的side by side則是由使用者自行指定2個已知名稱的模型進行比對。 雙(多)模型頁面選擇&lt;/br&gt; idle and refresh 如果界面閒置太久，會出現THIS SESSION HAS BEEN INACTIVE FOR TOO LONG. PLEASE REFRESH THIS PAGE.訊息，並且拒絕運作 只需重新整理頁面即可啟動 CPU 運作情形 單一模型運作約會消耗工作站一半的計算容量。約45~47個核心。 tmux 使用tmux指令，讓程式在背景運作。避免終端機關閉、網路斷線後程式隨即停止。 模型參數 FastChat提供了2個模型參數讓使用者可以調整答案的語文內容。以下是chatGPT對這2類參數的解釋。 temperature (chatGPT) 在大型語言模型中，”temperature” 是一個控制生成文本多樣性的參數。這個參數通常用於生成隨機性的文本輸出。較高的溫度值會產生更多的隨機性，而較低的溫度值會產生較少的隨機性。 具體來說，當使用較高的溫度值時，模型生成的文本更具變化性，可能包含更多不同的詞彙和結構變化，這使得生成的文本看起來更加多樣化。然而，這種多樣性可能會導致生成的文本變得不那麼連貫和隨意。 top (chatGPT) 在大型語言模型中，”top” 參數通常用於控制生成文本時的詞彙選擇。這個參數決定了在生成文本時模型將考慮多少個最有可能的詞彙選擇。有top-k及top-P 2種參數。(FastChat提供的是top-P參數。) 具體來說，”top-k” 是一種選擇性截斷策略，用於生成文本中的詞彙。當使用 “top-k” 時，模型會在詞彙表中選擇概率排名前 k 高的詞彙，然後從這 k 個詞彙中選擇下一個詞彙。這樣可以確保生成的文本中的詞彙是模型認為最有可能的詞彙，有助於提高文本的一致性和可讀性。 相反，”top-p”（也稱為 nucleus sampling）是一種根據詞彙概率質量分佈的截斷策略。當使用 “top-p” 時，模型會在詞彙表中根據詞彙的累積概率質量（由高到低排序）來選擇詞彙，直到累積概率質量達到或超過一個給定的閾值（通常是一個很小的數值）。這樣可以確保生成的文本中的詞彙是概率質量較高的詞彙，但同時保持了一定的隨機性，因為累積概率質量可能會包含多個詞彙 這兩種截斷策略可以幫助控制生成文本時的多樣性和可控性。較大的 “top-k” 或 “top-p” 值會導致生成的文本更多樣，而較小的值會導致生成的文本更加一致。 Rethiking CPU執行語言模型的推演實在不是一個好的方案，對計算型的工作站而言太吃力了。還是要思考其他的方案，如雲端的GPU計算服務。這一點FastChat宣稱是有這個類似openAI API功能選項的，還需要花時間來落實。 FastChat沒有好的歷史資料庫來保存使用者過去的對話。這個問題還蠻困擾的。每次都需要有充分的提示，chatbot才會正確回應。相關程式及資料庫、是否會員系統等，部件都還有待尋找。 chatWeb的核心語言模型是GPT3.5，有點老舊，應可以更換成公開版的GPT4。這2個套件應該有點整併，並且將計算放在指定雲端而不是openAI，畢竟openAI販賣的不是雲端計算。 怎麼降低temperature設定，讓語言模型可以更貼近實際檔案知識，這點除了用chatWeb之外，還需要有具有監督性質的規範，讓語言模型可以輕鬆切換進入環工的多樣性領域。 這裡似乎還有很多的prompting engineer工作，諸如：你是一個環評專家…、土水專家、空品模式專家等等。 Zheng, L., Chiang, W.-L., Sheng, Y., Zhuang, S., Wu, Z., Zhuang, Y., Lin, Z., Li, Z., Li, D., Xing, E.P., Zhang, H., Gonzalez, J.E., Stoica, I. (2023). Judging LLM-as-a-judge with MT-Bench and Chatbot Arena. doi &#8617;]]></summary></entry><entry><title type="html">chatWeb的裝置與應用</title><link href="https://sinotec2.github.io/FAQ/2023/08/31/chatWeb.html" rel="alternate" type="text/html" title="chatWeb的裝置與應用" /><published>2023-08-31T00:00:00+08:00</published><updated>2023-08-31T00:00:00+08:00</updated><id>https://sinotec2.github.io/FAQ/2023/08/31/chatWeb</id><content type="html" xml:base="https://sinotec2.github.io/FAQ/2023/08/31/chatWeb.html"><![CDATA[<h2 id="背景">背景</h2>

<ul>
  <li>這項openAI的gpt3.5 turbo API應用是源自於<a href="https://github.com/SkywalkerDarren/chatWeb">SkywalkerDarren/chatWeb(2022/05)</a>提供的程式碼。安裝及相關需求詳見github說明。此處說明應用的方式與結果啟發。</li>
  <li>安裝在<a href="http://200.200.31.47:7860/">node03:7860</a>。將會使用到node03儲存字庫(csv檔)與finetune模型bin檔。可以使用postgres(但未啟用)。</li>
  <li>測試1天(含以下)總計使用0.11鎂。尚未測試多人使用會發生甚麼情況</li>
  <li>除了解析網頁之外，套件也可以解析本地的文字檔案。接受的格式包括pdf、docx、以及txt檔案。</li>
  <li>類似功能之服務介紹如下</li>
</ul>

<h3 id="chatdoc">chatDOC</h3>

<ul>
  <li><a href="https://chatdoc.com/chatdoc/#/sign-up?invite_code=7fimgzlv7f">chatDOC</a>是著名電腦作家esor2023年4月介紹推薦的優秀網站。(詳見其<a href="https://www.playpcesor.com/2023/04/chatdoc-pdf-ai.html">推薦文章</a>)</li>
  <li>可接受檔案格式(形式)：pdf / doc / docx / markdown / epub / txt / OCR</li>
  <li>免費方案：登錄會員後即可得到3個免費檔案的優惠(僅限pdf檔)</li>
  <li>推薦會員：每推薦一人入會可得到5個免費檔案的優惠，最多1000個檔案(30日內)</li>
  <li>付費方案
    <ul>
      <li>Auto-Subscribe
        <ul>
          <li>Pro Plan 30 Days $5.99</li>
          <li>Pro Plan 360 Days $59.9</li>
        </ul>
      </li>
      <li>No any deals
        <ul>
          <li>Pro Plan 30 Days $7.99</li>
        </ul>
      </li>
    </ul>
  </li>
  <li>有’文件集’(collection)功能，類似目錄，可綜合分析集內之所有文件。</li>
  <li>文檔解析時間比其他服務都長</li>
</ul>

<h3 id="chatpdf">chatPDF</h3>

<ul>
  <li><a href="https://www.chatpdf.com/">chatpdf.com官網</a></li>
  <li>特色
    <ul>
      <li>使用chatGPT3.5作為語言模型</li>
      <li>會將pdf標題存留，只需點擊標題，即可展開檔案與過去的對話。</li>
      <li>可以很精確地回答pdf的細節內容。跨頁仍會有解讀上的問題。</li>
      <li>可以進行計算</li>
    </ul>
  </li>
  <li>免費版本
    <ul>
      <li>120 pages/PDF</li>
      <li>10 MB/PDF</li>
      <li>3 PDFs/day</li>
      <li>50 questions/day</li>
    </ul>
  </li>
  <li>Plus版本 $5/mo
    <ul>
      <li>2,000 pages/PDF</li>
      <li>32 MB/PDF</li>
      <li>50 PDFs/day</li>
      <li>1000 questions/day</li>
    </ul>
  </li>
</ul>

<h3 id="pdf-gptpdfchatter">PDF GPT(pdfChatter)</h3>

<ul>
  <li><a href="https://huggingface.co/spaces/bhaskartripathi/pdfChatter">bhaskartripathi/pdfChatter</a>是個架在huggingface空間的平台，輸入openAI的API token之後，與chatWeb就有類似的功能，差異只在不能儲存歷史。</li>
  <li>不過把token貼在網路上似乎不是一件聰明的事。還是不要輕易嘗試。
<img src="https://github.com/sinotec2/FAQ/raw/main/attachments/2023-09-06-15-32-25.png" alt="" /></li>
</ul>

<h3 id="chat-with-pdf">chat-with-pdf</h3>

<ul>
  <li>這個huggingface的平台<a href="https://huggingface.co/spaces/fffiloni/langchain-chat-with-pdf">fffiloni/langchain-chat-with-pdf</a>用的全是huggingface的公開模型，因此沒有token的需要。其他界面也都很類似。</li>
  <li>平台上用了3個模型</li>
</ul>

<p><img src="https://github.com/sinotec2/FAQ/raw/main/attachments/2023-09-06-15-59-11.png" alt="" /></p>

<ul>
  <li>用的是huggingface的計算資源，所以解析與推演的速度慢了很多(還有queue的問題)。</li>
</ul>

<h2 id="使用方式">使用方式</h2>

<h3 id="url輸入">url輸入</h3>

<p><img src="https://github.com/sinotec2/FAQ/raw/main/attachments/2023-08-31-10-54-02.png" alt="" /></p>

<ul>
  <li>在URL下貼上網址、按下Submit url即可開始解讀網頁。</li>
  <li>因openAI採預付制，如果deposit用完則進入免費模式，解讀時間會很有限，需再刷卡。</li>
</ul>

<h3 id="檔案輸入">檔案輸入</h3>

<p><img src="https://github.com/sinotec2/FAQ/raw/main/attachments/2023-08-31-10-57-54.png" alt="" /></p>

<ul>
  <li>可以拖曳檔案、點擊選取等方式輸入</li>
  <li>可以接受.pdf、.txt、.docx等3種檔案。</li>
  <li>目前還不能接受.csv或其他形式具關連性的檔案(eg. json)</li>
  <li>檔案太大會拒絕進行解析</li>
</ul>

<h3 id="對話框chatbot">對話框(chatbot)</h3>

<ul>
  <li>如果內容很明確，chatWeb會在左側出現標題、內容摘要。語言會對應到網頁使用的語言。</li>
  <li>如果內容不明確，則不會出現任何內容。需使用者主動提問。</li>
  <li>提問欄在Qurey下，直接按enter或Submit，問題即會送到openAI的伺服器計算(提問與回應都會計價)。</li>
  <li>Reset鍵會清除所有內容，開始一個新的網頁(或檔案內容)。之前的對話將不會儲存。</li>
</ul>

<h3 id="內容框context">內容框(context)</h3>

<ul>
  <li>畫面的右側出現網頁(或檔案)與對話有關的內容，讓使用者可以參考。</li>
  <li>點擊不會有甚麼作用</li>
</ul>

<p><img src="https://github.com/sinotec2/FAQ/raw/main/attachments/2023-08-31-10-44-10.png" alt="" /></p>

<h2 id="rethinkings">Rethinkings</h2>

<h3 id="合併成綜合知識庫">合併成綜合知識庫</h3>

<ul>
  <li>環工領域知識分類眾多繁雜。同樣名詞在不同領域會略有語意差異。如下例「監測」一詞有即時性、計畫性等等實質差異。</li>
  <li>fine tune需有監督、結構性提供素材，以建立從屬關聯。(如何輸入json檔案)</li>
</ul>

<h2 id="工程問題與對策之應用">工程問題與對策之應用</h2>

<ul>
  <li>單一網頁、單一檔案的解析並無大礙</li>
  <li>同類網頁檔案測試如下</li>
</ul>

<h3 id="合併檔案">合併檔案</h3>

<ul>
  <li>水質即時監測設備應設置於採樣點最近位置，分析成果取得後，再以信號傳送置控制中心以免樣品污染.txt</li>
  <li>施工查核之簡報重點.txt</li>
  <li>逾期提送監測計畫預定行程表遭致罰款案例探討.txt</li>
</ul>

<h3 id="問答">問答</h3>

<blockquote>
  <p>你是公司主管，請摘要本文內容。</p>
</blockquote>

<p>根據文章內容，以下是摘要的主要內容：</p>

<p>文章描述了一個水質淨化工程的案例，該工程中使用了取樣泵浦和管線輸送水樣進行監測。
在試運轉期間，機房內的溶氧監測設備測值與現地採樣測值相差甚大，經過儀器校正後，發現可能是管線輸送過程中的問題。
更換輸送水樣管線後，溶氧監測測值與現地採樣測值一致，但兩天後溶氧測值再次降低，推測是管線內壁孳生生物膜所致。
文章還提到了處理對策，包括定期消毒管線以去除生物膜，並建議將放流水質自動偵測設備設置在採樣點周邊以避免輸送過程中的污染。
文章還提到了簡報內容的整合和計畫工作內容的執行，以及計畫主任的最後檢核和計畫品保品管的控管。
最後，文章提到了一些問題和改善措施，以及相關的審查和參考資料。
總結來說，本文主要描述了一個水質淨化工程中的問題和解決方案，並提到了相關的簡報內容、計畫工作內容的執行和控管，以及審查和參考資料。</p>

<blockquote>
  <p>用中文條列一下”簡報內容的整合”相關內容。</p>
</blockquote>

<p>以下是與”簡報內容的整合”相關的內容條列：</p>

<p>簡報前，本公司應負責整合業主、本公司及承包商之簡報資料，就其一般性內容重複之處，視各自權責分別取捨後，完成各單位之簡報內容。
施工查核簡報以顯示優良之成果為主，並將本公司執行監造之特點作為報告之內容。有問題時，應說明採取對策後之成效，而非僅提出解決問題之建議，以致造成各方之困擾，因查核委員並非為解決問題而來。</p>

<blockquote>
  <p>“溶氧監測設備”相關的問題有哪些?</p>
</blockquote>

<p>根據文章內容，與”溶氧監測設備”相關的問題有以下幾個：</p>

<p>文章第2段提到，為了達到水質即時監測的目的，放流段設置了取樣泵浦和溶氧監測設備，請問這些溶氧監測設備是如何進行監測的？</p>

<p>文章第3段提到，在試運轉期間，機房中的溶氧測值趨近於零，但現場採樣的溶氧測值卻與之相異甚大，經儀器校正後確認測值誤差是由於輸送過程所致，請問是什麼原因導致輸送過程中的溶氧測值誤差？</p>

<p>文章第4段提到，更換管線兩天後，溶氧測值又逐漸降低至趨近於零，但現場採樣的溶氧測值仍然維持在5~6 mg/L，推測是由於管線內壁孳生生物膜，消耗水樣中的溶氧，請問如何解決這個問題？</p>

<p>文章第9段提到，經檢討後改善方式是將溶氧監測設備遷移至河道旁現地監測，並以傳訊設備傳送監測數值至中控室，請問這種改善方式是否有效？有沒有相關的數據或結果可以提供？</p>

<p>請注意，以上問題僅基於文章內容，如果上下文沒有提供足夠的信息，則無法提供確定的答案。</p>

<blockquote>
  <p>“溶氧監測設備”相關的問題發生在甚麼時候?</p>
</blockquote>

<p>根據文章內容，問題發生在試運轉期間。</p>

<blockquote>
  <p>“溶氧監測設備”和”監測計畫”有沒有關係?</p>
</blockquote>

<p>根據目前的內容，無法確定”溶氧監測設備”和”監測計畫”之間是否有關聯。目前的內容並未提到這兩者之間的關係。</p>

<blockquote>
  <p>說明一下文中對”監測計畫”提出哪些問題?</p>
</blockquote>

<p>根据文中的相关内容，对于”監測計畫”提出的问题如下：</p>

<p>本部門承攬某機關監測計畫，未依契約服務需求說明書要求，未在规定时间前将预定行程以书面通知業主，导致违反了契约要求。(paragraph 28)
进行计划工作内容的落实和提交进度的检核时，缺乏三级检核的掌握和确认，可能导致工作内容未按计划要求进行。(paragraph 43)
主办工程师在执行计划工作内容时，可能存在问题。(paragraph 41)
监测设备放置位置的选择可能导致监测数据受到影响。(paragraph 10)
以上是根据文中提到的相关内容得出的对”監測計畫”提出的问题。</p>

<blockquote>
  <p>發生”監測計畫”問題的相關人員有哪些人?</p>
</blockquote>

<p>根据文章内容，涉及到”監測計畫”问题的相关人员有以下几个人：</p>

<p>主辦工程師：负责执行计划工作内容。
协办工程师：负责进行数据复核。
计划主任：掌握和确认各项计划工作内容是否符合要求，进行最后的检核。
查核委员：对工程进行施工品质查核，负责评估和判定问题责任。
以上是根据文章内容推测的相关人员，但具体情况可能还需要参考文章其他部分的信息来确认。</p>

<blockquote>
  <p>溶氧監測可以設置的位置有哪些?試比較各個位置的優缺點?</p>
</blockquote>

<p>根據文章的內容，溶氧監測可以設置在以下位置：</p>

<p>機房內：優點是可以保護設備免受風吹日曬等損害，並方便操作人員管理和維護。缺點是水質和生物膜可能影響監測數據的準確性。</p>

<p>河道旁現地監測：優點是可以直接在放流段現場進行監測，確保溶氧數值的真實性。缺點是設備容易受到自然因素的影響，例如風吹、日曬等。</p>

<p>綜合比較兩個位置的優缺點，可以得出以下結論：</p>

<p>機房內的溶氧監測設備可以提供保護和方便管理的優勢，但可能受到水質和生物膜的影響，需要進行定期校正和維護。</p>

<p>河道旁現地監測可以確保溶氧數值的真實性，但設備容易受到自然因素的影響，需要注意設備的防護和維護。</p>

<p>綜合考慮，根據文章的建議，未來設計溶氧監測設備時，建議優先考慮設置在採樣點周邊，以避免輸送過程中遭受污染。</p>

<blockquote>
  <p>本文中提到的”問題”有哪幾項?整併成3條。</p>
</blockquote>

<p>根据文章内容，提到的问题有以下几项：</p>

<p>本部门承揽某机关监测计划，未按照合同要求在规定时间内通知业主预定行程。
设计三级检核单未按照要求进行签名确认。
水样輸送管线中生物膜孳生影响监测结果，且消毒液沖洗去除生物膜效果不持久。
请注意，以上是根据文章内容推测的问题，具体问题描述请参考原文。</p>

<blockquote>
  <p>你是公司總工程師，對於”監測”有甚麼建議?</p>
</blockquote>

<p>根據文章的內容，我們可以提出以下建議：</p>

<p>在施工查核簡報中，應該重點展示監測工作的優良成果，並說明採取對策後的成效，而不僅僅提出解決問題的建議。這樣可以避免造成各方的困擾。</p>

<p>如果工程進度落後，應該清楚說明落後的原因以及監造單位和承包商共同採取的對策，並強調業主的行政支援對改善工程進度的重要性，以讓委員感受到團隊合作的正面印象。</p>

<p>在監測工作中，應該定期檢查水樣輸送管線，以確保管線內部沒有生物膜的孳生，這樣可以確保監測結果的準確性和代表性。</p>

<p>在設計放流水質自動偵測設備時，應該優先考慮將設備設置在採樣點周邊，以避免在輸送過程中遭受污染。</p>

<p>總結來說，建議在監測工作中要重視成果展示和對策的說明，並確保監測設備和管線的正常運作，以提高監測結果的準確性和可靠性。</p>]]></content><author><name>yckuang</name><email>sinotec2@gmail.com</email></author><category term="AI" /><category term="chat" /><summary type="html"><![CDATA[背景 這項openAI的gpt3.5 turbo API應用是源自於SkywalkerDarren/chatWeb(2022/05)提供的程式碼。安裝及相關需求詳見github說明。此處說明應用的方式與結果啟發。 安裝在node03:7860。將會使用到node03儲存字庫(csv檔)與finetune模型bin檔。可以使用postgres(但未啟用)。 測試1天(含以下)總計使用0.11鎂。尚未測試多人使用會發生甚麼情況 除了解析網頁之外，套件也可以解析本地的文字檔案。接受的格式包括pdf、docx、以及txt檔案。 類似功能之服務介紹如下 chatDOC chatDOC是著名電腦作家esor2023年4月介紹推薦的優秀網站。(詳見其推薦文章) 可接受檔案格式(形式)：pdf / doc / docx / markdown / epub / txt / OCR 免費方案：登錄會員後即可得到3個免費檔案的優惠(僅限pdf檔) 推薦會員：每推薦一人入會可得到5個免費檔案的優惠，最多1000個檔案(30日內) 付費方案 Auto-Subscribe Pro Plan 30 Days $5.99 Pro Plan 360 Days $59.9 No any deals Pro Plan 30 Days $7.99 有’文件集’(collection)功能，類似目錄，可綜合分析集內之所有文件。 文檔解析時間比其他服務都長 chatPDF chatpdf.com官網 特色 使用chatGPT3.5作為語言模型 會將pdf標題存留，只需點擊標題，即可展開檔案與過去的對話。 可以很精確地回答pdf的細節內容。跨頁仍會有解讀上的問題。 可以進行計算 免費版本 120 pages/PDF 10 MB/PDF 3 PDFs/day 50 questions/day Plus版本 $5/mo 2,000 pages/PDF 32 MB/PDF 50 PDFs/day 1000 questions/day PDF GPT(pdfChatter) bhaskartripathi/pdfChatter是個架在huggingface空間的平台，輸入openAI的API token之後，與chatWeb就有類似的功能，差異只在不能儲存歷史。 不過把token貼在網路上似乎不是一件聰明的事。還是不要輕易嘗試。 chat-with-pdf 這個huggingface的平台fffiloni/langchain-chat-with-pdf用的全是huggingface的公開模型，因此沒有token的需要。其他界面也都很類似。 平台上用了3個模型 用的是huggingface的計算資源，所以解析與推演的速度慢了很多(還有queue的問題)。 使用方式 url輸入 在URL下貼上網址、按下Submit url即可開始解讀網頁。 因openAI採預付制，如果deposit用完則進入免費模式，解讀時間會很有限，需再刷卡。 檔案輸入 可以拖曳檔案、點擊選取等方式輸入 可以接受.pdf、.txt、.docx等3種檔案。 目前還不能接受.csv或其他形式具關連性的檔案(eg. json) 檔案太大會拒絕進行解析 對話框(chatbot) 如果內容很明確，chatWeb會在左側出現標題、內容摘要。語言會對應到網頁使用的語言。 如果內容不明確，則不會出現任何內容。需使用者主動提問。 提問欄在Qurey下，直接按enter或Submit，問題即會送到openAI的伺服器計算(提問與回應都會計價)。 Reset鍵會清除所有內容，開始一個新的網頁(或檔案內容)。之前的對話將不會儲存。 內容框(context) 畫面的右側出現網頁(或檔案)與對話有關的內容，讓使用者可以參考。 點擊不會有甚麼作用 Rethinkings 合併成綜合知識庫 環工領域知識分類眾多繁雜。同樣名詞在不同領域會略有語意差異。如下例「監測」一詞有即時性、計畫性等等實質差異。 fine tune需有監督、結構性提供素材，以建立從屬關聯。(如何輸入json檔案) 工程問題與對策之應用 單一網頁、單一檔案的解析並無大礙 同類網頁檔案測試如下 合併檔案 水質即時監測設備應設置於採樣點最近位置，分析成果取得後，再以信號傳送置控制中心以免樣品污染.txt 施工查核之簡報重點.txt 逾期提送監測計畫預定行程表遭致罰款案例探討.txt 問答 你是公司主管，請摘要本文內容。 根據文章內容，以下是摘要的主要內容： 文章描述了一個水質淨化工程的案例，該工程中使用了取樣泵浦和管線輸送水樣進行監測。 在試運轉期間，機房內的溶氧監測設備測值與現地採樣測值相差甚大，經過儀器校正後，發現可能是管線輸送過程中的問題。 更換輸送水樣管線後，溶氧監測測值與現地採樣測值一致，但兩天後溶氧測值再次降低，推測是管線內壁孳生生物膜所致。 文章還提到了處理對策，包括定期消毒管線以去除生物膜，並建議將放流水質自動偵測設備設置在採樣點周邊以避免輸送過程中的污染。 文章還提到了簡報內容的整合和計畫工作內容的執行，以及計畫主任的最後檢核和計畫品保品管的控管。 最後，文章提到了一些問題和改善措施，以及相關的審查和參考資料。 總結來說，本文主要描述了一個水質淨化工程中的問題和解決方案，並提到了相關的簡報內容、計畫工作內容的執行和控管，以及審查和參考資料。 用中文條列一下”簡報內容的整合”相關內容。 以下是與”簡報內容的整合”相關的內容條列： 簡報前，本公司應負責整合業主、本公司及承包商之簡報資料，就其一般性內容重複之處，視各自權責分別取捨後，完成各單位之簡報內容。 施工查核簡報以顯示優良之成果為主，並將本公司執行監造之特點作為報告之內容。有問題時，應說明採取對策後之成效，而非僅提出解決問題之建議，以致造成各方之困擾，因查核委員並非為解決問題而來。 “溶氧監測設備”相關的問題有哪些? 根據文章內容，與”溶氧監測設備”相關的問題有以下幾個： 文章第2段提到，為了達到水質即時監測的目的，放流段設置了取樣泵浦和溶氧監測設備，請問這些溶氧監測設備是如何進行監測的？ 文章第3段提到，在試運轉期間，機房中的溶氧測值趨近於零，但現場採樣的溶氧測值卻與之相異甚大，經儀器校正後確認測值誤差是由於輸送過程所致，請問是什麼原因導致輸送過程中的溶氧測值誤差？ 文章第4段提到，更換管線兩天後，溶氧測值又逐漸降低至趨近於零，但現場採樣的溶氧測值仍然維持在5~6 mg/L，推測是由於管線內壁孳生生物膜，消耗水樣中的溶氧，請問如何解決這個問題？ 文章第9段提到，經檢討後改善方式是將溶氧監測設備遷移至河道旁現地監測，並以傳訊設備傳送監測數值至中控室，請問這種改善方式是否有效？有沒有相關的數據或結果可以提供？ 請注意，以上問題僅基於文章內容，如果上下文沒有提供足夠的信息，則無法提供確定的答案。 “溶氧監測設備”相關的問題發生在甚麼時候? 根據文章內容，問題發生在試運轉期間。 “溶氧監測設備”和”監測計畫”有沒有關係? 根據目前的內容，無法確定”溶氧監測設備”和”監測計畫”之間是否有關聯。目前的內容並未提到這兩者之間的關係。 說明一下文中對”監測計畫”提出哪些問題? 根据文中的相关内容，对于”監測計畫”提出的问题如下： 本部門承攬某機關監測計畫，未依契約服務需求說明書要求，未在规定时间前将预定行程以书面通知業主，导致违反了契约要求。(paragraph 28) 进行计划工作内容的落实和提交进度的检核时，缺乏三级检核的掌握和确认，可能导致工作内容未按计划要求进行。(paragraph 43) 主办工程师在执行计划工作内容时，可能存在问题。(paragraph 41) 监测设备放置位置的选择可能导致监测数据受到影响。(paragraph 10) 以上是根据文中提到的相关内容得出的对”監測計畫”提出的问题。 發生”監測計畫”問題的相關人員有哪些人? 根据文章内容，涉及到”監測計畫”问题的相关人员有以下几个人： 主辦工程師：负责执行计划工作内容。 协办工程师：负责进行数据复核。 计划主任：掌握和确认各项计划工作内容是否符合要求，进行最后的检核。 查核委员：对工程进行施工品质查核，负责评估和判定问题责任。 以上是根据文章内容推测的相关人员，但具体情况可能还需要参考文章其他部分的信息来确认。 溶氧監測可以設置的位置有哪些?試比較各個位置的優缺點? 根據文章的內容，溶氧監測可以設置在以下位置： 機房內：優點是可以保護設備免受風吹日曬等損害，並方便操作人員管理和維護。缺點是水質和生物膜可能影響監測數據的準確性。 河道旁現地監測：優點是可以直接在放流段現場進行監測，確保溶氧數值的真實性。缺點是設備容易受到自然因素的影響，例如風吹、日曬等。 綜合比較兩個位置的優缺點，可以得出以下結論： 機房內的溶氧監測設備可以提供保護和方便管理的優勢，但可能受到水質和生物膜的影響，需要進行定期校正和維護。 河道旁現地監測可以確保溶氧數值的真實性，但設備容易受到自然因素的影響，需要注意設備的防護和維護。 綜合考慮，根據文章的建議，未來設計溶氧監測設備時，建議優先考慮設置在採樣點周邊，以避免輸送過程中遭受污染。 本文中提到的”問題”有哪幾項?整併成3條。 根据文章内容，提到的问题有以下几项： 本部门承揽某机关监测计划，未按照合同要求在规定时间内通知业主预定行程。 设计三级检核单未按照要求进行签名确认。 水样輸送管线中生物膜孳生影响监测结果，且消毒液沖洗去除生物膜效果不持久。 请注意，以上是根据文章内容推测的问题，具体问题描述请参考原文。 你是公司總工程師，對於”監測”有甚麼建議? 根據文章的內容，我們可以提出以下建議： 在施工查核簡報中，應該重點展示監測工作的優良成果，並說明採取對策後的成效，而不僅僅提出解決問題的建議。這樣可以避免造成各方的困擾。 如果工程進度落後，應該清楚說明落後的原因以及監造單位和承包商共同採取的對策，並強調業主的行政支援對改善工程進度的重要性，以讓委員感受到團隊合作的正面印象。 在監測工作中，應該定期檢查水樣輸送管線，以確保管線內部沒有生物膜的孳生，這樣可以確保監測結果的準確性和代表性。 在設計放流水質自動偵測設備時，應該優先考慮將設備設置在採樣點周邊，以避免在輸送過程中遭受污染。 總結來說，建議在監測工作中要重視成果展示和對策的說明，並確保監測設備和管線的正常運作，以提高監測結果的準確性和可靠性。]]></summary></entry><entry><title type="html">CFD在水務工程中的應用與AI發展</title><link href="https://sinotec2.github.io/FAQ/2023/08/17/CFD.html" rel="alternate" type="text/html" title="CFD在水務工程中的應用與AI發展" /><published>2023-08-17T00:00:00+08:00</published><updated>2023-08-17T00:00:00+08:00</updated><id>https://sinotec2.github.io/FAQ/2023/08/17/CFD</id><content type="html" xml:base="https://sinotec2.github.io/FAQ/2023/08/17/CFD.html"><![CDATA[<h2 id="背景">背景</h2>

<h3 id="iwathe-international-water-association">IWA(The International Water Association)</h3>

<ul>
  <li>水廠的模式模擬是結合機械、化工、資訊等專業長期耕耘的一個領域，國際間的設計顧問公司雖然不多，但也持續發展中。協會平台以IWA為主，在IWA架構下設有IMA(IWA Specialist Group Modelling and Integrated Assessment (MIA)原自行辦理研討會<sup id="fnref:23" role="doc-noteref"><a href="#fn:23" class="footnote" rel="footnote">1</a></sup>)，目前委員
    <ul>
      <li>學界：比利時Ghent、法國 Engees Strasbourg<sup id="fnref:24" role="doc-noteref"><a href="#fn:24" class="footnote" rel="footnote">2</a></sup>、<a href="https://www.researchgate.net/profile/Ulf-Jeppsson" title="Lund University-&gt;Department of Biomedical Engineering-&gt;Ulf Jeppsson">瑞典Lund</a>等大學</li>
      <li>顧問公司：比利時AM-Team、<a href="https://www.ibisworld.com/united-kingdom/market-research-reports/water-collection-treatment-supply-industry/" title="Water Collection, Treatment &amp; Supply in the UK">Ibis Group</a>、Ed Wicklein
(<a href="https://carollo.com/">Carollo Engineers</a>)<sup id="fnref:22" role="doc-noteref"><a href="#fn:22" class="footnote" rel="footnote">3</a></sup>、Javier Climent (<a href="https://www.grupogimeno.com/en/">Grupo Gimeno</a>)</li>
    </ul>
  </li>
</ul>

<h3 id="iwa-短文">IWA 短文</h3>

<ul>
  <li><a href="https://iwa-network.org/computational-fluid-dynamics-cfd-a-revolutionary-tool-for-the-water-industry/">Wim Audenaert (November 16, 2020)</a> Computational fluid dynamics (CFD): a revolutionary tool for the water industry.
    <ul>
      <li>這篇刊登在IWA的短文針對氣候變遷、流行病肆虐的當代環境，作者認為需要建立數位對映(Digital Twins, DT)來強化水廠的因應能力，其中的核心內涵即為水廠的CFD數值模型。CFD甚至可以在模廠興建之前就能提供足夠的設計數據，並且在現地放樣的過程，快速達到預期的穩定成果。</li>
      <li>作者是比利時公司<a href="https://www.am-team.com/">AM-TEAM</a>(Advanced modelling services for process optimisation and design)的總裁，該公司是一家水處理單元CFD及動力模擬與設計服務的全球性公司。實績詳見官網<a href="https://www.am-team.com/en/customer-stories/index.html">customer</a>。</li>
      <li>評論：
        <ul>
          <li>CFD公司非常努力拉近當代市場需要與IT產業熱門話題。即使是3年前的短文，仍然感覺很遙遠。</li>
          <li>然而DT的特性強項在於即時性、操作性。CFD要加入在DT的框架，除了計算速度必須有很大的突破，介面也必須大幅的模組化、簡化。前者可以透過模擬結果的機械學習，後者則會因為設計主題而異。</li>
          <li>CFD最費工的程序在3D建模。基設階段、細設、或者修繕階段的建模方式都不太相同。或許這是AI可以協助補足的地方。</li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<h3 id="iwa研討習會">IWA研討(習)會</h3>

<ul>
  <li>2023/1/18-22水回收模擬研討會(IWA Water Resource Recovery Modelling Seminar)針對模式校驗證與數位對映等主題，發表論文討論，也舉行青年工程師的研習培訓，以及共同發表了未來願景。
    <ul>
      <li>研習會主題支援：<a href="https://dynamita.com">Dynamita公司</a>的SUMO軟體</li>
    </ul>
  </li>
</ul>

<h3 id="廢水處理cfd設計之回顧">廢水處理CFD設計之回顧</h3>

<ul>
  <li>Samstag et al., (2016)這篇較早期的回顧文章<sup id="fnref:25" role="doc-noteref"><a href="#fn:25" class="footnote" rel="footnote">4</a></sup>有廣泛的涉獵，並對當時粒子膠結與分散、生物與水力耦合等模擬過程提出建言。</li>
</ul>

<h3 id="教學輔助app">教學輔助APP</h3>

<ul>
  <li>弘光科技大學副校長蘇弘毅(2023)向教育部提出一項創新教學實踐方案，用DesignSolver來教授傳統環工單元操作課程，就是參考了英國利物浦約翰摩爾斯大學海事與機械工程系Seddighi教授的作法<sup id="fnref:32" role="doc-noteref"><a href="#fn:32" class="footnote" rel="footnote">5</a></sup>。蘇教授的原文：</li>
</ul>

<blockquote>
  <p>在機械工程領域的教學上，Seddighi 等學者探討使用 IPython 筆記型電腦結合工業標準軟體教導機械系學生 CFD (Computational Fluid Dynamics) 電腦模擬流體動力學課程，這個研究採用混成學習模式並強調在做中學的精神，結合講授、助教、作業等高度互動方式。結果顯示，學生對於 CFD 理論與基礎觀念有良好的了解，使用這樣的電腦輔助設施可以增進 CFD 主題的教學效能 <sup id="fnref:31" role="doc-noteref"><a href="#fn:31" class="footnote" rel="footnote">6</a></sup></p>
  <ul>
    <li>蘇教授的教學內容現階段雖未包括環工單元操作的CFD，但也隱含了未來可以發展的潛質方向。</li>
    <li>經了解Seddighi教授的做法就是規避深入艱澀的流體力學控制方程式與紊流模式，而是以Jupyter Notebook逐條計算的方式，以1小時講解完畢，而以另外的2小時讓學生自行操作CFD已完成指定的作業。這個作法基本上也是將複雜的CFD予以模組化、以更高階的管理方式予以封包。</li>
  </ul>
</blockquote>

<h2 id="入流工之cfd">入流工之CFD</h2>

<ul>
  <li>Scum Buster For Water Treatment Animation(vertical drop) by <a href="https://www.youtube.com/watch?v=kkEh-rGmxhM">Porter McGuffie, Inc(2013)</a></li>
  <li>Tank Bottom Sludge &amp; Grit Mixing - Vertical Wetwell (CFD) by <a href="https://www.youtube.com/watch?v=IJOYY1t9pWQ">Vaughan Company Pump</a>
    <blockquote>
      <p>CFD animation demonstrating how a 6 inch layer of grit buildup on a tank floor is suspended, mixed, and homogenized in minutes.</p>
    </blockquote>

    <blockquote>
      <p>Streamlines indicate fluid paths, demonstrating complete tank mixing using a Vertical Wet Well Recirculating CHOPPER Pump (tank size: 12x12x9’).</p>
    </blockquote>
  </li>
</ul>

<h2 id="膠凝池之cfd模擬">膠凝池之CFD模擬</h2>

<h3 id="回顧">回顧</h3>

<ul>
  <li>Bridgeman et al., (2009)這篇早期針對膠凝池的CFD回顧文章，對多相流、蘭氏軌跡、以及母數平衡公式等等作法都提出了批判性的評論。<sup id="fnref:20" role="doc-noteref"><a href="#fn:20" class="footnote" rel="footnote">7</a></sup>不過就後續相關膠凝池CFD的發展而言，這篇文章可以說近乎絕響。</li>
</ul>

<h3 id="cfd-of-mixer">CFD of mixer</h3>

<ul>
  <li>The Art of Mixing by <a href="https://www.xylem.com/en-ai/about-xylem/newsroom/events/webinar-the-art-of-mixing/">xylem/Flygt(2023)</a></li>
</ul>

<h3 id="近年相關論文">近年相關論文</h3>

<ul>
  <li>Zouboulis et al.(2010)簡化了膠羽尺寸的流體行為來降低計算負荷，模式應用在低濃度進流之混凝過程，並用希臘帖撒羅尼加市的淨水場實場數據來模擬。研究發現因入流濃度太低，無法形成大到足以沉降的膠羽，必須回流污泥以增加顆粒數量。<sup id="fnref:26" role="doc-noteref"><a href="#fn:26" class="footnote" rel="footnote">8</a></sup></li>
  <li>Shi et al.(2019)與<a href="https://doi.org/10.1016/j.powtec.2021.10.054" title="ang, X., Cui, B., Wei, D., Song, Z., He, Y., Bayly, A.E. (2022). **CFD-PBM modelling of tailings flocculation in a lab-scale gravity thickener**. Powder Technology 396, 139–151.">Wang et. al 2022</a>同樣使用了CFD與PBM偶和模擬的方式，來進行混凝槽的模擬。經由變動入流SS的顆粒大小，研究膠凝池中的非線性過程，並進行可視覺化及定性之比較。<sup id="fnref:30" role="doc-noteref"><a href="#fn:30" class="footnote" rel="footnote">9</a></sup></li>
  <li>Chatila and Danageuzian, (2022)使用Ansy EFFLUENT及實驗室尺寸混凝槽之PIV(Particle Image Velocimetry )測速結果進行低轉速膠羽形成過程的模擬，藉此定量滑動係數κ。經由模擬協助在相同速度梯度條件下，可以降低κ自0.25至0.18，有效減少膠凝池的用電量。<sup id="fnref:28" role="doc-noteref"><a href="#fn:28" class="footnote" rel="footnote">10</a></sup></li>
  <li>國內學位論文：<a href="">自來水淨水廠高速膠凝澄清池之操作與結構改進</a></li>
</ul>

<h3 id="模擬動畫">模擬動畫</h3>

<ul>
  <li><a href="https://www.youtube.com/watch?v=hzr2DjqAuHw">THINK Fluid Dynamix</a></li>
</ul>

<p><img src="https://github.com/sinotec2/FAQ/raw/main/attachments/2023-08-21-15-59-19.png" alt="" /></p>

<h2 id="氣泡質傳熱交換等相關學術文獻">氣泡質傳、熱交換等相關學術文獻</h2>

<h3 id="法國圖盧茲大學團隊">法國圖盧茲大學團隊</h3>

<ul>
  <li>法國圖盧茲大學團隊Cockx et al., (2001)這篇較早期的文章使用了該國電力公司(Electricité de France EDF)所發展的二相氣泡流CFD商業程式ASTRID-Tri_CFD，研究廢水處理程序中氣泡的全域及局部質傳現象及系數<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">11</a></sup>。
    <ul>
      <li>本研究居於同作者先前有關氣升式內部環流反應器研究<sup id="fnref:3" role="doc-noteref"><a href="#fn:3" class="footnote" rel="footnote">12</a></sup>、以及臭氧反應塔研究<sup id="fnref:4" role="doc-noteref"><a href="#fn:4" class="footnote" rel="footnote">13</a></sup>，都是使用ASTRID之CFD程式。</li>
      <li>ASTRID(Advanced Sodium Technological Reactor for Industrial Demonstration)先進鈉技術反應堆工業示範計畫是CEA自2006年開始的項目。目前該計畫中的CFD是用以預測反應槽中鈉金屬的熱流行為。<a href="https://doi.org/10.1016/j.nucengdes.2019.04.033" title="Bieder, U., Maillard, J., Gorsse, Y., Guenadou, D. (2019). CFD analysis of the flow in the MICAS experimental facility, a water model of the hot pool of a sodium cooled fast reactor. Nuclear Engineering and Design 350, 67–77. [doi](https://doi.org/10.1016/j.nucengdes.2019.04.033)">Bieder et al., (2019)</a>也將其應用在ASTRID反應器1/6比例尺模廠之熱水模擬及驗證。<sup id="fnref:2" role="doc-noteref"><a href="#fn:2" class="footnote" rel="footnote">14</a></sup></li>
      <li>CEA(Commissariat à l’énergie atomique et aux énergies alternatives)法國原子能和替代能源委員會</li>
    </ul>
  </li>
  <li>團隊(Ngu et al., 2022)持續發展二氧化碳化學吸附反應塔質傳現象的CFD<sup id="fnref:14" role="doc-noteref"><a href="#fn:14" class="footnote" rel="footnote">15</a></sup>，以及生物產氫的質傳數值與模場模擬研究(Ngu et al., 2023)<sup id="fnref:15" role="doc-noteref"><a href="#fn:15" class="footnote" rel="footnote">16</a></sup>，不再使用商用軟體，改由自行研發。</li>
</ul>

<h3 id="中國石油大學重質油國家重點實驗室">中國石油大學重質油國家重點實驗室</h3>

<ul>
  <li>團隊建立了一個4.4m高對向流的氣泡塔模型廠、並建立數值模式來預測氣泡塔的流場與質傳<sup id="fnref:16" role="doc-noteref"><a href="#fn:16" class="footnote" rel="footnote">17</a></sup></li>
</ul>

<h3 id="openfoam">OpenFOAM</h3>

<ul>
  <li>這篇由中國科學院上海高等研究院團隊(Zhao et al., 2023)的應用研究，將泛用行CFD模式OpenFOAM應用在臭氧接觸槽中質傳的計算，最大的貢獻在於建立了視覺氣泡量測，以律定CFD中的介面力學模式(阻力、氣泡上升及紊流模式)與多尺寸氣泡模式(氣泡數平衡方程式及界面面積傳輸方程式)。<sup id="fnref:5" role="doc-noteref"><a href="#fn:5" class="footnote" rel="footnote">18</a></sup>
    <ul>
      <li>大多數人是用OpenFOAM中的volume of fluid (VoF) 方法進行模擬，如<sup id="fnref:6" role="doc-noteref"><a href="#fn:6" class="footnote" rel="footnote">19</a></sup>用OpenFOAM和Fluent兩個模式來計算氣泡柱的質傳。</li>
    </ul>
  </li>
  <li>在核能廠熱水系統中熱傳與質傳的OpenFOAM應用，如阿根廷國立海岸大學團隊(<a href="https://doi.org/10.1016/j.net.2023.01.001" title="Corzo, S.F., Godino, D.M., Sarache Piña, A.J., Nigro, N.M., Ramajo, D.E. (2023). **Thermal-hydraulic 0D/3D coupling in OpenFOAM: Validation and application in nuclear installations**. Nuclear Engineering and Technology 55, 1911–1923.">Corzo et al., 2023</a>)<sup id="fnref:7" role="doc-noteref"><a href="#fn:7" class="footnote" rel="footnote">20</a></sup>，該研究中使用0維與3維耦合的動態邊界條件，來模擬管線、加壓站、熱交換器、與開放冷卻水塘的冷卻現象。
    <blockquote>
      <p>To overcome the above mentioned issues, the nuclear engineering community has invested immense efforts to couple system codes with CFD codes [4] [5] [6]. 
There are few publications addressing this topic through semi-implicit or implicit techniques while most such papers are based on explicit coupling. In the later, the system codes and 3D CFD codes run in a staggered way, communicating the necessary data through temporary files and flags.</p>
    </blockquote>

    <blockquote>
      <p>One of the first attempts was done by Martin et al. <a href="https://doi.org/10.1016/j.net.2023.01.001" title="Corzo, S.F., Godino, D.M., Sarache Piña, A.J., Nigro, N.M., Ramajo, D.E. (2023). **Thermal-hydraulic 0D/3D coupling in OpenFOAM: Validation and application in nuclear installations**. Nuclear Engineering and Technology 55, 1911–1923.">7</a>, who coupled RELAP5 with other codes transferring data through a Parallel Virtual Machine (PVM) protocol. In the same way, Aumiller et al. [8] did so using RELAP5-3D with a CFD code showing good results while finding some numerical instability.</p>
    </blockquote>

    <blockquote>
      <p>More recent developments also using explicit methods, coupled RELAP with <strong>ANSYS-CFX</strong> [9], ATHLET with <strong>OpenFOAM</strong>Ⓡ [10], and TRACE with <strong>Star-CCM</strong> [11]. In all cases the system codes assumed the master role, sending the necessary information such as mass flow, pressure, and temperature, amongst others, to the CFD code. These mass-flow/pressure couplings are relatively simple because the pressure in the coupled domains remains constant until the end of the time step, but they could lead to stability problems under large time steps or fast transient simulations <a href="https://doi.org/10.1016/j.cej.2017.01.128" title="Bhusare, V.H., Dhiman, M.K., Kalaga, D.V., Roy, S., Joshi, J.B. (2017). **CFD simulations of a bubble column with and without internals by using OpenFOAM**. Chemical Engineering Journal 317, 157–174. ">12</a>.</p>
    </blockquote>

    <blockquote>
      <p>In order to eliminate numerical instabilities Weaver et al. [13] proposed a generic semi-implicit coupling technique, which uses the master/slave communication roles but update both the velocity and pressure in each communication step. This coupling methodology showed good performance in several flow conditions [14] [15]. Bandini et al. [16] presented a detailed compilation of the publications concerning code-coupling tools to simulate new-generation reactors focusing on the validation of these tools against experimental facilities.</p>
      <ul>
        <li>(Corzo et al., 2023)也應用OpenFOAM在行進中巴士內流場的模擬，這經驗對場站內的通風設計也會有不少啟發。<sup id="fnref:8" role="doc-noteref"><a href="#fn:8" class="footnote" rel="footnote">21</a></sup></li>
      </ul>
    </blockquote>
  </li>
  <li>印度霍米巴巴國家研究所團隊(<a href="https://doi.org/10.1016/j.cej.2017.01.128" title="Bhusare, V.H., Dhiman, M.K., Kalaga, D.V., Roy, S., Joshi, J.B. (2017). **CFD simulations of a bubble column with and without internals by using OpenFOAM**. Chemical Engineering Journal 317, 157–174. ">Bhusare et al., 2017</a>)發展出適用在氣泡塔質傳研究的OpenFOAM應用，他們主要的貢獻在於彙整了文獻中相關的試驗觀測數據，並用以驗證CFD模擬結果，除了OpenFOAM外，團隊以FLUENT進行同樣條件的模擬，藉此比較驗證模型的正確性，在實場的模擬中，作者以氣體停留時間、液體流速等等項目，來比較模擬結果與實測情形。<sup id="fnref:12" role="doc-noteref"><a href="#fn:12" class="footnote" rel="footnote">22</a></sup></li>
</ul>

<h3 id="ansys-fluent">ANSYS FLUENT</h3>

<ul>
  <li>北京清大化工系綠色反應工程與技術重點實驗室研究團隊應用FLUENT在最新接觸槽的設計，模擬研究針對向下噴流及中央設置螺旋篩帶之接觸塔設計。<sup id="fnref:13" role="doc-noteref"><a href="#fn:13" class="footnote" rel="footnote">23</a></sup></li>
  <li>Chen and Brooks(2021)使用顆粒速度量測與溶氧電荷法進行圓柱形氣泡塔模場試驗，並運用EFLUENT進行模擬，來預測未來實場的可能情形。<sup id="fnref:17" role="doc-noteref"><a href="#fn:17" class="footnote" rel="footnote">24</a></sup></li>
</ul>

<h3 id="系統cfd耦合模式">系統/CFD耦合模式</h3>

<ul>
  <li>雖然這類的組合大多應用在核能反應器的熱傳/質傳模擬，其組合的功能性也提醒我們，CFD可以與任何模式搭配，來完成敏感性分析及預測的任務，也包括AI模型的Digital Twins系統。</li>
  <li>法國鈉金屬冷卻之快速反應器在2009年除役，在進到下一階段先進鈉技術反應堆工業示範計畫(ASTRID)之前，依據歐洲共同體第七框架計畫之內容，法國展開所謂的熱水力創新系統(The thermal-hydraulics innovative system, THINS)過渡計畫，來驗證系統程式與系統/CFD耦合模式<sup id="fnref:9" role="doc-noteref"><a href="#fn:9" class="footnote" rel="footnote">25</a></sup>。選項包括：
    <ul>
      <li>RELAP(Reactor Excursion and Leak Analysis Program) with <strong>ANSYS-CFX</strong> (FLUENT)<sup id="fnref:10" role="doc-noteref"><a href="#fn:10" class="footnote" rel="footnote">26</a></sup></li>
      <li>ATHLET with <strong>OpenFOAM</strong>Ⓡ <sup id="fnref:11" role="doc-noteref"><a href="#fn:11" class="footnote" rel="footnote">27</a></sup></li>
      <li>TRACE with <strong>Star-CCM</strong></li>
    </ul>
  </li>
</ul>

<h3 id="氣化反應器">氣化反應器</h3>

<p><img src="https://www.researchgate.net/profile/Jitendra-Carpenter/publication/311865301/figure/fig6/AS:877538121367554@1586232800945/Schematic-representation-of-hydrodynamic-cavitation-HC-reactor.ppm" alt="" /></p>

<ul>
  <li>ANSYS-Fluent Tutorial- Waste water treatment by Cavitation Reactor(<a href="https://www.youtube.com/watch?v=TYnUH6QrA9s">Engineering Nature(2022)</a>)</li>
  <li>review paper<sup id="fnref:33" role="doc-noteref"><a href="#fn:33" class="footnote" rel="footnote">28</a></sup></li>
</ul>

<h2 id="沉澱池之模擬">沉澱池之模擬</h2>

<ul>
  <li>Wang et al., (2022)將Ansys CFX及母數平衡公式耦合在一起，用來模擬實驗室尺寸的膠羽污泥濃縮池，入流速度雖會增加膠羽的持續形成，但也會因增加紊流而破壞重力沉澱，作者經由模式模擬取得最佳的入流速度設計值<sup id="fnref:29" role="doc-noteref"><a href="#fn:29" class="footnote" rel="footnote">29</a></sup>。</li>
  <li>水泥的SPH模擬(<a href="https://doi.org/10.1016/j.ijmecsci.2020.106046" title="Tran-Duc, T., Ho, T., Thamwattana, N. (2021). A smoothed particle hydrodynamics study on effect of coarse aggregate on self-compacting concrete flows. International Journal of Mechanical Sciences 190, 106046.">Tran-Duc et al., 2021</a>)<sup id="fnref:34" role="doc-noteref"><a href="#fn:34" class="footnote" rel="footnote">30</a></sup></li>
</ul>

<h2 id="消毒系統流場質傳與反應之cfd相關文獻">消毒系統流場、質傳與反應之CFD相關文獻</h2>

<h3 id="回顧-1">回顧</h3>

<ul>
  <li>南佛羅里達大學土木環工系團隊(Zhang et al., 2014)將過去20年來在消毒領域的所有CFD研究進行了回顧，團隊認為依序需要解決的問題是：紊流模式之精進、暫態流、二相或多相流模擬、非均質分布對化學反應機制的影響<sup id="fnref:21" role="doc-noteref"><a href="#fn:21" class="footnote" rel="footnote">31</a></sup>。</li>
</ul>

<h3 id="自撰模式">自撰模式</h3>

<ul>
  <li>Bas Anton Wols, (2010)這篇鹿特丹代爾夫特理工大學土木系的博士班畢業論文中，作者針對臭氧與紫外線消毒程序進行了模場與CFD模擬(RANS and LES model)。<sup id="fnref:18" role="doc-noteref"><a href="#fn:18" class="footnote" rel="footnote">32</a></sup></li>
  <li>英國蘭卡斯特大學團隊(Shah et al., 2021)提出UV系統的CFD模擬結果，研究接觸池幾何形狀與UV劑量的關係，並評估在實場中使用紫外線燈的消毒效果<sup id="fnref:19" role="doc-noteref"><a href="#fn:19" class="footnote" rel="footnote">33</a></sup>。</li>
</ul>

<h3 id="圓形噴射加氟混合槽">圓形噴射加氟混合槽</h3>

<ul>
  <li>CFD Solutions for Water Treatment with Free Surface and Fluorine Jets by <a href="https://www.youtube.com/watch?app=desktop&amp;v=OOjmYbo--YY"> LEAP Australia(2022)</a></li>
</ul>

<h2 id="配水系統">配水系統</h2>

<h3 id="分水工">分水工</h3>

<ul>
  <li>by THINK Fluid Dynamix(2019) <a href="https://www.youtube.com/watch?v=ZI6fhrw8gQQ">CFD in Water Treatment: distribution chamber(YouTube)</a>
    <blockquote>
      <p>Unsteady analysis of flow distribution in distribution chamber in a wastewater treatment plant.
Multiphase Volume of Fluid (VOF) simulation.
Turbulence Model: SST-Scale Adaptative Simulation
ANSYS CFX 2019 R3</p>
    </blockquote>
    <ul>
      <li><a href="https://think-fluid-dynamix.com/about-us/">公司簡介</a>
        <ul>
          <li>德國Erlangen的一家顧問公司，專長在水處理廠的CFD模式模擬，舉凡混合、質傳、沈降分離、水力、變流、水工模型實驗等等。</li>
          <li>銷售套裝軟體為<a href="https://think-fluid-dynamix.com/m-star/m-star-validation-and-papers/">MSTAR</a>。</li>
        </ul>
      </li>
    </ul>
  </li>
  <li>by INVENT Umwelt- und Verfahrenstechnik AG(2015)<a href="https://www.youtube.com/watch?v=IUxX_ksQ9B4">CFD in water &amp; wastewater treatment: Mixing tanks, tracer(youtube)</a>
    <ul>
      <li>distribution and vertical mixing with upper outflows</li>
      <li><a href="https://invent-uv.com/company/history/">公司簡介</a>：THINK Fluid Dynamix之<a href="https://invent-uv.com/invent-worldwide/">控股公司</a>，除了德國之外，在義大利、阿拉伯、美國、澳洲也都設有辦公室。主要業務在設計水廠及應用元件，以雙曲面混合器起家，1980年代自弗里德里希-亞歷山大大學之埃爾蘭根-紐倫堡流體力學研究所拆分創立。</li>
    </ul>
  </li>
</ul>

<h2 id="商業cfd套裝軟體">商業CFD套裝軟體</h2>

<h3 id="ansys-cfxeffluent">Ansys CFX/EFFLUENT</h3>

<ul>
  <li>官網：<a href="https://www.ansys.com/products/fluids/ansys-cfx">Turbomachinery CFD Software</a></li>
  <li>Korpijärvi et al. (2000)<sup id="fnref:27" role="doc-noteref"><a href="#fn:27" class="footnote" rel="footnote">34</a></sup></li>
</ul>

<h3 id="mstar">MSTAR</h3>

<ul>
  <li>官網：<a href="https://think-fluid-dynamix.com/m-star/m-star-validation-and-papers/">THINK Fluid Dynamix</a></li>
</ul>

<h3 id="gps-x">GPS-X</h3>

<ul>
  <li>官網：<a href="https://www.hydromantis.com/GPSX-innovative.html">Hydromantis ESS, Inc.</a></li>
</ul>

<h3 id="water--gem">water -Gem</h3>

<ul>
  <li>官網：<a href="https://www.bentley.com/software/openflows-watergems/">bentley.com</a></li>
</ul>

<h3 id="epanet">EPANET</h3>

<ul>
  <li>官網：<a href="https://www.epa.gov/water-research/epanet">USEPA</a></li>
</ul>

<h3 id="flow---3d">FLOW - 3D</h3>

<ul>
  <li>官網：<a href="https://www.flow3d.com/products/flow-3d-hydro/conveyance-infrastructure/"> FLOW SCIENCE, INC</a></li>
</ul>

<h3 id="simcenter">Simcenter</h3>

<ul>
  <li>官網：<a href="https://plm.sw.siemens.com/en-US/simcenter/fluids-thermal-simulation/star-ccm/"> STAR-CCM+ software</a></li>
  <li>加入SPH(smoothed particles hydrodynamics)=<a href="https://www.megaflow.com.tw/simcenter-sph-flow/">FloEFD/Star-CCM+</a></li>
</ul>

<p><img src="https://github.com/sinotec2/FAQ/raw/main/attachments/2023-08-23-13-28-22.png" alt="" /></p>

<h3 id="nanofluidx">nanoFluidX</h3>

<ul>
  <li>官網：<a href="https://2021.help.altair.com/2021.2/hwsolvers/nfx/topics/getting_started/introduction_nanofluidx_r.htm">Altair nanoFluidX 2021.2</a>
    <ul>
      <li>nanoFluidX only runs on Linux systems with CUDA-ready GPU’s.</li>
    </ul>
  </li>
</ul>

<p><img src="https://github.com/sinotec2/FAQ/raw/main/attachments/2023-08-23-13-38-56.png" alt="" /></p>

<p><img src="https://github.com/sinotec2/FAQ/raw/main/attachments/2023-08-23-13-43-09.png" alt="" /></p>

<h2 id="visualizer">Visualizer</h2>

<h3 id="mixing-and-dissolve">mixing and dissolve</h3>

<ul>
  <li>Multiphase Fluid Simulations <a href="https://www.youtube.com/watch?v=cUWDeDRet4c">Two Minute Papers #113</a></li>
</ul>

<h3 id="realtime-simulator-on-unityhub">realtime simulator on UnityHub</h3>

<ul>
  <li>IDE style platform</li>
  <li><a href="">website</a></li>
  <li>Ajay
    <ul>
      <li>Coding a Realtime Fluid Simulation in Unity <a href="https://www.youtube.com/watch?v=zbBwKMRyavE&amp;t=24s">AJtech(2023)</a></li>
      <li>Optimizing our Realtime Fluid Simulation in Unity by <a href="https://www.youtube.com/watch?v=9M72KrGhYuE&amp;t=13s">AJtech(2023)</a></li>
    </ul>
  </li>
</ul>

<h3 id="visualized-using-unity3dhololens">visualized using Unity3D/Hololens</h3>

<ul>
  <li>(Berger and Cristie, 2015)<sup id="fnref:35" role="doc-noteref"><a href="#fn:35" class="footnote" rel="footnote">35</a></sup>, <a href="https://youtu.be/u35FuLWav3I">youtube</a></li>
</ul>

<p><img src="https://github.com/sinotec2/FAQ/raw/main/attachments/2023-08-24-11-49-14.png" alt="" /></p>

<ul>
  <li>Computational Fluid Dynamics (CFD) Data Visualization using Hololens by <a href="https://www.youtube.com/watch?v=HBYwnGITSEI">Marco Losurdo(2016)@youtube</a></li>
  <li>sersolmaz
    <ul>
      <li>CFD-CDN-UNITY: Interactive CFD simulations with Unity by <a href="https://github.com/sersolmaz/CFD-CDN-UNITY">Serkan Solmaz(2022)@github</a></li>
      <li>Multiplatform processing of CFD simulations with AR/VR by <a href="https://github.com/sersolmaz/CFD_AR_VR">Serkan Solmaz(2023)@github</a></li>
    </ul>
  </li>
  <li>UnityCFDviewer by <a href="https://github.com/ImperialCollegeLondon/UnityCFDviewer">ImperialCollegeLondon(2018)@github</a></li>
  <li>Smoke simulation using Navier-Stokes equations in Unity Engine(SmokeSimulationCFD) by <a href="https://github.com/mwarzech/SmokeSimulationCFD">mwarzech(2020)</a></li>
  <li>Simple Unity-fluid-simulation by <a href="https://github.com/gkowash/Unity-fluid-simulation">gkowash(2023)</a></li>
  <li><a href="https://github.com/chrislarkee/ParaView_CFD_To_VR">chrislarkee/ParaView_CFD_To_VR</a></li>
</ul>

<h3 id="unity-ai">Unity AI</h3>

<ul>
  <li>AI2-THOR: A virtual environment for training home assistant robots<a href="https://resources.unity.com/ai-ml-content/ai2-thor-session">Roozbeh Mottaghi(2021)@Youtube</a></li>
</ul>

<h3 id="cad元件">CAD元件</h3>

<ul>
  <li>Browse and download thousands of CAD Drawing files from <a href="https://www.caddetails.com/cad-drawings/mf/water-treatment-equipment">CADdetail</a>. Pollution and Waste Control Equipment -&gt; Water Treatment Equipment</li>
  <li>看這篇就夠！28 個免費 3D 模型下載、版權使用、資源網站整理 <a href="https://tw.eagle.cool/blog/post/best-websites-to-download-free-3d-model-with-high-quality">Eagle 部落格-&gt;設計資源</a></li>
</ul>

<h2 id="smoothing-particle-hydrodynamics">smoothing particle hydrodynamics</h2>

<ul>
  <li>Coding a Realtime Fluid Simulation in Unity by <a href="https://www.youtube.com/watch?v=zbBwKMRyavE">AJTech(2023)</a>
    <ul>
      <li>SPH並不是新的想法，此處以c#介紹coding的過程</li>
      <li>2023/7月更新了、更優化的作法(Optimizing our Realtime Fluid Simulation in Unity)<a href="https://www.youtube.com/watch?v=9M72KrGhYuE&amp;t=609s">AJTech2023</a></li>
    </ul>
  </li>
</ul>

<h3 id="open-source-codes-on-github">open source codes on GitHub</h3>

<table>
  <thead>
    <tr>
      <th style="text-align: center">uid(year)</th>
      <th style="text-align: center">repo</th>
      <th style="text-align: center">language</th>
      <th>title</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">sanguinariojoe(2023)</td>
      <td style="text-align: center"><a href="https://github.com/sanguinariojoe/aquagpusph">aquagpusph</a></td>
      <td style="text-align: center">c++</td>
      <td>Free CFD software based on SPH and accelerated with OpenCL</td>
    </tr>
    <tr>
      <td style="text-align: center">zoziha(2022)</td>
      <td style="text-align: center"><a href="https://github.com/zoziha/sph">sph</a></td>
      <td style="text-align: center">Fortran</td>
      <td>A smoothed particle hydrodynamics (SPH) code</td>
    </tr>
    <tr>
      <td style="text-align: center">AhmedSalih3d(2023)</td>
      <td style="text-align: center"><a href="https://github.com/AhmedSalih3d/SPHExample">SPHExample</a></td>
      <td style="text-align: center">Julia</td>
      <td>Simple SPH dam-break simulation</td>
    </tr>
    <tr>
      <td style="text-align: center">johng12(2014)</td>
      <td style="text-align: center"><a href="https://github.com/johng12/cudaSPH">cudaSPH</a></td>
      <td style="text-align: center">c++</td>
      <td>Smoothed Particle Hydrodynamics CFD software parallelized using CUDA</td>
    </tr>
    <tr>
      <td style="text-align: center">vishalk2(2021)</td>
      <td style="text-align: center"><a href="https://github.com/vishalk2/CFD-DEM-coupled-Simulations-of-Spherical-Particles">CFD-DEM-coupled-Simulations-of-Spherical-Particles</a></td>
      <td style="text-align: center">C</td>
      <td>CFD-DEM coupled simulations of Spherical-shaped particles in a Spouted Bed Dryer using OpenFOAM-5.x and LIGGGHTS.</td>
    </tr>
    <tr>
      <td style="text-align: center">abhaykamat(2012)</td>
      <td style="text-align: center"><a href="https://github.com/abhaykamat/GodunovSPH">GodunovSPH</a></td>
      <td style="text-align: center">c++</td>
      <td>Integrating a Godunov/Riemann solver with Smoothed Particle Hydrodynamics for Aeronautical, Astronautical and Astrophysical CFD.</td>
    </tr>
    <tr>
      <td style="text-align: center">Plume-SPH(2020)</td>
      <td style="text-align: center"><a href="https://github.com/Plume-SPH/plume-sph">Plume-SPH</a></td>
      <td style="text-align: center">c++</td>
      <td>A open source solver for modeling volano plume, the numerical method used for solving PDEs is smoothed particle hydrodynamics (SPH).</td>
    </tr>
    <tr>
      <td style="text-align: center">sim-oy(2022)</td>
      <td style="text-align: center"><a href="https://github.com/sim-oy/fluid_simulation">fluid_simulation</a></td>
      <td style="text-align: center">c#</td>
      <td>CFD SPH</td>
    </tr>
    <tr>
      <td style="text-align: center">deeptavker(2019)</td>
      <td style="text-align: center"><a href="https://github.com/deeptavker/shocktube_solver">shocktube_solver</a></td>
      <td style="text-align: center">Python</td>
      <td>Simulating the classic sod shocktube using SPH technique</td>
    </tr>
    <tr>
      <td style="text-align: center">martinjrobins(2014)</td>
      <td style="text-align: center"><a href="https://github.com/martinjrobins/paper_comparison/tree/master">paper_comparison</a></td>
      <td style="text-align: center">c++</td>
      <td>some simulations for SPH-DEM and CFD_DEM comparison paper</td>
    </tr>
    <tr>
      <td style="text-align: center">jvormann(2018)</td>
      <td style="text-align: center"><a href="https://github.com/jvormann/Nek5000-Cubed-Sphere">Nek5000-Cubed-Sphere</a></td>
      <td style="text-align: center">Fortran</td>
      <td>Create a cubed sphere grid for the Nek5000 CFD Code</td>
    </tr>
    <tr>
      <td style="text-align: center">farhan4995(2022)</td>
      <td style="text-align: center"><a href="https://github.com/farhan4995/MovingMultiblock_Sedimentation_Sphere">MovingMultiblock_Sedimentation_Sphere</a></td>
      <td style="text-align: center">C</td>
      <td>Simulation of a Sedimentation of Sphere under gravity using Multidomain method of Lattice Boltzmann Method</td>
    </tr>
    <tr>
      <td style="text-align: center">j8asic(2022)</td>
      <td style="text-align: center"><a href="https://github.com/j8asic/isph">isph</a></td>
      <td style="text-align: center">c++</td>
      <td>(2009-2012) First GPU implementation of Incompressible Smoothed Particle Hydrodynamics (ISPH)</td>
    </tr>
  </tbody>
</table>

<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:23" role="doc-endnote">
      <p>Nopens, I., Laurent, J., Wicklein, E., Ducoste, J., Griborio, A., Batstone, D., Wicks, J., Saunders, S., Potier, O., Karpinska Portela, A., Samstag, R. (2015). <strong>Computational Fluid Dynamics: an important modelling tool for the water sector</strong>, Rotterdam.<a href="https://www.researchgate.net/publication/301754532_Computational_Fluid_Dynamics_an_important_modelling_tool_for_the_water_sector">pdf</a> <a href="#fnref:23" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:24" role="doc-endnote">
      <p>Laurent, J., Samstag, R., Ducoste, J., Griborio, A., Nopens, I., Batstone, D., Wicks, J., Saunders, S., Potier, O. (2014). <strong>A protocol for the use of computational fluid dynamics as a supportive tool for wastewater treatment plant modelling</strong>. Water science and technology : a journal of the International Association on Water Pollution Research 70, 1575–84. <a href="https://doi.org/10.2166/wst.2014.425">doi</a> <a href="#fnref:24" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:22" role="doc-endnote">
      <p>Wicklein, E., Batstone, D., Ducoste, J., Laurent, J., Griborio, A., Wicks, J., Saunders, S., Samstag, R., Potier, O., Nopens, I. (2015). <strong>Good modelling practice in applying computational fluid dynamics for WWTP modelling</strong>. Water Science and Technology 73, wst2015565. <a href="https://doi.org/10.2166/wst.2015.565">doi</a> <a href="#fnref:22" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:25" role="doc-endnote">
      <p>Samstag, R.W., Ducoste, J.J., Griborio, A., Nopens, I., Batstone, D.J., Wicks, J.D., Saunders, S., Wicklein, E.A., Kenny, G., Laurent, J. (2016). <strong>CFD for wastewater treatment: an overview</strong>. Water Science and Technology 74, 549.<a href="https://doi.org/10.2166/wst.2016.249">doi</a> <a href="#fnref:25" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:32" role="doc-endnote">
      <p>蘇弘毅(2023)以擬 APP 網頁解題工具(DesignSolver)提升環工單元操作課程學生解決設計問題的興趣與能力」(配合課程名稱: 環境工程單元操作實驗)教育部教學實踐研究計畫成果報告PEE1100931(<a href="https://tpr.moe.edu.tw/achievement//upload/banner/20230208/47e86bd63fb74b7eb0fb4482bc553f80/47e86bd63fb74b7eb0fb4482bc553f80.pdf">pdf</a>) <a href="#fnref:32" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:31" role="doc-endnote">
      <p>M Seddighi, D Allanson, G Rothwell, K Takrouri, <strong>Study on the use of a combination of IPython Notebook and an industry-standard package in educating a CFD course</strong>, Computational Applied Engineering Education, 28 (2019) 952-964. <a href="#fnref:31" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:20" role="doc-endnote">
      <p>Bridgeman, J., Jefferson, B., Parsons, S.A. (2009). <strong>Computational Fluid Dynamics Modelling of Flocculation in Water Treatment: A Review</strong>. Engineering Applications of Computational Fluid Mechanics 3, 220–241. <a href="https://doi.org/10.1080/19942060.2009.11015267">doi</a> <a href="#fnref:20" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:26" role="doc-endnote">
      <p>Zouboulis, A., Karapantsios, T., Kostoglou, M. (2010). <strong>A CFD-based simulation study of a large scale flocculation tank for potable water treatment</strong>. Chemical Engineering Journal 162, 208–216. <a href="https://doi.org/10.1016/j.cej.2010.05.032">doi</a> <a href="#fnref:26" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:30" role="doc-endnote">
      <p>Shi, Z., Zhang, G., Zhang, Y., He, T., Pei, G. (2019). <strong>Modeling of Flocculation and Sedimentation Using Population Balance Equation</strong>. Journal of Chemistry 2019, 9187204. <a href="https://doi.org/10.1155/2019/9187204">doi</a> <a href="#fnref:30" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:28" role="doc-endnote">
      <p>Chatila, J.G., Danageuzian, H.R. (2022). <strong>PIV and CFD investigation of paddle flocculation hydrodynamics at low rotational speeds</strong>. Scientific Reports 12, 19742. <a href="https://doi.org/10.1038/s41598-022-23935-x">doi</a> <a href="#fnref:28" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:1" role="doc-endnote">
      <p>Cockx, A., Do-Quang, Z., Audic, J.M., Liné, A., Roustan, M. (2001). <strong>Global and local mass transfer coefficients in waste water treatment process by computational fluid dynamics</strong>. Chemical Engineering and Processing: Process Intensification 40, 187–194. <a href="https://doi.org/10.1016/S0255-2701(00)00138-0">doi</a> <a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:3" role="doc-endnote">
      <p>Cockx, A., Liné, A., Roustan, M., Do-Quang, Z., Lazarova, V. (1997). <strong>Numerical simulation and physical modeling of the hydrodynamics in an air-lift internal loop reactor.</strong> Chemical Engineering Science 52, 3787–3793. <a href="https://doi.org/10.1016/S0009-2509(97)00224-8">doi</a> <a href="#fnref:3" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:4" role="doc-endnote">
      <p>Cockx, A., Do-Quang, Z., Liné, A., Roustan, M. (1999). <strong>Use of computational fluid dynamics for simulating hydrodynamics and mass transfer in industrial ozonation towers.</strong> Chemical Engineering Science 54, 5085–5090. <a href="https://doi.org/10.1016/S0009-2509(99)00239-0">doi</a> <a href="#fnref:4" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:2" role="doc-endnote">
      <p>Bieder, U., Maillard, J., Gorsse, Y., Guenadou, D. (2019). <strong>CFD analysis of the flow in the MICAS experimental facility, a water model of the hot pool of a sodium cooled fast reactor.</strong> Nuclear Engineering and Design 350, 67–77. <a href="https://doi.org/10.1016/j.nucengdes.2019.04.033">doi</a> <a href="#fnref:2" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:14" role="doc-endnote">
      <p>Ngu, V., Morchain, J., Cockx, A. (2022). <strong>In-depth analysis of reactive bubbly flow using two-way coupled spatio-temporal 1D model.</strong> Chemical Engineering Science 261, 117963. <a href="https://doi.org/10.1016/j.ces.2022.117963">doi</a> <a href="#fnref:14" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:15" role="doc-endnote">
      <p>Ngu, V., Fletcher, D.F., Kavanagh, J.M., Rafrafi, Y., Dumas, C., Morchain, J., Cockx, A. (2023). <strong>H2 mass transfer – A key factor for efficient biological methanation: Comparison between pilot-scale experimental data, 1D and CFD models</strong>. Chemical Engineering Science 268, 118382. <a href="https://doi.org/10.1016/j.ces.2022.118382">doi</a> <a href="#fnref:15" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:16" role="doc-endnote">
      <p>Li, C., Cui, Y., Shi, X., Gao, J., Lan, X. (2022). <strong>CFD simulation of mass transfer in bubble columns: Detailed study of mass transfer models</strong>. Chemical Engineering Science 264, 118173. <a href="https://doi.org/10.1016/j.ces.2022.118173">doi</a> <a href="#fnref:16" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:5" role="doc-endnote">
      <p>Zhao, L., Lu, Y., Lu, D., Tang, Z. (2023). <strong>Modelling for gas-liquid bubbling flow and mass transfer with OpenFOAM.</strong> International Journal of Multiphase Flow 163, 104441. <a href="https://doi.org/10.1016/j.ijmultiphaseflow.2023.104441">doi</a> <a href="#fnref:5" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:6" role="doc-endnote">
      <p>Horvath, A., Jordan, C., Lukasser, M., Kuttner, C., Makaruk, A., Harasek, M. (2009). <strong>CFD SIMULATION OF BUBBLE COLUMNS USING THE VOF MODEL - COMPARISON OF COMMERCIAL AND OPEN SOURCE SOLVERS WITH AN EXPERIMENT.</strong> Chemical Engineering Transactions 18, 605–610. <a href="https://doi.org/10.3303/CET0918098">doi</a> <a href="#fnref:6" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:7" role="doc-endnote">
      <p>Corzo, S.F., Godino, D.M., Sarache Piña, A.J., Nigro, N.M., Ramajo, D.E. (2023). <strong>Thermal-hydraulic 0D/3D coupling in OpenFOAM: Validation and application in nuclear installations</strong>. Nuclear Engineering and Technology 55, 1911–1923. <a href="https://doi.org/10.1016/j.net.2023.01.001">doi</a> <a href="#fnref:7" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:8" role="doc-endnote">
      <p>Corzo, S.F., Godino, D.M., Ramajo, D.E. (2023). <strong>Air circulation study inside and outside of urban buses induced by the opening of windows</strong>. Environ Sci Pollut Res 30, 20821–20832. <a href="https://doi.org/10.1007/s11356-022-23369-y">doi</a> <a href="#fnref:8" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:12" role="doc-endnote">
      <p>Bhusare, V.H., Dhiman, M.K., Kalaga, D.V., Roy, S., Joshi, J.B. (2017). <strong>CFD simulations of a bubble column with and without internals by using OpenFOAM</strong>. Chemical Engineering Journal 317, 157–174. <a href="https://doi.org/10.1016/j.cej.2017.01.128">doi</a> <a href="#fnref:12" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:13" role="doc-endnote">
      <p>Sayyar, A., Zhang, H., Wang, T. (2023). <strong>Numerical simulation of the hydrodynamics in a novel jet loop bubble column with helical sieve tapes</strong>. Chemical Engineering Science 270, 118491. <a href="https://doi.org/10.1016/j.ces.2023.118491">doi</a> <a href="#fnref:13" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:17" role="doc-endnote">
      <p>Chen, J., Brooks, C.S. (2021). <strong>Experiments and CFD simulation of mass transfer and hydrodynamics in a cylindrical bubble column</strong>. Chemical Engineering Science 234, 116435. <a href="https://doi.org/10.1016/j.ces.2020.116435">doi</a> <a href="#fnref:17" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:9" role="doc-endnote">
      <p>Pialla, D., Tenchine, D., Li, S., Gauthe, P., Vasile, A., Baviere, R., Tauveron, N., Perdu, F., Maas, L., Cocheme, F., Huber, K., Cheng, X. (2015). <strong>Overview of the system alone and system/CFD coupled calculations of the PHENIX Natural Circulation Test within the THINS project</strong>. Nuclear Engineering and Design 290, 78–86. <a href="https://doi.org/10.1016/j.nucengdes.2014.12.006">doi</a> <a href="#fnref:9" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:10" role="doc-endnote">
      <p>Li, W., Wu, X., Zhang, D., Su, G., Tian, W., Qiu, S. (2014). <strong>Preliminary study of coupling CFD code FLUENT and system code RELAP5</strong>. Annals of Nuclear Energy 73, 96–107. <a href="https://doi.org/10.1016/j.anucene.2014.06.042">doi</a> <a href="#fnref:10" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:11" role="doc-endnote">
      <p>Herb, J. (2014). <strong>Coupling OpenFOAM with thermo-hydraulic simulation code ATHLET</strong>, in: 9th OpenFOAM Workshop, Zagreb (Croatia).(<a href="">url</a>) <a href="#fnref:11" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:33" role="doc-endnote">
      <p>Hong, F., Tian, H., Yuan, X., Liu, S., Peng, Q., Shi, Y., Jin, L., Ye, L., Jia, J., Ying, D., Ramsey, T.S., Huang, Y. (2022). <strong>CFD-assisted modeling of the hydrodynamic cavitation reactors for wastewater treatment — A review</strong>. Journal of Environmental Management 321, 115982. <a href="https://doi.org/10.1016/j.jenvman.2022.115982">doi</a> <a href="#fnref:33" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:29" role="doc-endnote">
      <p>Wang, X., Cui, B., Wei, D., Song, Z., He, Y., Bayly, A.E. (2022). <strong>CFD-PBM modelling of tailings flocculation in a lab-scale gravity thickener</strong>. Powder Technology 396, 139–151. <a href="https://doi.org/10.1016/j.powtec.2021.10.054">doi</a> <a href="#fnref:29" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:34" role="doc-endnote">
      <p>Tran-Duc, T., Ho, T., Thamwattana, N. (2021). <strong>A smoothed particle hydrodynamics study on effect of coarse aggregate on self-compacting concrete flows</strong>. International Journal of Mechanical Sciences 190, 106046. <a href="https://doi.org/10.1016/j.ijmecsci.2020.106046">doi</a> <a href="#fnref:34" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:21" role="doc-endnote">
      <p>Zhang, J., Tejada-Martínez, A.E., Zhang, Q. (2014). <strong>Developments in computational fluid dynamics-based modeling for disinfection technologies over the last two decades: A review</strong>. Environmental Modelling &amp; Software 58, 71–85. <a href="https://doi.org/10.1016/j.envsoft.2014.04.003">doi</a> <a href="#fnref:21" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:18" role="doc-endnote">
      <p>Bas Anton Wols (2010). <strong>CFD in drinking water treatment. de Technische Universiteit Delft</strong>, Rotterdam.(<a href="https://citeseerx.ist.psu.edu/document?repid=rep1&amp;type=pdf&amp;doi=f15f95bc8133c72bb54c1d0f2f4466483a4224eb">pdf</a>) <a href="#fnref:18" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:19" role="doc-endnote">
      <p>Shah, J., Židonis, A., Aggidis, G. (2021). <strong>State of the art of UV water treatment technologies and hydraulic design optimisation using computational modelling</strong>. Journal of Water Process Engineering 41, 102099. <a href="https://doi.org/10.1016/j.jwpe.2021.102099">doi</a> <a href="#fnref:19" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:27" role="doc-endnote">
      <p>Korpijärvi, J., Laine, E., Ahlstedt, H. (2000). <strong>Using CFD in the Study of Mixing in Coagulation and Flocculation</strong>, in: Hahn, H.H., Hoffmann, E., Ødegaard, H. (Eds.), Chemical Water and Wastewater Treatment VI, Springer, Berlin, Heidelberg, pp. 89–99. <a href="https://doi.org/10.1007/978-3-642-59791-6_9">doi</a> <a href="#fnref:27" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:35" role="doc-endnote">
      <p>Berger, M., Cristie, V. (2015). <strong>CFD Post-processing in Unity3D</strong>. Procedia Computer Science 51, 2913–2922. <a href="https://doi.org/10.1016/j.procs.2015.05.476">doi</a> <a href="#fnref:35" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>]]></content><author><name>yckuang</name><email>sinotec2@gmail.com</email></author><category term="AI" /><category term="CFD" /><summary type="html"><![CDATA[背景 IWA(The International Water Association) 水廠的模式模擬是結合機械、化工、資訊等專業長期耕耘的一個領域，國際間的設計顧問公司雖然不多，但也持續發展中。協會平台以IWA為主，在IWA架構下設有IMA(IWA Specialist Group Modelling and Integrated Assessment (MIA)原自行辦理研討會1)，目前委員 學界：比利時Ghent、法國 Engees Strasbourg2、瑞典Lund等大學 顧問公司：比利時AM-Team、Ibis Group、Ed Wicklein (Carollo Engineers)3、Javier Climent (Grupo Gimeno) IWA 短文 Wim Audenaert (November 16, 2020) Computational fluid dynamics (CFD): a revolutionary tool for the water industry. 這篇刊登在IWA的短文針對氣候變遷、流行病肆虐的當代環境，作者認為需要建立數位對映(Digital Twins, DT)來強化水廠的因應能力，其中的核心內涵即為水廠的CFD數值模型。CFD甚至可以在模廠興建之前就能提供足夠的設計數據，並且在現地放樣的過程，快速達到預期的穩定成果。 作者是比利時公司AM-TEAM(Advanced modelling services for process optimisation and design)的總裁，該公司是一家水處理單元CFD及動力模擬與設計服務的全球性公司。實績詳見官網customer。 評論： CFD公司非常努力拉近當代市場需要與IT產業熱門話題。即使是3年前的短文，仍然感覺很遙遠。 然而DT的特性強項在於即時性、操作性。CFD要加入在DT的框架，除了計算速度必須有很大的突破，介面也必須大幅的模組化、簡化。前者可以透過模擬結果的機械學習，後者則會因為設計主題而異。 CFD最費工的程序在3D建模。基設階段、細設、或者修繕階段的建模方式都不太相同。或許這是AI可以協助補足的地方。 IWA研討(習)會 2023/1/18-22水回收模擬研討會(IWA Water Resource Recovery Modelling Seminar)針對模式校驗證與數位對映等主題，發表論文討論，也舉行青年工程師的研習培訓，以及共同發表了未來願景。 研習會主題支援：Dynamita公司的SUMO軟體 廢水處理CFD設計之回顧 Samstag et al., (2016)這篇較早期的回顧文章4有廣泛的涉獵，並對當時粒子膠結與分散、生物與水力耦合等模擬過程提出建言。 教學輔助APP 弘光科技大學副校長蘇弘毅(2023)向教育部提出一項創新教學實踐方案，用DesignSolver來教授傳統環工單元操作課程，就是參考了英國利物浦約翰摩爾斯大學海事與機械工程系Seddighi教授的作法5。蘇教授的原文： 在機械工程領域的教學上，Seddighi 等學者探討使用 IPython 筆記型電腦結合工業標準軟體教導機械系學生 CFD (Computational Fluid Dynamics) 電腦模擬流體動力學課程，這個研究採用混成學習模式並強調在做中學的精神，結合講授、助教、作業等高度互動方式。結果顯示，學生對於 CFD 理論與基礎觀念有良好的了解，使用這樣的電腦輔助設施可以增進 CFD 主題的教學效能 6 蘇教授的教學內容現階段雖未包括環工單元操作的CFD，但也隱含了未來可以發展的潛質方向。 經了解Seddighi教授的做法就是規避深入艱澀的流體力學控制方程式與紊流模式，而是以Jupyter Notebook逐條計算的方式，以1小時講解完畢，而以另外的2小時讓學生自行操作CFD已完成指定的作業。這個作法基本上也是將複雜的CFD予以模組化、以更高階的管理方式予以封包。 入流工之CFD Scum Buster For Water Treatment Animation(vertical drop) by Porter McGuffie, Inc(2013) Tank Bottom Sludge &amp; Grit Mixing - Vertical Wetwell (CFD) by Vaughan Company Pump CFD animation demonstrating how a 6 inch layer of grit buildup on a tank floor is suspended, mixed, and homogenized in minutes. Streamlines indicate fluid paths, demonstrating complete tank mixing using a Vertical Wet Well Recirculating CHOPPER Pump (tank size: 12x12x9’). 膠凝池之CFD模擬 回顧 Bridgeman et al., (2009)這篇早期針對膠凝池的CFD回顧文章，對多相流、蘭氏軌跡、以及母數平衡公式等等作法都提出了批判性的評論。7不過就後續相關膠凝池CFD的發展而言，這篇文章可以說近乎絕響。 CFD of mixer The Art of Mixing by xylem/Flygt(2023) 近年相關論文 Zouboulis et al.(2010)簡化了膠羽尺寸的流體行為來降低計算負荷，模式應用在低濃度進流之混凝過程，並用希臘帖撒羅尼加市的淨水場實場數據來模擬。研究發現因入流濃度太低，無法形成大到足以沉降的膠羽，必須回流污泥以增加顆粒數量。8 Shi et al.(2019)與Wang et. al 2022同樣使用了CFD與PBM偶和模擬的方式，來進行混凝槽的模擬。經由變動入流SS的顆粒大小，研究膠凝池中的非線性過程，並進行可視覺化及定性之比較。9 Chatila and Danageuzian, (2022)使用Ansy EFFLUENT及實驗室尺寸混凝槽之PIV(Particle Image Velocimetry )測速結果進行低轉速膠羽形成過程的模擬，藉此定量滑動係數κ。經由模擬協助在相同速度梯度條件下，可以降低κ自0.25至0.18，有效減少膠凝池的用電量。10 國內學位論文：自來水淨水廠高速膠凝澄清池之操作與結構改進 模擬動畫 THINK Fluid Dynamix 氣泡質傳、熱交換等相關學術文獻 法國圖盧茲大學團隊 法國圖盧茲大學團隊Cockx et al., (2001)這篇較早期的文章使用了該國電力公司(Electricité de France EDF)所發展的二相氣泡流CFD商業程式ASTRID-Tri_CFD，研究廢水處理程序中氣泡的全域及局部質傳現象及系數11。 本研究居於同作者先前有關氣升式內部環流反應器研究12、以及臭氧反應塔研究13，都是使用ASTRID之CFD程式。 ASTRID(Advanced Sodium Technological Reactor for Industrial Demonstration)先進鈉技術反應堆工業示範計畫是CEA自2006年開始的項目。目前該計畫中的CFD是用以預測反應槽中鈉金屬的熱流行為。Bieder et al., (2019)也將其應用在ASTRID反應器1/6比例尺模廠之熱水模擬及驗證。14 CEA(Commissariat à l’énergie atomique et aux énergies alternatives)法國原子能和替代能源委員會 團隊(Ngu et al., 2022)持續發展二氧化碳化學吸附反應塔質傳現象的CFD15，以及生物產氫的質傳數值與模場模擬研究(Ngu et al., 2023)16，不再使用商用軟體，改由自行研發。 中國石油大學重質油國家重點實驗室 團隊建立了一個4.4m高對向流的氣泡塔模型廠、並建立數值模式來預測氣泡塔的流場與質傳17 OpenFOAM 這篇由中國科學院上海高等研究院團隊(Zhao et al., 2023)的應用研究，將泛用行CFD模式OpenFOAM應用在臭氧接觸槽中質傳的計算，最大的貢獻在於建立了視覺氣泡量測，以律定CFD中的介面力學模式(阻力、氣泡上升及紊流模式)與多尺寸氣泡模式(氣泡數平衡方程式及界面面積傳輸方程式)。18 大多數人是用OpenFOAM中的volume of fluid (VoF) 方法進行模擬，如19用OpenFOAM和Fluent兩個模式來計算氣泡柱的質傳。 在核能廠熱水系統中熱傳與質傳的OpenFOAM應用，如阿根廷國立海岸大學團隊(Corzo et al., 2023)20，該研究中使用0維與3維耦合的動態邊界條件，來模擬管線、加壓站、熱交換器、與開放冷卻水塘的冷卻現象。 To overcome the above mentioned issues, the nuclear engineering community has invested immense efforts to couple system codes with CFD codes [4] [5] [6]. There are few publications addressing this topic through semi-implicit or implicit techniques while most such papers are based on explicit coupling. In the later, the system codes and 3D CFD codes run in a staggered way, communicating the necessary data through temporary files and flags. One of the first attempts was done by Martin et al. 7, who coupled RELAP5 with other codes transferring data through a Parallel Virtual Machine (PVM) protocol. In the same way, Aumiller et al. [8] did so using RELAP5-3D with a CFD code showing good results while finding some numerical instability. More recent developments also using explicit methods, coupled RELAP with ANSYS-CFX [9], ATHLET with OpenFOAMⓇ [10], and TRACE with Star-CCM [11]. In all cases the system codes assumed the master role, sending the necessary information such as mass flow, pressure, and temperature, amongst others, to the CFD code. These mass-flow/pressure couplings are relatively simple because the pressure in the coupled domains remains constant until the end of the time step, but they could lead to stability problems under large time steps or fast transient simulations 12. In order to eliminate numerical instabilities Weaver et al. [13] proposed a generic semi-implicit coupling technique, which uses the master/slave communication roles but update both the velocity and pressure in each communication step. This coupling methodology showed good performance in several flow conditions [14] [15]. Bandini et al. [16] presented a detailed compilation of the publications concerning code-coupling tools to simulate new-generation reactors focusing on the validation of these tools against experimental facilities. (Corzo et al., 2023)也應用OpenFOAM在行進中巴士內流場的模擬，這經驗對場站內的通風設計也會有不少啟發。21 印度霍米巴巴國家研究所團隊(Bhusare et al., 2017)發展出適用在氣泡塔質傳研究的OpenFOAM應用，他們主要的貢獻在於彙整了文獻中相關的試驗觀測數據，並用以驗證CFD模擬結果，除了OpenFOAM外，團隊以FLUENT進行同樣條件的模擬，藉此比較驗證模型的正確性，在實場的模擬中，作者以氣體停留時間、液體流速等等項目，來比較模擬結果與實測情形。22 ANSYS FLUENT 北京清大化工系綠色反應工程與技術重點實驗室研究團隊應用FLUENT在最新接觸槽的設計，模擬研究針對向下噴流及中央設置螺旋篩帶之接觸塔設計。23 Chen and Brooks(2021)使用顆粒速度量測與溶氧電荷法進行圓柱形氣泡塔模場試驗，並運用EFLUENT進行模擬，來預測未來實場的可能情形。24 系統/CFD耦合模式 雖然這類的組合大多應用在核能反應器的熱傳/質傳模擬，其組合的功能性也提醒我們，CFD可以與任何模式搭配，來完成敏感性分析及預測的任務，也包括AI模型的Digital Twins系統。 法國鈉金屬冷卻之快速反應器在2009年除役，在進到下一階段先進鈉技術反應堆工業示範計畫(ASTRID)之前，依據歐洲共同體第七框架計畫之內容，法國展開所謂的熱水力創新系統(The thermal-hydraulics innovative system, THINS)過渡計畫，來驗證系統程式與系統/CFD耦合模式25。選項包括： RELAP(Reactor Excursion and Leak Analysis Program) with ANSYS-CFX (FLUENT)26 ATHLET with OpenFOAMⓇ 27 TRACE with Star-CCM 氣化反應器 ANSYS-Fluent Tutorial- Waste water treatment by Cavitation Reactor(Engineering Nature(2022)) review paper28 沉澱池之模擬 Wang et al., (2022)將Ansys CFX及母數平衡公式耦合在一起，用來模擬實驗室尺寸的膠羽污泥濃縮池，入流速度雖會增加膠羽的持續形成，但也會因增加紊流而破壞重力沉澱，作者經由模式模擬取得最佳的入流速度設計值29。 水泥的SPH模擬(Tran-Duc et al., 2021)30 消毒系統流場、質傳與反應之CFD相關文獻 回顧 南佛羅里達大學土木環工系團隊(Zhang et al., 2014)將過去20年來在消毒領域的所有CFD研究進行了回顧，團隊認為依序需要解決的問題是：紊流模式之精進、暫態流、二相或多相流模擬、非均質分布對化學反應機制的影響31。 自撰模式 Bas Anton Wols, (2010)這篇鹿特丹代爾夫特理工大學土木系的博士班畢業論文中，作者針對臭氧與紫外線消毒程序進行了模場與CFD模擬(RANS and LES model)。32 英國蘭卡斯特大學團隊(Shah et al., 2021)提出UV系統的CFD模擬結果，研究接觸池幾何形狀與UV劑量的關係，並評估在實場中使用紫外線燈的消毒效果33。 圓形噴射加氟混合槽 CFD Solutions for Water Treatment with Free Surface and Fluorine Jets by LEAP Australia(2022) 配水系統 分水工 by THINK Fluid Dynamix(2019) CFD in Water Treatment: distribution chamber(YouTube) Unsteady analysis of flow distribution in distribution chamber in a wastewater treatment plant. Multiphase Volume of Fluid (VOF) simulation. Turbulence Model: SST-Scale Adaptative Simulation ANSYS CFX 2019 R3 公司簡介 德國Erlangen的一家顧問公司，專長在水處理廠的CFD模式模擬，舉凡混合、質傳、沈降分離、水力、變流、水工模型實驗等等。 銷售套裝軟體為MSTAR。 by INVENT Umwelt- und Verfahrenstechnik AG(2015)CFD in water &amp; wastewater treatment: Mixing tanks, tracer(youtube) distribution and vertical mixing with upper outflows 公司簡介：THINK Fluid Dynamix之控股公司，除了德國之外，在義大利、阿拉伯、美國、澳洲也都設有辦公室。主要業務在設計水廠及應用元件，以雙曲面混合器起家，1980年代自弗里德里希-亞歷山大大學之埃爾蘭根-紐倫堡流體力學研究所拆分創立。 商業CFD套裝軟體 Ansys CFX/EFFLUENT 官網：Turbomachinery CFD Software Korpijärvi et al. (2000)34 MSTAR 官網：THINK Fluid Dynamix GPS-X 官網：Hydromantis ESS, Inc. water -Gem 官網：bentley.com EPANET 官網：USEPA FLOW - 3D 官網： FLOW SCIENCE, INC Simcenter 官網： STAR-CCM+ software 加入SPH(smoothed particles hydrodynamics)=FloEFD/Star-CCM+ nanoFluidX 官網：Altair nanoFluidX 2021.2 nanoFluidX only runs on Linux systems with CUDA-ready GPU’s. Visualizer mixing and dissolve Multiphase Fluid Simulations Two Minute Papers #113 realtime simulator on UnityHub IDE style platform website Ajay Coding a Realtime Fluid Simulation in Unity AJtech(2023) Optimizing our Realtime Fluid Simulation in Unity by AJtech(2023) visualized using Unity3D/Hololens (Berger and Cristie, 2015)35, youtube Computational Fluid Dynamics (CFD) Data Visualization using Hololens by Marco Losurdo(2016)@youtube sersolmaz CFD-CDN-UNITY: Interactive CFD simulations with Unity by Serkan Solmaz(2022)@github Multiplatform processing of CFD simulations with AR/VR by Serkan Solmaz(2023)@github UnityCFDviewer by ImperialCollegeLondon(2018)@github Smoke simulation using Navier-Stokes equations in Unity Engine(SmokeSimulationCFD) by mwarzech(2020) Simple Unity-fluid-simulation by gkowash(2023) chrislarkee/ParaView_CFD_To_VR Unity AI AI2-THOR: A virtual environment for training home assistant robotsRoozbeh Mottaghi(2021)@Youtube CAD元件 Browse and download thousands of CAD Drawing files from CADdetail. Pollution and Waste Control Equipment -&gt; Water Treatment Equipment 看這篇就夠！28 個免費 3D 模型下載、版權使用、資源網站整理 Eagle 部落格-&gt;設計資源 smoothing particle hydrodynamics Coding a Realtime Fluid Simulation in Unity by AJTech(2023) SPH並不是新的想法，此處以c#介紹coding的過程 2023/7月更新了、更優化的作法(Optimizing our Realtime Fluid Simulation in Unity)AJTech2023 open source codes on GitHub uid(year) repo language title sanguinariojoe(2023) aquagpusph c++ Free CFD software based on SPH and accelerated with OpenCL zoziha(2022) sph Fortran A smoothed particle hydrodynamics (SPH) code AhmedSalih3d(2023) SPHExample Julia Simple SPH dam-break simulation johng12(2014) cudaSPH c++ Smoothed Particle Hydrodynamics CFD software parallelized using CUDA vishalk2(2021) CFD-DEM-coupled-Simulations-of-Spherical-Particles C CFD-DEM coupled simulations of Spherical-shaped particles in a Spouted Bed Dryer using OpenFOAM-5.x and LIGGGHTS. abhaykamat(2012) GodunovSPH c++ Integrating a Godunov/Riemann solver with Smoothed Particle Hydrodynamics for Aeronautical, Astronautical and Astrophysical CFD. Plume-SPH(2020) Plume-SPH c++ A open source solver for modeling volano plume, the numerical method used for solving PDEs is smoothed particle hydrodynamics (SPH). sim-oy(2022) fluid_simulation c# CFD SPH deeptavker(2019) shocktube_solver Python Simulating the classic sod shocktube using SPH technique martinjrobins(2014) paper_comparison c++ some simulations for SPH-DEM and CFD_DEM comparison paper jvormann(2018) Nek5000-Cubed-Sphere Fortran Create a cubed sphere grid for the Nek5000 CFD Code farhan4995(2022) MovingMultiblock_Sedimentation_Sphere C Simulation of a Sedimentation of Sphere under gravity using Multidomain method of Lattice Boltzmann Method j8asic(2022) isph c++ (2009-2012) First GPU implementation of Incompressible Smoothed Particle Hydrodynamics (ISPH) Nopens, I., Laurent, J., Wicklein, E., Ducoste, J., Griborio, A., Batstone, D., Wicks, J., Saunders, S., Potier, O., Karpinska Portela, A., Samstag, R. (2015). Computational Fluid Dynamics: an important modelling tool for the water sector, Rotterdam.pdf &#8617; Laurent, J., Samstag, R., Ducoste, J., Griborio, A., Nopens, I., Batstone, D., Wicks, J., Saunders, S., Potier, O. (2014). A protocol for the use of computational fluid dynamics as a supportive tool for wastewater treatment plant modelling. Water science and technology : a journal of the International Association on Water Pollution Research 70, 1575–84. doi &#8617; Wicklein, E., Batstone, D., Ducoste, J., Laurent, J., Griborio, A., Wicks, J., Saunders, S., Samstag, R., Potier, O., Nopens, I. (2015). Good modelling practice in applying computational fluid dynamics for WWTP modelling. Water Science and Technology 73, wst2015565. doi &#8617; Samstag, R.W., Ducoste, J.J., Griborio, A., Nopens, I., Batstone, D.J., Wicks, J.D., Saunders, S., Wicklein, E.A., Kenny, G., Laurent, J. (2016). CFD for wastewater treatment: an overview. Water Science and Technology 74, 549.doi &#8617; 蘇弘毅(2023)以擬 APP 網頁解題工具(DesignSolver)提升環工單元操作課程學生解決設計問題的興趣與能力」(配合課程名稱: 環境工程單元操作實驗)教育部教學實踐研究計畫成果報告PEE1100931(pdf) &#8617; M Seddighi, D Allanson, G Rothwell, K Takrouri, Study on the use of a combination of IPython Notebook and an industry-standard package in educating a CFD course, Computational Applied Engineering Education, 28 (2019) 952-964. &#8617; Bridgeman, J., Jefferson, B., Parsons, S.A. (2009). Computational Fluid Dynamics Modelling of Flocculation in Water Treatment: A Review. Engineering Applications of Computational Fluid Mechanics 3, 220–241. doi &#8617; Zouboulis, A., Karapantsios, T., Kostoglou, M. (2010). A CFD-based simulation study of a large scale flocculation tank for potable water treatment. Chemical Engineering Journal 162, 208–216. doi &#8617; Shi, Z., Zhang, G., Zhang, Y., He, T., Pei, G. (2019). Modeling of Flocculation and Sedimentation Using Population Balance Equation. Journal of Chemistry 2019, 9187204. doi &#8617; Chatila, J.G., Danageuzian, H.R. (2022). PIV and CFD investigation of paddle flocculation hydrodynamics at low rotational speeds. Scientific Reports 12, 19742. doi &#8617; Cockx, A., Do-Quang, Z., Audic, J.M., Liné, A., Roustan, M. (2001). Global and local mass transfer coefficients in waste water treatment process by computational fluid dynamics. Chemical Engineering and Processing: Process Intensification 40, 187–194. doi &#8617; Cockx, A., Liné, A., Roustan, M., Do-Quang, Z., Lazarova, V. (1997). Numerical simulation and physical modeling of the hydrodynamics in an air-lift internal loop reactor. Chemical Engineering Science 52, 3787–3793. doi &#8617; Cockx, A., Do-Quang, Z., Liné, A., Roustan, M. (1999). Use of computational fluid dynamics for simulating hydrodynamics and mass transfer in industrial ozonation towers. Chemical Engineering Science 54, 5085–5090. doi &#8617; Bieder, U., Maillard, J., Gorsse, Y., Guenadou, D. (2019). CFD analysis of the flow in the MICAS experimental facility, a water model of the hot pool of a sodium cooled fast reactor. Nuclear Engineering and Design 350, 67–77. doi &#8617; Ngu, V., Morchain, J., Cockx, A. (2022). In-depth analysis of reactive bubbly flow using two-way coupled spatio-temporal 1D model. Chemical Engineering Science 261, 117963. doi &#8617; Ngu, V., Fletcher, D.F., Kavanagh, J.M., Rafrafi, Y., Dumas, C., Morchain, J., Cockx, A. (2023). H2 mass transfer – A key factor for efficient biological methanation: Comparison between pilot-scale experimental data, 1D and CFD models. Chemical Engineering Science 268, 118382. doi &#8617; Li, C., Cui, Y., Shi, X., Gao, J., Lan, X. (2022). CFD simulation of mass transfer in bubble columns: Detailed study of mass transfer models. Chemical Engineering Science 264, 118173. doi &#8617; Zhao, L., Lu, Y., Lu, D., Tang, Z. (2023). Modelling for gas-liquid bubbling flow and mass transfer with OpenFOAM. International Journal of Multiphase Flow 163, 104441. doi &#8617; Horvath, A., Jordan, C., Lukasser, M., Kuttner, C., Makaruk, A., Harasek, M. (2009). CFD SIMULATION OF BUBBLE COLUMNS USING THE VOF MODEL - COMPARISON OF COMMERCIAL AND OPEN SOURCE SOLVERS WITH AN EXPERIMENT. Chemical Engineering Transactions 18, 605–610. doi &#8617; Corzo, S.F., Godino, D.M., Sarache Piña, A.J., Nigro, N.M., Ramajo, D.E. (2023). Thermal-hydraulic 0D/3D coupling in OpenFOAM: Validation and application in nuclear installations. Nuclear Engineering and Technology 55, 1911–1923. doi &#8617; Corzo, S.F., Godino, D.M., Ramajo, D.E. (2023). Air circulation study inside and outside of urban buses induced by the opening of windows. Environ Sci Pollut Res 30, 20821–20832. doi &#8617; Bhusare, V.H., Dhiman, M.K., Kalaga, D.V., Roy, S., Joshi, J.B. (2017). CFD simulations of a bubble column with and without internals by using OpenFOAM. Chemical Engineering Journal 317, 157–174. doi &#8617; Sayyar, A., Zhang, H., Wang, T. (2023). Numerical simulation of the hydrodynamics in a novel jet loop bubble column with helical sieve tapes. Chemical Engineering Science 270, 118491. doi &#8617; Chen, J., Brooks, C.S. (2021). Experiments and CFD simulation of mass transfer and hydrodynamics in a cylindrical bubble column. Chemical Engineering Science 234, 116435. doi &#8617; Pialla, D., Tenchine, D., Li, S., Gauthe, P., Vasile, A., Baviere, R., Tauveron, N., Perdu, F., Maas, L., Cocheme, F., Huber, K., Cheng, X. (2015). Overview of the system alone and system/CFD coupled calculations of the PHENIX Natural Circulation Test within the THINS project. Nuclear Engineering and Design 290, 78–86. doi &#8617; Li, W., Wu, X., Zhang, D., Su, G., Tian, W., Qiu, S. (2014). Preliminary study of coupling CFD code FLUENT and system code RELAP5. Annals of Nuclear Energy 73, 96–107. doi &#8617; Herb, J. (2014). Coupling OpenFOAM with thermo-hydraulic simulation code ATHLET, in: 9th OpenFOAM Workshop, Zagreb (Croatia).(url) &#8617; Hong, F., Tian, H., Yuan, X., Liu, S., Peng, Q., Shi, Y., Jin, L., Ye, L., Jia, J., Ying, D., Ramsey, T.S., Huang, Y. (2022). CFD-assisted modeling of the hydrodynamic cavitation reactors for wastewater treatment — A review. Journal of Environmental Management 321, 115982. doi &#8617; Wang, X., Cui, B., Wei, D., Song, Z., He, Y., Bayly, A.E. (2022). CFD-PBM modelling of tailings flocculation in a lab-scale gravity thickener. Powder Technology 396, 139–151. doi &#8617; Tran-Duc, T., Ho, T., Thamwattana, N. (2021). A smoothed particle hydrodynamics study on effect of coarse aggregate on self-compacting concrete flows. International Journal of Mechanical Sciences 190, 106046. doi &#8617; Zhang, J., Tejada-Martínez, A.E., Zhang, Q. (2014). Developments in computational fluid dynamics-based modeling for disinfection technologies over the last two decades: A review. Environmental Modelling &amp; Software 58, 71–85. doi &#8617; Bas Anton Wols (2010). CFD in drinking water treatment. de Technische Universiteit Delft, Rotterdam.(pdf) &#8617; Shah, J., Židonis, A., Aggidis, G. (2021). State of the art of UV water treatment technologies and hydraulic design optimisation using computational modelling. Journal of Water Process Engineering 41, 102099. doi &#8617; Korpijärvi, J., Laine, E., Ahlstedt, H. (2000). Using CFD in the Study of Mixing in Coagulation and Flocculation, in: Hahn, H.H., Hoffmann, E., Ødegaard, H. (Eds.), Chemical Water and Wastewater Treatment VI, Springer, Berlin, Heidelberg, pp. 89–99. doi &#8617; Berger, M., Cristie, V. (2015). CFD Post-processing in Unity3D. Procedia Computer Science 51, 2913–2922. doi &#8617;]]></summary></entry><entry><title type="html">數值模擬、數位對映與環工設計</title><link href="https://sinotec2.github.io/FAQ/2023/08/16/DT.html" rel="alternate" type="text/html" title="數值模擬、數位對映與環工設計" /><published>2023-08-16T00:00:00+08:00</published><updated>2023-08-16T00:00:00+08:00</updated><id>https://sinotec2.github.io/FAQ/2023/08/16/DT</id><content type="html" xml:base="https://sinotec2.github.io/FAQ/2023/08/16/DT.html"><![CDATA[<h2 id="背景">背景</h2>

<ul>
  <li>此處彙總了數位對映（Digital Twins, DT）的相關書籍、報章及文獻，以及一些工作上的反思。</li>
  <li>早期做的環境模擬總覺得是靜態的回顧、成因探討，即使做到了「半」模式預報（氣象引用GFS預報結果、排放援引3年前的數據，所計算而得的空氣品質），卻也不能控制什麼來達到防制、保護的效果。畢竟環境的基本定義就是我們不能做什麼來控制的部分，能夠控制的我們稱之為程序。</li>
  <li>這是為什麼環工的主流價值觀會集中在程序，淨水廠、污水廠站、管線、焚化爐、現地處理、AQCS，因為這些程序、系統等著工程師們、主管們決定可以做些什麼、調控參數，來改變系統的產出、就是產品或服務。</li>
  <li>早期(Gassó et al., 1992)的環工互動式設計是用Fortran, AUTOLisp, C等語言來撰寫<sup id="fnref:7" role="doc-noteref"><a href="#fn:7" class="footnote" rel="footnote">1</a></sup>。</li>
  <li>現代大量計算資源、顯示器資源均集中在個人電腦上，以虛擬型態來進行模擬、建立數位對映，有其教育意義及優勢<sup id="fnref:8" role="doc-noteref"><a href="#fn:8" class="footnote" rel="footnote">2</a></sup>：
    <ol>
      <li>減少模廠之花費與時間</li>
      <li>避免時廠操作錯誤的風險</li>
      <li>運用本地資源進行計算流體力學之計算</li>
      <li>仿真渲染、VR等技術之應用，可以得到最大之臨場感受</li>
    </ol>
  </li>
</ul>

<h2 id="digital-twins">digital twins</h2>

<h3 id="維基百科的定義">維基百科的定義</h3>

<ul>
  <li>數位對映、數位雙生、數位分身、中國翻譯成數字映射</li>
  <li><a href="https://zh.wikipedia.org/zh-tw/数字映射">wikipedia(2021)</a>
    <blockquote>
      <p>數位對映（Digital twin），或譯作數位孿生、數位分身、數位雙生，指在資訊化平台內類比物理實體、流程或者系統，類似實體系統在資訊化平台中的雙胞胎。藉助於數位對映，可以在資訊化平台上了解物理實體的狀態，甚至可以對物理實體裡面預定義的介面元件進行控制。</p>
    </blockquote>

    <blockquote>
      <p>數位對映是物聯網裡面的概念，它指通過整合物理回饋資料，並輔以人工智慧、機器學習和軟體分析，在資訊化平台內建立一個數位化類比。這個類比會根據回饋，隨著物理實體的變化而自動做出相應的變化。理想狀態下，數位對映可以根據多重的回饋源資料進行自我學習，從而幾乎即時地在數位世界裡呈現物理實體的真實狀況。數位對映的回饋源主要依賴於各種感測器，如壓力、角度、速度感測器等。數位對映的自我學習（或稱機器學習）除了可以依賴於感測器的回饋資訊，也可以是通過歷史資料，或者是整合網路的資料學習。後者常指多個同批次的物理實體同時進行不同的操作，並將資料回饋到同一個資訊化平台，數位對映根據海量的資訊回饋，進行迅速的深度學習和精確類比。</p>
    </blockquote>

    <blockquote>
      <p>數位對映可以應用在各種行業（目前主要是工業）對核心裝置、流程的使用進行最佳化，並簡化維護工作，目前也有農漁業數位分身應用的嘗試。</p>
    </blockquote>
  </li>
</ul>

<h3 id="gartner評論">Gartner評論</h3>

<ul>
  <li><a href="https://vivian-ku.medium.com/連續三年被評為全球十大科技趨勢的-數位孿生-到底是什麼-上-419a34144529">Vivian Ku</a><sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">3</a></sup>部落格
    <blockquote>
      <p>數位孿生(Digital Twin)已連續三年被資訊科技研究機構Gartner評為全球十大科技趨勢之一，簡單來說，數位孿生是指透過存在於虛擬世界的「雙胞胎」，來顯示現實世界中的物體可能的反應、狀況或是效能等。(Gartner最新的報導可以看<a href="https://www.gartner.com/smarterwithgartner/gartner-top-10-strategic-technology-trends-for-2019">這邊</a>，有興趣的人可以去看看其他九項科技是什麼。)</p>
    </blockquote>

    <blockquote>
      <p>但是從google trends來看，在過去五年間，Digital Twin顯然沒有引起非常熱烈的討論，一直到2017年時才出現熱潮，可是比起同為十大科技的「區塊鍊」，網路搜尋熱度就差了一大截。這反應的是，數位孿生並非一個全新的技術，而是綜合多項科技與領域，並針對不同產業的痛點所提出的應用，因此，在技術層面涉及較廣泛，且重視Domain know-how的情況之下，發展速度不如預期快速。然而，隨著IOT、AI、AR、VR等技術的到位，數位孿生肯定是下一波工業4.0發展重點中的重點。</p>
    </blockquote>
  </li>
</ul>

<h2 id="數值模擬-vs-數位對映">數值模擬 vs 數位對映</h2>

<ul>
  <li>到底是人腦聰明還是電腦聰明？這類的主題總不會停止討論。《Engineering》是中国工程院于2015年创办的工程科技综合性期刊，在2019年第5卷第5期出版了關於水污染控制的專刊，其中也收錄了一篇Sean O’Neill(2019)《数学推理挑战人工智能》<sup id="fnref:3" role="doc-noteref"><a href="#fn:3" class="footnote" rel="footnote">4</a></sup>，對當代的AI不如人類數學推理的悲觀看法。但如果今天來看，恐怕作者要改寫短文的結論了。</li>
</ul>

<h3 id="環工程序的數值模擬">環工程序的數值模擬</h3>

<ul>
  <li>有關製程用水、冷卻水、飲用水、與廢水處理工場的計算流體力學模式模擬源自於1990年代，近年來有很大的突破，除了傳統化工反應槽或生物處理的開發應用之外，在核能發電廠的研究成果對環工實務也有很大的貢獻，包括商業CFD軟體、開源CFD軟體、以及研究單位開放的軟體等等，可以詳見<a href="https://sinotec2.github.io/FAQ/2023/08/17/CFD.html">CFD在水務工程中的應用</a></li>
  <li>在台電最新的AQCS更新改建計畫中，就應用了CFD進行細部設計的敏感性分析，包括導流板、粗灰阻隔設備、SCR之注氨系統AIG、或混流器等流場設計調整。<sup id="fnref:2" role="doc-noteref"><a href="#fn:2" class="footnote" rel="footnote">5</a></sup></li>
</ul>

<h3 id="ibm官網之說明">IBM官網之說明</h3>

<ul>
  <li>依據<a href="https://www.ibm.com/topics/what-is-a-digital-twin">IBM </a>對數位對映與一般模擬仿真與同化差異的說明
    <ul>
      <li>相同處：都是用數字將真實世界予以量化，以便進行診斷、解析、並作出預測及評估。二者對系統而言，都是不可或缺的數值方法。</li>
      <li>相異處
        <ol>
          <li>規模：數位對映本身除了專注在流程，還能加入邏輯上還不能解釋相關性的環境數據，甚或整併任意數量的數值模擬結果，來研究多程序間的交互作用。</li>
          <li>即時性：數值模式對即時模擬的計算需求是非常龐大，少數應用在無法控制的程序或系統，如天氣、地震及火山活動的短期預報。但數位對映的設計目的原本就是用在即時監測與控制雙向信息流的決策機制，該信息流首先發生自傳感器即時傳送到系統處理器，而在處理器達成新的診斷、預測與決策後，資訊流又發生自系統處理器傳送到現場可控制物件，產生即時性的反應。</li>
          <li>更廣泛的應用：數值模式的敏感性測試項目取決於模式基本的統御方程式、條件與參數，是預先決定的。但數位對映因納入非邏輯性的數據變數，對系統可能影響對變因將會保持更開放的態度，可以提供系統與產品更多改進的可能性。</li>
        </ol>
      </li>
    </ul>
  </li>
</ul>

<h3 id="水廠的智慧化">水廠的智慧化</h3>

<ul>
  <li>北京師範大學侯立安教授在工程期刊上發表對《建设生产健康饮水的智慧水厂》的看法<sup id="fnref:4" role="doc-noteref"><a href="#fn:4" class="footnote" rel="footnote">6</a></sup>，就壓力面而言，侯教授提出了水質安全、複合複雜、新污染新技術難融入、突發情況應急、管網更新與二次污染等5項問題，相應對策則有淨化單元模塊化、淨化過程綠色化、回收物質資源化、控制方式智能化等4個關鍵特質，建構低耗能、精準加藥、數位化與智能化融合共生的水廠。</li>
  <li><sup id="fnref:6" role="doc-noteref"><a href="#fn:6" class="footnote" rel="footnote">7</a></sup>這篇浙江大學的研究雖然是針對工業用水模廠( Secure Water Treatment (SWaT) 測試床)的虛實系統(Cyber-Physical Systems, CPS)研究，但因為是針對網路攻擊的異常狀況的AI訓練，對靠網際網路連線的監測系統而言，其參考價值還是蠻高的。</li>
  <li>How Simulation Helps Clean and Manage Water by <a href="https://www.ansys.com/blog/how-simulation-cleans-and-conserves-water">Ansys blog(MARCH 22, 2023)</a></li>
</ul>

<h3 id="中德合作water40">中德合作water4.0</h3>

<ul>
  <li>這篇短文綜合了2個中國境內湖泊(巢湖及鄱陽湖)的水質管理計畫，應用最新的即時監測設備、GIS系統、VR(Unity)、以及遠端控制系統，來做到實場與實驗室的數位對映<sup id="fnref:5" role="doc-noteref"><a href="#fn:5" class="footnote" rel="footnote">8</a></sup>。其軟、硬體規格與功能構想值得參考。</li>
  <li>不過當中還沒有加入數值模式(水質擴散模式、水廠CFD等等)、統計或任何形式的AI模型，水廠部分的自動(或智慧)控制也沒有著墨。畢竟是試驗性質的計畫，主要還是著重在環境資訊與最後的顯示決策系統展示，真正實場的控制涉及供水、廢水處理的實務與各單位的權責，應該是行政協調而不是研究計畫可以碰觸的決策。</li>
</ul>

<h2 id="水處理設計之套裝軟件">水處理設計之套裝軟件</h2>

<h3 id="top-5">top 5</h3>

<p>From <a href="https://smartserv.io/blog/top-water-treatment-software/">SmartServ(2022)</a> Top 5 Water Treatment Software In 2022</p>

<ul>
  <li>DuPont <a href="https://www.dupont.com/water/resources/design-software.html">WAVE</a>
    <blockquote>
      <p>Water Application Value Engine (WAVE) is the industry’s first fully integrated free modeling software program to integrate our leading technologies — ultrafiltration (UF), reverse osmosis (RO), ion exchange (IX), and now incorporates DesaliTec™ SOAR CCRO — into one comprehensive tool. Using a common interface, it simplifies the design process and ultimately helps reduce the time needed to manage your water-treatment system.</p>
    </blockquote>
  </li>
  <li><a href="https://smartserv.io/blog/top-water-treatment-software/">SmartServ</a>
    <ul>
      <li>Picture Notes/Custom equipment/Hide pricing using ACL/Create and show tiered pricing to your customers./Payment intermediate page/</li>
      <li>整體工程採購、全方位輔助軟體</li>
      <li>專人解說示範、無下載版。</li>
    </ul>
  </li>
  <li><a href="">Aqua Designer</a></li>
  <li><a href="https://envirosuite.com/insights/news/evs-water-plant-designer">Envirosuite</a>: Water Simulation Software。提供30日試用版。</li>
  <li>Workever: Water Hygiene &amp; Treatment Business Software</li>
</ul>

<h2 id="books-about-digital-twinsdt">books about digital twins(DT)</h2>

<h3 id="最新上架">最新上架</h3>

<ul>
  <li>Ali Kashif Bashir， Balamurugan Balusamy， Pooja Malik， Rajasekar Vani， and Rajesh Kumar Dhanaraj(2023)<strong>Digital Twin for Smart Manufacturing</strong>(<a href="https://www.google.com.tw/books/edition/Digital_Twin_for_Smart_Manufacturing/xC2gEAAAQBAJ?hl=zh-TW">google books</a>)
    <blockquote>
      <p>Digital Twin for Smart Manufacturing: Emerging Approaches and Applications provides detailed descriptions on how to integrate and optimize novel digital technologies for smart manufacturing.</p>
    </blockquote>

    <blockquote>
      <p>The book discusses digital twins, which combine the industrial internet of things, artificial intelligence, machine learning and software analytics with spatial network graphs to create living digital simulation models that update and change as their physical counterparts change.</p>
    </blockquote>

    <blockquote>
      <p>In addition, they provide an effective way to integrate technologies like cyber-physical systems into a smart manufacturing system, potentially optimizing the entire business process and operating procedure of the manufacturing firm.</p>
    </blockquote>
  </li>
  <li>Noel Crespi, Adam T. Drobot, Roberto Minerva(2023)<strong>The Digital Twin</strong>(<a href="https://link.springer.com/book/10.1007/978-3-031-21343-4">springer</a>)
    <blockquote>
      <p>Covers the origin and history of the “Digital Twin” and the path that leads to where we are today</p>
    </blockquote>

    <blockquote>
      <p>Identifies the impacts of the technological evolution and transformation in the next 5-8 years on Digital Twins</p>
    </blockquote>

    <blockquote>
      <p>Provides an in depth look at the basic and enabling technologies that are necessary for implementation</p>
    </blockquote>
  </li>
</ul>

<h3 id="經典推薦">經典推薦</h3>

<ul>
  <li>David Gelernter(1993)Mirror Worlds: or the Day Software Puts the Universe in a Shoebox…How It Will Happen and What It Will Mean(<a href="https://www.amazon.com/Mirror-Worlds-Software-Universe-Shoebox/dp/019507906X">amazon</a>)
    <blockquote>
      <p>Technology doesn’t flow smoothly; it’s the big surprises that matter, and Yale computer expert David Gelernter sees one such giant leap right on the horizon. Today’s small scale software programs are about to be joined by vast public software works that will revolutionize computing and transform society as a whole. One such vast program is the “Mirror World.”</p>
    </blockquote>
  </li>
</ul>

<blockquote>
  <p>Imagine looking at your computer screen and seeing reality–an image of your city, for instance, complete with moving traffic patterns, or a picture that sketches the state of an entire far-flung corporation at this second. These representations are called Mirror Worlds, and according to Gelernter they will soon be available to everyone. Mirror Worlds are high-tech voodoo dolls: by interacting with the images, you interact with reality. Indeed, Mirror Worlds will revolutionize the use of computers, transforming them from (mere) handy tools to crystal balls which will allow us to see the world more vividly and see into it more deeply. Reality will be replaced gradually, piece-by-piece, by a software imitation; we will live inside the imitation; and the surprising thing is–this will be a great humanistic advance. We gain control over our world, plus a huge new measure of insight and vision.</p>
</blockquote>

<blockquote>
  <p>In this fascinating book–part speculation, part explanation–Gelernter takes us on a tour of the computer technology of the near future. Mirror Worlds, he contends, will allow us to explore the world in unprecedented depth and detail without ever changing out of our pajamas. A hospital administrator might wander through an entire medical complex via a desktop computer. Any citizen might explore the performance of the local schools, chat electronically with teachers and other Mirror World visitors, plant software agents to report back on interesting topics; decide to run for the local school board, hire a campaign manager, and conduct the better part of the campaign itself–all by interacting with the Mirror World.</p>
</blockquote>

<blockquote>
  <p>Gelernter doesn’t just speculate about how this amazing new software will be used–he shows us how it will be made, explaining carefully and in detail how to build a Mirror World using technology already available. We learn about “disembodied machines,” “trellises,” “ensembles,” and other computer components which sound obscure, but which Gelernter explains using familiar metaphors and terms. (He tells us that a Mirror World is a microcosm just like a Japanese garden or a Gothic cathedral, and that a computer program is translated by the computer in the same way a symphony is translated by a violinist into music.)</p>
</blockquote>

<blockquote>
  <p>Mirror Worlds offers a lucid and humanistic account of the coming software revolution, told by a computer scientist at the cutting edge of his field.</p>
</blockquote>

<ul>
  <li>A.Y.C. Nee， S.K. Ong(2021)Digital Twins in Industry(<a href="https://www.google.com.tw/books/edition/Digital_Twins_in_Industry/NWC_zgEACAAJ?hl=zh-TW">google books</a>)
    <blockquote>
      <p>Digital Twins in Industry is a compilation of works by authors with specific emphasis on industrial applications.</p>
    </blockquote>

    <blockquote>
      <p>Much of the research on digital twins has been conducted by the academia in both theoretical considerations and laboratory-based prototypes. Industry, while taking the lead on larger scale implementations of Digital Twins (DT) using sophisticated software, is concentrating on dedicated solutions that are not within the reach of the average-sized industries.</p>
    </blockquote>

    <blockquote>
      <p>This book covers 11 chapters of various implementations of DT. It provides an insight for companies who are contemplating the adaption of the DT technology, as well as researchers and senior students in exploring the potential of DT and its associated technologies.</p>
    </blockquote>
  </li>
</ul>

<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:7" role="doc-endnote">
      <p>Gassó, S., Baldasano, J., Celades, C. (1992). <strong>The SIMTAR CAD/CAE system for the interactive computer aided design of wastewater treatment facilities</strong>. Environmental Software 7, 155–164. <a href="#fnref:7" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:8" role="doc-endnote">
      <p>Roozbeh Mottaghi (2022) <strong>AI2-THOR: A virtual environment for training home assistant robots</strong> by <a href="https://www.youtube.com/watch?v=w27UKcFXcmk&amp;t=20s">Unity@youtube</a> <a href="#fnref:8" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:1" role="doc-endnote">
      <p>連續三年被評為全球十大科技趨勢的「數位孿生」到底是什麼？(上) <a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:3" role="doc-endnote">
      <p>Sean O’Neill. <strong>Mathematical Reasoning Challenges Artificial Intelligence</strong>. Engineering, <a href="https://doi.org/10.1016/j.eng.2019.08.009">doi</a> <a href="#fnref:3" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:2" role="doc-endnote">
      <p>劉源隆、吳政宏、王郁惠、陳廷博(2020)既有燃煤發電機組空污防制設備效能提升可行性評估工業污染防治 第 150 期 (Nov. 2020) pp80 ~ 101 (<a href="https://proj.ftis.org.tw/eta/WebPhotos/2020/既有燃煤發電機組空污防制設備效能提升可行性評估.pdf">pdf</a>) <a href="#fnref:2" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:4" role="doc-endnote">
      <p>Li’an Hou. <strong>Creating Smart Waterworks to Produce Healthy Drinking Water</strong>. Engineering, <a href="https://doi.org/10.1016/j.eng.2019.07.017">doi</a> <a href="#fnref:4" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:6" role="doc-endnote">
      <p>Macas, M., Wu, C. (2019). <strong>An Unsupervised Framework for Anomaly Detection in a Water Treatment System</strong>, Presented at the 2019 18th IEEE International Conference on Machine Learning and Applications (ICMLA), Athens, Greece, pp. 1298–1305. <a href="https://doi.org/10.1109/ICMLA.2019.00212">doi</a> <a href="#fnref:6" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:5" role="doc-endnote">
      <p>Olaf Kolditz, Karsten Rink, Erik Nixdorf, Thomas Fischer, Lars Bilke, Dmitri Naumov, Zhenliang Liao, Tianxiang Yue. <strong>Environmental Information Systems: Paving the Path for Digitally Facilitated Water Management (Water 4.0)</strong>. Engineering, <a href="https://doi.org/10.1016/j.eng.2019.08.002">doi</a>. <a href="#fnref:5" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>]]></content><author><name>yckuang</name><email>sinotec2@gmail.com</email></author><category term="AI" /><summary type="html"><![CDATA[背景 此處彙總了數位對映（Digital Twins, DT）的相關書籍、報章及文獻，以及一些工作上的反思。 早期做的環境模擬總覺得是靜態的回顧、成因探討，即使做到了「半」模式預報（氣象引用GFS預報結果、排放援引3年前的數據，所計算而得的空氣品質），卻也不能控制什麼來達到防制、保護的效果。畢竟環境的基本定義就是我們不能做什麼來控制的部分，能夠控制的我們稱之為程序。 這是為什麼環工的主流價值觀會集中在程序，淨水廠、污水廠站、管線、焚化爐、現地處理、AQCS，因為這些程序、系統等著工程師們、主管們決定可以做些什麼、調控參數，來改變系統的產出、就是產品或服務。 早期(Gassó et al., 1992)的環工互動式設計是用Fortran, AUTOLisp, C等語言來撰寫1。 現代大量計算資源、顯示器資源均集中在個人電腦上，以虛擬型態來進行模擬、建立數位對映，有其教育意義及優勢2： 減少模廠之花費與時間 避免時廠操作錯誤的風險 運用本地資源進行計算流體力學之計算 仿真渲染、VR等技術之應用，可以得到最大之臨場感受 digital twins 維基百科的定義 數位對映、數位雙生、數位分身、中國翻譯成數字映射 wikipedia(2021) 數位對映（Digital twin），或譯作數位孿生、數位分身、數位雙生，指在資訊化平台內類比物理實體、流程或者系統，類似實體系統在資訊化平台中的雙胞胎。藉助於數位對映，可以在資訊化平台上了解物理實體的狀態，甚至可以對物理實體裡面預定義的介面元件進行控制。 數位對映是物聯網裡面的概念，它指通過整合物理回饋資料，並輔以人工智慧、機器學習和軟體分析，在資訊化平台內建立一個數位化類比。這個類比會根據回饋，隨著物理實體的變化而自動做出相應的變化。理想狀態下，數位對映可以根據多重的回饋源資料進行自我學習，從而幾乎即時地在數位世界裡呈現物理實體的真實狀況。數位對映的回饋源主要依賴於各種感測器，如壓力、角度、速度感測器等。數位對映的自我學習（或稱機器學習）除了可以依賴於感測器的回饋資訊，也可以是通過歷史資料，或者是整合網路的資料學習。後者常指多個同批次的物理實體同時進行不同的操作，並將資料回饋到同一個資訊化平台，數位對映根據海量的資訊回饋，進行迅速的深度學習和精確類比。 數位對映可以應用在各種行業（目前主要是工業）對核心裝置、流程的使用進行最佳化，並簡化維護工作，目前也有農漁業數位分身應用的嘗試。 Gartner評論 Vivian Ku3部落格 數位孿生(Digital Twin)已連續三年被資訊科技研究機構Gartner評為全球十大科技趨勢之一，簡單來說，數位孿生是指透過存在於虛擬世界的「雙胞胎」，來顯示現實世界中的物體可能的反應、狀況或是效能等。(Gartner最新的報導可以看這邊，有興趣的人可以去看看其他九項科技是什麼。) 但是從google trends來看，在過去五年間，Digital Twin顯然沒有引起非常熱烈的討論，一直到2017年時才出現熱潮，可是比起同為十大科技的「區塊鍊」，網路搜尋熱度就差了一大截。這反應的是，數位孿生並非一個全新的技術，而是綜合多項科技與領域，並針對不同產業的痛點所提出的應用，因此，在技術層面涉及較廣泛，且重視Domain know-how的情況之下，發展速度不如預期快速。然而，隨著IOT、AI、AR、VR等技術的到位，數位孿生肯定是下一波工業4.0發展重點中的重點。 數值模擬 vs 數位對映 到底是人腦聰明還是電腦聰明？這類的主題總不會停止討論。《Engineering》是中国工程院于2015年创办的工程科技综合性期刊，在2019年第5卷第5期出版了關於水污染控制的專刊，其中也收錄了一篇Sean O’Neill(2019)《数学推理挑战人工智能》4，對當代的AI不如人類數學推理的悲觀看法。但如果今天來看，恐怕作者要改寫短文的結論了。 環工程序的數值模擬 有關製程用水、冷卻水、飲用水、與廢水處理工場的計算流體力學模式模擬源自於1990年代，近年來有很大的突破，除了傳統化工反應槽或生物處理的開發應用之外，在核能發電廠的研究成果對環工實務也有很大的貢獻，包括商業CFD軟體、開源CFD軟體、以及研究單位開放的軟體等等，可以詳見CFD在水務工程中的應用 在台電最新的AQCS更新改建計畫中，就應用了CFD進行細部設計的敏感性分析，包括導流板、粗灰阻隔設備、SCR之注氨系統AIG、或混流器等流場設計調整。5 IBM官網之說明 依據IBM 對數位對映與一般模擬仿真與同化差異的說明 相同處：都是用數字將真實世界予以量化，以便進行診斷、解析、並作出預測及評估。二者對系統而言，都是不可或缺的數值方法。 相異處 規模：數位對映本身除了專注在流程，還能加入邏輯上還不能解釋相關性的環境數據，甚或整併任意數量的數值模擬結果，來研究多程序間的交互作用。 即時性：數值模式對即時模擬的計算需求是非常龐大，少數應用在無法控制的程序或系統，如天氣、地震及火山活動的短期預報。但數位對映的設計目的原本就是用在即時監測與控制雙向信息流的決策機制，該信息流首先發生自傳感器即時傳送到系統處理器，而在處理器達成新的診斷、預測與決策後，資訊流又發生自系統處理器傳送到現場可控制物件，產生即時性的反應。 更廣泛的應用：數值模式的敏感性測試項目取決於模式基本的統御方程式、條件與參數，是預先決定的。但數位對映因納入非邏輯性的數據變數，對系統可能影響對變因將會保持更開放的態度，可以提供系統與產品更多改進的可能性。 水廠的智慧化 北京師範大學侯立安教授在工程期刊上發表對《建设生产健康饮水的智慧水厂》的看法6，就壓力面而言，侯教授提出了水質安全、複合複雜、新污染新技術難融入、突發情況應急、管網更新與二次污染等5項問題，相應對策則有淨化單元模塊化、淨化過程綠色化、回收物質資源化、控制方式智能化等4個關鍵特質，建構低耗能、精準加藥、數位化與智能化融合共生的水廠。 7這篇浙江大學的研究雖然是針對工業用水模廠( Secure Water Treatment (SWaT) 測試床)的虛實系統(Cyber-Physical Systems, CPS)研究，但因為是針對網路攻擊的異常狀況的AI訓練，對靠網際網路連線的監測系統而言，其參考價值還是蠻高的。 How Simulation Helps Clean and Manage Water by Ansys blog(MARCH 22, 2023) 中德合作water4.0 這篇短文綜合了2個中國境內湖泊(巢湖及鄱陽湖)的水質管理計畫，應用最新的即時監測設備、GIS系統、VR(Unity)、以及遠端控制系統，來做到實場與實驗室的數位對映8。其軟、硬體規格與功能構想值得參考。 不過當中還沒有加入數值模式(水質擴散模式、水廠CFD等等)、統計或任何形式的AI模型，水廠部分的自動(或智慧)控制也沒有著墨。畢竟是試驗性質的計畫，主要還是著重在環境資訊與最後的顯示決策系統展示，真正實場的控制涉及供水、廢水處理的實務與各單位的權責，應該是行政協調而不是研究計畫可以碰觸的決策。 水處理設計之套裝軟件 top 5 From SmartServ(2022) Top 5 Water Treatment Software In 2022 DuPont WAVE Water Application Value Engine (WAVE) is the industry’s first fully integrated free modeling software program to integrate our leading technologies — ultrafiltration (UF), reverse osmosis (RO), ion exchange (IX), and now incorporates DesaliTec™ SOAR CCRO — into one comprehensive tool. Using a common interface, it simplifies the design process and ultimately helps reduce the time needed to manage your water-treatment system. SmartServ Picture Notes/Custom equipment/Hide pricing using ACL/Create and show tiered pricing to your customers./Payment intermediate page/ 整體工程採購、全方位輔助軟體 專人解說示範、無下載版。 Aqua Designer Envirosuite: Water Simulation Software。提供30日試用版。 Workever: Water Hygiene &amp; Treatment Business Software books about digital twins(DT) 最新上架 Ali Kashif Bashir， Balamurugan Balusamy， Pooja Malik， Rajasekar Vani， and Rajesh Kumar Dhanaraj(2023)Digital Twin for Smart Manufacturing(google books) Digital Twin for Smart Manufacturing: Emerging Approaches and Applications provides detailed descriptions on how to integrate and optimize novel digital technologies for smart manufacturing. The book discusses digital twins, which combine the industrial internet of things, artificial intelligence, machine learning and software analytics with spatial network graphs to create living digital simulation models that update and change as their physical counterparts change. In addition, they provide an effective way to integrate technologies like cyber-physical systems into a smart manufacturing system, potentially optimizing the entire business process and operating procedure of the manufacturing firm. Noel Crespi, Adam T. Drobot, Roberto Minerva(2023)The Digital Twin(springer) Covers the origin and history of the “Digital Twin” and the path that leads to where we are today Identifies the impacts of the technological evolution and transformation in the next 5-8 years on Digital Twins Provides an in depth look at the basic and enabling technologies that are necessary for implementation 經典推薦 David Gelernter(1993)Mirror Worlds: or the Day Software Puts the Universe in a Shoebox…How It Will Happen and What It Will Mean(amazon) Technology doesn’t flow smoothly; it’s the big surprises that matter, and Yale computer expert David Gelernter sees one such giant leap right on the horizon. Today’s small scale software programs are about to be joined by vast public software works that will revolutionize computing and transform society as a whole. One such vast program is the “Mirror World.” Imagine looking at your computer screen and seeing reality–an image of your city, for instance, complete with moving traffic patterns, or a picture that sketches the state of an entire far-flung corporation at this second. These representations are called Mirror Worlds, and according to Gelernter they will soon be available to everyone. Mirror Worlds are high-tech voodoo dolls: by interacting with the images, you interact with reality. Indeed, Mirror Worlds will revolutionize the use of computers, transforming them from (mere) handy tools to crystal balls which will allow us to see the world more vividly and see into it more deeply. Reality will be replaced gradually, piece-by-piece, by a software imitation; we will live inside the imitation; and the surprising thing is–this will be a great humanistic advance. We gain control over our world, plus a huge new measure of insight and vision. In this fascinating book–part speculation, part explanation–Gelernter takes us on a tour of the computer technology of the near future. Mirror Worlds, he contends, will allow us to explore the world in unprecedented depth and detail without ever changing out of our pajamas. A hospital administrator might wander through an entire medical complex via a desktop computer. Any citizen might explore the performance of the local schools, chat electronically with teachers and other Mirror World visitors, plant software agents to report back on interesting topics; decide to run for the local school board, hire a campaign manager, and conduct the better part of the campaign itself–all by interacting with the Mirror World. Gelernter doesn’t just speculate about how this amazing new software will be used–he shows us how it will be made, explaining carefully and in detail how to build a Mirror World using technology already available. We learn about “disembodied machines,” “trellises,” “ensembles,” and other computer components which sound obscure, but which Gelernter explains using familiar metaphors and terms. (He tells us that a Mirror World is a microcosm just like a Japanese garden or a Gothic cathedral, and that a computer program is translated by the computer in the same way a symphony is translated by a violinist into music.) Mirror Worlds offers a lucid and humanistic account of the coming software revolution, told by a computer scientist at the cutting edge of his field. A.Y.C. Nee， S.K. Ong(2021)Digital Twins in Industry(google books) Digital Twins in Industry is a compilation of works by authors with specific emphasis on industrial applications. Much of the research on digital twins has been conducted by the academia in both theoretical considerations and laboratory-based prototypes. Industry, while taking the lead on larger scale implementations of Digital Twins (DT) using sophisticated software, is concentrating on dedicated solutions that are not within the reach of the average-sized industries. This book covers 11 chapters of various implementations of DT. It provides an insight for companies who are contemplating the adaption of the DT technology, as well as researchers and senior students in exploring the potential of DT and its associated technologies. Gassó, S., Baldasano, J., Celades, C. (1992). The SIMTAR CAD/CAE system for the interactive computer aided design of wastewater treatment facilities. Environmental Software 7, 155–164. &#8617; Roozbeh Mottaghi (2022) AI2-THOR: A virtual environment for training home assistant robots by Unity@youtube &#8617; 連續三年被評為全球十大科技趨勢的「數位孿生」到底是什麼？(上) &#8617; Sean O’Neill. Mathematical Reasoning Challenges Artificial Intelligence. Engineering, doi &#8617; 劉源隆、吳政宏、王郁惠、陳廷博(2020)既有燃煤發電機組空污防制設備效能提升可行性評估工業污染防治 第 150 期 (Nov. 2020) pp80 ~ 101 (pdf) &#8617; Li’an Hou. Creating Smart Waterworks to Produce Healthy Drinking Water. Engineering, doi &#8617; Macas, M., Wu, C. (2019). An Unsupervised Framework for Anomaly Detection in a Water Treatment System, Presented at the 2019 18th IEEE International Conference on Machine Learning and Applications (ICMLA), Athens, Greece, pp. 1298–1305. doi &#8617; Olaf Kolditz, Karsten Rink, Erik Nixdorf, Thomas Fischer, Lars Bilke, Dmitri Naumov, Zhenliang Liao, Tianxiang Yue. Environmental Information Systems: Paving the Path for Digitally Facilitated Water Management (Water 4.0). Engineering, doi. &#8617;]]></summary></entry></feed>