diff options
39 files changed, 1379 insertions, 1380 deletions
diff --git a/2023/05/03/Rust-NewType-模式/index.html b/2023/05/03/Rust-NewType-模式/index.html index 7ad16dd5..dcb2a4e8 100644 --- a/2023/05/03/Rust-NewType-模式/index.html +++ b/2023/05/03/Rust-NewType-模式/index.html @@ -198,7 +198,7 @@ <div class="icon arrow-left"></div> <div class="post-link"> - <a href="/2023/05/04/C-%E7%9A%84-Trait/">Prev</a> + <a href="/2023/05/24/Rust-%E9%97%AD%E5%8C%85-lifetime-may-not-live-long-enough-%E9%97%AE%E9%A2%98/">Prev</a> </div> </div> diff --git a/2023/05/04/C-的-Trait/index.html b/2023/05/04/C-的-Trait/index.html deleted file mode 100644 index e626505f..00000000 --- a/2023/05/04/C-的-Trait/index.html +++ /dev/null @@ -1,294 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> - <head> - <meta charset="UTF-8"> -<meta name="viewport" - content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> -<meta http-equiv="X-UA-Compatible" content="ie=edge"> - - <meta name="author" content="韩暮秋"> - - - <meta name="subtitle" content="暮秋小屋"> - - - <meta name="description" content="这里是暮秋小屋,思念和灵感的寄存处"> - - - <meta name="keywords" content="韩暮秋,MuqiuHan,'Muqiu Han', 'muqiu han', muqiuhan"> - - - - -<title>C++ 的 Trait | 暮秋小屋</title> - - - - <link rel="icon" href="/favicon.ico"> - - - -<style> - @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Noto+Sans+SC:wght@300;400;500;700&family=Roboto+Mono&display=swap'); -</style> - - - - <!-- stylesheets list from _config.yml --> - - <link rel="stylesheet" href="/css/style.css"> - - - - - - <!-- scripts list from _config.yml --> - - <script src="/js/frame.js"></script> - - - - - - <script src="https://polyfill.io/v3/polyfill.min.js?features=es6"></script> - <script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script> - - - - - - - - <meta name="generator" content="Hexo 6.3.0"></head> - <body> - <div class="mask-border"> - </div> - - <div class="wrapper"> - - <div class="header"> - <div class="flex-container"> - <div class="header-inner"> - <div class="site-brand-container"> - <a href="/"> - - 暮秋小屋 - - </a> - </div> - <div id="menu-btn" class="menu-btn" onclick="toggleMenu()"> - Menu - </div> - <nav class="site-nav"> - <ul class="menu-list"> - - - <li class="menu-item"> - <a href="/">主页</a> - </li> - - - - <li class="menu-item"> - <a href="/categories/gallery/">日记本</a> - </li> - - - - <li class="menu-item"> - <a href="/tags/Medicine/">医学</a> - </li> - - - - <li class="menu-item"> - <a href="/tags/Technique/">计算机科学</a> - </li> - - - - <li class="menu-item"> - <a href="/tags/Life/">生活</a> - </li> - - - - <li class="menu-item"> - <a href="/about">关于</a> - </li> - - - - <li class="menu-item search-btn"> - <a href="#">Search</a> - </li> - - </ul> - </nav> - </div> - </div> -</div> - - - <div class="main"> - <div class="flex-container"> - <article id="post"> - - - <div class="post-head"> - <div class="post-info"> - <div class="tag-list"> - - - <span class="post-tag"> - <a href="/tags/Technique/"> - Technique - </a> - </span> - - <span class="post-tag"> - <a href="/tags/C/"> - C++ - </a> - </span> - - - </div> - <div class="post-title"> - - - C++ 的 Trait - - - </div> - <span class="post-date"> - May 4, 2023 - </span> - </div> - <div class="post-img"> - - <div class="h-line-primary"></div> - - </div> -</div> - <div class="post-content"> - <blockquote> -<p>C++ 的 traits 技术,是一种约定俗称的技术方案,用来为同一类数据(包括自定义数据类型和内置数据类型)提供统一的类型名(traits),这样可以统一的操作函数,例如 advance(), swap(), encode()/decode() 等。</p> -</blockquote> -<p>例如,拥有义类型Foo, Bar,以及编译器自带类型 int, double, string,我们想要为这些不同的类型提供统一的编码函数 decode() 。</p> -<p>除了使用 trait 技术之外,函数重载和模板函数 + 内置字段也可以实现,前者每增加一种数据类型就需要重新实现一个函数,而同一类数据(int, unsinged int)可以使用同样的编码方法。我们想要的是针对同一种数据类型,只编写一个函数。后者对于系统自定义变量 int, double 而言,是无法在其内部定义 type 的。</p> -<p>traits 技术的关键在于,使用另外的模板类 type_traits 来保存不同数据类型的 type,这样就可以兼容自定义数据类型和内置数据类型:</p> -<figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 定义数据 type 类</span></span><br><span class="line"><span class="keyword">enum</span> <span class="title class_">Type</span> {</span><br><span class="line"> TYPE_1,</span><br><span class="line"> TYPE_2,</span><br><span class="line"> TYPE_3</span><br><span class="line">}</span><br></pre></td></tr></table></figure> - -<p>对于自定义类型,在类内部定义 type,然后在 traits 类中定义同样的 type:</p> -<figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 自定义数据类型</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Foo</span> {</span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> Type type = TYPE_1;</span><br><span class="line">};</span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Bar</span> {</span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> Type type = TYPE_2;</span><br><span class="line">};</span><br><span class="line"><span class="keyword">template</span><<span class="keyword">typename</span> T></span><br><span class="line"><span class="keyword">struct</span> <span class="title class_">type_traits</span> {</span><br><span class="line"> Type type = T::type;</span><br><span class="line">}</span><br></pre></td></tr></table></figure> - -<p>对于内置数据类型,使用模板类的特化为自定义类型生成独有的 type_traits:</p> -<figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 内置数据类型</span></span><br><span class="line"><span class="keyword">template</span><<span class="keyword">typename</span> <span class="type">int</span>></span><br><span class="line"><span class="keyword">struct</span> <span class="title class_">type_traits</span> {</span><br><span class="line"> Type type = Type::TYPE_1;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">template</span><<span class="keyword">typename</span> <span class="type">double</span>></span><br><span class="line"><span class="keyword">struct</span> <span class="title class_">type_traits</span> {</span><br><span class="line"> Type type = Type::TYPE_3;</span><br><span class="line">}</span><br></pre></td></tr></table></figure> - -<p>这样就可以为不同数据类型生成统一的模板函数</p> -<figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 统一的编码函数</span></span><br><span class="line"><span class="keyword">template</span><<span class="keyword">typename</span> T></span><br><span class="line"><span class="type">void</span> decode<<span class="type">const</span> T& data, <span class="type">char</span>* buf) {</span><br><span class="line"> <span class="keyword">if</span>(type_traits<T>::type == Type::TYPE_1) {</span><br><span class="line"> ...</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span>(type_traits<T>::type == Type::TYPE_2) {</span><br><span class="line"> ...</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure> - -<p>总结</p> -<ul> -<li>traits 技术的关键在于使用第三方模板类 traits,利用模板特化的功能, 实现对自定义数据和编译器内置数据的统一</li> -<li>这个例子使用了枚举变量来表示数据类型,而实际操作中通常使用不同的类来表示不同的类型,这样可以在编写模板函数时更好的优化。</li> -<li>tratis 技术常见于标准库的实现中,但对日常开发中降低代码冗余也有很好的借鉴意义</li> -<li>C++20 提供了Concept 的特性,使用Concept 可以使得实现类似的功能更加方便</li> -</ul> - -</div> - -<script> - window.onload = detectors(); -</script> - <div class="post-footer"> - <div class="h-line-primary"></div> - <nav class="post-nav"> - <div class="prev-item"> - - <div class="icon arrow-left"></div> - <div class="post-link"> - <a href="/2023/05/11/C-vector-%E7%9A%84-push-back-%E5%92%8C-emplace-back/">Prev</a> - </div> - - </div> - <div class="next-item"> - - <div class="icon arrow-right"></div> - <div class="post-link"> - <a href="/2023/05/03/Rust-NewType-%E6%A8%A1%E5%BC%8F/">Next</a> - </div> - - </div> - </nav> -</div> - - - <div class="post-comment"> - - - - - - - -</div> - - -</article> - </div> - </div> - - <div class="footer"> - <div class="flex-container"> - <div class="footer-text"> - - - | - - - 希望路过的人可以添点柴火让这里暖和点 - - </div> - </div> -</div> - - </div> - - - <div class="search-popup"> - <div class="search-popup-overlay"> - </div> - <div class="search-popup-window" > - <div class="search-header"> - <div class="search-input-container"> - <input autocomplete="off" autocapitalize="off" maxlength="80" - placeholder="Search Anything" spellcheck="false" - type="search" class="search-input"> - </div> - <div class="search-close-btn"> - <div class="icon close-btn"></div> - </div> - </div> - <div class="search-result-container"> - </div> - </div> -</div> - -<script> - const searchConfig = { - path : "/search.xml", - top_n_per_article: "1", - unescape : "false", - trigger: "auto", - preload: "false" - } -</script> -<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/search.js"></script> -<script src="/js/search.js"></script> - - - - </body> -</html> diff --git a/2023/05/12/C-20-实现-string-split/index.html b/2023/05/12/C-20-实现-string-split/index.html deleted file mode 100644 index a2db0de9..00000000 --- a/2023/05/12/C-20-实现-string-split/index.html +++ /dev/null @@ -1,274 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> - <head> - <meta charset="UTF-8"> -<meta name="viewport" - content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> -<meta http-equiv="X-UA-Compatible" content="ie=edge"> - - <meta name="author" content="韩暮秋"> - - - <meta name="subtitle" content="暮秋小屋"> - - - <meta name="description" content="这里是暮秋小屋,思念和灵感的寄存处"> - - - <meta name="keywords" content="韩暮秋,MuqiuHan,'Muqiu Han', 'muqiu han', muqiuhan"> - - - - -<title>C++ 20 实现 string split | 暮秋小屋</title> - - - - <link rel="icon" href="/favicon.ico"> - - - -<style> - @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Noto+Sans+SC:wght@300;400;500;700&family=Roboto+Mono&display=swap'); -</style> - - - - <!-- stylesheets list from _config.yml --> - - <link rel="stylesheet" href="/css/style.css"> - - - - - - <!-- scripts list from _config.yml --> - - <script src="/js/frame.js"></script> - - - - - - <script src="https://polyfill.io/v3/polyfill.min.js?features=es6"></script> - <script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script> - - - - - - - - <meta name="generator" content="Hexo 6.3.0"></head> - <body> - <div class="mask-border"> - </div> - - <div class="wrapper"> - - <div class="header"> - <div class="flex-container"> - <div class="header-inner"> - <div class="site-brand-container"> - <a href="/"> - - 暮秋小屋 - - </a> - </div> - <div id="menu-btn" class="menu-btn" onclick="toggleMenu()"> - Menu - </div> - <nav class="site-nav"> - <ul class="menu-list"> - - - <li class="menu-item"> - <a href="/">主页</a> - </li> - - - - <li class="menu-item"> - <a href="/categories/gallery/">日记本</a> - </li> - - - - <li class="menu-item"> - <a href="/tags/Medicine/">医学</a> - </li> - - - - <li class="menu-item"> - <a href="/tags/Technique/">计算机科学</a> - </li> - - - - <li class="menu-item"> - <a href="/tags/Life/">生活</a> - </li> - - - - <li class="menu-item"> - <a href="/about">关于</a> - </li> - - - - <li class="menu-item search-btn"> - <a href="#">Search</a> - </li> - - </ul> - </nav> - </div> - </div> -</div> - - - <div class="main"> - <div class="flex-container"> - <article id="post"> - - - <div class="post-head"> - <div class="post-info"> - <div class="tag-list"> - - - <span class="post-tag"> - <a href="/tags/Technique/"> - Technique - </a> - </span> - - <span class="post-tag"> - <a href="/tags/C/"> - C++ - </a> - </span> - - - </div> - <div class="post-title"> - - - C++ 20 实现 string split - - - </div> - <span class="post-date"> - May 12, 2023 - </span> - </div> - <div class="post-img"> - - <div class="h-line-primary"></div> - - </div> -</div> - <div class="post-content"> - <p>C++20引入了范围库ranges,其中提供的两个范围适配器std::split、std::lazy_split可以使我们以一种更为优雅的形式实现split:</p> -<figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><concept></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><ranges></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><algorithm></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><format></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><iostream></span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> stdr std::ranges</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> stdrv std::ranges::views</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">template</span><<span class="keyword">template</span><<span class="keyword">typename</span>> <span class="keyword">typename</span> Container = std::vector, <span class="keyword">typename</span> Arg = std::string_view></span><br><span class="line"><span class="keyword">auto</span> <span class="built_in">Split</span>(std::string_view str, std::string_view delimiter)</span><br><span class="line">{</span><br><span class="line"> Container<Arg> myCont;</span><br><span class="line"> <span class="keyword">auto</span> temp = str </span><br><span class="line"> | stdrv::<span class="built_in">split</span>(delimiter)</span><br><span class="line"> | stdrv::<span class="built_in">transform</span>([](<span class="keyword">auto</span>&& r)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">Arg</span>(std::<span class="built_in">addressof</span>(*r.<span class="built_in">begin</span>()), stdr::<span class="built_in">distance</span>(r));</span><br><span class="line"> });</span><br><span class="line"> <span class="keyword">auto</span> iter = std::<span class="built_in">inserter</span>(myCont, myCont.<span class="built_in">end</span>());</span><br><span class="line"> stdr::for_each(temp, [&](<span class="keyword">auto</span>&& x) { iter = {x.<span class="built_in">begin</span>(), x.<span class="built_in">end</span>()}; });</span><br><span class="line"> <span class="keyword">return</span> myCont;</span><br><span class="line">}</span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> std::string str = <span class="string">"Hello233C++20233and233New233Spilt"</span>;</span><br><span class="line"> std::string delimiter = <span class="string">"233"</span>;</span><br><span class="line"> <span class="keyword">auto</span>&& strCont = <span class="built_in">Split</span><std::list, std::string>(str, delimiter);</span><br><span class="line"> stdr::for_each(strCont, [](<span class="keyword">auto</span>&& x) { std::cout << std::format(<span class="string">"{} "</span>, x); });</span><br><span class="line">}</span><br><span class="line"><span class="comment">//output: Hello C++20 and New Spilt</span></span><br></pre></td></tr></table></figure> - -<p>C++20没有提供关键的 <code>ranges::to<container></code>函数,导致demo中还需要额外封装并手写for_each来写入数据,等到C++23实装了该函数,split的实现会比现在简洁优雅的多,真正做到方便泛用、无需封装:</p> -<figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">auto</span>&& strCont = str</span><br><span class="line"> | stdrv::<span class="built_in">lazy_split</span>(delimiter)</span><br><span class="line"> | stdr ::to<std::vector<std::string>>;</span><br></pre></td></tr></table></figure> -</div> - -<script> - window.onload = detectors(); -</script> - <div class="post-footer"> - <div class="h-line-primary"></div> - <nav class="post-nav"> - <div class="prev-item"> - - <div class="icon arrow-left"></div> - <div class="post-link"> - <a href="/2023/05/24/Rust-%E9%97%AD%E5%8C%85-lifetime-may-not-live-long-enough-%E9%97%AE%E9%A2%98/">Prev</a> - </div> - - </div> - <div class="next-item"> - - <div class="icon arrow-right"></div> - <div class="post-link"> - <a href="/2023/05/11/C-vector-%E7%9A%84-push-back-%E5%92%8C-emplace-back/">Next</a> - </div> - - </div> - </nav> -</div> - - - <div class="post-comment"> - - - - - - - -</div> - - -</article> - </div> - </div> - - <div class="footer"> - <div class="flex-container"> - <div class="footer-text"> - - - | - - - 希望路过的人可以添点柴火让这里暖和点 - - </div> - </div> -</div> - - </div> - - - <div class="search-popup"> - <div class="search-popup-overlay"> - </div> - <div class="search-popup-window" > - <div class="search-header"> - <div class="search-input-container"> - <input autocomplete="off" autocapitalize="off" maxlength="80" - placeholder="Search Anything" spellcheck="false" - type="search" class="search-input"> - </div> - <div class="search-close-btn"> - <div class="icon close-btn"></div> - </div> - </div> - <div class="search-result-container"> - </div> - </div> -</div> - -<script> - const searchConfig = { - path : "/search.xml", - top_n_per_article: "1", - unescape : "false", - trigger: "auto", - preload: "false" - } -</script> -<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/search.js"></script> -<script src="/js/search.js"></script> - - - - </body> -</html> diff --git a/2023/05/24/Rust-闭包-lifetime-may-not-live-long-enough-问题/index.html b/2023/05/24/Rust-闭包-lifetime-may-not-live-long-enough-问题/index.html index 3e34ba99..ff0dfa44 100644 --- a/2023/05/24/Rust-闭包-lifetime-may-not-live-long-enough-问题/index.html +++ b/2023/05/24/Rust-闭包-lifetime-may-not-live-long-enough-问题/index.html @@ -202,7 +202,7 @@ <div class="icon arrow-right"></div> <div class="post-link"> - <a href="/2023/05/12/C-20-%E5%AE%9E%E7%8E%B0-string-split/">Next</a> + <a href="/2023/05/03/Rust-NewType-%E6%A8%A1%E5%BC%8F/">Next</a> </div> </div> diff --git a/2023/06/10/二零二三年六月十日/index.html b/2023/06/10/二零二三年六月十日/index.html index 4ebbe5eb..8cc6e28e 100644 --- a/2023/06/10/二零二三年六月十日/index.html +++ b/2023/06/10/二零二三年六月十日/index.html @@ -158,11 +158,11 @@ </div> </div> <div class="post-content"> - <p>我希望与我一样独自生活多年的宝宝们,能绝对理性的面对所有事情,这是一个人工作学习生活的基础,但同时要感同身受的去阅读文学类作品,这是让我们保留一丝感性的方式,感性是不可或缺的,理性可以让人控制感性,但也可以消灭它。</p> -<p>一个人的世界很容易出现信息茧房,要不断的和人交流,把很多想法说出来,接收一切评论,不然会在长期的不分正确错误的信息堆叠中出现一团巨大的闭塞性的知识,这很不利于我们快乐的活下去。</p> -<p>接收到的评论不必急于改变,先存起来,让它们陪着你跟着时间走,路上会慢慢的和其他的事情连结起来,这样就能择其善者而从之,其不善者而改之了。</p> -<p>和我一样处在青少年阶段的宝宝们应当早日从这喧扰的世界冷静下来,让脑子里满是憧憬和情爱的灵魂得到一丝陈酿,理性点抬头看看世界上方的二氧化碳,自己晃晃头打破能回到最初的样子再重来的梦。</p> -<p>爱你们噢。</p> + <p>请绝对理性的面对所有事情,这是一个人工作学习生活的基础,但同时要感同身受的去阅读文学类作品,这是保留一丝感性的方式,感性是不可或缺的,理性可以让人控制感性,但也可以消灭它。</p> +<p>独处的世界很容易出现信息茧房,要不断的和人交流,把很多想法说出来,接收一切评论,不然会在长期的不分正确错误的信息堆叠中出现一团巨大的闭塞性的知识,这很不利于快乐的活下去。</p> +<p>接收到的评论不必急于改变,先存起来,让它们陪着自己,跟着时间走,路上会慢慢的和其他的事情连结起来,这样就能择其善者而从之,其不善者而改之了。</p> +<p>应当早日从这喧扰的世界冷静下来,让脑子里满是憧憬和情爱的灵魂得到一丝陈酿,理性点抬头看看世界上方的二氧化碳,自己晃晃头打破能回到最初的样子再重来的梦。</p> +<p>爱你们。</p> </div> diff --git a/2024/11/17/二〇二四年十一月十七日/index.html b/2024/11/17/二〇二四年十一月十七日/index.html index fe4cd80d..6163defd 100644 --- a/2024/11/17/二〇二四年十一月十七日/index.html +++ b/2024/11/17/二〇二四年十一月十七日/index.html @@ -158,7 +158,7 @@ </div> </div> <div class="post-content"> - <p>快乐是正面情绪的原型,许多思想家都说过,人类的所作所为,最终都是为了追求快乐。我们之所以想追求财富、健康或名声,都是为了借此得到快乐。然而,追求快乐也不是因为它可以带给我们其他好处,因为快乐本身就是目的。</p> + <p>快乐是正面情绪的原型,人类的所作所为,最终都是为了追求快乐。我们之所以想追求财富、健康或名声,都是为了借此得到快乐。然而,追求快乐也不是因为它可以带给我们其他好处,因为快乐本身就是目的。</p> <p>“世人皆以痛楚、孤独、悲伤为大境界,以为这就是深邃的人生,殊不知快乐才是人生的真谛。一个人获取快乐的能力才是真正有用的能力。伤春悲秋、离愁别绪太容易了,读几首诗词即可,但获取欢乐太难了非大丈夫不可为之。”</p> </div> diff --git a/2025/01/19/身体往前倾,灵魂向后摇/index.html b/2025/01/19/身体往前倾,灵魂向后摇/index.html index 6abbd905..53f1ff70 100644 --- a/2025/01/19/身体往前倾,灵魂向后摇/index.html +++ b/2025/01/19/身体往前倾,灵魂向后摇/index.html @@ -190,7 +190,7 @@ <div class="icon arrow-left"></div> <div class="post-link"> - <a href="/2025/02/18/Prisma-%E5%85%B3%E7%B3%BB%E5%9E%8B%E6%95%B0%E6%8D%AE%E5%BA%93%E7%9A%84-Self-relations/">Prev</a> + <a href="/2025/02/10/%E5%AE%9E%E6%97%B6%E6%90%9C%E7%B4%A2%E4%B8%AD%E7%9A%84%E9%98%B2%E6%8A%96%E5%87%BD%E6%95%B0/">Prev</a> </div> </div> diff --git a/2025/02/10/实时搜索中的防抖函数/index.html b/2025/02/10/实时搜索中的防抖函数/index.html new file mode 100644 index 00000000..614e7b9c --- /dev/null +++ b/2025/02/10/实时搜索中的防抖函数/index.html @@ -0,0 +1,287 @@ +<!DOCTYPE html> +<html lang="en"> + <head> + <meta charset="UTF-8"> +<meta name="viewport" + content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> +<meta http-equiv="X-UA-Compatible" content="ie=edge"> + + <meta name="author" content="韩暮秋"> + + + <meta name="subtitle" content="暮秋小屋"> + + + <meta name="description" content="这里是暮秋小屋,思念和灵感的寄存处"> + + + <meta name="keywords" content="韩暮秋,MuqiuHan,'Muqiu Han', 'muqiu han', muqiuhan"> + + + + +<title>实时搜索中的防抖函数 | 暮秋小屋</title> + + + + <link rel="icon" href="/favicon.ico"> + + + +<style> + @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Noto+Sans+SC:wght@300;400;500;700&family=Roboto+Mono&display=swap'); +</style> + + + + <!-- stylesheets list from _config.yml --> + + <link rel="stylesheet" href="/css/style.css"> + + + + + + <!-- scripts list from _config.yml --> + + <script src="/js/frame.js"></script> + + + + + + <script src="https://polyfill.io/v3/polyfill.min.js?features=es6"></script> + <script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script> + + + + + + + + <meta name="generator" content="Hexo 6.3.0"></head> + <body> + <div class="mask-border"> + </div> + + <div class="wrapper"> + + <div class="header"> + <div class="flex-container"> + <div class="header-inner"> + <div class="site-brand-container"> + <a href="/"> + + 暮秋小屋 + + </a> + </div> + <div id="menu-btn" class="menu-btn" onclick="toggleMenu()"> + Menu + </div> + <nav class="site-nav"> + <ul class="menu-list"> + + + <li class="menu-item"> + <a href="/">主页</a> + </li> + + + + <li class="menu-item"> + <a href="/categories/gallery/">日记本</a> + </li> + + + + <li class="menu-item"> + <a href="/tags/Medicine/">医学</a> + </li> + + + + <li class="menu-item"> + <a href="/tags/Technique/">计算机科学</a> + </li> + + + + <li class="menu-item"> + <a href="/tags/Life/">生活</a> + </li> + + + + <li class="menu-item"> + <a href="/about">关于</a> + </li> + + + + <li class="menu-item search-btn"> + <a href="#">Search</a> + </li> + + </ul> + </nav> + </div> + </div> +</div> + + + <div class="main"> + <div class="flex-container"> + <article id="post"> + + + <div class="post-head"> + <div class="post-info"> + <div class="tag-list"> + + + <span class="post-tag"> + <a href="/tags/Technique/"> + Technique + </a> + </span> + + <span class="post-tag"> + <a href="/tags/Web/"> + Web + </a> + </span> + + + </div> + <div class="post-title"> + + + 实时搜索中的防抖函数 + + + </div> + <span class="post-date"> + Feb 10, 2025 + </span> + </div> + <div class="post-img"> + + <div class="h-line-primary"></div> + + </div> +</div> + <div class="post-content"> + <p>在实现实时搜索功能时,通常会使用输入框的事件监听器来捕获用户的输入变化,并在输入变化时发送搜索请求。为了避免过多的请求导致服务器负担过重,通常会使用“防抖”(debounce)技术来控制请求的频率。</p> +<h3 id="实现步骤"><a href="#实现步骤" class="headerlink" title="实现步骤"></a>实现步骤</h3><ol> +<li><strong>监听输入框的变化</strong>:使用<code>input</code>事件监听器来捕获用户的输入变化。</li> +<li><strong>防抖处理</strong>:使用防抖函数来限制请求的频率。防抖函数会在用户停止输入一段时间后才发送请求。</li> +<li><strong>发送请求</strong>:在防抖函数中调用搜索请求。</li> +</ol> +<h3 id="防抖函数示例"><a href="#防抖函数示例" class="headerlink" title="防抖函数示例"></a>防抖函数示例</h3><p>以下是一个简单的防抖函数示例:</p> +<figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">function</span> <span class="title function_">debounce</span>(<span class="params">func, wait</span>) {</span><br><span class="line"> <span class="keyword">let</span> timeout;</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">function</span>(<span class="params">...args</span>) {</span><br><span class="line"> <span class="keyword">const</span> context = <span class="variable language_">this</span>;</span><br><span class="line"> <span class="built_in">clearTimeout</span>(timeout);</span><br><span class="line"> timeout = <span class="built_in">setTimeout</span>(<span class="function">() =></span> func.<span class="title function_">apply</span>(context, args), wait);</span><br><span class="line"> };</span><br><span class="line">}</span><br></pre></td></tr></table></figure> + +<h3 id="实现实时搜索"><a href="#实现实时搜索" class="headerlink" title="实现实时搜索"></a>实现实时搜索</h3><p>假设你有一个输入框用于搜索患者:</p> +<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line"><script></span><br><span class="line"> import { onMount } from 'svelte';</span><br><span class="line"> import { patientsStore } from '$lib/stores/patients.svelte';</span><br><span class="line"></span><br><span class="line"> let searchTerm = '';</span><br><span class="line"></span><br><span class="line"> // 防抖函数</span><br><span class="line"> function debounce(func, wait) {</span><br><span class="line"> let timeout;</span><br><span class="line"> return function(...args) {</span><br><span class="line"> const context = this;</span><br><span class="line"> clearTimeout(timeout);</span><br><span class="line"> timeout = setTimeout(() => func.apply(context, args), wait);</span><br><span class="line"> };</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> // 搜索函数</span><br><span class="line"> const searchPatients = debounce(async (term) => {</span><br><span class="line"> if (term) {</span><br><span class="line"> // 发送搜索请求</span><br><span class="line"> const response = await fetch(`/api/search-patients?query=${term}`);</span><br><span class="line"> const data = await response.json();</span><br><span class="line"> patientsStore.mbglPatients = data;</span><br><span class="line"> } else {</span><br><span class="line"> // 清空搜索结果或恢复默认数据</span><br><span class="line"> patientsStore.mbglPatients = [];</span><br><span class="line"> }</span><br><span class="line"> }, 300); // 300ms 的防抖时间</span><br><span class="line"></span><br><span class="line"> // 监听输入框变化</span><br><span class="line"> function handleInput(event) {</span><br><span class="line"> searchTerm = event.target.value;</span><br><span class="line"> searchPatients(searchTerm);</span><br><span class="line"> }</span><br><span class="line"></script></span><br><span class="line"></span><br><span class="line"><input type="text" placeholder="搜索患者..." on:input={handleInput} bind:value={searchTerm} /></span><br></pre></td></tr></table></figure> + +<h3 id="请求发送间隔"><a href="#请求发送间隔" class="headerlink" title="请求发送间隔"></a>请求发送间隔</h3><ul> +<li><strong>防抖时间</strong>:通常设置为 300ms 到 500ms 之间。这个时间足够让用户完成输入并减少不必要的请求。</li> +<li><strong>考虑用户体验</strong>:防抖时间过短可能导致过多请求,过长则可能让用户感到延迟。300ms 是一个常用的折中值。</li> +</ul> +<p>通过这种方式,你可以实现一个高效的实时搜索功能,既能保证用户体验,又能减少服务器的负担。</p> + +</div> + +<script> + window.onload = detectors(); +</script> + <div class="post-footer"> + <div class="h-line-primary"></div> + <nav class="post-nav"> + <div class="prev-item"> + + <div class="icon arrow-left"></div> + <div class="post-link"> + <a href="/2025/02/11/%E4%BB%8E%E4%BA%8B%E4%BB%B6%E9%A3%8E%E6%9A%B4%E7%9C%8B%E9%A2%86%E5%9F%9F%E9%A9%B1%E5%8A%A8%E8%AE%BE%E8%AE%A1/">Prev</a> + </div> + + </div> + <div class="next-item"> + + <div class="icon arrow-right"></div> + <div class="post-link"> + <a href="/2025/01/19/%E8%BA%AB%E4%BD%93%E5%BE%80%E5%89%8D%E5%80%BE%EF%BC%8C%E7%81%B5%E9%AD%82%E5%90%91%E5%90%8E%E6%91%87/">Next</a> + </div> + + </div> + </nav> +</div> + + + <div class="post-comment"> + + + + + + + +</div> + + +</article> + </div> + </div> + + <div class="footer"> + <div class="flex-container"> + <div class="footer-text"> + + + | + + + 希望路过的人可以添点柴火让这里暖和点 + + </div> + </div> +</div> + + </div> + + + <div class="search-popup"> + <div class="search-popup-overlay"> + </div> + <div class="search-popup-window" > + <div class="search-header"> + <div class="search-input-container"> + <input autocomplete="off" autocapitalize="off" maxlength="80" + placeholder="Search Anything" spellcheck="false" + type="search" class="search-input"> + </div> + <div class="search-close-btn"> + <div class="icon close-btn"></div> + </div> + </div> + <div class="search-result-container"> + </div> + </div> +</div> + +<script> + const searchConfig = { + path : "/search.xml", + top_n_per_article: "1", + unescape : "false", + trigger: "auto", + preload: "false" + } +</script> +<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/search.js"></script> +<script src="/js/search.js"></script> + + + + </body> +</html> diff --git a/2023/05/11/C-vector-的-push-back-和-emplace-back/index.html b/2025/02/11/从事件风暴看领域驱动设计/index.html index ef87129a..d7d6ef41 100644 --- a/2023/05/11/C-vector-的-push-back-和-emplace-back/index.html +++ b/2025/02/11/从事件风暴看领域驱动设计/index.html @@ -20,7 +20,7 @@ -<title>C++ vector 的 push_back 和 emplace_back | 暮秋小屋</title> +<title>从事件风暴看领域驱动设计 | 暮秋小屋</title> @@ -145,24 +145,18 @@ Technique </a> </span> - - <span class="post-tag"> - <a href="/tags/C/"> - C++ - </a> - </span> </div> <div class="post-title"> - C++ vector 的 push_back 和 emplace_back + 从事件风暴看领域驱动设计 </div> <span class="post-date"> - May 11, 2023 + Feb 11, 2025 </span> </div> <div class="post-img"> @@ -172,15 +166,19 @@ </div> </div> <div class="post-content"> - <figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/// Inserts a new element at the end of the vector, right after its current last element. This new element is constructed in place using args as the arguments for its constructor.</span></span><br><span class="line"><span class="comment">/// This effectively increases the container size by one, which causes an automatic reallocation of the allocated storage space if -and only if- the new vector size surpasses the current vector capacity.</span></span><br><span class="line"><span class="comment">/// The element is constructed in-place by calling allocator_traits::construct with args forwarded.</span></span><br><span class="line"><span class="comment">///A similar member function exists, push_back, which either copies or moves an existing object into the container.</span></span><br><span class="line"><span class="keyword">template</span> <<span class="keyword">class</span>... Args></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">emplace_back</span> <span class="params">(Args&&... args)</span></span>;</span><br></pre></td></tr></table></figure> - -<p><code>push_back</code> 会构造一个临时对象,这个临时对象会被拷贝或者移入到容器中,然而 <code>emplace_back</code> 会直接根据传入的参数在容器的适当位置进行构造而避免拷贝或者移动。</p> -<p>传统观点认为 <code>push_back</code> 会构造一个临时对象,这个临时对象会被移入到 v 中,然而 <code>emplace_back</code> 会直接根据传入的参数在适当位置进行构造而避免拷贝或者移动。从标准库代码的实现角度来说这是对的,但是对于提供了优化的编译器来讲,上面示例中最后两行表达式生成的代码其实没有区别。</p> -<p>真正的区别在于,<code>emplace_back</code> 更加强大,它可以调用任何类型的(只要存在)构造函数。而 push_back 会更加严谨,它只调用隐式构造函数。隐式构造函数被认为是安全的。如果能够通过对象 T 隐式构造对象 U,就认为 U 能够完整包含 T 的所有内容,这样将 T 传递给 U 通常是安全的。正确使用隐式构造的例子是用 <code>std::uint32_t</code> 对象构造 <code>std::uint64_t</code> 对象,错误使用隐式构造的例子是用 <code>double</code> 构造 <code>std::uint8_t</code>。</p> -<p>如果想要调用显示构造函数,那么就调用 <code>emplace_back</code>。如果只希望调用隐式构造函数,那么请使用更加安全的 <code>push_back</code>:</p> -<figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">std::vector<std::unique_ptr<T>> v;</span><br><span class="line">T a;</span><br><span class="line">v.<span class="built_in">emplace_back</span>(std::<span class="built_in">addressof</span>(a)); <span class="comment">// compiles</span></span><br><span class="line">v.<span class="built_in">push_back</span>(std::<span class="built_in">addressof</span>(a)); <span class="comment">// fails to compile</span></span><br></pre></td></tr></table></figure> - -<p><code>std::unique_ptr<T></code> 包含了显示构造函数通过 <code>T*</code> 进行构造。因为 <code>emplace_back</code> 能够调用显示构造函数,所以传递一个裸指针并不会产生编译错误。然而,当 v 超出了作用域,<code>std::unique_ptr<T></code> 的析构函数会尝试 delete 类型 <code>T*</code> 的指针,而类型 <code>T*</code> 的指针并不是通过 new 来分配的,因为它保存的是栈对象的地址,因此 delete 行为是未定义的。</p> + <p>事件风暴(Event Storming)是一种领域驱动设计(DDD)的实践方法,由 Alberto Brandolini 提出,旨在通过团队协作的方式快速理解和建模业务领域。</p> +<p>以下是事件风暴及相关领域驱动设计中的一些核心概念和知识点:</p> +<p>1. 领域(Domain):指的是业务相关知识的集合,可以进一步划分为子域。<br>2. 子域(Subdomain):是领域的一部分,可以是核心域、支撑域或通用域。<br>3. 核心域(Core Domain):指领域中最核心的部分,通常对应企业的核心业务。<br>4. 通用语言(Ubiquitous Language):团队所有成员使用的一种语言,用于确保业务和软件之间的沟通一致性。<br>5. 限界上下文(Bounded Context):定义了一组规则和协议,用于明确领域模型的适用范围。<br>6. 实体(Entity):具有唯一标识和生命周期的领域对象。<br>7. 值对象(Value Object):描述了某种特性或属性的对象,没有概念标识。<br>8. 聚合(Aggregate):一组相关对象的集合,由一个聚合根(Aggregate Root)统一管理。<br>9. 领域事件(Domain Event):领域中发生的重要事件,可以用于通知其他领域对象或跨限界上下文进行解耦和协作。<br>10. 命令(Command):表示要执行的操作,通常与事件一一对应。<br>11. 读模型(Read Model):为了优化读取操作而设计的模型,可能与写模型不同。<br>12. 决策命令(Decision Command):在事件风暴中,直接导致事件发生的命令。<br>13. 战略设计(Strategic Design):高层次的抽象和归类,包括理清上下文和子域的划分。<br>14. 战术设计(Tactical Design):对特定上下文下的模型进行详细设计,包括聚合、实体和值对象。<br>15. 贫血模型(Anemic Domain Model):领域对象只有属性及其getter/setter方法的纯数据类,业务逻辑通过服务实现。<br>16. 充血模型(Rich Domain Model):领域对象包含业务逻辑,每个对象都是活跃的。<br>17. 资源库(Repository):用于检索和持久化领域对象的机制。<br>18. 服务(Service):在模型中独立的操作,可以是领域服务或应用服务。<br>19. 固定规则(Invariant):为设计元素做出的断言,必须一直保持为真。</p> +<p>事件风暴通常包括以下步骤:</p> +<ul> +<li>识别领域事件</li> +<li>确定事件顺序</li> +<li>识别命令和触发器</li> +<li>识别聚合和实体</li> +<li>划分限界上下文</li> +<li>识别领域服务和资源库</li> +<li>通过这些步骤,团队可以共同创建出反映业务领域的领域模型,为软件设计和开发提供指导。</li> +</ul> </div> @@ -194,7 +192,7 @@ <div class="icon arrow-left"></div> <div class="post-link"> - <a href="/2023/05/12/C-20-%E5%AE%9E%E7%8E%B0-string-split/">Prev</a> + <a href="/2025/02/18/Prisma-%E5%85%B3%E7%B3%BB%E5%9E%8B%E6%95%B0%E6%8D%AE%E5%BA%93%E7%9A%84-Self-relations/">Prev</a> </div> </div> @@ -202,7 +200,7 @@ <div class="icon arrow-right"></div> <div class="post-link"> - <a href="/2023/05/04/C-%E7%9A%84-Trait/">Next</a> + <a href="/2025/02/10/%E5%AE%9E%E6%97%B6%E6%90%9C%E7%B4%A2%E4%B8%AD%E7%9A%84%E9%98%B2%E6%8A%96%E5%87%BD%E6%95%B0/">Next</a> </div> </div> diff --git a/2025/02/18/Prisma-关系型数据库的-Self-relations/index.html b/2025/02/18/Prisma-关系型数据库的-Self-relations/index.html index c4c33004..d5523d01 100644 --- a/2025/02/18/Prisma-关系型数据库的-Self-relations/index.html +++ b/2025/02/18/Prisma-关系型数据库的-Self-relations/index.html @@ -267,7 +267,7 @@ <div class="icon arrow-right"></div> <div class="post-link"> - <a href="/2025/01/19/%E8%BA%AB%E4%BD%93%E5%BE%80%E5%89%8D%E5%80%BE%EF%BC%8C%E7%81%B5%E9%AD%82%E5%90%91%E5%90%8E%E6%91%87/">Next</a> + <a href="/2025/02/11/%E4%BB%8E%E4%BA%8B%E4%BB%B6%E9%A3%8E%E6%9A%B4%E7%9C%8B%E9%A2%86%E5%9F%9F%E9%A9%B1%E5%8A%A8%E8%AE%BE%E8%AE%A1/">Next</a> </div> </div> diff --git a/2025/02/24/二〇二五年二月二十四日/index.html b/2025/02/24/二〇二五年二月二十四日/index.html index 04392f68..ec7102ef 100644 --- a/2025/02/24/二〇二五年二月二十四日/index.html +++ b/2025/02/24/二〇二五年二月二十四日/index.html @@ -173,6 +173,11 @@ <nav class="post-nav"> <div class="prev-item"> + <div class="icon arrow-left"></div> + <div class="post-link"> + <a href="/2025/03/13/%E9%A2%86%E5%9F%9F%E9%A9%B1%E5%8A%A8%E8%AE%BE%E8%AE%A1%E4%B8%AD%E7%9A%84%E2%80%9C%E8%81%9A%E5%90%88%E6%A0%B9%E2%80%9D/">Prev</a> + </div> + </div> <div class="next-item"> diff --git a/2025/03/13/领域驱动设计中的“聚合根”/index.html b/2025/03/13/领域驱动设计中的“聚合根”/index.html new file mode 100644 index 00000000..ecbdce70 --- /dev/null +++ b/2025/03/13/领域驱动设计中的“聚合根”/index.html @@ -0,0 +1,282 @@ +<!DOCTYPE html> +<html lang="en"> + <head> + <meta charset="UTF-8"> +<meta name="viewport" + content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> +<meta http-equiv="X-UA-Compatible" content="ie=edge"> + + <meta name="author" content="韩暮秋"> + + + <meta name="subtitle" content="暮秋小屋"> + + + <meta name="description" content="这里是暮秋小屋,思念和灵感的寄存处"> + + + <meta name="keywords" content="韩暮秋,MuqiuHan,'Muqiu Han', 'muqiu han', muqiuhan"> + + + + +<title>领域驱动设计中的“聚合根” | 暮秋小屋</title> + + + + <link rel="icon" href="/favicon.ico"> + + + +<style> + @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Noto+Sans+SC:wght@300;400;500;700&family=Roboto+Mono&display=swap'); +</style> + + + + <!-- stylesheets list from _config.yml --> + + <link rel="stylesheet" href="/css/style.css"> + + + + + + <!-- scripts list from _config.yml --> + + <script src="/js/frame.js"></script> + + + + + + <script src="https://polyfill.io/v3/polyfill.min.js?features=es6"></script> + <script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script> + + + + + + + + <meta name="generator" content="Hexo 6.3.0"></head> + <body> + <div class="mask-border"> + </div> + + <div class="wrapper"> + + <div class="header"> + <div class="flex-container"> + <div class="header-inner"> + <div class="site-brand-container"> + <a href="/"> + + 暮秋小屋 + + </a> + </div> + <div id="menu-btn" class="menu-btn" onclick="toggleMenu()"> + Menu + </div> + <nav class="site-nav"> + <ul class="menu-list"> + + + <li class="menu-item"> + <a href="/">主页</a> + </li> + + + + <li class="menu-item"> + <a href="/categories/gallery/">日记本</a> + </li> + + + + <li class="menu-item"> + <a href="/tags/Medicine/">医学</a> + </li> + + + + <li class="menu-item"> + <a href="/tags/Technique/">计算机科学</a> + </li> + + + + <li class="menu-item"> + <a href="/tags/Life/">生活</a> + </li> + + + + <li class="menu-item"> + <a href="/about">关于</a> + </li> + + + + <li class="menu-item search-btn"> + <a href="#">Search</a> + </li> + + </ul> + </nav> + </div> + </div> +</div> + + + <div class="main"> + <div class="flex-container"> + <article id="post"> + + + <div class="post-head"> + <div class="post-info"> + <div class="tag-list"> + + + <span class="post-tag"> + <a href="/tags/Technique/"> + Technique + </a> + </span> + + <span class="post-tag"> + <a href="/tags/Software-Engineering/"> + Software Engineering + </a> + </span> + + + </div> + <div class="post-title"> + + + 领域驱动设计中的“聚合根” + + + </div> + <span class="post-date"> + Mar 13, 2025 + </span> + </div> + <div class="post-img"> + + <div class="h-line-primary"></div> + + </div> +</div> + <div class="post-content"> + <p>在领域驱动设计(Domain-Driven Design,简称DDD)中,聚合根(Aggregate Root)是聚合(Aggregate)中的核心实体,是一个聚合的入口点和控制者,负责维护聚合内部的一致性和不变性条件。聚合是一组紧密相关的领域对象的集合,这些对象通过一定的业务规则绑定在一起,并被视为一个单元。</p> +<p>主要的作用如下:</p> +<ul> +<li><strong>维护不变性</strong>:聚合根确保聚合内所有对象的一致性和不变性条件不被破坏。它负责封装与聚合相关的业务逻辑,保证聚合内的对象符合业务规则。</li> +<li><strong>管理生命周期</strong>:聚合根负责管理其内部对象的创建、修改和删除。它控制着聚合内部成员的生命周期,包括它们的创建、更新和删除。</li> +<li><strong>处理业务逻辑</strong>:聚合根负责处理与聚合相关的业务逻辑和操作,外部系统通过调用聚合根的方法来执行这些操作。它不仅是数据的容器,还负责封装与聚合相关的业务逻辑。</li> +</ul> +<p>其具有以下特性:</p> +<ul> +<li><strong>唯一入口</strong>:聚合根是聚合内部对象的唯一入口,外部系统只能与聚合根交互,而无法直接访问聚合内部的其他对象。这样可以避免外部系统直接修改聚合内的实体,确保聚合的一致性和业务逻辑的完整性。</li> +<li><strong>标识唯一性</strong>:每个聚合根都有一个全局唯一的标识符(ID),用以区分不同的聚合实例。</li> +<li><strong>事务边界</strong>:聚合根常常作为事务的边界,确保事务内的所有操作要么全部成功,要么全部失败,以此来维护数据的完整性。</li> +</ul> +<p>用 F# 来描述,以订单管理为例,大概写一下:</p> +<figure class="highlight fsharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">type</span> <span class="title class_">OrderStatus</span> <span class="operator">=</span> </span><br><span class="line"> <span class="operator">|</span> New</span><br><span class="line"> <span class="operator">|</span> Shipped</span><br><span class="line"> <span class="operator">|</span> Delivered</span><br><span class="line"> <span class="operator">|</span> Cancelled</span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> <span class="title class_">OrderItem</span> (productName<span class="operator">:</span> <span class="type">string</span>, price<span class="operator">:</span> <span class="type">float</span>, quantity<span class="operator">:</span> <span class="type">int</span>) <span class="operator">=</span> </span><br><span class="line"> <span class="keyword">do</span></span><br><span class="line"> <span class="keyword">if</span> quantity <span class="operator"><=</span> <span class="number">0</span> <span class="keyword">then</span></span><br><span class="line"> <span class="built_in">failwith</span> <span class="string">"Quantity must be positive"</span></span><br><span class="line"> </span><br><span class="line"> <span class="keyword">member</span> <span class="keyword">public</span> this.ProductName <span class="operator">=</span> productName</span><br><span class="line"> <span class="keyword">member</span> <span class="keyword">public</span> this.Price <span class="operator">=</span> price</span><br><span class="line"> <span class="keyword">member</span> <span class="keyword">public</span> this.Quantity <span class="operator">=</span> quantity</span><br><span class="line"> <span class="keyword">member</span> <span class="keyword">public</span> this.TotalPrice () <span class="operator">=</span> price <span class="operator">*</span> quantity</span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> <span class="title class_">Order</span> (<span class="built_in">id</span><span class="operator">:</span> <span class="type">int</span>, customerName<span class="operator">:</span> <span class="type">string</span>) <span class="operator">=</span> </span><br><span class="line"> <span class="keyword">let</span> <span class="keyword">mutable</span> status <span class="operator">=</span> OrderStatus.New</span><br><span class="line"> <span class="keyword">let</span> <span class="keyword">mutable</span> orderItems <span class="operator">=</span> []</span><br><span class="line"></span><br><span class="line"> <span class="keyword">member</span> <span class="keyword">public</span> this.Id <span class="operator">=</span> <span class="built_in">id</span></span><br><span class="line"> <span class="keyword">member</span> <span class="keyword">public</span> this.CustomerName <span class="operator">=</span> customerName</span><br><span class="line"> <span class="keyword">member</span> <span class="keyword">public</span> this.Status <span class="operator">=</span> status</span><br><span class="line"> <span class="keyword">member</span> <span class="keyword">public</span> this.OrderItems <span class="operator">=</span> orderItems</span><br><span class="line"></span><br><span class="line"> <span class="keyword">member</span> <span class="keyword">public</span> this.AddItem (item<span class="operator">:</span> OrderItem, price<span class="operator">:</span> <span class="type">float</span>, quantity<span class="operator">:</span> <span class="type">int</span>) <span class="operator">=</span></span><br><span class="line"> <span class="keyword">if</span> quantity <span class="operator"><=</span> <span class="number">0</span> <span class="keyword">then</span></span><br><span class="line"> <span class="built_in">failwith</span> <span class="string">"Quantity must be positive"</span></span><br><span class="line"> </span><br><span class="line"> orderItems <span class="operator"><-</span> orderItems <span class="operator">@</span> [OrderItem(item.ProductName, price, quantity)]</span><br><span class="line"></span><br><span class="line"> <span class="keyword">member</span> <span class="keyword">public</span> this.ChangeStatus (status<span class="operator">:</span> OrderStatus) <span class="operator">=</span></span><br><span class="line"> this.Status <span class="operator"><-</span> status</span><br><span class="line"></span><br><span class="line"> <span class="keyword">member</span> <span class="keyword">public</span> this.TotalPrice () <span class="operator">=</span></span><br><span class="line"> orderItems <span class="operator">|></span> List.sumBy (<span class="keyword">fun</span> item <span class="operator">-></span> item.TotalPrice())</span><br><span class="line"></span><br><span class="line"> <span class="keyword">member</span> <span class="keyword">public</span> this.GetTotalPrice () <span class="operator">=</span></span><br><span class="line"> orderItems <span class="operator">|></span> List.sumBy (<span class="keyword">fun</span> item <span class="operator">-></span> item.TotalPrice())</span><br></pre></td></tr></table></figure> + +<p>在这个例子中,<code>Order</code> 是聚合根,它通过 <code>AddItem</code> 方法来添加订单项,保证每个订单项符合业务规则。同时,聚合根 <code>Order</code> 还负责订单状态的管理,例如通过 <code>ChangeStatus</code> 方法来更新订单状态。<code>OrderItem</code> 是聚合内的一个实体,表示订单项,它通过 <code>GetTotalPrice</code> 方法来计算每个订单项的总价。外部系统只能通过 <code>Order</code> 聚合根来访问和操作订单项,而不能直接访问或修改 <code>OrderItem</code></p> + +</div> + +<script> + window.onload = detectors(); +</script> + <div class="post-footer"> + <div class="h-line-primary"></div> + <nav class="post-nav"> + <div class="prev-item"> + + </div> + <div class="next-item"> + + <div class="icon arrow-right"></div> + <div class="post-link"> + <a href="/2025/02/24/%E4%BA%8C%E3%80%87%E4%BA%8C%E4%BA%94%E5%B9%B4%E4%BA%8C%E6%9C%88%E4%BA%8C%E5%8D%81%E5%9B%9B%E6%97%A5/">Next</a> + </div> + + </div> + </nav> +</div> + + + <div class="post-comment"> + + + + + + + +</div> + + +</article> + </div> + </div> + + <div class="footer"> + <div class="flex-container"> + <div class="footer-text"> + + + | + + + 希望路过的人可以添点柴火让这里暖和点 + + </div> + </div> +</div> + + </div> + + + <div class="search-popup"> + <div class="search-popup-overlay"> + </div> + <div class="search-popup-window" > + <div class="search-header"> + <div class="search-input-container"> + <input autocomplete="off" autocapitalize="off" maxlength="80" + placeholder="Search Anything" spellcheck="false" + type="search" class="search-input"> + </div> + <div class="search-close-btn"> + <div class="icon close-btn"></div> + </div> + </div> + <div class="search-result-container"> + </div> + </div> +</div> + +<script> + const searchConfig = { + path : "/search.xml", + top_n_per_article: "1", + unescape : "false", + trigger: "auto", + preload: "false" + } +</script> +<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/search.js"></script> +<script src="/js/search.js"></script> + + + + </body> +</html> diff --git a/archives/2023/05/index.html b/archives/2023/05/index.html index 2d36321b..a13ffb6d 100644 --- a/archives/2023/05/index.html +++ b/archives/2023/05/index.html @@ -162,60 +162,6 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/05/12/C-20-%E5%AE%9E%E7%8E%B0-string-split/"> - - C++ 20 实现 string split - - </a> - </div> - - <span class="post-date">May 12, 2023</span> - </div> - - - - - - - - <div class="post-list-item"> - <div class="post-title"> - <a href="/2023/05/11/C-vector-%E7%9A%84-push-back-%E5%92%8C-emplace-back/"> - - C++ vector 的 push_back 和 emplace_back - - </a> - </div> - - <span class="post-date">May 11, 2023</span> - </div> - - - - - - - - <div class="post-list-item"> - <div class="post-title"> - <a href="/2023/05/04/C-%E7%9A%84-Trait/"> - - C++ 的 Trait - - </a> - </div> - - <span class="post-date">May 4, 2023</span> - </div> - - - - - - - - <div class="post-list-item"> - <div class="post-title"> <a href="/2023/05/03/Rust-NewType-%E6%A8%A1%E5%BC%8F/"> Rust NewType 模式 diff --git a/archives/2023/page/4/index.html b/archives/2023/page/4/index.html index 36b373f3..60016689 100644 --- a/archives/2023/page/4/index.html +++ b/archives/2023/page/4/index.html @@ -162,14 +162,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/05/12/C-20-%E5%AE%9E%E7%8E%B0-string-split/"> + <a href="/2023/05/03/Rust-NewType-%E6%A8%A1%E5%BC%8F/"> - C++ 20 实现 string split + Rust NewType 模式 </a> </div> - <span class="post-date">May 12, 2023</span> + <span class="post-date">May 3, 2023</span> </div> @@ -180,14 +180,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/05/11/C-vector-%E7%9A%84-push-back-%E5%92%8C-emplace-back/"> + <a href="/2023/05/02/Rust-Partial-%E8%AF%AD%E4%B9%89/"> - C++ vector 的 push_back 和 emplace_back + Rust Partial 语义 </a> </div> - <span class="post-date">May 11, 2023</span> + <span class="post-date">May 2, 2023</span> </div> @@ -198,14 +198,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/05/04/C-%E7%9A%84-Trait/"> + <a href="/2023/05/01/Rust-%E8%99%9A%E8%A1%A8%E5%B8%83%E5%B1%80%E8%A7%84%E5%88%99%E4%BB%8B%E7%BB%8D/"> - C++ 的 Trait + Rust 虚表布局规则介绍 </a> </div> - <span class="post-date">May 4, 2023</span> + <span class="post-date">May 1, 2023</span> </div> @@ -216,14 +216,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/05/03/Rust-NewType-%E6%A8%A1%E5%BC%8F/"> + <a href="/2023/04/30/TypeScript-With-Rust-Errors-No-Try-Catch-Heresy/"> - Rust NewType 模式 + TypeScript With Rust Errors, No Try Catch, Heresy </a> </div> - <span class="post-date">May 3, 2023</span> + <span class="post-date">Apr 30, 2023</span> </div> @@ -234,14 +234,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/05/02/Rust-Partial-%E8%AF%AD%E4%B9%89/"> + <a href="/2023/04/25/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%B8%89%E5%B9%B4%E5%9B%9B%E6%9C%88%E4%BA%8C%E5%8D%81%E4%BA%94%E6%97%A5/"> - Rust Partial 语义 + 二零二三年四月二十五日 </a> </div> - <span class="post-date">May 2, 2023</span> + <span class="post-date">Apr 25, 2023</span> </div> @@ -252,14 +252,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/05/01/Rust-%E8%99%9A%E8%A1%A8%E5%B8%83%E5%B1%80%E8%A7%84%E5%88%99%E4%BB%8B%E7%BB%8D/"> + <a href="/2023/04/22/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%B8%89%E5%B9%B4%E5%9B%9B%E6%9C%88%E4%BA%8C%E5%8D%81%E4%BA%8C%E6%97%A5/"> - Rust 虚表布局规则介绍 + 二零二三年四月二十二日 </a> </div> - <span class="post-date">May 1, 2023</span> + <span class="post-date">Apr 22, 2023</span> </div> @@ -270,14 +270,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/04/30/TypeScript-With-Rust-Errors-No-Try-Catch-Heresy/"> + <a href="/2023/03/14/%E8%9E%BA%E5%86%85%E9%85%AF%E7%89%87/"> - TypeScript With Rust Errors, No Try Catch, Heresy + 螺内酯片 </a> </div> - <span class="post-date">Apr 30, 2023</span> + <span class="post-date">Mar 14, 2023</span> </div> @@ -288,14 +288,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/04/25/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%B8%89%E5%B9%B4%E5%9B%9B%E6%9C%88%E4%BA%8C%E5%8D%81%E4%BA%94%E6%97%A5/"> + <a href="/2023/03/14/%E5%91%8B%E5%A1%9E%E7%B1%B3/"> - 二零二三年四月二十五日 + 呋塞米 </a> </div> - <span class="post-date">Apr 25, 2023</span> + <span class="post-date">Mar 14, 2023</span> </div> @@ -306,14 +306,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/04/22/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%B8%89%E5%B9%B4%E5%9B%9B%E6%9C%88%E4%BA%8C%E5%8D%81%E4%BA%8C%E6%97%A5/"> + <a href="/2023/03/13/%E6%9B%BF%E7%B1%B3%E6%B2%99%E5%9D%A6/"> - 二零二三年四月二十二日 + 替米沙坦 </a> </div> - <span class="post-date">Apr 22, 2023</span> + <span class="post-date">Mar 13, 2023</span> </div> diff --git a/archives/2023/page/5/index.html b/archives/2023/page/5/index.html index 13d38e47..26d740d2 100644 --- a/archives/2023/page/5/index.html +++ b/archives/2023/page/5/index.html @@ -144,14 +144,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/03/14/%E8%9E%BA%E5%86%85%E9%85%AF%E7%89%87/"> + <a href="/2023/03/05/%E5%A5%A5%E5%8F%B8%E4%BB%96%E9%9F%A6/"> - 螺内酯片 + 奥司他韦 </a> </div> - <span class="post-date">Mar 14, 2023</span> + <span class="post-date">Mar 5, 2023</span> </div> @@ -162,14 +162,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/03/14/%E5%91%8B%E5%A1%9E%E7%B1%B3/"> + <a href="/2023/03/04/%E9%87%91%E5%8C%AE%E8%A6%81%E7%95%A5/"> - 呋塞米 + 金匮要略 </a> </div> - <span class="post-date">Mar 14, 2023</span> + <span class="post-date">Mar 4, 2023</span> </div> @@ -180,14 +180,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/03/13/%E6%9B%BF%E7%B1%B3%E6%B2%99%E5%9D%A6/"> + <a href="/2023/03/01/%E6%B0%94%E8%83%B8/"> - 替米沙坦 + 气胸 </a> </div> - <span class="post-date">Mar 13, 2023</span> + <span class="post-date">Mar 1, 2023</span> </div> @@ -198,14 +198,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/03/05/%E5%A5%A5%E5%8F%B8%E4%BB%96%E9%9F%A6/"> + <a href="/2023/03/01/%E7%BA%AF%E7%89%9B%E5%A5%B6%E5%8F%AF%E4%BB%A5%E5%8A%A0%E7%82%B9%E5%95%A5/"> - 奥司他韦 + 纯牛奶可以加点啥 </a> </div> - <span class="post-date">Mar 5, 2023</span> + <span class="post-date">Mar 1, 2023</span> </div> @@ -216,14 +216,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/03/04/%E9%87%91%E5%8C%AE%E8%A6%81%E7%95%A5/"> + <a href="/2023/02/26/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%B8%89%E5%B9%B4%E4%BA%8C%E6%9C%88%E4%BA%8C%E5%8D%81%E5%85%AD%E6%97%A5/"> - 金匮要略 + 二零二三年二月二十六日 </a> </div> - <span class="post-date">Mar 4, 2023</span> + <span class="post-date">Feb 26, 2023</span> </div> @@ -234,14 +234,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/03/01/%E6%B0%94%E8%83%B8/"> + <a href="/2023/02/25/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%B8%89%E5%B9%B4%E4%BA%8C%E6%9C%88%E4%BA%8C%E5%8D%81%E4%BA%94%E6%97%A5/"> - 气胸 + 二零二三年二月二十五日 </a> </div> - <span class="post-date">Mar 1, 2023</span> + <span class="post-date">Feb 25, 2023</span> </div> @@ -252,14 +252,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/03/01/%E7%BA%AF%E7%89%9B%E5%A5%B6%E5%8F%AF%E4%BB%A5%E5%8A%A0%E7%82%B9%E5%95%A5/"> + <a href="/2023/02/24/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%B8%89%E5%B9%B4%E4%BA%8C%E6%9C%88%E4%BA%8C%E5%8D%81%E5%9B%9B%E6%97%A5/"> - 纯牛奶可以加点啥 + 二零二三年二月二十四日 </a> </div> - <span class="post-date">Mar 1, 2023</span> + <span class="post-date">Feb 24, 2023</span> </div> @@ -270,14 +270,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/02/26/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%B8%89%E5%B9%B4%E4%BA%8C%E6%9C%88%E4%BA%8C%E5%8D%81%E5%85%AD%E6%97%A5/"> + <a href="/2023/02/22/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%B8%89%E5%B9%B4%E4%BA%8C%E6%9C%88%E4%BA%8C%E5%8D%81%E4%BA%8C%E6%97%A5/"> - 二零二三年二月二十六日 + 二零二三年二月二十二日 </a> </div> - <span class="post-date">Feb 26, 2023</span> + <span class="post-date">Feb 22, 2023</span> </div> @@ -288,14 +288,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/02/25/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%B8%89%E5%B9%B4%E4%BA%8C%E6%9C%88%E4%BA%8C%E5%8D%81%E4%BA%94%E6%97%A5/"> + <a href="/2023/02/02/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%B8%89%E5%B9%B4%E4%BA%8C%E6%9C%88%E4%BA%8C%E6%97%A5/"> - 二零二三年二月二十五日 + 二零二三年二月二日 </a> </div> - <span class="post-date">Feb 25, 2023</span> + <span class="post-date">Feb 2, 2023</span> </div> @@ -306,14 +306,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/02/24/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%B8%89%E5%B9%B4%E4%BA%8C%E6%9C%88%E4%BA%8C%E5%8D%81%E5%9B%9B%E6%97%A5/"> + <a href="/2023/02/01/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%B8%89%E5%B9%B4%E4%BA%8C%E6%9C%88%E4%B8%80%E6%97%A5/"> - 二零二三年二月二十四日 + 二零二三年二月一日 </a> </div> - <span class="post-date">Feb 24, 2023</span> + <span class="post-date">Feb 1, 2023</span> </div> diff --git a/archives/2023/page/6/index.html b/archives/2023/page/6/index.html index 444c7d2d..c8749d74 100644 --- a/archives/2023/page/6/index.html +++ b/archives/2023/page/6/index.html @@ -144,60 +144,6 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/02/22/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%B8%89%E5%B9%B4%E4%BA%8C%E6%9C%88%E4%BA%8C%E5%8D%81%E4%BA%8C%E6%97%A5/"> - - 二零二三年二月二十二日 - - </a> - </div> - - <span class="post-date">Feb 22, 2023</span> - </div> - - - - - - - - <div class="post-list-item"> - <div class="post-title"> - <a href="/2023/02/02/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%B8%89%E5%B9%B4%E4%BA%8C%E6%9C%88%E4%BA%8C%E6%97%A5/"> - - 二零二三年二月二日 - - </a> - </div> - - <span class="post-date">Feb 2, 2023</span> - </div> - - - - - - - - <div class="post-list-item"> - <div class="post-title"> - <a href="/2023/02/01/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%B8%89%E5%B9%B4%E4%BA%8C%E6%9C%88%E4%B8%80%E6%97%A5/"> - - 二零二三年二月一日 - - </a> - </div> - - <span class="post-date">Feb 1, 2023</span> - </div> - - - - - - - - <div class="post-list-item"> - <div class="post-title"> <a href="/2023/01/21/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%B8%89%E5%B9%B4%E4%B8%80%E6%9C%88%E4%BA%8C%E5%8D%81%E4%B8%80%E6%97%A5/"> 二零二三年一月二十一日 diff --git a/archives/2025/02/index.html b/archives/2025/02/index.html index 0a635529..7d2b2ba3 100644 --- a/archives/2025/02/index.html +++ b/archives/2025/02/index.html @@ -191,6 +191,42 @@ </div> + + + + + + <div class="post-list-item"> + <div class="post-title"> + <a href="/2025/02/11/%E4%BB%8E%E4%BA%8B%E4%BB%B6%E9%A3%8E%E6%9A%B4%E7%9C%8B%E9%A2%86%E5%9F%9F%E9%A9%B1%E5%8A%A8%E8%AE%BE%E8%AE%A1/"> + + 从事件风暴看领域驱动设计 + + </a> + </div> + + <span class="post-date">Feb 11, 2025</span> + </div> + + + + + + + + <div class="post-list-item"> + <div class="post-title"> + <a href="/2025/02/10/%E5%AE%9E%E6%97%B6%E6%90%9C%E7%B4%A2%E4%B8%AD%E7%9A%84%E9%98%B2%E6%8A%96%E5%87%BD%E6%95%B0/"> + + 实时搜索中的防抖函数 + + </a> + </div> + + <span class="post-date">Feb 10, 2025</span> + </div> + + <div id="paginator"> </div> diff --git a/tags/C/index.html b/archives/2025/03/index.html index 87508ce8..2a32551b 100644 --- a/tags/C/index.html +++ b/archives/2025/03/index.html @@ -20,7 +20,7 @@ -<title>Tag: C++ | 暮秋小屋</title> +<title>Archive: 2025/3 | 暮秋小屋</title> @@ -132,69 +132,26 @@ <div class="main"> <div class="flex-container"> - <div id="tag"> - - - <p class="tag-title"> - / <a href="/tag/">tags</a> - / <a href="">C++</a> / - </p> - <div class="post-list"> + <div class="post-list"> - <div class="year-title">2023</div> + <div class="year-title">2025</div> <div class="post-list-item"> <div class="post-title"> - <a href="/2023/05/12/C-20-%E5%AE%9E%E7%8E%B0-string-split/"> + <a href="/2025/03/13/%E9%A2%86%E5%9F%9F%E9%A9%B1%E5%8A%A8%E8%AE%BE%E8%AE%A1%E4%B8%AD%E7%9A%84%E2%80%9C%E8%81%9A%E5%90%88%E6%A0%B9%E2%80%9D/"> - C++ 20 实现 string split + 领域驱动设计中的“聚合根” </a> </div> - <span class="post-date">May 12, 2023</span> - </div> - - - - - - - - <div class="post-list-item"> - <div class="post-title"> - <a href="/2023/05/11/C-vector-%E7%9A%84-push-back-%E5%92%8C-emplace-back/"> - - C++ vector 的 push_back 和 emplace_back - - </a> - </div> - - <span class="post-date">May 11, 2023</span> - </div> - - - - - - - - <div class="post-list-item"> - <div class="post-title"> - <a href="/2023/05/04/C-%E7%9A%84-Trait/"> - - C++ 的 Trait - - </a> - </div> - - <span class="post-date">May 4, 2023</span> + <span class="post-date">Mar 13, 2025</span> </div> @@ -203,10 +160,6 @@ </div> </div> - - - -</div> </div> </div> diff --git a/archives/2025/index.html b/archives/2025/index.html index 6ab9fbd5..52ec4abd 100644 --- a/archives/2025/index.html +++ b/archives/2025/index.html @@ -144,6 +144,24 @@ <div class="post-list-item"> <div class="post-title"> + <a href="/2025/03/13/%E9%A2%86%E5%9F%9F%E9%A9%B1%E5%8A%A8%E8%AE%BE%E8%AE%A1%E4%B8%AD%E7%9A%84%E2%80%9C%E8%81%9A%E5%90%88%E6%A0%B9%E2%80%9D/"> + + 领域驱动设计中的“聚合根” + + </a> + </div> + + <span class="post-date">Mar 13, 2025</span> + </div> + + + + + + + + <div class="post-list-item"> + <div class="post-title"> <a href="/2025/02/24/%E4%BA%8C%E3%80%87%E4%BA%8C%E4%BA%94%E5%B9%B4%E4%BA%8C%E6%9C%88%E4%BA%8C%E5%8D%81%E5%9B%9B%E6%97%A5/"> 二〇二五年二月二十四日 @@ -198,6 +216,42 @@ <div class="post-list-item"> <div class="post-title"> + <a href="/2025/02/11/%E4%BB%8E%E4%BA%8B%E4%BB%B6%E9%A3%8E%E6%9A%B4%E7%9C%8B%E9%A2%86%E5%9F%9F%E9%A9%B1%E5%8A%A8%E8%AE%BE%E8%AE%A1/"> + + 从事件风暴看领域驱动设计 + + </a> + </div> + + <span class="post-date">Feb 11, 2025</span> + </div> + + + + + + + + <div class="post-list-item"> + <div class="post-title"> + <a href="/2025/02/10/%E5%AE%9E%E6%97%B6%E6%90%9C%E7%B4%A2%E4%B8%AD%E7%9A%84%E9%98%B2%E6%8A%96%E5%87%BD%E6%95%B0/"> + + 实时搜索中的防抖函数 + + </a> + </div> + + <span class="post-date">Feb 10, 2025</span> + </div> + + + + + + + + <div class="post-list-item"> + <div class="post-title"> <a href="/2025/01/19/%E8%BA%AB%E4%BD%93%E5%BE%80%E5%89%8D%E5%80%BE%EF%BC%8C%E7%81%B5%E9%AD%82%E5%90%91%E5%90%8E%E6%91%87/"> 身体往前倾,灵魂向后摇 diff --git a/archives/index.html b/archives/index.html index 85f7beae..6af51419 100644 --- a/archives/index.html +++ b/archives/index.html @@ -144,14 +144,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2025/02/24/%E4%BA%8C%E3%80%87%E4%BA%8C%E4%BA%94%E5%B9%B4%E4%BA%8C%E6%9C%88%E4%BA%8C%E5%8D%81%E5%9B%9B%E6%97%A5/"> + <a href="/2025/03/13/%E9%A2%86%E5%9F%9F%E9%A9%B1%E5%8A%A8%E8%AE%BE%E8%AE%A1%E4%B8%AD%E7%9A%84%E2%80%9C%E8%81%9A%E5%90%88%E6%A0%B9%E2%80%9D/"> - 二〇二五年二月二十四日 + 领域驱动设计中的“聚合根” </a> </div> - <span class="post-date">Feb 24, 2025</span> + <span class="post-date">Mar 13, 2025</span> </div> @@ -162,14 +162,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2025/02/19/Repository-pattern-in-Typescript/"> + <a href="/2025/02/24/%E4%BA%8C%E3%80%87%E4%BA%8C%E4%BA%94%E5%B9%B4%E4%BA%8C%E6%9C%88%E4%BA%8C%E5%8D%81%E5%9B%9B%E6%97%A5/"> - Repository pattern in Typescript + 二〇二五年二月二十四日 </a> </div> - <span class="post-date">Feb 19, 2025</span> + <span class="post-date">Feb 24, 2025</span> </div> @@ -180,14 +180,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2025/02/18/Prisma-%E5%85%B3%E7%B3%BB%E5%9E%8B%E6%95%B0%E6%8D%AE%E5%BA%93%E7%9A%84-Self-relations/"> + <a href="/2025/02/19/Repository-pattern-in-Typescript/"> - Prisma 关系型数据库的 Self-relations + Repository pattern in Typescript </a> </div> - <span class="post-date">Feb 18, 2025</span> + <span class="post-date">Feb 19, 2025</span> </div> @@ -198,14 +198,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2025/01/19/%E8%BA%AB%E4%BD%93%E5%BE%80%E5%89%8D%E5%80%BE%EF%BC%8C%E7%81%B5%E9%AD%82%E5%90%91%E5%90%8E%E6%91%87/"> + <a href="/2025/02/18/Prisma-%E5%85%B3%E7%B3%BB%E5%9E%8B%E6%95%B0%E6%8D%AE%E5%BA%93%E7%9A%84-Self-relations/"> - 身体往前倾,灵魂向后摇 + Prisma 关系型数据库的 Self-relations </a> </div> - <span class="post-date">Jan 19, 2025</span> + <span class="post-date">Feb 18, 2025</span> </div> @@ -213,19 +213,17 @@ - <div class="year-title">2024</div> - <div class="post-list-item"> <div class="post-title"> - <a href="/2024/12/18/%E4%BA%8C%E3%80%87%E4%BA%8C%E5%9B%9B%E5%B9%B4%E5%8D%81%E4%BA%8C%E6%9C%88%E5%8D%81%E5%85%AB%E6%97%A5/"> + <a href="/2025/02/11/%E4%BB%8E%E4%BA%8B%E4%BB%B6%E9%A3%8E%E6%9A%B4%E7%9C%8B%E9%A2%86%E5%9F%9F%E9%A9%B1%E5%8A%A8%E8%AE%BE%E8%AE%A1/"> - 二〇二四年十二月十八日 + 从事件风暴看领域驱动设计 </a> </div> - <span class="post-date">Dec 18, 2024</span> + <span class="post-date">Feb 11, 2025</span> </div> @@ -236,14 +234,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/12/15/OCaml-News-2024-7/"> + <a href="/2025/02/10/%E5%AE%9E%E6%97%B6%E6%90%9C%E7%B4%A2%E4%B8%AD%E7%9A%84%E9%98%B2%E6%8A%96%E5%87%BD%E6%95%B0/"> - OCaml News 2024-7 + 实时搜索中的防抖函数 </a> </div> - <span class="post-date">Dec 15, 2024</span> + <span class="post-date">Feb 10, 2025</span> </div> @@ -254,14 +252,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/11/26/%E5%A6%82%E4%BD%95%E7%AE%A1%E7%90%86%E7%94%A8%E6%88%B7%E7%95%8C%E9%9D%A2%E4%B8%AD%E7%9A%84%E5%8D%B1%E9%99%A9%E6%93%8D%E4%BD%9C/"> + <a href="/2025/01/19/%E8%BA%AB%E4%BD%93%E5%BE%80%E5%89%8D%E5%80%BE%EF%BC%8C%E7%81%B5%E9%AD%82%E5%90%91%E5%90%8E%E6%91%87/"> - 如何管理用户界面中的危险操作 + 身体往前倾,灵魂向后摇 </a> </div> - <span class="post-date">Nov 26, 2024</span> + <span class="post-date">Jan 19, 2025</span> </div> @@ -269,17 +267,19 @@ + <div class="year-title">2024</div> + <div class="post-list-item"> <div class="post-title"> - <a href="/2024/11/17/%E4%BA%8C%E3%80%87%E4%BA%8C%E5%9B%9B%E5%B9%B4%E5%8D%81%E4%B8%80%E6%9C%88%E5%8D%81%E4%B8%83%E6%97%A5/"> + <a href="/2024/12/18/%E4%BA%8C%E3%80%87%E4%BA%8C%E5%9B%9B%E5%B9%B4%E5%8D%81%E4%BA%8C%E6%9C%88%E5%8D%81%E5%85%AB%E6%97%A5/"> - 二〇二四年十一月十七日 + 二〇二四年十二月十八日 </a> </div> - <span class="post-date">Nov 17, 2024</span> + <span class="post-date">Dec 18, 2024</span> </div> @@ -290,14 +290,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/11/15/%E8%A5%BF%E6%9F%9A%E5%AF%B9%E8%8D%AF%E7%89%A9%E7%9A%84%E5%BD%B1%E5%93%8D/"> + <a href="/2024/12/15/OCaml-News-2024-7/"> - 西柚对药物的影响 + OCaml News 2024-7 </a> </div> - <span class="post-date">Nov 15, 2024</span> + <span class="post-date">Dec 15, 2024</span> </div> @@ -308,14 +308,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/10/18/10-Tips-for-Productive-FSharp-Scripting/"> + <a href="/2024/11/26/%E5%A6%82%E4%BD%95%E7%AE%A1%E7%90%86%E7%94%A8%E6%88%B7%E7%95%8C%E9%9D%A2%E4%B8%AD%E7%9A%84%E5%8D%B1%E9%99%A9%E6%93%8D%E4%BD%9C/"> - 10 Tips for Productive FSharp Scripting + 如何管理用户界面中的危险操作 </a> </div> - <span class="post-date">Oct 18, 2024</span> + <span class="post-date">Nov 26, 2024</span> </div> diff --git a/archives/page/2/index.html b/archives/page/2/index.html index f6dff10a..9ea96ed8 100644 --- a/archives/page/2/index.html +++ b/archives/page/2/index.html @@ -144,14 +144,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/10/18/Building-custom-fibers-library-in-FSharp/"> + <a href="/2024/11/17/%E4%BA%8C%E3%80%87%E4%BA%8C%E5%9B%9B%E5%B9%B4%E5%8D%81%E4%B8%80%E6%9C%88%E5%8D%81%E4%B8%83%E6%97%A5/"> - Building custom fibers library in FSharp + 二〇二四年十一月十七日 </a> </div> - <span class="post-date">Oct 18, 2024</span> + <span class="post-date">Nov 17, 2024</span> </div> @@ -162,14 +162,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/10/18/Dealing-with-complex-dependency-injection-in-FSharp/"> + <a href="/2024/11/15/%E8%A5%BF%E6%9F%9A%E5%AF%B9%E8%8D%AF%E7%89%A9%E7%9A%84%E5%BD%B1%E5%93%8D/"> - Dealing with complex dependency injection in FSharp + 西柚对药物的影响 </a> </div> - <span class="post-date">Oct 18, 2024</span> + <span class="post-date">Nov 15, 2024</span> </div> @@ -180,14 +180,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/10/06/Obsidian-Vault-%E7%9A%84-obsidian-%E7%9B%AE%E5%BD%95%E4%B8%AD%E7%9A%84%E5%90%84%E6%96%87%E4%BB%B6%E4%BD%9C%E7%94%A8/"> + <a href="/2024/10/18/10-Tips-for-Productive-FSharp-Scripting/"> - Obsidian Vault 的 .obsidian 目录中的各文件作用 + 10 Tips for Productive FSharp Scripting </a> </div> - <span class="post-date">Oct 6, 2024</span> + <span class="post-date">Oct 18, 2024</span> </div> @@ -198,14 +198,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/09/27/Turborepo-%E7%AE%80%E8%BF%B0/"> + <a href="/2024/10/18/Building-custom-fibers-library-in-FSharp/"> - Turborepo 简述 + Building custom fibers library in FSharp </a> </div> - <span class="post-date">Sep 27, 2024</span> + <span class="post-date">Oct 18, 2024</span> </div> @@ -216,14 +216,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/09/15/%E8%82%A9%E5%91%A8%E7%82%8E%E5%92%8C%E8%82%A9%E8%A2%96%E6%8D%9F%E4%BC%A4%E7%9A%84%E5%8C%BA%E5%88%AB/"> + <a href="/2024/10/18/Dealing-with-complex-dependency-injection-in-FSharp/"> - 肩周炎和肩袖损伤的区别 + Dealing with complex dependency injection in FSharp </a> </div> - <span class="post-date">Sep 15, 2024</span> + <span class="post-date">Oct 18, 2024</span> </div> @@ -234,14 +234,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/09/15/Advanced-C-binding-using-ocaml-ctypes-and-dune/"> + <a href="/2024/10/06/Obsidian-Vault-%E7%9A%84-obsidian-%E7%9B%AE%E5%BD%95%E4%B8%AD%E7%9A%84%E5%90%84%E6%96%87%E4%BB%B6%E4%BD%9C%E7%94%A8/"> - Advanced C binding using ocaml-ctypes and dune + Obsidian Vault 的 .obsidian 目录中的各文件作用 </a> </div> - <span class="post-date">Sep 15, 2024</span> + <span class="post-date">Oct 6, 2024</span> </div> @@ -252,14 +252,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/09/12/Functional-Reactive-Programming-in-F/"> + <a href="/2024/09/27/Turborepo-%E7%AE%80%E8%BF%B0/"> - Functional Reactive Programming in F# + Turborepo 简述 </a> </div> - <span class="post-date">Sep 12, 2024</span> + <span class="post-date">Sep 27, 2024</span> </div> @@ -270,14 +270,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/09/12/%E4%BA%8C%E3%80%87%E4%BA%8C%E5%9B%9B%E5%B9%B4%E4%B9%9D%E6%9C%88%E5%8D%81%E4%BA%8C%E6%97%A5/"> + <a href="/2024/09/15/%E8%82%A9%E5%91%A8%E7%82%8E%E5%92%8C%E8%82%A9%E8%A2%96%E6%8D%9F%E4%BC%A4%E7%9A%84%E5%8C%BA%E5%88%AB/"> - 二〇二四年九月十二日 + 肩周炎和肩袖损伤的区别 </a> </div> - <span class="post-date">Sep 12, 2024</span> + <span class="post-date">Sep 15, 2024</span> </div> @@ -288,14 +288,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/09/08/%E4%B8%AD%E8%80%81%E5%B9%B4%E4%BA%BA%E6%B2%89%E8%BF%B7%E6%89%8B%E6%9C%BA%E7%9A%84%E9%97%AE%E9%A2%98/"> + <a href="/2024/09/15/Advanced-C-binding-using-ocaml-ctypes-and-dune/"> - 中老年人沉迷手机的问题 + Advanced C binding using ocaml-ctypes and dune </a> </div> - <span class="post-date">Sep 8, 2024</span> + <span class="post-date">Sep 15, 2024</span> </div> @@ -306,14 +306,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/09/07/%E7%BB%99%E5%AD%A9%E5%AD%90%E4%BB%AC%E7%9A%84%E8%AF%9D/"> + <a href="/2024/09/12/Functional-Reactive-Programming-in-F/"> - 什么玩意儿都是 + Functional Reactive Programming in F# </a> </div> - <span class="post-date">Sep 7, 2024</span> + <span class="post-date">Sep 12, 2024</span> </div> diff --git a/archives/page/3/index.html b/archives/page/3/index.html index b5a251fc..ee182de9 100644 --- a/archives/page/3/index.html +++ b/archives/page/3/index.html @@ -144,14 +144,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/09/01/%E4%BA%8C%E3%80%87%E4%BA%8C%E5%9B%9B%E5%B9%B4%E4%B9%9D%E6%9C%88%E4%B8%80%E6%97%A5/"> + <a href="/2024/09/12/%E4%BA%8C%E3%80%87%E4%BA%8C%E5%9B%9B%E5%B9%B4%E4%B9%9D%E6%9C%88%E5%8D%81%E4%BA%8C%E6%97%A5/"> - 二〇二四年九月一日 + 二〇二四年九月十二日 </a> </div> - <span class="post-date">Sep 1, 2024</span> + <span class="post-date">Sep 12, 2024</span> </div> @@ -162,14 +162,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/09/01/%E8%97%BF%E9%A6%99%E6%AD%A3%E6%B0%94%E6%B0%B4%E5%92%8C%E8%97%BF%E9%A6%99%E6%AD%A3%E6%B0%94%E5%8F%A3%E6%9C%8D%E6%B6%B2%E7%9A%84%E5%8C%BA%E5%88%AB/"> + <a href="/2024/09/08/%E4%B8%AD%E8%80%81%E5%B9%B4%E4%BA%BA%E6%B2%89%E8%BF%B7%E6%89%8B%E6%9C%BA%E7%9A%84%E9%97%AE%E9%A2%98/"> - 藿香正气水和藿香正气口服液的区别 + 中老年人沉迷手机的问题 </a> </div> - <span class="post-date">Sep 1, 2024</span> + <span class="post-date">Sep 8, 2024</span> </div> @@ -180,14 +180,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/08/12/%E7%9B%B4%E7%B3%BB%E8%A1%80%E4%BA%B2%E4%B9%8B%E9%97%B4%E4%B8%8D%E8%83%BD%E7%9B%B4%E6%8E%A5%E8%BE%93%E8%A1%80/"> + <a href="/2024/09/07/%E7%BB%99%E5%AD%A9%E5%AD%90%E4%BB%AC%E7%9A%84%E8%AF%9D/"> - 直系血亲之间不能直接输血 + 什么玩意儿都是 </a> </div> - <span class="post-date">Aug 12, 2024</span> + <span class="post-date">Sep 7, 2024</span> </div> @@ -198,14 +198,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/08/02/%E4%BA%8C%E3%80%87%E4%BA%8C%E5%9B%9B%E5%B9%B4%E5%85%AB%E6%9C%88%E4%B8%80%E6%97%A5/"> + <a href="/2024/09/01/%E4%BA%8C%E3%80%87%E4%BA%8C%E5%9B%9B%E5%B9%B4%E4%B9%9D%E6%9C%88%E4%B8%80%E6%97%A5/"> - 二〇二四年八月一日 + 二〇二四年九月一日 </a> </div> - <span class="post-date">Aug 2, 2024</span> + <span class="post-date">Sep 1, 2024</span> </div> @@ -216,14 +216,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/07/23/OCaml-News-2024-6/"> + <a href="/2024/09/01/%E8%97%BF%E9%A6%99%E6%AD%A3%E6%B0%94%E6%B0%B4%E5%92%8C%E8%97%BF%E9%A6%99%E6%AD%A3%E6%B0%94%E5%8F%A3%E6%9C%8D%E6%B6%B2%E7%9A%84%E5%8C%BA%E5%88%AB/"> - OCaml News 2024-6 + 藿香正气水和藿香正气口服液的区别 </a> </div> - <span class="post-date">Jul 23, 2024</span> + <span class="post-date">Sep 1, 2024</span> </div> @@ -234,14 +234,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/07/09/%E7%A5%9E%E7%BB%8F%E7%B3%BB%E7%BB%9F%E9%87%8D%E7%82%B9/"> + <a href="/2024/08/12/%E7%9B%B4%E7%B3%BB%E8%A1%80%E4%BA%B2%E4%B9%8B%E9%97%B4%E4%B8%8D%E8%83%BD%E7%9B%B4%E6%8E%A5%E8%BE%93%E8%A1%80/"> - 内护神经系统重点考点 + 直系血亲之间不能直接输血 </a> </div> - <span class="post-date">Jul 9, 2024</span> + <span class="post-date">Aug 12, 2024</span> </div> @@ -252,14 +252,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/07/01/OCaml-News-2024-4/"> + <a href="/2024/08/02/%E4%BA%8C%E3%80%87%E4%BA%8C%E5%9B%9B%E5%B9%B4%E5%85%AB%E6%9C%88%E4%B8%80%E6%97%A5/"> - OCaml News 2024-4 + 二〇二四年八月一日 </a> </div> - <span class="post-date">Jul 1, 2024</span> + <span class="post-date">Aug 2, 2024</span> </div> @@ -270,14 +270,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/06/27/%E4%BA%8C%E3%80%87%E4%BA%8C%E5%9B%9B%E5%B9%B4%E5%85%AD%E6%9C%88%E4%BA%8C%E5%8D%81%E4%B8%83%E6%97%A5/"> + <a href="/2024/07/23/OCaml-News-2024-6/"> - 二〇二四年六月二十七日 + OCaml News 2024-6 </a> </div> - <span class="post-date">Jun 27, 2024</span> + <span class="post-date">Jul 23, 2024</span> </div> @@ -288,14 +288,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/06/27/OCaml-News-2024-5/"> + <a href="/2024/07/09/%E7%A5%9E%E7%BB%8F%E7%B3%BB%E7%BB%9F%E9%87%8D%E7%82%B9/"> - OCaml News 2024-5 + 内护神经系统重点考点 </a> </div> - <span class="post-date">Jun 27, 2024</span> + <span class="post-date">Jul 9, 2024</span> </div> @@ -306,14 +306,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/06/06/NET-AOT-%E4%B8%8B%E7%9A%84-F-%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%8F%82%E6%95%B0%E8%A7%A3%E6%9E%90%E5%BA%93%E9%80%89%E6%8B%A9/"> + <a href="/2024/07/01/OCaml-News-2024-4/"> - .NET AOT 下的 F# 命令行参数解析库选择 + OCaml News 2024-4 </a> </div> - <span class="post-date">Jun 6, 2024</span> + <span class="post-date">Jul 1, 2024</span> </div> diff --git a/archives/page/4/index.html b/archives/page/4/index.html index 8137f5bf..8ec07d54 100644 --- a/archives/page/4/index.html +++ b/archives/page/4/index.html @@ -144,14 +144,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/05/20/Rescript-genType-import-%E9%97%AE%E9%A2%98/"> + <a href="/2024/06/27/%E4%BA%8C%E3%80%87%E4%BA%8C%E5%9B%9B%E5%B9%B4%E5%85%AD%E6%9C%88%E4%BA%8C%E5%8D%81%E4%B8%83%E6%97%A5/"> - Rescript @genType import 问题 + 二〇二四年六月二十七日 </a> </div> - <span class="post-date">May 20, 2024</span> + <span class="post-date">Jun 27, 2024</span> </div> @@ -162,14 +162,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/05/16/%E4%BA%8C%E3%80%87%E4%BA%8C%E5%9B%9B%E5%B9%B4%E4%BA%94%E6%9C%88%E5%8D%81%E5%85%AD%E6%97%A5/"> + <a href="/2024/06/27/OCaml-News-2024-5/"> - 二〇二四年五月十六日 + OCaml News 2024-5 </a> </div> - <span class="post-date">May 16, 2024</span> + <span class="post-date">Jun 27, 2024</span> </div> @@ -180,14 +180,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/05/13/%E7%BB%99%E5%B0%B8%E4%BD%93%E4%B8%8A-ECMO-%E5%B9%B6%E7%BB%B4%E6%8C%81%E5%BF%83%E8%B7%B3/"> + <a href="/2024/06/06/NET-AOT-%E4%B8%8B%E7%9A%84-F-%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%8F%82%E6%95%B0%E8%A7%A3%E6%9E%90%E5%BA%93%E9%80%89%E6%8B%A9/"> - 给尸体上 ECMO 并维持心跳 + .NET AOT 下的 F# 命令行参数解析库选择 </a> </div> - <span class="post-date">May 13, 2024</span> + <span class="post-date">Jun 6, 2024</span> </div> @@ -198,14 +198,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/05/07/%E4%BA%8C%E3%80%87%E4%BA%8C%E5%9B%9B%E5%B9%B4%E4%BA%94%E6%9C%88%E4%B8%83%E6%97%A5/"> + <a href="/2024/05/20/Rescript-genType-import-%E9%97%AE%E9%A2%98/"> - 二〇二四年五月七日 + Rescript @genType import 问题 </a> </div> - <span class="post-date">May 7, 2024</span> + <span class="post-date">May 20, 2024</span> </div> @@ -216,14 +216,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/04/08/%E4%BA%8C%E3%80%87%E4%BA%8C%E5%9B%9B%E5%B9%B4%E5%9B%9B%E6%9C%88%E5%85%AB%E6%97%A5/"> + <a href="/2024/05/16/%E4%BA%8C%E3%80%87%E4%BA%8C%E5%9B%9B%E5%B9%B4%E4%BA%94%E6%9C%88%E5%8D%81%E5%85%AD%E6%97%A5/"> - 二〇二四年四月八日 + 二〇二四年五月十六日 </a> </div> - <span class="post-date">Apr 8, 2024</span> + <span class="post-date">May 16, 2024</span> </div> @@ -234,14 +234,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/04/03/shadow-cljs-proxy/"> + <a href="/2024/05/13/%E7%BB%99%E5%B0%B8%E4%BD%93%E4%B8%8A-ECMO-%E5%B9%B6%E7%BB%B4%E6%8C%81%E5%BF%83%E8%B7%B3/"> - shadow-cljs 怎么设置代理 + 给尸体上 ECMO 并维持心跳 </a> </div> - <span class="post-date">Apr 3, 2024</span> + <span class="post-date">May 13, 2024</span> </div> @@ -252,14 +252,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/03/22/%E4%BA%8C%E3%80%87%E4%BA%8C%E5%9B%9B%E5%B9%B4%E4%B8%89%E6%9C%88%E4%BA%8C%E5%8D%81%E4%BA%8C%E6%97%A5/"> + <a href="/2024/05/07/%E4%BA%8C%E3%80%87%E4%BA%8C%E5%9B%9B%E5%B9%B4%E4%BA%94%E6%9C%88%E4%B8%83%E6%97%A5/"> - 二〇二四年三月二十二日 + 二〇二四年五月七日 </a> </div> - <span class="post-date">Mar 22, 2024</span> + <span class="post-date">May 7, 2024</span> </div> @@ -270,14 +270,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/02/26/OCaml-News-2024-3/"> + <a href="/2024/04/08/%E4%BA%8C%E3%80%87%E4%BA%8C%E5%9B%9B%E5%B9%B4%E5%9B%9B%E6%9C%88%E5%85%AB%E6%97%A5/"> - OCaml News 2024-3 + 二〇二四年四月八日 </a> </div> - <span class="post-date">Feb 26, 2024</span> + <span class="post-date">Apr 8, 2024</span> </div> @@ -288,14 +288,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/02/07/%E4%BA%8C%E3%80%87%E4%BA%8C%E5%9B%9B%E5%B9%B4%E4%BA%8C%E6%9C%88%E4%B8%83%E6%97%A5/"> + <a href="/2024/04/03/shadow-cljs-proxy/"> - 二〇二四年二月七日 + shadow-cljs 怎么设置代理 </a> </div> - <span class="post-date">Feb 7, 2024</span> + <span class="post-date">Apr 3, 2024</span> </div> @@ -306,14 +306,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/01/25/%E6%80%A5%E8%AF%8A%E4%B8%8E%E7%81%BE%E9%9A%BE%E5%8C%BB%E5%AD%A6-%E7%83%A7%E4%BC%A4/"> + <a href="/2024/03/22/%E4%BA%8C%E3%80%87%E4%BA%8C%E5%9B%9B%E5%B9%B4%E4%B8%89%E6%9C%88%E4%BA%8C%E5%8D%81%E4%BA%8C%E6%97%A5/"> - 急诊与灾难医学--烧伤 + 二〇二四年三月二十二日 </a> </div> - <span class="post-date">Jan 25, 2024</span> + <span class="post-date">Mar 22, 2024</span> </div> diff --git a/archives/page/5/index.html b/archives/page/5/index.html index ea66ddf1..2b588a1d 100644 --- a/archives/page/5/index.html +++ b/archives/page/5/index.html @@ -144,14 +144,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/01/23/G-Machine/"> + <a href="/2024/02/26/OCaml-News-2024-3/"> - G-Machine + OCaml News 2024-3 </a> </div> - <span class="post-date">Jan 23, 2024</span> + <span class="post-date">Feb 26, 2024</span> </div> @@ -162,14 +162,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/01/23/%E6%85%A2%E6%80%A7%E8%82%BA%E6%BA%90%E6%80%A7%E5%BF%83%E8%84%8F%E7%97%85/"> + <a href="/2024/02/07/%E4%BA%8C%E3%80%87%E4%BA%8C%E5%9B%9B%E5%B9%B4%E4%BA%8C%E6%9C%88%E4%B8%83%E6%97%A5/"> - 慢性肺源性心脏病 + 二〇二四年二月七日 </a> </div> - <span class="post-date">Jan 23, 2024</span> + <span class="post-date">Feb 7, 2024</span> </div> @@ -180,14 +180,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/01/23/%E4%BA%8C%E3%80%87%E4%BA%8C%E5%9B%9B%E5%B9%B4%E4%B8%80%E6%9C%88%E4%BA%8C%E5%8D%81%E4%B8%89%E6%97%A5/"> + <a href="/2024/01/25/%E6%80%A5%E8%AF%8A%E4%B8%8E%E7%81%BE%E9%9A%BE%E5%8C%BB%E5%AD%A6-%E7%83%A7%E4%BC%A4/"> - 二〇二四年一月二十三日 + 急诊与灾难医学--烧伤 </a> </div> - <span class="post-date">Jan 23, 2024</span> + <span class="post-date">Jan 25, 2024</span> </div> @@ -198,14 +198,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/01/22/Rescript-React-Native/"> + <a href="/2024/01/23/G-Machine/"> - Rescript and React Native + G-Machine </a> </div> - <span class="post-date">Jan 22, 2024</span> + <span class="post-date">Jan 23, 2024</span> </div> @@ -216,14 +216,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/01/18/OCaml-News-2024-2/"> + <a href="/2024/01/23/%E6%85%A2%E6%80%A7%E8%82%BA%E6%BA%90%E6%80%A7%E5%BF%83%E8%84%8F%E7%97%85/"> - OCaml News 2024-2 + 慢性肺源性心脏病 </a> </div> - <span class="post-date">Jan 18, 2024</span> + <span class="post-date">Jan 23, 2024</span> </div> @@ -234,14 +234,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/01/08/OCaml-News-2024-1/"> + <a href="/2024/01/23/%E4%BA%8C%E3%80%87%E4%BA%8C%E5%9B%9B%E5%B9%B4%E4%B8%80%E6%9C%88%E4%BA%8C%E5%8D%81%E4%B8%89%E6%97%A5/"> - OCaml News 2024-1 + 二〇二四年一月二十三日 </a> </div> - <span class="post-date">Jan 8, 2024</span> + <span class="post-date">Jan 23, 2024</span> </div> @@ -249,19 +249,17 @@ - <div class="year-title">2023</div> - <div class="post-list-item"> <div class="post-title"> - <a href="/2023/12/02/%E4%BA%8C%E3%80%87%E4%BA%8C%E4%B8%89%E5%B9%B4%E5%8D%81%E4%BA%8C%E6%9C%88%E4%BA%8C%E6%97%A5/"> + <a href="/2024/01/22/Rescript-React-Native/"> - 二〇二三年十二月二日 + Rescript and React Native </a> </div> - <span class="post-date">Dec 2, 2023</span> + <span class="post-date">Jan 22, 2024</span> </div> @@ -272,14 +270,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/12/01/%E4%BA%8C%E3%80%87%E4%BA%8C%E4%B8%89%E5%B9%B4%E5%8D%81%E4%BA%8C%E6%9C%88%E4%B8%80%E6%97%A5/"> + <a href="/2024/01/18/OCaml-News-2024-2/"> - 二〇二三年十二月一日 + OCaml News 2024-2 </a> </div> - <span class="post-date">Dec 1, 2023</span> + <span class="post-date">Jan 18, 2024</span> </div> @@ -290,14 +288,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/11/29/%E4%BA%8C%E3%80%87%E4%BA%8C%E4%B8%89%E5%B9%B4%E5%8D%81%E4%B8%80%E6%9C%88%E4%BA%8C%E5%8D%81%E4%B9%9D%E6%97%A5/"> + <a href="/2024/01/08/OCaml-News-2024-1/"> - 二〇二三年十一月二十九日 + OCaml News 2024-1 </a> </div> - <span class="post-date">Nov 29, 2023</span> + <span class="post-date">Jan 8, 2024</span> </div> @@ -305,17 +303,19 @@ + <div class="year-title">2023</div> + <div class="post-list-item"> <div class="post-title"> - <a href="/2023/11/21/Adolescent-Onset-of-Acute-Heart-Failure/"> + <a href="/2023/12/02/%E4%BA%8C%E3%80%87%E4%BA%8C%E4%B8%89%E5%B9%B4%E5%8D%81%E4%BA%8C%E6%9C%88%E4%BA%8C%E6%97%A5/"> - Adolescent Onset of Acute Heart Failure + 二〇二三年十二月二日 </a> </div> - <span class="post-date">Nov 21, 2023</span> + <span class="post-date">Dec 2, 2023</span> </div> diff --git a/archives/page/6/index.html b/archives/page/6/index.html index 1534270f..4d7bddb5 100644 --- a/archives/page/6/index.html +++ b/archives/page/6/index.html @@ -144,14 +144,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/11/16/Fever-of-Unknown-Origin/"> + <a href="/2023/12/01/%E4%BA%8C%E3%80%87%E4%BA%8C%E4%B8%89%E5%B9%B4%E5%8D%81%E4%BA%8C%E6%9C%88%E4%B8%80%E6%97%A5/"> - Fever of Unknown Origin + 二〇二三年十二月一日 </a> </div> - <span class="post-date">Nov 16, 2023</span> + <span class="post-date">Dec 1, 2023</span> </div> @@ -162,14 +162,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/11/06/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%B8%89%E5%B9%B4%E5%8D%81%E4%B8%80%E6%9C%88%E5%85%AD%E6%97%A5/"> + <a href="/2023/11/29/%E4%BA%8C%E3%80%87%E4%BA%8C%E4%B8%89%E5%B9%B4%E5%8D%81%E4%B8%80%E6%9C%88%E4%BA%8C%E5%8D%81%E4%B9%9D%E6%97%A5/"> - 二零二三年十一月六日 + 二〇二三年十一月二十九日 </a> </div> - <span class="post-date">Nov 6, 2023</span> + <span class="post-date">Nov 29, 2023</span> </div> @@ -180,14 +180,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/10/25/%E5%84%BF%E7%AB%A5%E6%96%B0%E5%9E%8B%E5%86%A0%E7%8A%B6%E7%97%85%E6%AF%92Omicron%E6%A0%AA%E5%92%8C%E8%82%BA%E7%82%8E%E6%94%AF%E5%8E%9F%E4%BD%93%E6%B7%B7%E5%90%88%E6%84%9F%E6%9F%93%E9%87%8D%E7%97%87%E8%82%BA%E7%82%8E1%E4%BE%8B/"> + <a href="/2023/11/21/Adolescent-Onset-of-Acute-Heart-Failure/"> - 儿童新型冠状病毒Omicron株和肺炎支原体混合感染重症肺炎1例 + Adolescent Onset of Acute Heart Failure </a> </div> - <span class="post-date">Oct 25, 2023</span> + <span class="post-date">Nov 21, 2023</span> </div> @@ -198,14 +198,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/10/25/Radiographic-Absence-of-the-Left-Humeral-Head/"> + <a href="/2023/11/16/Fever-of-Unknown-Origin/"> - Radiographic Absence of the Left Humeral Head + Fever of Unknown Origin </a> </div> - <span class="post-date">Oct 25, 2023</span> + <span class="post-date">Nov 16, 2023</span> </div> @@ -216,14 +216,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/10/25/%E8%82%BA%E7%82%8E%E6%94%AF%E5%8E%9F%E4%BD%93%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9/"> + <a href="/2023/11/06/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%B8%89%E5%B9%B4%E5%8D%81%E4%B8%80%E6%9C%88%E5%85%AD%E6%97%A5/"> - 肺炎支原体注意事项 + 二零二三年十一月六日 </a> </div> - <span class="post-date">Oct 25, 2023</span> + <span class="post-date">Nov 6, 2023</span> </div> @@ -234,14 +234,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/10/22/%E5%86%AC%E5%AD%A3%E5%92%B3%E5%97%BD%E8%BE%A8%E5%88%AB%E6%8C%87%E5%8D%97/"> + <a href="/2023/10/25/%E5%84%BF%E7%AB%A5%E6%96%B0%E5%9E%8B%E5%86%A0%E7%8A%B6%E7%97%85%E6%AF%92Omicron%E6%A0%AA%E5%92%8C%E8%82%BA%E7%82%8E%E6%94%AF%E5%8E%9F%E4%BD%93%E6%B7%B7%E5%90%88%E6%84%9F%E6%9F%93%E9%87%8D%E7%97%87%E8%82%BA%E7%82%8E1%E4%BE%8B/"> - 冬季咳嗽辨别指南 + 儿童新型冠状病毒Omicron株和肺炎支原体混合感染重症肺炎1例 </a> </div> - <span class="post-date">Oct 22, 2023</span> + <span class="post-date">Oct 25, 2023</span> </div> @@ -252,14 +252,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/10/21/OCaml-Core-Int-pow-%E7%9A%84%E5%AE%9E%E7%8E%B0/"> + <a href="/2023/10/25/Radiographic-Absence-of-the-Left-Humeral-Head/"> - OCaml Core.Int.pow 的实现 + Radiographic Absence of the Left Humeral Head </a> </div> - <span class="post-date">Oct 21, 2023</span> + <span class="post-date">Oct 25, 2023</span> </div> @@ -270,14 +270,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/10/13/%E8%82%9D%E5%8A%9F%E8%83%BD%E6%A3%80%E6%9F%A5%E5%8C%96%E9%AA%8C%E5%8D%95/"> + <a href="/2023/10/25/%E8%82%BA%E7%82%8E%E6%94%AF%E5%8E%9F%E4%BD%93%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9/"> - 肝功能检查化验单阅读指南 + 肺炎支原体注意事项 </a> </div> - <span class="post-date">Oct 13, 2023</span> + <span class="post-date">Oct 25, 2023</span> </div> @@ -288,14 +288,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/10/12/%E8%A1%80%E5%B8%B8%E8%A7%84%E5%8C%96%E9%AA%8C%E7%BB%93%E6%9E%9C%E9%98%85%E8%AF%BB%E6%8C%87%E5%8D%97/"> + <a href="/2023/10/22/%E5%86%AC%E5%AD%A3%E5%92%B3%E5%97%BD%E8%BE%A8%E5%88%AB%E6%8C%87%E5%8D%97/"> - 血常规化验结果阅读指南 + 冬季咳嗽辨别指南 </a> </div> - <span class="post-date">Oct 12, 2023</span> + <span class="post-date">Oct 22, 2023</span> </div> @@ -306,14 +306,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/10/12/%E8%BF%87%E5%BA%A6%E7%96%B2%E5%8A%B3%E7%9A%84%E5%85%AD%E7%A7%8D%E8%A1%A8%E7%8E%B0/"> + <a href="/2023/10/21/OCaml-Core-Int-pow-%E7%9A%84%E5%AE%9E%E7%8E%B0/"> - 过度疲劳的六种表现 + OCaml Core.Int.pow 的实现 </a> </div> - <span class="post-date">Oct 12, 2023</span> + <span class="post-date">Oct 21, 2023</span> </div> diff --git a/archives/page/7/index.html b/archives/page/7/index.html index 54618996..7b666a3e 100644 --- a/archives/page/7/index.html +++ b/archives/page/7/index.html @@ -144,14 +144,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/10/05/v8%E4%B8%AD%E7%9A%84Number-toString/"> + <a href="/2023/10/13/%E8%82%9D%E5%8A%9F%E8%83%BD%E6%A3%80%E6%9F%A5%E5%8C%96%E9%AA%8C%E5%8D%95/"> - v8中的Number.toString() + 肝功能检查化验单阅读指南 </a> </div> - <span class="post-date">Oct 5, 2023</span> + <span class="post-date">Oct 13, 2023</span> </div> @@ -162,14 +162,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/09/28/A-Brief-History-of-Just-In-Time/"> + <a href="/2023/10/12/%E8%A1%80%E5%B8%B8%E8%A7%84%E5%8C%96%E9%AA%8C%E7%BB%93%E6%9E%9C%E9%98%85%E8%AF%BB%E6%8C%87%E5%8D%97/"> - A Brief History of Just-In-Time + 血常规化验结果阅读指南 </a> </div> - <span class="post-date">Sep 28, 2023</span> + <span class="post-date">Oct 12, 2023</span> </div> @@ -180,14 +180,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/09/13/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%B8%89%E5%B9%B4%E4%B9%9D%E6%9C%88%E5%8D%81%E4%B8%89%E6%97%A5/"> + <a href="/2023/10/12/%E8%BF%87%E5%BA%A6%E7%96%B2%E5%8A%B3%E7%9A%84%E5%85%AD%E7%A7%8D%E8%A1%A8%E7%8E%B0/"> - 二零二三年九月十三日 + 过度疲劳的六种表现 </a> </div> - <span class="post-date">Sep 13, 2023</span> + <span class="post-date">Oct 12, 2023</span> </div> @@ -198,14 +198,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/08/27/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%B8%89%E5%B9%B4%E5%85%AB%E6%9C%88%E4%BA%8C%E5%8D%81%E4%B8%83%E6%97%A5/"> + <a href="/2023/10/05/v8%E4%B8%AD%E7%9A%84Number-toString/"> - 二零二三年八月二十七日 + v8中的Number.toString() </a> </div> - <span class="post-date">Aug 27, 2023</span> + <span class="post-date">Oct 5, 2023</span> </div> @@ -216,14 +216,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/08/21/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%B8%89%E5%B9%B4%E5%85%AB%E6%9C%88%E4%BA%8C%E5%8D%81%E4%B8%80%E6%97%A5/"> + <a href="/2023/09/28/A-Brief-History-of-Just-In-Time/"> - 二零二三年八月二十一日 + A Brief History of Just-In-Time </a> </div> - <span class="post-date">Aug 21, 2023</span> + <span class="post-date">Sep 28, 2023</span> </div> @@ -234,14 +234,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/08/15/tick-thread%E5%9C%A8Multicore-OCaml%E4%B8%AD%E7%9A%84%E4%BD%9C%E7%94%A8/"> + <a href="/2023/09/13/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%B8%89%E5%B9%B4%E4%B9%9D%E6%9C%88%E5%8D%81%E4%B8%89%E6%97%A5/"> - tick thread在Multicore OCaml中的作用 + 二零二三年九月十三日 </a> </div> - <span class="post-date">Aug 15, 2023</span> + <span class="post-date">Sep 13, 2023</span> </div> @@ -252,14 +252,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/08/15/poll-error-attribute-in-OCaml/"> + <a href="/2023/08/27/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%B8%89%E5%B9%B4%E5%85%AB%E6%9C%88%E4%BA%8C%E5%8D%81%E4%B8%83%E6%97%A5/"> - 使用 [@poll error] 实现线程安全的数据结构 + 二零二三年八月二十七日 </a> </div> - <span class="post-date">Aug 15, 2023</span> + <span class="post-date">Aug 27, 2023</span> </div> @@ -270,14 +270,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/08/01/%E4%BA%8C%E3%80%87%E4%BA%8C%E4%B8%89%E5%B9%B4%E5%85%AB%E6%9C%88%E4%B8%80%E6%97%A5/"> + <a href="/2023/08/21/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%B8%89%E5%B9%B4%E5%85%AB%E6%9C%88%E4%BA%8C%E5%8D%81%E4%B8%80%E6%97%A5/"> - 二〇二三年八月一日 + 二零二三年八月二十一日 </a> </div> - <span class="post-date">Aug 1, 2023</span> + <span class="post-date">Aug 21, 2023</span> </div> @@ -288,14 +288,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/07/30/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%B8%89%E5%B9%B4%E4%B8%83%E6%9C%88%E4%B8%89%E5%8D%81%E6%97%A5/"> + <a href="/2023/08/15/tick-thread%E5%9C%A8Multicore-OCaml%E4%B8%AD%E7%9A%84%E4%BD%9C%E7%94%A8/"> - 二零二三年七月三十日 + tick thread在Multicore OCaml中的作用 </a> </div> - <span class="post-date">Jul 30, 2023</span> + <span class="post-date">Aug 15, 2023</span> </div> @@ -306,14 +306,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/07/21/WiscKey-Separating-Keys-from-Values-in-SSD-conscious-Storage/"> + <a href="/2023/08/15/poll-error-attribute-in-OCaml/"> - WiscKey: Separating Keys from Values in SSD-conscious Storage + 使用 [@poll error] 实现线程安全的数据结构 </a> </div> - <span class="post-date">Jul 21, 2023</span> + <span class="post-date">Aug 15, 2023</span> </div> diff --git a/archives/page/8/index.html b/archives/page/8/index.html index 02e1509f..3418eeaa 100644 --- a/archives/page/8/index.html +++ b/archives/page/8/index.html @@ -144,14 +144,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/06/29/%E4%BA%8C%E3%80%87%E4%BA%8C%E4%B8%89%E5%B9%B4%E5%85%AD%E6%9C%88%E4%BA%8C%E5%8D%81%E4%B9%9D%E6%97%A5/"> + <a href="/2023/08/01/%E4%BA%8C%E3%80%87%E4%BA%8C%E4%B8%89%E5%B9%B4%E5%85%AB%E6%9C%88%E4%B8%80%E6%97%A5/"> - 二〇二三年六月二十九日 + 二〇二三年八月一日 </a> </div> - <span class="post-date">Jun 29, 2023</span> + <span class="post-date">Aug 1, 2023</span> </div> @@ -162,14 +162,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/06/28/%E9%9A%90%E8%97%8F%E4%B8%80%E4%BA%9BOCaml-Effect%E7%9A%84%E6%9C%BA%E5%88%B6%EF%BC%8C%E8%AE%A9%E5%85%B6%E8%AF%AD%E6%B3%95%E5%9C%A8%E7%B2%BE%E7%A5%9E%E4%B8%8A%E6%9B%B4%E6%8E%A5%E8%BF%91delimcc/"> + <a href="/2023/07/30/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%B8%89%E5%B9%B4%E4%B8%83%E6%9C%88%E4%B8%89%E5%8D%81%E6%97%A5/"> - 隐藏一些OCaml Effect的机制,让其语法在精神上更接近delimcc + 二零二三年七月三十日 </a> </div> - <span class="post-date">Jun 28, 2023</span> + <span class="post-date">Jul 30, 2023</span> </div> @@ -180,14 +180,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/06/28/caml-release-runtime-system%E5%AF%BC%E8%87%B4%E7%9A%84%E6%AD%BB%E9%94%81%E9%97%AE%E9%A2%98/"> + <a href="/2023/07/21/WiscKey-Separating-Keys-from-Values-in-SSD-conscious-Storage/"> - caml_release_runtime_system导致的死锁问题 + WiscKey: Separating Keys from Values in SSD-conscious Storage </a> </div> - <span class="post-date">Jun 28, 2023</span> + <span class="post-date">Jul 21, 2023</span> </div> @@ -198,14 +198,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/06/22/%E7%81%AF%E7%AC%BC%E8%8D%89/"> + <a href="/2023/06/29/%E4%BA%8C%E3%80%87%E4%BA%8C%E4%B8%89%E5%B9%B4%E5%85%AD%E6%9C%88%E4%BA%8C%E5%8D%81%E4%B9%9D%E6%97%A5/"> - 灯笼草 + 二〇二三年六月二十九日 </a> </div> - <span class="post-date">Jun 22, 2023</span> + <span class="post-date">Jun 29, 2023</span> </div> @@ -216,14 +216,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/06/17/%E5%8F%91%E7%83%AD%E5%8F%8A%E8%B6%85%E9%AB%98%E7%83%AD%E5%8D%B1%E8%B1%A1/"> + <a href="/2023/06/28/%E9%9A%90%E8%97%8F%E4%B8%80%E4%BA%9BOCaml-Effect%E7%9A%84%E6%9C%BA%E5%88%B6%EF%BC%8C%E8%AE%A9%E5%85%B6%E8%AF%AD%E6%B3%95%E5%9C%A8%E7%B2%BE%E7%A5%9E%E4%B8%8A%E6%9B%B4%E6%8E%A5%E8%BF%91delimcc/"> - 发热及超高热危象 + 隐藏一些OCaml Effect的机制,让其语法在精神上更接近delimcc </a> </div> - <span class="post-date">Jun 17, 2023</span> + <span class="post-date">Jun 28, 2023</span> </div> @@ -234,14 +234,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/06/10/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%B8%89%E5%B9%B4%E5%85%AD%E6%9C%88%E5%8D%81%E6%97%A5/"> + <a href="/2023/06/28/caml-release-runtime-system%E5%AF%BC%E8%87%B4%E7%9A%84%E6%AD%BB%E9%94%81%E9%97%AE%E9%A2%98/"> - 二零二三年六月十日 + caml_release_runtime_system导致的死锁问题 </a> </div> - <span class="post-date">Jun 10, 2023</span> + <span class="post-date">Jun 28, 2023</span> </div> @@ -252,14 +252,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/05/24/Rust-%E9%97%AD%E5%8C%85-lifetime-may-not-live-long-enough-%E9%97%AE%E9%A2%98/"> + <a href="/2023/06/22/%E7%81%AF%E7%AC%BC%E8%8D%89/"> - Rust 闭包 lifetime may not live long enough 问题 + 灯笼草 </a> </div> - <span class="post-date">May 24, 2023</span> + <span class="post-date">Jun 22, 2023</span> </div> @@ -270,14 +270,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/05/12/C-20-%E5%AE%9E%E7%8E%B0-string-split/"> + <a href="/2023/06/17/%E5%8F%91%E7%83%AD%E5%8F%8A%E8%B6%85%E9%AB%98%E7%83%AD%E5%8D%B1%E8%B1%A1/"> - C++ 20 实现 string split + 发热及超高热危象 </a> </div> - <span class="post-date">May 12, 2023</span> + <span class="post-date">Jun 17, 2023</span> </div> @@ -288,14 +288,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/05/11/C-vector-%E7%9A%84-push-back-%E5%92%8C-emplace-back/"> + <a href="/2023/06/10/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%B8%89%E5%B9%B4%E5%85%AD%E6%9C%88%E5%8D%81%E6%97%A5/"> - C++ vector 的 push_back 和 emplace_back + 二零二三年六月十日 </a> </div> - <span class="post-date">May 11, 2023</span> + <span class="post-date">Jun 10, 2023</span> </div> @@ -306,14 +306,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/05/04/C-%E7%9A%84-Trait/"> + <a href="/2023/05/24/Rust-%E9%97%AD%E5%8C%85-lifetime-may-not-live-long-enough-%E9%97%AE%E9%A2%98/"> - C++ 的 Trait + Rust 闭包 lifetime may not live long enough 问题 </a> </div> - <span class="post-date">May 4, 2023</span> + <span class="post-date">May 24, 2023</span> </div> diff --git a/css/animation.css b/css/animation.css new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/css/animation.css diff --git a/js/theme-switch.js b/js/theme-switch.js new file mode 100644 index 00000000..4dddd304 --- /dev/null +++ b/js/theme-switch.js @@ -0,0 +1,31 @@ +document.addEventListener('DOMContentLoaded', () => { + const themeSwitch = document.getElementById('theme-switch-btn'); + const prefersDarkScheme = window.matchMedia('(prefers-color-scheme: dark)'); + + // 检查本地存储中的主题设置 + const currentTheme = localStorage.getItem('theme'); + if (currentTheme === 'dark') { + document.body.classList.add('dark-theme'); + themeSwitch.querySelector('i').classList.replace('icon-moon', 'icon-sun'); + } else if (currentTheme === 'light') { + document.body.classList.remove('dark-theme'); + } else if (prefersDarkScheme.matches) { + document.body.classList.add('dark-theme'); + themeSwitch.querySelector('i').classList.replace('icon-moon', 'icon-sun'); + } + + // 切换主题 + themeSwitch.addEventListener('click', (e) => { + e.preventDefault(); + + if (document.body.classList.contains('dark-theme')) { + document.body.classList.remove('dark-theme'); + localStorage.setItem('theme', 'light'); + themeSwitch.querySelector('i').classList.replace('icon-sun', 'icon-moon'); + } else { + document.body.classList.add('dark-theme'); + localStorage.setItem('theme', 'dark'); + themeSwitch.querySelector('i').classList.replace('icon-moon', 'icon-sun'); + } + }); +});
\ No newline at end of file diff --git a/page/6/index.html b/page/6/index.html index 8bb68a9a..b4cfc6df 100644 --- a/page/6/index.html +++ b/page/6/index.html @@ -59,119 +59,7 @@ - <meta name="generator" content="Hexo 6.3.0"><style>mjx-container[jax="SVG"] { - direction: ltr; -} - -mjx-container[jax="SVG"] > svg { - overflow: visible; -} - -mjx-container[jax="SVG"][display="true"] { - display: block; - text-align: center; - margin: 1em 0; -} - -mjx-container[jax="SVG"][justify="left"] { - text-align: left; -} - -mjx-container[jax="SVG"][justify="right"] { - text-align: right; -} - -g[data-mml-node="merror"] > g { - fill: red; - stroke: red; -} - -g[data-mml-node="merror"] > rect[data-background] { - fill: yellow; - stroke: none; -} - -g[data-mml-node="mtable"] > line[data-line] { - stroke-width: 70px; - fill: none; -} - -g[data-mml-node="mtable"] > rect[data-frame] { - stroke-width: 70px; - fill: none; -} - -g[data-mml-node="mtable"] > .mjx-dashed { - stroke-dasharray: 140; -} - -g[data-mml-node="mtable"] > .mjx-dotted { - stroke-linecap: round; - stroke-dasharray: 0,140; -} - -g[data-mml-node="mtable"] > svg { - overflow: visible; -} - -[jax="SVG"] mjx-tool { - display: inline-block; - position: relative; - width: 0; - height: 0; -} - -[jax="SVG"] mjx-tool > mjx-tip { - position: absolute; - top: 0; - left: 0; -} - -mjx-tool > mjx-tip { - display: inline-block; - padding: .2em; - border: 1px solid #888; - font-size: 70%; - background-color: #F8F8F8; - color: black; - box-shadow: 2px 2px 5px #AAAAAA; -} - -g[data-mml-node="maction"][data-toggle] { - cursor: pointer; -} - -mjx-status { - display: block; - position: fixed; - left: 1em; - bottom: 1em; - min-width: 25%; - padding: .2em .4em; - border: 1px solid #888; - font-size: 90%; - background-color: #F8F8F8; - color: black; -} - -foreignObject[data-mjx-xml] { - font-family: initial; - line-height: normal; - overflow: visible; -} - -.MathJax path { - stroke-width: 3; -} - -mjx-container[display="true"] { - overflow: auto hidden; -} - -mjx-container[display="true"] + br { - display: none; -} -</style></head> + <meta name="generator" content="Hexo 6.3.0"></head> <body> <div class="mask-border"> </div> diff --git a/page/7/index.html b/page/7/index.html index b4cfc6df..8bb68a9a 100644 --- a/page/7/index.html +++ b/page/7/index.html @@ -59,7 +59,119 @@ - <meta name="generator" content="Hexo 6.3.0"></head> + <meta name="generator" content="Hexo 6.3.0"><style>mjx-container[jax="SVG"] { + direction: ltr; +} + +mjx-container[jax="SVG"] > svg { + overflow: visible; +} + +mjx-container[jax="SVG"][display="true"] { + display: block; + text-align: center; + margin: 1em 0; +} + +mjx-container[jax="SVG"][justify="left"] { + text-align: left; +} + +mjx-container[jax="SVG"][justify="right"] { + text-align: right; +} + +g[data-mml-node="merror"] > g { + fill: red; + stroke: red; +} + +g[data-mml-node="merror"] > rect[data-background] { + fill: yellow; + stroke: none; +} + +g[data-mml-node="mtable"] > line[data-line] { + stroke-width: 70px; + fill: none; +} + +g[data-mml-node="mtable"] > rect[data-frame] { + stroke-width: 70px; + fill: none; +} + +g[data-mml-node="mtable"] > .mjx-dashed { + stroke-dasharray: 140; +} + +g[data-mml-node="mtable"] > .mjx-dotted { + stroke-linecap: round; + stroke-dasharray: 0,140; +} + +g[data-mml-node="mtable"] > svg { + overflow: visible; +} + +[jax="SVG"] mjx-tool { + display: inline-block; + position: relative; + width: 0; + height: 0; +} + +[jax="SVG"] mjx-tool > mjx-tip { + position: absolute; + top: 0; + left: 0; +} + +mjx-tool > mjx-tip { + display: inline-block; + padding: .2em; + border: 1px solid #888; + font-size: 70%; + background-color: #F8F8F8; + color: black; + box-shadow: 2px 2px 5px #AAAAAA; +} + +g[data-mml-node="maction"][data-toggle] { + cursor: pointer; +} + +mjx-status { + display: block; + position: fixed; + left: 1em; + bottom: 1em; + min-width: 25%; + padding: .2em .4em; + border: 1px solid #888; + font-size: 90%; + background-color: #F8F8F8; + color: black; +} + +foreignObject[data-mjx-xml] { + font-family: initial; + line-height: normal; + overflow: visible; +} + +.MathJax path { + stroke-width: 3; +} + +mjx-container[display="true"] { + overflow: auto hidden; +} + +mjx-container[display="true"] + br { + display: none; +} +</style></head> <body> <div class="mask-border"> </div> @@ -505,70 +505,6 @@ </tags> </entry> <entry> - <title>C++ 20 实现 string split</title> - <url>/2023/05/12/C-20-%E5%AE%9E%E7%8E%B0-string-split/</url> - <content><</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">Arg</span>(std::<span class="built_in">addressof</span>(*r.<span class="built_in">begin</span>()), stdr::<span class="built_in">distance</span>(r));</span><br><span class="line"> });</span><br><span class="line"> <span class="keyword">auto</span> iter = std::<span class="built_in">inserter</span>(myCont, myCont.<span class="built_in">end</span>());</span><br><span class="line"> stdr::for_each(temp, [&](<span class="keyword">auto</span>&& x) { iter = {x.<span class="built_in">begin</span>(), x.<span class="built_in">end</span>()}; });</span><br><span class="line"> <span class="keyword">return</span> myCont;</span><br><span class="line">}</span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> std::string str = <span class="string">"Hello233C++20233and233New233Spilt"</span>;</span><br><span class="line"> std::string delimiter = <span class="string">"233"</span>;</span><br><span class="line"> <span class="keyword">auto</span>&& strCont = <span class="built_in">Split</span><std::list, std::string>(str, delimiter);</span><br><span class="line"> stdr::for_each(strCont, [](<span class="keyword">auto</span>&& x) { std::cout << std::format(<span class="string">"{} "</span>, x); });</span><br><span class="line">}</span><br><span class="line"><span class="comment">//output: Hello C++20 and New Spilt</span></span><br></pre></td></tr></table></figure> - -<p>C++20没有提供关键的 <code>ranges::to<container></code>函数,导致demo中还需要额外封装并手写for_each来写入数据,等到C++23实装了该函数,split的实现会比现在简洁优雅的多,真正做到方便泛用、无需封装:</p> -<figure class="highlight cpp"><table><tr><td class="code"><pre><span class="line"><span class="keyword">auto</span>&& strCont = str</span><br><span class="line"> | stdrv::<span class="built_in">lazy_split</span>(delimiter)</span><br><span class="line"> | stdr ::to<std::vector<std::string>>;</span><br></pre></td></tr></table></figure>]]></content> - <tags> - <tag>Technique</tag> - <tag>C++</tag> - </tags> - </entry> - <entry> - <title>C++ vector 的 push_back 和 emplace_back</title> - <url>/2023/05/11/C-vector-%E7%9A%84-push-back-%E5%92%8C-emplace-back/</url> - <content><![CDATA[<figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="comment">/// Inserts a new element at the end of the vector, right after its current last element. This new element is constructed in place using args as the arguments for its constructor.</span></span><br><span class="line"><span class="comment">/// This effectively increases the container size by one, which causes an automatic reallocation of the allocated storage space if -and only if- the new vector size surpasses the current vector capacity.</span></span><br><span class="line"><span class="comment">/// The element is constructed in-place by calling allocator_traits::construct with args forwarded.</span></span><br><span class="line"><span class="comment">///A similar member function exists, push_back, which either copies or moves an existing object into the container.</span></span><br><span class="line"><span class="keyword">template</span> <<span class="keyword">class</span>... Args></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">emplace_back</span> <span class="params">(Args&&... args)</span></span>;</span><br></pre></td></tr></table></figure> - -<p><code>push_back</code> 会构造一个临时对象,这个临时对象会被拷贝或者移入到容器中,然而 <code>emplace_back</code> 会直接根据传入的参数在容器的适当位置进行构造而避免拷贝或者移动。</p> -<p>传统观点认为 <code>push_back</code> 会构造一个临时对象,这个临时对象会被移入到 v 中,然而 <code>emplace_back</code> 会直接根据传入的参数在适当位置进行构造而避免拷贝或者移动。从标准库代码的实现角度来说这是对的,但是对于提供了优化的编译器来讲,上面示例中最后两行表达式生成的代码其实没有区别。</p> -<p>真正的区别在于,<code>emplace_back</code> 更加强大,它可以调用任何类型的(只要存在)构造函数。而 push_back 会更加严谨,它只调用隐式构造函数。隐式构造函数被认为是安全的。如果能够通过对象 T 隐式构造对象 U,就认为 U 能够完整包含 T 的所有内容,这样将 T 传递给 U 通常是安全的。正确使用隐式构造的例子是用 <code>std::uint32_t</code> 对象构造 <code>std::uint64_t</code> 对象,错误使用隐式构造的例子是用 <code>double</code> 构造 <code>std::uint8_t</code>。</p> -<p>如果想要调用显示构造函数,那么就调用 <code>emplace_back</code>。如果只希望调用隐式构造函数,那么请使用更加安全的 <code>push_back</code>:</p> -<figure class="highlight c++"><table><tr><td class="code"><pre><span class="line">std::vector<std::unique_ptr<T>> v;</span><br><span class="line">T a;</span><br><span class="line">v.<span class="built_in">emplace_back</span>(std::<span class="built_in">addressof</span>(a)); <span class="comment">// compiles</span></span><br><span class="line">v.<span class="built_in">push_back</span>(std::<span class="built_in">addressof</span>(a)); <span class="comment">// fails to compile</span></span><br></pre></td></tr></table></figure> - -<p><code>std::unique_ptr<T></code> 包含了显示构造函数通过 <code>T*</code> 进行构造。因为 <code>emplace_back</code> 能够调用显示构造函数,所以传递一个裸指针并不会产生编译错误。然而,当 v 超出了作用域,<code>std::unique_ptr<T></code> 的析构函数会尝试 delete 类型 <code>T*</code> 的指针,而类型 <code>T*</code> 的指针并不是通过 new 来分配的,因为它保存的是栈对象的地址,因此 delete 行为是未定义的。</p> -]]></content> - <tags> - <tag>Technique</tag> - <tag>C++</tag> - </tags> - </entry> - <entry> - <title>C++ 的 Trait</title> - <url>/2023/05/04/C-%E7%9A%84-Trait/</url> - <content><![CDATA[<blockquote> -<p>C++ 的 traits 技术,是一种约定俗称的技术方案,用来为同一类数据(包括自定义数据类型和内置数据类型)提供统一的类型名(traits),这样可以统一的操作函数,例如 advance(), swap(), encode()/decode() 等。</p> -</blockquote> -<p>例如,拥有义类型Foo, Bar,以及编译器自带类型 int, double, string,我们想要为这些不同的类型提供统一的编码函数 decode() 。</p> -<p>除了使用 trait 技术之外,函数重载和模板函数 + 内置字段也可以实现,前者每增加一种数据类型就需要重新实现一个函数,而同一类数据(int, unsinged int)可以使用同样的编码方法。我们想要的是针对同一种数据类型,只编写一个函数。后者对于系统自定义变量 int, double 而言,是无法在其内部定义 type 的。</p> -<p>traits 技术的关键在于,使用另外的模板类 type_traits 来保存不同数据类型的 type,这样就可以兼容自定义数据类型和内置数据类型:</p> -<figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="comment">// 定义数据 type 类</span></span><br><span class="line"><span class="keyword">enum</span> <span class="title class_">Type</span> {</span><br><span class="line"> TYPE_1,</span><br><span class="line"> TYPE_2,</span><br><span class="line"> TYPE_3</span><br><span class="line">}</span><br></pre></td></tr></table></figure> - -<p>对于自定义类型,在类内部定义 type,然后在 traits 类中定义同样的 type:</p> -<figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="comment">// 自定义数据类型</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Foo</span> {</span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> Type type = TYPE_1;</span><br><span class="line">};</span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Bar</span> {</span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> Type type = TYPE_2;</span><br><span class="line">};</span><br><span class="line"><span class="keyword">template</span><<span class="keyword">typename</span> T></span><br><span class="line"><span class="keyword">struct</span> <span class="title class_">type_traits</span> {</span><br><span class="line"> Type type = T::type;</span><br><span class="line">}</span><br></pre></td></tr></table></figure> - -<p>对于内置数据类型,使用模板类的特化为自定义类型生成独有的 type_traits:</p> -<figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="comment">// 内置数据类型</span></span><br><span class="line"><span class="keyword">template</span><<span class="keyword">typename</span> <span class="type">int</span>></span><br><span class="line"><span class="keyword">struct</span> <span class="title class_">type_traits</span> {</span><br><span class="line"> Type type = Type::TYPE_1;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">template</span><<span class="keyword">typename</span> <span class="type">double</span>></span><br><span class="line"><span class="keyword">struct</span> <span class="title class_">type_traits</span> {</span><br><span class="line"> Type type = Type::TYPE_3;</span><br><span class="line">}</span><br></pre></td></tr></table></figure> - -<p>这样就可以为不同数据类型生成统一的模板函数</p> -<figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="comment">// 统一的编码函数</span></span><br><span class="line"><span class="keyword">template</span><<span class="keyword">typename</span> T></span><br><span class="line"><span class="type">void</span> decode<<span class="type">const</span> T& data, <span class="type">char</span>* buf) {</span><br><span class="line"> <span class="keyword">if</span>(type_traits<T>::type == Type::TYPE_1) {</span><br><span class="line"> ...</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span>(type_traits<T>::type == Type::TYPE_2) {</span><br><span class="line"> ...</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure> - -<p>总结</p> -<ul> -<li>traits 技术的关键在于使用第三方模板类 traits,利用模板特化的功能, 实现对自定义数据和编译器内置数据的统一</li> -<li>这个例子使用了枚举变量来表示数据类型,而实际操作中通常使用不同的类来表示不同的类型,这样可以在编写模板函数时更好的优化。</li> -<li>tratis 技术常见于标准库的实现中,但对日常开发中降低代码冗余也有很好的借鉴意义</li> -<li>C++20 提供了Concept 的特性,使用Concept 可以使得实现类似的功能更加方便</li> -</ul> -]]></content> - <tags> - <tag>Technique</tag> - <tag>C++</tag> - </tags> - </entry> - <entry> <title>Dealing with complex dependency injection in FSharp</title> <url>/2024/10/18/Dealing-with-complex-dependency-injection-in-FSharp/</url> <content><![CDATA[<p>Today, we’re going to cover different ways of encapsulating capabilities and supplying them between functions using functional programming techniques which can be realized in F#.</p> @@ -688,6 +624,32 @@ </tags> </entry> <entry> + <title>G-Machine</title> + <url>/2024/01/23/G-Machine/</url> + <content><![CDATA[<ul> +<li><a href="https://link.springer.com/chapter/10.1007/3-540-15975-4_50">The G-machine: A fast, graph-reduction evaluator</a></li> +</ul> +<p>G-Machine 是一种通过图规约来对函数式语言程序求值的抽象架构。<br>与组合子规约不同,组合子规约的control是从表达式图本身动态导出的,而G-Machine是由通过编译Application表达式导出的指令序列指定的。</p> +<hr> +<p>FP的程序基本上都可以用一个表达式的图表示,图计算机就是对这个图求值的机器,总的说来对图的求值是一个不停合并图上的节点生产新节点的过程。</p> +<p>例如:</p> +<figure class="highlight ocaml"><table><tr><td class="code"><pre><span class="line"><span class="keyword">let</span> x = <span class="number">2</span> + <span class="number">3</span> <span class="keyword">in</span> </span><br><span class="line"> x * x</span><br></pre></td></tr></table></figure> + +<p>先计算出5,然后创建一个新的节点 <code>5 * 5</code>,然后再对这个节点求值,于是求值过程中就产生了很多临时的节点,这些中间节点也被叫做是 spine,求值过程是沿着 spine 进行的。</p> +<p>但是这样就产生了很多额外的开销,lambda lifting 里提到:可以把程序里,很多捕捉了外围绑定的闭包函数中的这些绑定,转换成函数的参数,从而消除闭包,得到的这个函数就可以自由脱离作用域,被静态的编译到机器码里。这些被 float out 的函数也叫 supercombinator.</p> +<p>在上面的代码中,如果不创建新的节点,顺序计算完了第一个 <code>x</code>,第二个 <code>x</code> 还会再被算一遍。</p> +<p>Spineless reduction 的概念:只有当面临需要重复计算的情况时,才去创建节点,不然就一路顺序算下去</p> +<ul> +<li><a href="https://en.wikipedia.org/wiki/Graph_reduction">Graph reduction</a></li> +<li><a href="https://en.wikipedia.org/wiki/Graph_reduction_machine">Graph reduction machine</a></li> +<li><a href="https://www.zhihu.com/question/54834531/answer/144213668">https://www.zhihu.com/question/54834531/answer/144213668</a></li> +</ul> +]]></content> + <tags> + <tag>Technique</tag> + </tags> + </entry> + <entry> <title>Functional Reactive Programming in F#</title> <url>/2024/09/12/Functional-Reactive-Programming-in-F/</url> <content><![CDATA[<blockquote> @@ -815,32 +777,6 @@ </tags> </entry> <entry> - <title>G-Machine</title> - <url>/2024/01/23/G-Machine/</url> - <content><![CDATA[<ul> -<li><a href="https://link.springer.com/chapter/10.1007/3-540-15975-4_50">The G-machine: A fast, graph-reduction evaluator</a></li> -</ul> -<p>G-Machine 是一种通过图规约来对函数式语言程序求值的抽象架构。<br>与组合子规约不同,组合子规约的control是从表达式图本身动态导出的,而G-Machine是由通过编译Application表达式导出的指令序列指定的。</p> -<hr> -<p>FP的程序基本上都可以用一个表达式的图表示,图计算机就是对这个图求值的机器,总的说来对图的求值是一个不停合并图上的节点生产新节点的过程。</p> -<p>例如:</p> -<figure class="highlight ocaml"><table><tr><td class="code"><pre><span class="line"><span class="keyword">let</span> x = <span class="number">2</span> + <span class="number">3</span> <span class="keyword">in</span> </span><br><span class="line"> x * x</span><br></pre></td></tr></table></figure> - -<p>先计算出5,然后创建一个新的节点 <code>5 * 5</code>,然后再对这个节点求值,于是求值过程中就产生了很多临时的节点,这些中间节点也被叫做是 spine,求值过程是沿着 spine 进行的。</p> -<p>但是这样就产生了很多额外的开销,lambda lifting 里提到:可以把程序里,很多捕捉了外围绑定的闭包函数中的这些绑定,转换成函数的参数,从而消除闭包,得到的这个函数就可以自由脱离作用域,被静态的编译到机器码里。这些被 float out 的函数也叫 supercombinator.</p> -<p>在上面的代码中,如果不创建新的节点,顺序计算完了第一个 <code>x</code>,第二个 <code>x</code> 还会再被算一遍。</p> -<p>Spineless reduction 的概念:只有当面临需要重复计算的情况时,才去创建节点,不然就一路顺序算下去</p> -<ul> -<li><a href="https://en.wikipedia.org/wiki/Graph_reduction">Graph reduction</a></li> -<li><a href="https://en.wikipedia.org/wiki/Graph_reduction_machine">Graph reduction machine</a></li> -<li><a href="https://www.zhihu.com/question/54834531/answer/144213668">https://www.zhihu.com/question/54834531/answer/144213668</a></li> -</ul> -]]></content> - <tags> - <tag>Technique</tag> - </tags> - </entry> - <entry> <title>.NET AOT 下的 F# 命令行参数解析库选择</title> <url>/2024/06/06/NET-AOT-%E4%B8%8B%E7%9A%84-F-%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%8F%82%E6%95%B0%E8%A7%A3%E6%9E%90%E5%BA%93%E9%80%89%E6%8B%A9/</url> <content><![CDATA[<p>Argu 不支持 AOT,不过用 F# 的话可以看整个 .NET 的生态,我看了一下 C# 的 CommandLineParser:<br><a href="https://github.com/commandlineparser">https://github.com/commandlineparser</a></p> @@ -2595,7 +2531,7 @@ <entry> <title>二〇二四年十一月十七日</title> <url>/2024/11/17/%E4%BA%8C%E3%80%87%E4%BA%8C%E5%9B%9B%E5%B9%B4%E5%8D%81%E4%B8%80%E6%9C%88%E5%8D%81%E4%B8%83%E6%97%A5/</url> - <content><![CDATA[<p>快乐是正面情绪的原型,许多思想家都说过,人类的所作所为,最终都是为了追求快乐。我们之所以想追求财富、健康或名声,都是为了借此得到快乐。然而,追求快乐也不是因为它可以带给我们其他好处,因为快乐本身就是目的。</p> + <content><![CDATA[<p>快乐是正面情绪的原型,人类的所作所为,最终都是为了追求快乐。我们之所以想追求财富、健康或名声,都是为了借此得到快乐。然而,追求快乐也不是因为它可以带给我们其他好处,因为快乐本身就是目的。</p> <p>“世人皆以痛楚、孤独、悲伤为大境界,以为这就是深邃的人生,殊不知快乐才是人生的真谛。一个人获取快乐的能力才是真正有用的能力。伤春悲秋、离愁别绪太容易了,读几首诗词即可,但获取欢乐太难了非大丈夫不可为之。”</p> ]]></content> <categories> @@ -2792,11 +2728,11 @@ <entry> <title>二零二三年六月十日</title> <url>/2023/06/10/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%B8%89%E5%B9%B4%E5%85%AD%E6%9C%88%E5%8D%81%E6%97%A5/</url> - <content><![CDATA[<p>我希望与我一样独自生活多年的宝宝们,能绝对理性的面对所有事情,这是一个人工作学习生活的基础,但同时要感同身受的去阅读文学类作品,这是让我们保留一丝感性的方式,感性是不可或缺的,理性可以让人控制感性,但也可以消灭它。</p> -<p>一个人的世界很容易出现信息茧房,要不断的和人交流,把很多想法说出来,接收一切评论,不然会在长期的不分正确错误的信息堆叠中出现一团巨大的闭塞性的知识,这很不利于我们快乐的活下去。</p> -<p>接收到的评论不必急于改变,先存起来,让它们陪着你跟着时间走,路上会慢慢的和其他的事情连结起来,这样就能择其善者而从之,其不善者而改之了。</p> -<p>和我一样处在青少年阶段的宝宝们应当早日从这喧扰的世界冷静下来,让脑子里满是憧憬和情爱的灵魂得到一丝陈酿,理性点抬头看看世界上方的二氧化碳,自己晃晃头打破能回到最初的样子再重来的梦。</p> -<p>爱你们噢。</p> + <content><![CDATA[<p>请绝对理性的面对所有事情,这是一个人工作学习生活的基础,但同时要感同身受的去阅读文学类作品,这是保留一丝感性的方式,感性是不可或缺的,理性可以让人控制感性,但也可以消灭它。</p> +<p>独处的世界很容易出现信息茧房,要不断的和人交流,把很多想法说出来,接收一切评论,不然会在长期的不分正确错误的信息堆叠中出现一团巨大的闭塞性的知识,这很不利于快乐的活下去。</p> +<p>接收到的评论不必急于改变,先存起来,让它们陪着自己,跟着时间走,路上会慢慢的和其他的事情连结起来,这样就能择其善者而从之,其不善者而改之了。</p> +<p>应当早日从这喧扰的世界冷静下来,让脑子里满是憧憬和情爱的灵魂得到一丝陈酿,理性点抬头看看世界上方的二氧化碳,自己晃晃头打破能回到最初的样子再重来的梦。</p> +<p>爱你们。</p> ]]></content> <categories> <category>gallery</category> @@ -2941,6 +2877,27 @@ </categories> </entry> <entry> + <title>从事件风暴看领域驱动设计</title> + <url>/2025/02/11/%E4%BB%8E%E4%BA%8B%E4%BB%B6%E9%A3%8E%E6%9A%B4%E7%9C%8B%E9%A2%86%E5%9F%9F%E9%A9%B1%E5%8A%A8%E8%AE%BE%E8%AE%A1/</url> + <content><![CDATA[<p>事件风暴(Event Storming)是一种领域驱动设计(DDD)的实践方法,由 Alberto Brandolini 提出,旨在通过团队协作的方式快速理解和建模业务领域。</p> +<p>以下是事件风暴及相关领域驱动设计中的一些核心概念和知识点:</p> +<p>1. 领域(Domain):指的是业务相关知识的集合,可以进一步划分为子域。<br>2. 子域(Subdomain):是领域的一部分,可以是核心域、支撑域或通用域。<br>3. 核心域(Core Domain):指领域中最核心的部分,通常对应企业的核心业务。<br>4. 通用语言(Ubiquitous Language):团队所有成员使用的一种语言,用于确保业务和软件之间的沟通一致性。<br>5. 限界上下文(Bounded Context):定义了一组规则和协议,用于明确领域模型的适用范围。<br>6. 实体(Entity):具有唯一标识和生命周期的领域对象。<br>7. 值对象(Value Object):描述了某种特性或属性的对象,没有概念标识。<br>8. 聚合(Aggregate):一组相关对象的集合,由一个聚合根(Aggregate Root)统一管理。<br>9. 领域事件(Domain Event):领域中发生的重要事件,可以用于通知其他领域对象或跨限界上下文进行解耦和协作。<br>10. 命令(Command):表示要执行的操作,通常与事件一一对应。<br>11. 读模型(Read Model):为了优化读取操作而设计的模型,可能与写模型不同。<br>12. 决策命令(Decision Command):在事件风暴中,直接导致事件发生的命令。<br>13. 战略设计(Strategic Design):高层次的抽象和归类,包括理清上下文和子域的划分。<br>14. 战术设计(Tactical Design):对特定上下文下的模型进行详细设计,包括聚合、实体和值对象。<br>15. 贫血模型(Anemic Domain Model):领域对象只有属性及其getter/setter方法的纯数据类,业务逻辑通过服务实现。<br>16. 充血模型(Rich Domain Model):领域对象包含业务逻辑,每个对象都是活跃的。<br>17. 资源库(Repository):用于检索和持久化领域对象的机制。<br>18. 服务(Service):在模型中独立的操作,可以是领域服务或应用服务。<br>19. 固定规则(Invariant):为设计元素做出的断言,必须一直保持为真。</p> +<p>事件风暴通常包括以下步骤:</p> +<ul> +<li>识别领域事件</li> +<li>确定事件顺序</li> +<li>识别命令和触发器</li> +<li>识别聚合和实体</li> +<li>划分限界上下文</li> +<li>识别领域服务和资源库</li> +<li>通过这些步骤,团队可以共同创建出反映业务领域的领域模型,为软件设计和开发提供指导。</li> +</ul> +]]></content> + <tags> + <tag>Technique</tag> + </tags> + </entry> + <entry> <title>儿童新型冠状病毒Omicron株和肺炎支原体混合感染重症肺炎1例</title> <url>/2023/10/25/%E5%84%BF%E7%AB%A5%E6%96%B0%E5%9E%8B%E5%86%A0%E7%8A%B6%E7%97%85%E6%AF%92Omicron%E6%A0%AA%E5%92%8C%E8%82%BA%E7%82%8E%E6%94%AF%E5%8E%9F%E4%BD%93%E6%B7%B7%E5%90%88%E6%84%9F%E6%9F%93%E9%87%8D%E7%97%87%E8%82%BA%E7%82%8E1%E4%BE%8B/</url> <content><![CDATA[<p>患儿 男, 3 岁 10 月龄,因“间歇发热 2 周伴咳嗽、气促”入上海交通大学医学院附属仁济医院(南部院区)定点医院隔离病房。<br>患儿病初发热,确诊为新型冠状病毒肺炎(简称新冠肺炎),热退 2d 再次持续高热>3d 伴气促、吸气性凹陷,胸部 CT 示右肺下叶片状密度影,诊断“重型新冠肺炎”,行支气管镜肺泡灌洗,宏基因组病原检测确诊为混合肺炎支原体感染,治疗好转出院。<br>提示临床医生诊治重型新冠肺炎时需警惕混合感染</p> @@ -3287,6 +3244,32 @@ </tags> </entry> <entry> + <title>实时搜索中的防抖函数</title> + <url>/2025/02/10/%E5%AE%9E%E6%97%B6%E6%90%9C%E7%B4%A2%E4%B8%AD%E7%9A%84%E9%98%B2%E6%8A%96%E5%87%BD%E6%95%B0/</url> + <content><![CDATA[<p>在实现实时搜索功能时,通常会使用输入框的事件监听器来捕获用户的输入变化,并在输入变化时发送搜索请求。为了避免过多的请求导致服务器负担过重,通常会使用“防抖”(debounce)技术来控制请求的频率。</p> +<h3 id="实现步骤"><a href="#实现步骤" class="headerlink" title="实现步骤"></a>实现步骤</h3><ol> +<li><strong>监听输入框的变化</strong>:使用<code>input</code>事件监听器来捕获用户的输入变化。</li> +<li><strong>防抖处理</strong>:使用防抖函数来限制请求的频率。防抖函数会在用户停止输入一段时间后才发送请求。</li> +<li><strong>发送请求</strong>:在防抖函数中调用搜索请求。</li> +</ol> +<h3 id="防抖函数示例"><a href="#防抖函数示例" class="headerlink" title="防抖函数示例"></a>防抖函数示例</h3><p>以下是一个简单的防抖函数示例:</p> +<figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">function</span> <span class="title function_">debounce</span>(<span class="params">func, wait</span>) {</span><br><span class="line"> <span class="keyword">let</span> timeout;</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">function</span>(<span class="params">...args</span>) {</span><br><span class="line"> <span class="keyword">const</span> context = <span class="variable language_">this</span>;</span><br><span class="line"> <span class="built_in">clearTimeout</span>(timeout);</span><br><span class="line"> timeout = <span class="built_in">setTimeout</span>(<span class="function">() =></span> func.<span class="title function_">apply</span>(context, args), wait);</span><br><span class="line"> };</span><br><span class="line">}</span><br></pre></td></tr></table></figure> + +<h3 id="实现实时搜索"><a href="#实现实时搜索" class="headerlink" title="实现实时搜索"></a>实现实时搜索</h3><p>假设你有一个输入框用于搜索患者:</p> +<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"><script></span><br><span class="line"> import { onMount } from 'svelte';</span><br><span class="line"> import { patientsStore } from '$lib/stores/patients.svelte';</span><br><span class="line"></span><br><span class="line"> let searchTerm = '';</span><br><span class="line"></span><br><span class="line"> // 防抖函数</span><br><span class="line"> function debounce(func, wait) {</span><br><span class="line"> let timeout;</span><br><span class="line"> return function(...args) {</span><br><span class="line"> const context = this;</span><br><span class="line"> clearTimeout(timeout);</span><br><span class="line"> timeout = setTimeout(() => func.apply(context, args), wait);</span><br><span class="line"> };</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> // 搜索函数</span><br><span class="line"> const searchPatients = debounce(async (term) => {</span><br><span class="line"> if (term) {</span><br><span class="line"> // 发送搜索请求</span><br><span class="line"> const response = await fetch(`/api/search-patients?query=${term}`);</span><br><span class="line"> const data = await response.json();</span><br><span class="line"> patientsStore.mbglPatients = data;</span><br><span class="line"> } else {</span><br><span class="line"> // 清空搜索结果或恢复默认数据</span><br><span class="line"> patientsStore.mbglPatients = [];</span><br><span class="line"> }</span><br><span class="line"> }, 300); // 300ms 的防抖时间</span><br><span class="line"></span><br><span class="line"> // 监听输入框变化</span><br><span class="line"> function handleInput(event) {</span><br><span class="line"> searchTerm = event.target.value;</span><br><span class="line"> searchPatients(searchTerm);</span><br><span class="line"> }</span><br><span class="line"></script></span><br><span class="line"></span><br><span class="line"><input type="text" placeholder="搜索患者..." on:input={handleInput} bind:value={searchTerm} /></span><br></pre></td></tr></table></figure> + +<h3 id="请求发送间隔"><a href="#请求发送间隔" class="headerlink" title="请求发送间隔"></a>请求发送间隔</h3><ul> +<li><strong>防抖时间</strong>:通常设置为 300ms 到 500ms 之间。这个时间足够让用户完成输入并减少不必要的请求。</li> +<li><strong>考虑用户体验</strong>:防抖时间过短可能导致过多请求,过长则可能让用户感到延迟。300ms 是一个常用的折中值。</li> +</ul> +<p>通过这种方式,你可以实现一个高效的实时搜索功能,既能保证用户体验,又能减少服务器的负担。</p> +]]></content> + <tags> + <tag>Technique</tag> + <tag>Web</tag> + </tags> + </entry> + <entry> <title>急诊与灾难医学--烧伤</title> <url>/2024/01/25/%E6%80%A5%E8%AF%8A%E4%B8%8E%E7%81%BE%E9%9A%BE%E5%8C%BB%E5%AD%A6-%E7%83%A7%E4%BC%A4/</url> <content><![CDATA[<p>烧伤,烫伤是一个很常见的急诊意外损伤,这里科普一下相关的知识。</p> @@ -5520,6 +5503,32 @@ </tags> </entry> <entry> + <title>领域驱动设计中的“聚合根”</title> + <url>/2025/03/13/%E9%A2%86%E5%9F%9F%E9%A9%B1%E5%8A%A8%E8%AE%BE%E8%AE%A1%E4%B8%AD%E7%9A%84%E2%80%9C%E8%81%9A%E5%90%88%E6%A0%B9%E2%80%9D/</url> + <content><![CDATA[<p>在领域驱动设计(Domain-Driven Design,简称DDD)中,聚合根(Aggregate Root)是聚合(Aggregate)中的核心实体,是一个聚合的入口点和控制者,负责维护聚合内部的一致性和不变性条件。聚合是一组紧密相关的领域对象的集合,这些对象通过一定的业务规则绑定在一起,并被视为一个单元。</p> +<p>主要的作用如下:</p> +<ul> +<li><strong>维护不变性</strong>:聚合根确保聚合内所有对象的一致性和不变性条件不被破坏。它负责封装与聚合相关的业务逻辑,保证聚合内的对象符合业务规则。</li> +<li><strong>管理生命周期</strong>:聚合根负责管理其内部对象的创建、修改和删除。它控制着聚合内部成员的生命周期,包括它们的创建、更新和删除。</li> +<li><strong>处理业务逻辑</strong>:聚合根负责处理与聚合相关的业务逻辑和操作,外部系统通过调用聚合根的方法来执行这些操作。它不仅是数据的容器,还负责封装与聚合相关的业务逻辑。</li> +</ul> +<p>其具有以下特性:</p> +<ul> +<li><strong>唯一入口</strong>:聚合根是聚合内部对象的唯一入口,外部系统只能与聚合根交互,而无法直接访问聚合内部的其他对象。这样可以避免外部系统直接修改聚合内的实体,确保聚合的一致性和业务逻辑的完整性。</li> +<li><strong>标识唯一性</strong>:每个聚合根都有一个全局唯一的标识符(ID),用以区分不同的聚合实例。</li> +<li><strong>事务边界</strong>:聚合根常常作为事务的边界,确保事务内的所有操作要么全部成功,要么全部失败,以此来维护数据的完整性。</li> +</ul> +<p>用 F# 来描述,以订单管理为例,大概写一下:</p> +<figure class="highlight fsharp"><table><tr><td class="code"><pre><span class="line"><span class="keyword">type</span> <span class="title class_">OrderStatus</span> <span class="operator">=</span> </span><br><span class="line"> <span class="operator">|</span> New</span><br><span class="line"> <span class="operator">|</span> Shipped</span><br><span class="line"> <span class="operator">|</span> Delivered</span><br><span class="line"> <span class="operator">|</span> Cancelled</span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> <span class="title class_">OrderItem</span> (productName<span class="operator">:</span> <span class="type">string</span>, price<span class="operator">:</span> <span class="type">float</span>, quantity<span class="operator">:</span> <span class="type">int</span>) <span class="operator">=</span> </span><br><span class="line"> <span class="keyword">do</span></span><br><span class="line"> <span class="keyword">if</span> quantity <span class="operator"><=</span> <span class="number">0</span> <span class="keyword">then</span></span><br><span class="line"> <span class="built_in">failwith</span> <span class="string">"Quantity must be positive"</span></span><br><span class="line"> </span><br><span class="line"> <span class="keyword">member</span> <span class="keyword">public</span> this.ProductName <span class="operator">=</span> productName</span><br><span class="line"> <span class="keyword">member</span> <span class="keyword">public</span> this.Price <span class="operator">=</span> price</span><br><span class="line"> <span class="keyword">member</span> <span class="keyword">public</span> this.Quantity <span class="operator">=</span> quantity</span><br><span class="line"> <span class="keyword">member</span> <span class="keyword">public</span> this.TotalPrice () <span class="operator">=</span> price <span class="operator">*</span> quantity</span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> <span class="title class_">Order</span> (<span class="built_in">id</span><span class="operator">:</span> <span class="type">int</span>, customerName<span class="operator">:</span> <span class="type">string</span>) <span class="operator">=</span> </span><br><span class="line"> <span class="keyword">let</span> <span class="keyword">mutable</span> status <span class="operator">=</span> OrderStatus.New</span><br><span class="line"> <span class="keyword">let</span> <span class="keyword">mutable</span> orderItems <span class="operator">=</span> []</span><br><span class="line"></span><br><span class="line"> <span class="keyword">member</span> <span class="keyword">public</span> this.Id <span class="operator">=</span> <span class="built_in">id</span></span><br><span class="line"> <span class="keyword">member</span> <span class="keyword">public</span> this.CustomerName <span class="operator">=</span> customerName</span><br><span class="line"> <span class="keyword">member</span> <span class="keyword">public</span> this.Status <span class="operator">=</span> status</span><br><span class="line"> <span class="keyword">member</span> <span class="keyword">public</span> this.OrderItems <span class="operator">=</span> orderItems</span><br><span class="line"></span><br><span class="line"> <span class="keyword">member</span> <span class="keyword">public</span> this.AddItem (item<span class="operator">:</span> OrderItem, price<span class="operator">:</span> <span class="type">float</span>, quantity<span class="operator">:</span> <span class="type">int</span>) <span class="operator">=</span></span><br><span class="line"> <span class="keyword">if</span> quantity <span class="operator"><=</span> <span class="number">0</span> <span class="keyword">then</span></span><br><span class="line"> <span class="built_in">failwith</span> <span class="string">"Quantity must be positive"</span></span><br><span class="line"> </span><br><span class="line"> orderItems <span class="operator"><-</span> orderItems <span class="operator">@</span> [OrderItem(item.ProductName, price, quantity)]</span><br><span class="line"></span><br><span class="line"> <span class="keyword">member</span> <span class="keyword">public</span> this.ChangeStatus (status<span class="operator">:</span> OrderStatus) <span class="operator">=</span></span><br><span class="line"> this.Status <span class="operator"><-</span> status</span><br><span class="line"></span><br><span class="line"> <span class="keyword">member</span> <span class="keyword">public</span> this.TotalPrice () <span class="operator">=</span></span><br><span class="line"> orderItems <span class="operator">|></span> List.sumBy (<span class="keyword">fun</span> item <span class="operator">-></span> item.TotalPrice())</span><br><span class="line"></span><br><span class="line"> <span class="keyword">member</span> <span class="keyword">public</span> this.GetTotalPrice () <span class="operator">=</span></span><br><span class="line"> orderItems <span class="operator">|></span> List.sumBy (<span class="keyword">fun</span> item <span class="operator">-></span> item.TotalPrice())</span><br></pre></td></tr></table></figure> + +<p>在这个例子中,<code>Order</code> 是聚合根,它通过 <code>AddItem</code> 方法来添加订单项,保证每个订单项符合业务规则。同时,聚合根 <code>Order</code> 还负责订单状态的管理,例如通过 <code>ChangeStatus</code> 方法来更新订单状态。<code>OrderItem</code> 是聚合内的一个实体,表示订单项,它通过 <code>GetTotalPrice</code> 方法来计算每个订单项的总价。外部系统只能通过 <code>Order</code> 聚合根来访问和操作订单项,而不能直接访问或修改 <code>OrderItem</code></p> +]]></content> + <tags> + <tag>Technique</tag> + <tag>Software Engineering</tag> + </tags> + </entry> + <entry> <title>关于</title> <url>/about.html</url> <content><![CDATA[<h2 id="韩暮秋"><a href="#韩暮秋" class="headerlink" title="韩暮秋"></a>韩暮秋</h2><blockquote> diff --git a/tag/index.html b/tag/index.html index d398ceb3..6fe27a9b 100644 --- a/tag/index.html +++ b/tag/index.html @@ -176,12 +176,6 @@ </span> <span class="post-tag"> - <a href="/tags/C/"> - C++ - </a> - </span> - - <span class="post-tag"> <a href="/tags/Obsidian/"> Obsidian </a> @@ -264,6 +258,12 @@ Music </a> </span> + + <span class="post-tag"> + <a href="/tags/Software-Engineering/"> + Software Engineering + </a> + </span> </div> </div> diff --git a/tags/Software-Engineering/index.html b/tags/Software-Engineering/index.html index 04f502e7..8051e4b1 100644 --- a/tags/Software-Engineering/index.html +++ b/tags/Software-Engineering/index.html @@ -20,7 +20,7 @@ -<title>Tag: Software-Engineering | 暮秋小屋</title> +<title>Tag: Software Engineering | 暮秋小屋</title> @@ -137,7 +137,7 @@ <p class="tag-title"> / <a href="/tag/">tags</a> - / <a href="">Software-Engineering</a> / + / <a href="">Software Engineering</a> / </p> <div class="post-list"> @@ -151,14 +151,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2025/02/19/Repository-pattern-in-Typescript/"> + <a href="/2025/03/13/%E9%A2%86%E5%9F%9F%E9%A9%B1%E5%8A%A8%E8%AE%BE%E8%AE%A1%E4%B8%AD%E7%9A%84%E2%80%9C%E8%81%9A%E5%90%88%E6%A0%B9%E2%80%9D/"> - Repository pattern in Typescript + 领域驱动设计中的“聚合根” </a> </div> - <span class="post-date">Feb 19, 2025</span> + <span class="post-date">Mar 13, 2025</span> </div> diff --git a/tags/Technique/index.html b/tags/Technique/index.html index 0ce05d91..b4f102c0 100644 --- a/tags/Technique/index.html +++ b/tags/Technique/index.html @@ -151,14 +151,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2025/02/19/Repository-pattern-in-Typescript/"> + <a href="/2025/03/13/%E9%A2%86%E5%9F%9F%E9%A9%B1%E5%8A%A8%E8%AE%BE%E8%AE%A1%E4%B8%AD%E7%9A%84%E2%80%9C%E8%81%9A%E5%90%88%E6%A0%B9%E2%80%9D/"> - Repository pattern in Typescript + 领域驱动设计中的“聚合根” </a> </div> - <span class="post-date">Feb 19, 2025</span> + <span class="post-date">Mar 13, 2025</span> </div> @@ -169,14 +169,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2025/02/18/Prisma-%E5%85%B3%E7%B3%BB%E5%9E%8B%E6%95%B0%E6%8D%AE%E5%BA%93%E7%9A%84-Self-relations/"> + <a href="/2025/02/19/Repository-pattern-in-Typescript/"> - Prisma 关系型数据库的 Self-relations + Repository pattern in Typescript </a> </div> - <span class="post-date">Feb 18, 2025</span> + <span class="post-date">Feb 19, 2025</span> </div> @@ -184,19 +184,17 @@ - <div class="year-title">2024</div> - <div class="post-list-item"> <div class="post-title"> - <a href="/2024/12/15/OCaml-News-2024-7/"> + <a href="/2025/02/18/Prisma-%E5%85%B3%E7%B3%BB%E5%9E%8B%E6%95%B0%E6%8D%AE%E5%BA%93%E7%9A%84-Self-relations/"> - OCaml News 2024-7 + Prisma 关系型数据库的 Self-relations </a> </div> - <span class="post-date">Dec 15, 2024</span> + <span class="post-date">Feb 18, 2025</span> </div> @@ -207,14 +205,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/10/18/10-Tips-for-Productive-FSharp-Scripting/"> + <a href="/2025/02/11/%E4%BB%8E%E4%BA%8B%E4%BB%B6%E9%A3%8E%E6%9A%B4%E7%9C%8B%E9%A2%86%E5%9F%9F%E9%A9%B1%E5%8A%A8%E8%AE%BE%E8%AE%A1/"> - 10 Tips for Productive FSharp Scripting + 从事件风暴看领域驱动设计 </a> </div> - <span class="post-date">Oct 18, 2024</span> + <span class="post-date">Feb 11, 2025</span> </div> @@ -225,14 +223,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/10/18/Building-custom-fibers-library-in-FSharp/"> + <a href="/2025/02/10/%E5%AE%9E%E6%97%B6%E6%90%9C%E7%B4%A2%E4%B8%AD%E7%9A%84%E9%98%B2%E6%8A%96%E5%87%BD%E6%95%B0/"> - Building custom fibers library in FSharp + 实时搜索中的防抖函数 </a> </div> - <span class="post-date">Oct 18, 2024</span> + <span class="post-date">Feb 10, 2025</span> </div> @@ -240,17 +238,19 @@ + <div class="year-title">2024</div> + <div class="post-list-item"> <div class="post-title"> - <a href="/2024/10/18/Dealing-with-complex-dependency-injection-in-FSharp/"> + <a href="/2024/12/15/OCaml-News-2024-7/"> - Dealing with complex dependency injection in FSharp + OCaml News 2024-7 </a> </div> - <span class="post-date">Oct 18, 2024</span> + <span class="post-date">Dec 15, 2024</span> </div> @@ -261,14 +261,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/10/06/Obsidian-Vault-%E7%9A%84-obsidian-%E7%9B%AE%E5%BD%95%E4%B8%AD%E7%9A%84%E5%90%84%E6%96%87%E4%BB%B6%E4%BD%9C%E7%94%A8/"> + <a href="/2024/10/18/10-Tips-for-Productive-FSharp-Scripting/"> - Obsidian Vault 的 .obsidian 目录中的各文件作用 + 10 Tips for Productive FSharp Scripting </a> </div> - <span class="post-date">Oct 6, 2024</span> + <span class="post-date">Oct 18, 2024</span> </div> @@ -279,14 +279,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/09/27/Turborepo-%E7%AE%80%E8%BF%B0/"> + <a href="/2024/10/18/Building-custom-fibers-library-in-FSharp/"> - Turborepo 简述 + Building custom fibers library in FSharp </a> </div> - <span class="post-date">Sep 27, 2024</span> + <span class="post-date">Oct 18, 2024</span> </div> @@ -297,14 +297,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/09/15/Advanced-C-binding-using-ocaml-ctypes-and-dune/"> + <a href="/2024/10/18/Dealing-with-complex-dependency-injection-in-FSharp/"> - Advanced C binding using ocaml-ctypes and dune + Dealing with complex dependency injection in FSharp </a> </div> - <span class="post-date">Sep 15, 2024</span> + <span class="post-date">Oct 18, 2024</span> </div> @@ -315,14 +315,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/09/12/Functional-Reactive-Programming-in-F/"> + <a href="/2024/10/06/Obsidian-Vault-%E7%9A%84-obsidian-%E7%9B%AE%E5%BD%95%E4%B8%AD%E7%9A%84%E5%90%84%E6%96%87%E4%BB%B6%E4%BD%9C%E7%94%A8/"> - Functional Reactive Programming in F# + Obsidian Vault 的 .obsidian 目录中的各文件作用 </a> </div> - <span class="post-date">Sep 12, 2024</span> + <span class="post-date">Oct 6, 2024</span> </div> diff --git a/tags/Technique/page/2/index.html b/tags/Technique/page/2/index.html index 38d2faa6..0f2ce626 100644 --- a/tags/Technique/page/2/index.html +++ b/tags/Technique/page/2/index.html @@ -151,14 +151,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/07/23/OCaml-News-2024-6/"> + <a href="/2024/09/27/Turborepo-%E7%AE%80%E8%BF%B0/"> - OCaml News 2024-6 + Turborepo 简述 </a> </div> - <span class="post-date">Jul 23, 2024</span> + <span class="post-date">Sep 27, 2024</span> </div> @@ -169,14 +169,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/07/01/OCaml-News-2024-4/"> + <a href="/2024/09/15/Advanced-C-binding-using-ocaml-ctypes-and-dune/"> - OCaml News 2024-4 + Advanced C binding using ocaml-ctypes and dune </a> </div> - <span class="post-date">Jul 1, 2024</span> + <span class="post-date">Sep 15, 2024</span> </div> @@ -187,14 +187,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/06/27/OCaml-News-2024-5/"> + <a href="/2024/09/12/Functional-Reactive-Programming-in-F/"> - OCaml News 2024-5 + Functional Reactive Programming in F# </a> </div> - <span class="post-date">Jun 27, 2024</span> + <span class="post-date">Sep 12, 2024</span> </div> @@ -205,14 +205,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/06/06/NET-AOT-%E4%B8%8B%E7%9A%84-F-%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%8F%82%E6%95%B0%E8%A7%A3%E6%9E%90%E5%BA%93%E9%80%89%E6%8B%A9/"> + <a href="/2024/07/23/OCaml-News-2024-6/"> - .NET AOT 下的 F# 命令行参数解析库选择 + OCaml News 2024-6 </a> </div> - <span class="post-date">Jun 6, 2024</span> + <span class="post-date">Jul 23, 2024</span> </div> @@ -223,14 +223,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/05/20/Rescript-genType-import-%E9%97%AE%E9%A2%98/"> + <a href="/2024/07/01/OCaml-News-2024-4/"> - Rescript @genType import 问题 + OCaml News 2024-4 </a> </div> - <span class="post-date">May 20, 2024</span> + <span class="post-date">Jul 1, 2024</span> </div> @@ -241,14 +241,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/02/26/OCaml-News-2024-3/"> + <a href="/2024/06/27/OCaml-News-2024-5/"> - OCaml News 2024-3 + OCaml News 2024-5 </a> </div> - <span class="post-date">Feb 26, 2024</span> + <span class="post-date">Jun 27, 2024</span> </div> @@ -259,14 +259,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/01/23/G-Machine/"> + <a href="/2024/06/06/NET-AOT-%E4%B8%8B%E7%9A%84-F-%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%8F%82%E6%95%B0%E8%A7%A3%E6%9E%90%E5%BA%93%E9%80%89%E6%8B%A9/"> - G-Machine + .NET AOT 下的 F# 命令行参数解析库选择 </a> </div> - <span class="post-date">Jan 23, 2024</span> + <span class="post-date">Jun 6, 2024</span> </div> @@ -277,14 +277,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/01/22/Rescript-React-Native/"> + <a href="/2024/05/20/Rescript-genType-import-%E9%97%AE%E9%A2%98/"> - Rescript and React Native + Rescript @genType import 问题 </a> </div> - <span class="post-date">Jan 22, 2024</span> + <span class="post-date">May 20, 2024</span> </div> @@ -295,14 +295,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/01/18/OCaml-News-2024-2/"> + <a href="/2024/02/26/OCaml-News-2024-3/"> - OCaml News 2024-2 + OCaml News 2024-3 </a> </div> - <span class="post-date">Jan 18, 2024</span> + <span class="post-date">Feb 26, 2024</span> </div> @@ -313,14 +313,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2024/01/08/OCaml-News-2024-1/"> + <a href="/2024/01/23/G-Machine/"> - OCaml News 2024-1 + G-Machine </a> </div> - <span class="post-date">Jan 8, 2024</span> + <span class="post-date">Jan 23, 2024</span> </div> diff --git a/tags/Technique/page/3/index.html b/tags/Technique/page/3/index.html index 42c3238e..b608f9b8 100644 --- a/tags/Technique/page/3/index.html +++ b/tags/Technique/page/3/index.html @@ -146,19 +146,19 @@ - <div class="year-title">2023</div> + <div class="year-title">2024</div> <div class="post-list-item"> <div class="post-title"> - <a href="/2023/10/21/OCaml-Core-Int-pow-%E7%9A%84%E5%AE%9E%E7%8E%B0/"> + <a href="/2024/01/22/Rescript-React-Native/"> - OCaml Core.Int.pow 的实现 + Rescript and React Native </a> </div> - <span class="post-date">Oct 21, 2023</span> + <span class="post-date">Jan 22, 2024</span> </div> @@ -169,14 +169,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/10/05/v8%E4%B8%AD%E7%9A%84Number-toString/"> + <a href="/2024/01/18/OCaml-News-2024-2/"> - v8中的Number.toString() + OCaml News 2024-2 </a> </div> - <span class="post-date">Oct 5, 2023</span> + <span class="post-date">Jan 18, 2024</span> </div> @@ -187,14 +187,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/09/28/A-Brief-History-of-Just-In-Time/"> + <a href="/2024/01/08/OCaml-News-2024-1/"> - A Brief History of Just-In-Time + OCaml News 2024-1 </a> </div> - <span class="post-date">Sep 28, 2023</span> + <span class="post-date">Jan 8, 2024</span> </div> @@ -202,17 +202,19 @@ + <div class="year-title">2023</div> + <div class="post-list-item"> <div class="post-title"> - <a href="/2023/08/15/tick-thread%E5%9C%A8Multicore-OCaml%E4%B8%AD%E7%9A%84%E4%BD%9C%E7%94%A8/"> + <a href="/2023/10/21/OCaml-Core-Int-pow-%E7%9A%84%E5%AE%9E%E7%8E%B0/"> - tick thread在Multicore OCaml中的作用 + OCaml Core.Int.pow 的实现 </a> </div> - <span class="post-date">Aug 15, 2023</span> + <span class="post-date">Oct 21, 2023</span> </div> @@ -223,14 +225,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/08/15/poll-error-attribute-in-OCaml/"> + <a href="/2023/10/05/v8%E4%B8%AD%E7%9A%84Number-toString/"> - 使用 [@poll error] 实现线程安全的数据结构 + v8中的Number.toString() </a> </div> - <span class="post-date">Aug 15, 2023</span> + <span class="post-date">Oct 5, 2023</span> </div> @@ -241,14 +243,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/07/21/WiscKey-Separating-Keys-from-Values-in-SSD-conscious-Storage/"> + <a href="/2023/09/28/A-Brief-History-of-Just-In-Time/"> - WiscKey: Separating Keys from Values in SSD-conscious Storage + A Brief History of Just-In-Time </a> </div> - <span class="post-date">Jul 21, 2023</span> + <span class="post-date">Sep 28, 2023</span> </div> @@ -259,14 +261,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/06/28/%E9%9A%90%E8%97%8F%E4%B8%80%E4%BA%9BOCaml-Effect%E7%9A%84%E6%9C%BA%E5%88%B6%EF%BC%8C%E8%AE%A9%E5%85%B6%E8%AF%AD%E6%B3%95%E5%9C%A8%E7%B2%BE%E7%A5%9E%E4%B8%8A%E6%9B%B4%E6%8E%A5%E8%BF%91delimcc/"> + <a href="/2023/08/15/tick-thread%E5%9C%A8Multicore-OCaml%E4%B8%AD%E7%9A%84%E4%BD%9C%E7%94%A8/"> - 隐藏一些OCaml Effect的机制,让其语法在精神上更接近delimcc + tick thread在Multicore OCaml中的作用 </a> </div> - <span class="post-date">Jun 28, 2023</span> + <span class="post-date">Aug 15, 2023</span> </div> @@ -277,14 +279,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/06/28/caml-release-runtime-system%E5%AF%BC%E8%87%B4%E7%9A%84%E6%AD%BB%E9%94%81%E9%97%AE%E9%A2%98/"> + <a href="/2023/08/15/poll-error-attribute-in-OCaml/"> - caml_release_runtime_system导致的死锁问题 + 使用 [@poll error] 实现线程安全的数据结构 </a> </div> - <span class="post-date">Jun 28, 2023</span> + <span class="post-date">Aug 15, 2023</span> </div> @@ -295,14 +297,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/05/24/Rust-%E9%97%AD%E5%8C%85-lifetime-may-not-live-long-enough-%E9%97%AE%E9%A2%98/"> + <a href="/2023/07/21/WiscKey-Separating-Keys-from-Values-in-SSD-conscious-Storage/"> - Rust 闭包 lifetime may not live long enough 问题 + WiscKey: Separating Keys from Values in SSD-conscious Storage </a> </div> - <span class="post-date">May 24, 2023</span> + <span class="post-date">Jul 21, 2023</span> </div> @@ -313,14 +315,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/05/12/C-20-%E5%AE%9E%E7%8E%B0-string-split/"> + <a href="/2023/06/28/%E9%9A%90%E8%97%8F%E4%B8%80%E4%BA%9BOCaml-Effect%E7%9A%84%E6%9C%BA%E5%88%B6%EF%BC%8C%E8%AE%A9%E5%85%B6%E8%AF%AD%E6%B3%95%E5%9C%A8%E7%B2%BE%E7%A5%9E%E4%B8%8A%E6%9B%B4%E6%8E%A5%E8%BF%91delimcc/"> - C++ 20 实现 string split + 隐藏一些OCaml Effect的机制,让其语法在精神上更接近delimcc </a> </div> - <span class="post-date">May 12, 2023</span> + <span class="post-date">Jun 28, 2023</span> </div> diff --git a/tags/Technique/page/4/index.html b/tags/Technique/page/4/index.html index 25655550..d802dbab 100644 --- a/tags/Technique/page/4/index.html +++ b/tags/Technique/page/4/index.html @@ -151,14 +151,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/05/11/C-vector-%E7%9A%84-push-back-%E5%92%8C-emplace-back/"> + <a href="/2023/06/28/caml-release-runtime-system%E5%AF%BC%E8%87%B4%E7%9A%84%E6%AD%BB%E9%94%81%E9%97%AE%E9%A2%98/"> - C++ vector 的 push_back 和 emplace_back + caml_release_runtime_system导致的死锁问题 </a> </div> - <span class="post-date">May 11, 2023</span> + <span class="post-date">Jun 28, 2023</span> </div> @@ -169,14 +169,14 @@ <div class="post-list-item"> <div class="post-title"> - <a href="/2023/05/04/C-%E7%9A%84-Trait/"> + <a href="/2023/05/24/Rust-%E9%97%AD%E5%8C%85-lifetime-may-not-live-long-enough-%E9%97%AE%E9%A2%98/"> - C++ 的 Trait + Rust 闭包 lifetime may not live long enough 问题 </a> </div> - <span class="post-date">May 4, 2023</span> + <span class="post-date">May 24, 2023</span> </div> diff --git a/tags/Web/index.html b/tags/Web/index.html index c244272d..1489a564 100644 --- a/tags/Web/index.html +++ b/tags/Web/index.html @@ -184,6 +184,24 @@ + + <div class="post-list-item"> + <div class="post-title"> + <a href="/2025/02/10/%E5%AE%9E%E6%97%B6%E6%90%9C%E7%B4%A2%E4%B8%AD%E7%9A%84%E9%98%B2%E6%8A%96%E5%87%BD%E6%95%B0/"> + + 实时搜索中的防抖函数 + + </a> + </div> + + <span class="post-date">Feb 10, 2025</span> + </div> + + + + + + <div class="year-title">2024</div> |
