<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Chang Luo</title>
    <link>https://luochang212.github.io/</link>
    <description>Recent content on Chang Luo</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Thu, 29 Jan 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://luochang212.github.io/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>智能的本质是对抗不确定</title>
      <link>https://luochang212.github.io/posts/the_essence/</link>
      <pubDate>Thu, 29 Jan 2026 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/the_essence/</guid>
      <description>&lt;p&gt;2019 年春，在晨光熹微的餐厅里，我独自坐在角落，思考智能如何产生。餐厅的名字已经忘了，只记得离开时，老板送我一根棒棒糖。糖很甜，我舔着糖回家。此后多年，这个问题一直萦绕在我心间，却没有答案。时间来到 2026 年，当我再度思考这个问题，发现如今对智能的理解不是太少，而是太多。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;一千个人对智能有一千五百种理解。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;Ilya 说，智能的本质是压缩。&lt;/p&gt;&#xA;&lt;p&gt;这是一种相当工程的理解。想象你学了很多驳杂无用的知识。某天偶得机缘，将它们融会贯通。原本分散在大脑中的知识骤然凝聚、浓缩。此刻，它们占据比往常更少的存储空间，却拥有更快的推理速度。这就是压缩。&lt;/p&gt;&#xA;&lt;p&gt;融会贯通的关键，在于找到引发知识凝聚的「内在关联」。在深度学习中，找这种内在关联有一种方法，叫作「注意力机制」。其虽名为注意力，却和注意力关系不大，本质上是一种搜索。通过反复迭代 Q, K, V 三矩阵，逐渐精炼出更好的 Q（问题），更好的 KV（答案的键值），从而实现对文本信息的高维抽取。&lt;/p&gt;&#xA;&lt;p&gt;Ilya 的理解已经足够触及本质，但我更想给出我的版本。如果 Ilya 是工程视角，回答的是如何训练出智能；那我就是演化视角，试图分析智能将往何处去。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;智能的本质是泛化，而泛化的本质是对抗不确定。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;这句话是未经允许擅自出现在我脑海中的。它是一个典型的三段论：因为智能的本质是泛化，而泛化的本质是对抗不确定，所以智能的本质是对抗不确定。&lt;/p&gt;&#xA;&lt;p&gt;虽然这句话属于浴中奇思，但推究下来居然挺有道理。早期智能只能完成图像识别、命名实体识别、文本摘要这种零散琐碎的任务。随着模型的演化，泛化能力逐渐增强，最终在语言这种泛化能力极强的模态中，诞生了大语言模型这个庞然大物。&lt;/p&gt;&#xA;&lt;p&gt;业界目前有种认知，就是大语言模型有缺陷，是因为缺少对物理世界的感知，所以大模型的下一站应该是「世界模型」。我认同这种观点，因为这是沿着泛化能力逐渐增强的路子往下走的。人类正是因为拥有无比强大的泛化能力，才能在自然界中生存下来。模型如果要超越人类，即 AGI，必然要在泛化性上超越人。所以在泛化性上做横向拓展，应该是确定的下一步。&lt;/p&gt;&#xA;&lt;p&gt;至于泛化的本质是对抗不确定，这个更好理解了。一个常见的用于解释泛化性的例子是：一个苹果被咬了一口，如果模型的泛化性好，依然可以被识别为苹果。泛化本身做的就是对抗不确定的事情，这个描述倒是浅白到无需解释。&lt;/p&gt;</description>
    </item>
    <item>
      <title>在树莓派上搭建家用 Agent 服务</title>
      <link>https://luochang212.github.io/posts/rpi_agent_server/</link>
      <pubDate>Sun, 18 Jan 2026 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/rpi_agent_server/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;使用树莓派搭建 &lt;a href=&#34;https://github.com/luochang212/dive-into-langgraph/tree/main/app&#34;&gt;dive-into-langgraph/app&lt;/a&gt; 服务，在家庭局域网内部使用。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;一键部署脚本：&lt;a href=&#34;https://github.com/luochang212/agent-server&#34;&gt;agent-server&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;一制作-tf-卡&#34;&gt;一、制作 TF 卡&lt;/h3&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; 你可以参考我的这篇博客《&lt;a href=&#34;https://luochang212.github.io/posts/raspberry_pi_5/&#34;&gt;树莓派 5 装机指南&lt;/a&gt;》，它写得更详细一些。但部分信息已经过时，请注意甄别。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;h4 id=&#34;1下载&#34;&gt;1）下载&lt;/h4&gt;&#xA;&lt;p&gt;你需要下载两样东西：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.raspberrypi.com/software/&#34;&gt;Raspberry Pi Imager&lt;/a&gt;：将镜像写入 TF 卡的工具&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://ubuntu.com/download/raspberry-pi&#34;&gt;Ubuntu 24.04.3 LTS&lt;/a&gt;：树莓派的 Ubuntu 镜像&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Ubuntu 镜像有两种版本：桌面版、服务器版，我们下载服务器版。下载的时候可以检查一下，安装包的文件名应该是这个 &lt;code&gt;ubuntu-24.04.3-preinstalled-server-arm64+raspi.img.xz&lt;/code&gt;&lt;/p&gt;&#xA;&lt;h4 id=&#34;2将镜像写入-tf-卡&#34;&gt;2）将镜像写入 TF 卡&lt;/h4&gt;&#xA;&lt;p&gt;根据 &lt;strong&gt;Raspberry Pi Imager&lt;/strong&gt; 的指引，完成镜像烧录的过程就好了。并没有什么难的。唯一需要注意的是，由于我们已经下载了 Ubuntu 镜像，所以这里要选「使用自定义镜像」。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/Raspberry-Pi-Imager-2025.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;二首次启动-ubuntu&#34;&gt;二、首次启动 Ubuntu&lt;/h3&gt;&#xA;&lt;p&gt;烧录完成后，按以下步骤操作：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;先断电，然后将 TF 卡插入板子&lt;/li&gt;&#xA;&lt;li&gt;连接外接显示屏、键盘、网线&lt;/li&gt;&#xA;&lt;li&gt;最后插入电源&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;一般来讲，插电即可点亮。这时回车一下，即可输入账号密码，初始账密是：&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;&lt;/th&gt;&#xA;          &lt;th&gt;&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;账号&lt;/td&gt;&#xA;          &lt;td&gt;ubuntu&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;密码&lt;/td&gt;&#xA;          &lt;td&gt;ubuntu&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;输完账密，它会接着让你设置新密码。这里流程设计得有点人机，需要注意看提示，不然容易卡关。温馨提示：你输入 &lt;code&gt;ubuntu&lt;/code&gt; 的次数比你想象中更多。&lt;/p&gt;&#xA;&lt;h3 id=&#34;三环境配置&#34;&gt;三、环境配置&lt;/h3&gt;&#xA;&lt;h4 id=&#34;1更新软件包&#34;&gt;1）更新软件包&lt;/h4&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#57606a&#34;&gt;# 更新软件源的索引列表&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt update&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#57606a&#34;&gt;# 根据更新后的索引，升级所有可更新的软件包&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt upgrade -y&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;2安装-pipx-和-uv&#34;&gt;2）安装 pipx 和 uv&lt;/h4&gt;&#xA;&lt;p&gt;先安装 &lt;code&gt;pipx&lt;/code&gt;，再用它安装 &lt;code&gt;uv&lt;/code&gt;：&lt;/p&gt;</description>
    </item>
    <item>
      <title>RAG：大模型时代的搜索基座</title>
      <link>https://luochang212.github.io/posts/rag_intro/</link>
      <pubDate>Sat, 27 Dec 2025 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/rag_intro/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;没有一条帆船能吹动自己行驶，它需要外面的风。 &amp;ndash; 因可觅《量子离歌》&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;大模型的训练数据有截止日期，在此之后的事它不知道；大模型的参数量有限，无法容纳所有专业知识。也就是说，大模型在实时性和专业性上都有所欠缺。&lt;/p&gt;&#xA;&lt;p&gt;如何让大模型变得实时且专业呢？最省力的方法是“打小抄”。&lt;strong&gt;知识库&lt;/strong&gt; 就像大模型的“小抄”。在回答问题之前，先瞅一眼小抄，看有没有与问题相关的内容。如果有，就从知识库中取回这段内容，结合大模型的推理能力，生成最终答案。&lt;/p&gt;&#xA;&lt;p&gt;这里「打小抄」的动作，就是 &lt;a href=&#34;https://docs.langchain.com/oss/python/langchain/retrieval&#34;&gt;&lt;strong&gt;RAG&lt;/strong&gt;&lt;/a&gt;（Retrieval-Augmented Generation, 检索增强生成）。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; 使用知识库可以让大模型的回答有据可依、减少幻觉，代价是需要承担知识库的构建成本。尤其当知识库的规模较大时，有必要想想是否值得支付对价。毕竟，通过扩大知识库的方式提升 Agent 性能，多少有点「用有限对抗无限，用确定对抗不确定」的意思。虽然我们总是在提起 RAG 时提到知识库，但 RAG 是一种检索技术，它可以检索任何内容。比起检索需要手动构建的知识库，用来检索联网内容、历史对话也是可以的，而且性价比很高。你的下一个检索对象，又何必是知识库。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;h2 id=&#34;一提示词模板&#34;&gt;一、提示词模板&lt;/h2&gt;&#xA;&lt;p&gt;RAG 做的事情并不复杂，就是从知识库中召回与用户问题有关的内容，作为上下文注入到 &lt;strong&gt;提示词模板 (Prompt Template)&lt;/strong&gt; 中。&lt;/p&gt;&#xA;&lt;p&gt;下面是一个提示词模板：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{context}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;---&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;基于上面给出的上下文，回答问题。&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;问题：{question}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;回答： &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;使用该模板时，将召回文本填入 &lt;code&gt;{context}&lt;/code&gt;，将用户问题填入 &lt;code&gt;{question}&lt;/code&gt;。然后把填好的提示词模板交给大模型推理。&lt;/p&gt;&#xA;&lt;p&gt;RAG 主要做了两件事：一是从知识库中 &lt;strong&gt;召回&lt;/strong&gt; 与用户问题有关的文本，二是使用提示词模板 &lt;strong&gt;拼接&lt;/strong&gt; 召回文本与用户问题。拼接很容易做到，难度主要集中在召回上。在下一小节中，我将介绍如何召回与用户问题有关的文本。&lt;/p&gt;&#xA;&lt;h2 id=&#34;二向量检索&#34;&gt;二、向量检索&lt;/h2&gt;&#xA;&lt;p&gt;完成「召回与用户问题有关的」这件事，需要用到检索器。实现检索器的方式有 &lt;a href=&#34;https://docs.langchain.com/oss/python/integrations/retrievers&#34;&gt;很多&lt;/a&gt;，比如基于关键词检索的 &lt;a href=&#34;https://docs.langchain.com/oss/python/integrations/retrievers/bm25&#34;&gt;BM25&lt;/a&gt; 算法，但本节主要介绍基于 Embedding 的检索方法：&lt;strong&gt;向量检索&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;h3 id=&#34;1从文本向量化说起&#34;&gt;1）从文本向量化说起&lt;/h3&gt;&#xA;&lt;p&gt;Embedding 是一种将文本转为向量的技术。它的输入是一段文本，输出是一个定长的向量。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;#34;好喜欢你&amp;#34; --&amp;gt; [0.190012, 0.123555, .... ]&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;将文本转为向量的目的，是把语义相近的词分配到同一片向量空间。所以，一对近义词转成向量后，它们的向量之间的距离通常比其他词更近。比如，足球和篮球在向量空间中的距离更近一些，而足球和篮筐之间的距离更远。Embedding 的本质是压缩。从编码角度讲，自然语言存在冗余信息。Embedding 相当于对自然语言进行重编码，用最少的 token 表达最多的语义。&lt;/p&gt;&#xA;&lt;p&gt;Embedding 在多语言场景下也有优势。经过充分训练的 Embedding 模型，会将多语言内容在语义层面上对齐。也就是说，一个向量可以在多语言环境中保持同一语义。这种特性让大模型得以兼容并包。即使加入多语言材料，也不会因为字面上的词不同，而产生“理解”上的混乱。&lt;/p&gt;&#xA;&lt;h3 id=&#34;2向量检索的原理&#34;&gt;2）向量检索的原理&lt;/h3&gt;&#xA;&lt;p&gt;由于 Embedding 模型具有将相似语义的词训练成距离相近的向量的特性，我们可以把「用户问题」与「知识库内容」都转成 Embedding 向量。然后计算向量之间的距离。向量之间的距离越小，则语料之间的相似度越高。借助这个原理，最后返回知识库中与问题向量距离最小的 Top-K 份语料即可。&lt;/p&gt;</description>
    </item>
    <item>
      <title>《LangGraph 1.0 完全指南》发布</title>
      <link>https://luochang212.github.io/posts/dive_into_langgraph/</link>
      <pubDate>Sun, 23 Nov 2025 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/dive_into_langgraph/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;经过三个星期的努力，&lt;a href=&#34;https://luochang212.github.io/dive-into-langgraph/&#34; target=&#34;_blank&#34;&gt;《LangGraph 1.0 完全指南》&lt;/a&gt;终于面世啦！&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;10 月中旬，LangGraph 1.0 发布。开发团队承诺这是一个稳定版本，未来不会大改。因此，现在正是学习它的好时候。&lt;/p&gt;&#xA;&lt;p&gt;LangGraph 是由 LangChain 团队开发的开源智能体框架。使用时它俩是紧密耦合的：LangChain 提供底层功能，LangGraph 负责状态管理。因此，两个库的文档都需要学习，这无疑加重了使用者的负担。为了让大家快速入门，我将两个库的主要功能提取出来，分成 13 个章节进行介绍。&lt;/p&gt;&#xA;&lt;p&gt;这是一个开源电子书项目，使用 GitHub Action 自动构建，欢迎 &lt;a href=&#34;https://github.com/luochang212/dive-into-langgraph/pulls&#34; target=&#34;_blank&#34;&gt;Pull Request&lt;/a&gt;。如果你觉得本教程对你有帮助，也欢迎 Star 本教程仓库 &lt;a href=&#34;https://github.com/luochang212/dive-into-langgraph&#34; target=&#34;_blank&#34;&gt;luochang212/dive-into-langgraph&lt;/a&gt;。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/d2lg-overview.png&#34; alt=&#34;overview&#34;&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;一在线资源&#34;&gt;一、在线资源&lt;/h3&gt;&#xA;&lt;p&gt;可以通过以下链接，访问本项目的仓库和在线文档：&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;资源&lt;/th&gt;&#xA;          &lt;th&gt;链接&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;GitHub 仓库&lt;/td&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://github.com/luochang212/dive-into-langgraph&#34; target=&#34;_blank&#34;&gt;luochang212/dive-into-langgraph&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;电子书&lt;/td&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://luochang212.github.io/dive-into-langgraph/&#34; target=&#34;_blank&#34;&gt;《LangGraph 1.0 完全指南》&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h3 id=&#34;二章节介绍&#34;&gt;二、章节介绍&lt;/h3&gt;&#xA;&lt;p&gt;本教程的内容速览：&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;序号&lt;/th&gt;&#xA;          &lt;th&gt;章节&lt;/th&gt;&#xA;          &lt;th&gt;主要内容&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;1&lt;/td&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://luochang212.github.io/dive-into-langgraph/quickstart/&#34;&gt;快速入门&lt;/a&gt;&lt;/td&gt;&#xA;          &lt;td&gt;创建你的第一个 ReAct Agent&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;2&lt;/td&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://luochang212.github.io/dive-into-langgraph/stategraph/&#34;&gt;状态图&lt;/a&gt;&lt;/td&gt;&#xA;          &lt;td&gt;使用 StateGraph 创建工作流&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;3&lt;/td&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://luochang212.github.io/dive-into-langgraph/middleware/&#34;&gt;中间件&lt;/a&gt;&lt;/td&gt;&#xA;          &lt;td&gt;使用自定义中间件实现四个功能：预算控制、消息截断、敏感词过滤、PII 检测&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;4&lt;/td&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://luochang212.github.io/dive-into-langgraph/human_in_the_loop/&#34;&gt;人机交互&lt;/a&gt;&lt;/td&gt;&#xA;          &lt;td&gt;使用内置的 HITL 中间件实现人机交互&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;5&lt;/td&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://luochang212.github.io/dive-into-langgraph/memory/&#34;&gt;记忆&lt;/a&gt;&lt;/td&gt;&#xA;          &lt;td&gt;创建短期记忆、长期记忆&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;6&lt;/td&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://luochang212.github.io/dive-into-langgraph/context/&#34;&gt;上下文工程&lt;/a&gt;&lt;/td&gt;&#xA;          &lt;td&gt;使用 State、Store、Runtime 管理上下文&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;7&lt;/td&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://luochang212.github.io/dive-into-langgraph/mcp_server/&#34;&gt;MCP Server&lt;/a&gt;&lt;/td&gt;&#xA;          &lt;td&gt;创建 MCP Server 并接入 LangGraph&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;8&lt;/td&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://luochang212.github.io/dive-into-langgraph/supervisor/&#34;&gt;监督者模式&lt;/a&gt;&lt;/td&gt;&#xA;          &lt;td&gt;两种方法实现监督者模式：tool-calling、langgraph-supervisor&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;9&lt;/td&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://luochang212.github.io/dive-into-langgraph/parallelization/&#34;&gt;并行&lt;/a&gt;&lt;/td&gt;&#xA;          &lt;td&gt;如何实现并发：节点并发、&lt;code&gt;@task&lt;/code&gt; 装饰器、Map-reduce、Sub-graphs&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;10&lt;/td&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://luochang212.github.io/dive-into-langgraph/rag/&#34;&gt;RAG&lt;/a&gt;&lt;/td&gt;&#xA;          &lt;td&gt;三种方式实现 RAG：向量检索、关键词检索、混合检索&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;11&lt;/td&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://luochang212.github.io/dive-into-langgraph/web_search/&#34;&gt;网络搜索&lt;/a&gt;&lt;/td&gt;&#xA;          &lt;td&gt;实现联网搜索：DashScope、Tavily 和 DDGS&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;12&lt;/td&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://luochang212.github.io/dive-into-langgraph/deep_agents/&#34;&gt;Deep Agents&lt;/a&gt;&lt;/td&gt;&#xA;          &lt;td&gt;简单介绍 Deep Agents&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;13&lt;/td&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://luochang212.github.io/dive-into-langgraph/langgraph_cli/&#34;&gt;调试页面&lt;/a&gt;&lt;/td&gt;&#xA;          &lt;td&gt;介绍 langgraph-cli 提供的调试页面&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h3 id=&#34;三拓展阅读&#34;&gt;三、拓展阅读&lt;/h3&gt;&#xA;&lt;p&gt;以下是推荐阅读的文档和教程：&lt;/p&gt;</description>
    </item>
    <item>
      <title>使用 Docker Compose 部署大数据集群：Spark &#43; Hadoop &#43; Hive &#43; JupyterLab</title>
      <link>https://luochang212.github.io/posts/bigdata_env/</link>
      <pubDate>Sat, 15 Nov 2025 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/bigdata_env/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;麻雀虽小，五脏俱全。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/bigdata-env&#34; target=&#34;_blank&#34;&gt;bigdata-env&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;引子&#34;&gt;引子&lt;/h3&gt;&#xA;&lt;p&gt;我有两台树莓派。&lt;/p&gt;&#xA;&lt;p&gt;凭借超高颜值，安安静静地摆在那里，就是超绝桌搭。担心没有实用性？有的兄弟，包有的。装上 &lt;a href=&#34;https://jupyterlab.readthedocs.io/en/stable/&#34;&gt;JupyterLab&lt;/a&gt;，它是数据科学工作站；装上 &lt;a href=&#34;https://www.kali.org/&#34;&gt;Kali Linux&lt;/a&gt;，它是黑客界的瑞士军刀；装上 &lt;a href=&#34;https://github.com/ggml-org/llama.cpp&#34;&gt;llama.cpp&lt;/a&gt;，它是你的私有 LLM 推理服务器。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/raspberry_pi_cluster.JPG&#34; alt=&#34;raspberry_pi_cluster&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;你可能不屑一顾，这些事一台树莓派也能搞定，何必弄两台呢？看来只有做一些两台机器才能办到的事，才算物尽其用。因此，我计划部署一个大数据集群。部署大数据集群是个技术活，不要期待一开始就在硬件上部署。可以先在 Docker Compose 上跑通，再尝试硬件部署。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; 如果对装机过程感兴趣，可以参考我的博客&lt;a href=&#34;https://luochang212.github.io/posts/raspberry_pi_5/&#34;&gt;《树莓派 5 装机指南》&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;h3 id=&#34;一集群功能&#34;&gt;一、集群功能&lt;/h3&gt;&#xA;&lt;p&gt;「大数据集群」是个宽泛的词儿。&lt;/p&gt;&#xA;&lt;p&gt;装了 Spark 的，可以是大数据集群；装了 Spark + Hadoop 的，也可以是大数据集群。那么到底要装到什么程度呢？这取决于我们的需求。作为常年耕作在数据一线的工程师，我认为基础需求包括：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;必须能分布式计算&lt;/li&gt;&#xA;&lt;li&gt;必须能分布式存储&lt;/li&gt;&#xA;&lt;li&gt;必须可以建分区表&lt;/li&gt;&#xA;&lt;li&gt;必须能使用分布式机器学习库 &lt;a href=&#34;https://spark.apache.org/docs/latest/api/python/reference/pyspark.ml.html&#34;&gt;pyspark.ml&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;必须有调度工具（当然 crontab 也算）&lt;/li&gt;&#xA;&lt;li&gt;必须有 JupyterLab&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;我的目标是搭建一个满足这些需求的集群。当然，我们没有必要从零开始搭建，因为前人已经有很优秀的工作。只需要基于前人的工作做一些拓展，就能实现我们想要的功能。&lt;a href=&#34;https://github.com/s1mplecc&#34;&gt;s1mplecc&lt;/a&gt; 大佬的&lt;a href=&#34;https://s1mple.cc/2021/10/12/%E4%BD%BF%E7%94%A8-Docker-%E5%BF%AB%E9%80%9F%E9%83%A8%E7%BD%B2-Spark-Hadoop-%E5%A4%A7%E6%95%B0%E6%8D%AE%E9%9B%86%E7%BE%A4/&#34;&gt;《使用 Docker 快速部署 Spark + Hadoop 大数据集群》&lt;/a&gt;就是一个很棒的基础工作。&lt;/p&gt;&#xA;&lt;p&gt;大佬已经实现了 &lt;a href=&#34;https://github.com/s1mplecc/spark-hadoop-docker&#34;&gt;Spark + Hadoop 集群&lt;/a&gt;，我只需要新增以下内容：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;沿用一主（Master）二从（Worker）的配置&lt;/li&gt;&#xA;&lt;li&gt;启用 Worker 节点的 DataNode 以支持数据同步&lt;/li&gt;&#xA;&lt;li&gt;安装 Hive 环境&lt;/li&gt;&#xA;&lt;li&gt;安装并初始化 miniconda3&lt;/li&gt;&#xA;&lt;li&gt;安装与 Spark 版本配适的 Python 和 PySpark&lt;/li&gt;&#xA;&lt;li&gt;安装 JupyterLab&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;主要增加了 Hive、JupyterLab 和 miniconda3。Hive 让我们更轻松地管理分区表；JupyterLab 提供了用于调试开发的浏览器界面；miniconda3 用作 Python 包管理。&lt;/p&gt;</description>
    </item>
    <item>
      <title>阿里发布新版 Quick BI，聊聊 ChatBI 的底层架构、交互设计和云计算生态</title>
      <link>https://luochang212.github.io/posts/quick_bi_intro/</link>
      <pubDate>Sat, 06 Sep 2025 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/quick_bi_intro/</guid>
      <description>&lt;p&gt;8月28日，阿里云发布了数据分析工具 &lt;a href=&#34;https://cn.aliyun.com/product/quick-bi&#34;&gt;Quick BI&lt;/a&gt; 的全新版本。它是大模型应用在 BI 行业的最新实践。Quick BI 在云计算基础设施之上，搭建了一个 ChatBI 应用。阿里为这个应用起了一个拟人化的名字：智能小Q。智能小Q允许用户以对话的形式探索数据。无需写 SQL，只需与小Q对话，即可获得想要的统计信息。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/quick-bi-func.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;智能小Q其实是一个多智能体系统（multi-agent system），包含多个 Agent：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;报告 Agent&lt;/li&gt;&#xA;&lt;li&gt;问数 Agent&lt;/li&gt;&#xA;&lt;li&gt;搭建 Agent&lt;/li&gt;&#xA;&lt;li&gt;解读 Agent&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;这些 Agent 均由领域大模型驱动。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; 领域大模型经过 SFT、RL 微调，可将业务知识迁移泛化到同类任务中，从而在特定领域获得更优表现。此外，领域大模型的参数量小、推理速度快，也是优势之一。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;h3 id=&#34;一智能小q能做什么&#34;&gt;一、智能小Q能做什么？&lt;/h3&gt;&#xA;&lt;p&gt;下面介绍智能小Q的两种模式：问数和解读。&lt;/p&gt;&#xA;&lt;h4 id=&#34;1问数界面&#34;&gt;1）问数界面&lt;/h4&gt;&#xA;&lt;p&gt;当用户提问：“店日均杯量是多少？”小Q可以找到数据并可视化，这就是“问数”。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/quick-bi-vis.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h4 id=&#34;2解读界面&#34;&gt;2）解读界面&lt;/h4&gt;&#xA;&lt;p&gt;解读界面允许用户筛选面板中的数据，并基于筛选后的数据向小Q提问。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/quick-bi-context.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;将「筛选后的数据」作为上下文向小Q提问有什么优势？&lt;/p&gt;&#xA;&lt;p&gt;一方面，直接引用数据源意味着大模型无需去猜你想分析哪张表，节省了宝贵的 token；另一方面，直接引用提问涉及的数据范围，有助于大模型关注到真正有用的线索，避免大模型因为找不到重点，变得泛泛而谈。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;在与智能体的对话中，明确引用所指对象是好文明！&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;h3 id=&#34;二拆解-quick-bi-技术路径&#34;&gt;二、拆解 Quick BI 技术路径&lt;/h3&gt;&#xA;&lt;p&gt;Quick BI 的底层架构是 &lt;strong&gt;Agent + 数据库&lt;/strong&gt;。只要有这两个核心模块，你也能做出简易的 ChatBI，这一点在我的开源项目 &lt;a href=&#34;https://github.com/luochang212/clickhouse-chatbi&#34;&gt;luochang212/clickhouse-chatbi&lt;/a&gt; 中亦有记载。其中，Agent 对 Quick BI 的实现尤为关键。&lt;/p&gt;&#xA;&lt;p&gt;先来盘一盘 Agent 框架有哪些能力？&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;能力&lt;/th&gt;&#xA;          &lt;th&gt;技术&lt;/th&gt;&#xA;          &lt;th&gt;代表&lt;/th&gt;&#xA;          &lt;th&gt;偏向&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;路由&lt;/td&gt;&#xA;          &lt;td&gt;Router&lt;/td&gt;&#xA;          &lt;td&gt;ChatGPT&lt;/td&gt;&#xA;          &lt;td&gt;模型&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;检索&lt;/td&gt;&#xA;          &lt;td&gt;RAG&lt;/td&gt;&#xA;          &lt;td&gt;LlamaIndex&lt;/td&gt;&#xA;          &lt;td&gt;工程&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;状态&lt;/td&gt;&#xA;          &lt;td&gt;Session&lt;/td&gt;&#xA;          &lt;td&gt;Google ADK&lt;/td&gt;&#xA;          &lt;td&gt;工程&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;记忆&lt;/td&gt;&#xA;          &lt;td&gt;Memory&lt;/td&gt;&#xA;          &lt;td&gt;Letta&lt;/td&gt;&#xA;          &lt;td&gt;工程&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;交互&lt;/td&gt;&#xA;          &lt;td&gt;ReActChat&lt;/td&gt;&#xA;          &lt;td&gt;Qwen Agent&lt;/td&gt;&#xA;          &lt;td&gt;模型&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;工具&lt;/td&gt;&#xA;          &lt;td&gt;MCP&lt;/td&gt;&#xA;          &lt;td&gt;Claude&lt;/td&gt;&#xA;          &lt;td&gt;工程&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;规划&lt;/td&gt;&#xA;          &lt;td&gt;Supervisor&lt;/td&gt;&#xA;          &lt;td&gt;LangGraph&lt;/td&gt;&#xA;          &lt;td&gt;工程&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;安全&lt;/td&gt;&#xA;          &lt;td&gt;Guardrails&lt;/td&gt;&#xA;          &lt;td&gt;OpenAI Agents&lt;/td&gt;&#xA;          &lt;td&gt;工程&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;&lt;em&gt;* 上面的「代表」不是 SOTA 的意思，只是我第一个想到的例子&lt;/em&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>耶是 ClickHouse！我们有救了！！</title>
      <link>https://luochang212.github.io/posts/chat_to_clickhouse/</link>
      <pubDate>Sat, 26 Jul 2025 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/chat_to_clickhouse/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;本来我懒得装，但是 MySQL 太慢了，遭不住，咱还是把 ClickHouse 装起来吧。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/chat-to-clickhouse&#34; target=&#34;_blank&#34;&gt;chat-to-clickhouse&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;在&lt;a href=&#34;https://luochang212.github.io/posts/agent_project/&#34;&gt;《Agent 实战：智能路由、任务拆解和链路工程》&lt;/a&gt;一文中，我实现了一个简单的 ChatBI，它能查询 MySQL 数据库。对于小批量数据量，MySQL 尚可应付，但是当数据量来到千万量级时，一次 MySQL 查询将消耗数秒甚至数十秒，这么长的等待时间是用户难以忍受的。而且 Agent 还有一个技术问题，它的 NL2SQL 尚未做到 one-shot，也就是说，在拿到最终结果前，它也许需要多次试错，这将进一步拉长查询时间。&lt;/p&gt;&#xA;&lt;p&gt;如何无痛解决查询效率低下的问题呢？很简单，只需要换数据库就可以做到。这便引入今天的主角：ClickHouse。&lt;/p&gt;&#xA;&lt;h3 id=&#34;一分析利器&#34;&gt;一、分析利器&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/ClickHouse/ClickHouse&#34;&gt;ClickHouse&lt;/a&gt; 是 Yandex 旗下的一款开源的列式存储数据库，专为 &lt;strong&gt;联机分析处理&lt;/strong&gt; (OLAP) 场景设计。在做数据分析时，它比传统数据库快几倍到几十倍。分析场景的核心需求是「聚合计算」，即 &lt;code&gt;GROUP BY&lt;/code&gt; 子句下的 &lt;code&gt;SUM&lt;/code&gt;, &lt;code&gt;AVG&lt;/code&gt;, &lt;code&gt;COUNT&lt;/code&gt; 操作，这些正是 ClickHouse 的强项。&lt;/p&gt;&#xA;&lt;p&gt;为什么它的聚合计算如此之快呢？因为它具有如下特性：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;列式存储&lt;/strong&gt;：顾名思义，列存的数据是按列存储的。这种存储方式可以减少无效 I/O，因为列存可以只读取查询中涉及的列。而非行存那样，读取整行后再丢掉不需要的列&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;并行计算&lt;/strong&gt;：列存的另一个优势是数据更容易切分。单列数据的连续性和同构性更强，无需考虑与其他列的关联，因此可以更方便地按维度（如时间区间、数值分段）拆分并分配到不同节点。当然，这种设计的代价是使得插入操作变得更加昂贵&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;物化视图&lt;/strong&gt;：物化视图可以把高频分析的结果提前算好存在表里，后续查询直接读结果，无需重新计算&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;二安装过程&#34;&gt;二、安装过程&lt;/h3&gt;&#xA;&lt;p&gt;用 &lt;a href=&#34;https://hub.docker.com/r/clickhouse/clickhouse-server/&#34;&gt;Docker&lt;/a&gt; 安装，过程相对简单。工业界在集群上装，比咱们这个复杂不少。&lt;/p&gt;&#xA;&lt;h4 id=&#34;1-配置-docker-镜像源&#34;&gt;1. 配置 Docker 镜像源&lt;/h4&gt;&#xA;&lt;p&gt;中国大陆地区下载镜像，需要配置镜像源。&lt;/p&gt;&#xA;&lt;p&gt;对于 Linux 系统，需要在 &lt;code&gt;/etc/docker/daemon.json&lt;/code&gt; 文件中配置镜像源（如下）。&lt;code&gt;Windows&lt;/code&gt; 和 &lt;code&gt;MacOS&lt;/code&gt; 系统更方便一点，可以直接在 &lt;code&gt;Docker Desktop&lt;/code&gt; 的 &lt;code&gt;Settings -&amp;gt; Docker Engine&lt;/code&gt; 页面修改 &lt;code&gt;daemon.json&lt;/code&gt; 文件。&lt;/p&gt;</description>
    </item>
    <item>
      <title>新瓶装旧酒：纸牌魔术 MCP</title>
      <link>https://luochang212.github.io/posts/card_magic_mcp/</link>
      <pubDate>Sat, 12 Jul 2025 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/card_magic_mcp/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;Chico 和 Dico 是两名魔术师，他们有一个经典纸牌魔术：抽五张扑克牌，根据前四张，猜第五张是什么。完成这个魔术不需要任何魔术师的技巧，它完全建立在数学原理之上。只需要一点数学知识和充分的练习，你也能表演这个魔术。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/card-magic-mcp&#34; target=&#34;_blank&#34;&gt;card-magic-mcp&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;五年前，我写了一篇文章&lt;a href=&#34;https://luochang212.github.io/posts/chico_and_dico/&#34;&gt;《用魔法打败魔法》&lt;/a&gt;，介绍 Chico &amp;amp; Dico 魔术的数学原理，并用 Python 实现了这个魔术。随着时代的发展、科技的进步，今天我们有更简单的方法来玩这个魔术，不需要运行 Python，不需要看懂公式，只需要打开 &lt;a href=&#34;https://www.modelscope.cn/mcp/servers/FMoBall/card-magic-mcp&#34;&gt;ModelScope&lt;/a&gt; 和大模型对话，就可以轻松体验这个魔术↓↓↓&lt;/p&gt;&#xA;&lt;p&gt;访问 &lt;code&gt;ModelScope Playground&lt;/code&gt;: &lt;a href=&#34;https://www.modelscope.cn/studios/modelscope/mcp-playground?studio_additional_params=%7B%0A%20%20%22mcpServers%22%3A%20%7B%0A%20%20%20%20%22card-magic-mcp%22%3A%20%7B%0A%20%20%20%20%20%20%22type%22%3A%20%22sse%22%2C%0A%20%20%20%20%20%20%22url%22%3A%20%22https%3A%2F%2Fmcp.api-inference.modelscope.net%2Ffcfa3b28ef6a4f%2Fsse%22%0A%20%20%20%20%7D%0A%20%20%7D%0A%7D&#34;&gt;card-magic-mcp&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;下面我将介绍这个魔术的数学原理和算法实现，然后讲解如何用 FastMCP 将魔术流程包装成大语言模型可以调用的工具（MCP Server）。&lt;/p&gt;&#xA;&lt;h3 id=&#34;chico--dico-的魔术&#34;&gt;Chico &amp;amp; Dico 的魔术&lt;/h3&gt;&#xA;&lt;p&gt;Chico 和 Dico 是两位魔术师，他们经常表演的一个魔术是这样的：Chico 将一副 52 张的扑克牌交给观众，让他抽取其中的 5 张。然后 Chico 将这 5 张牌按一定的顺序重新排列，再将其还给观众。上述整个过程 Dico 都是看不见的。然而，当观众按 Chico 排好的顺序依次展示前四张牌之后，Dico 却能准确地说出第五张牌是什么。&lt;/p&gt;&#xA;&lt;p&gt;乍一看这个魔术很神奇。随机抽取 5 张牌，你能从前 4 张牌中看出第 5 张牌是什么吗？对于普通人来说，当然不行。Chico 和 Dico 的秘诀在于 Chico 有机会将扑克重新排序。如果两人事先约定好某种协议，Chico 有可能通过前四张扑克排列的顺序，向 Dico 传递关于第 5 张牌的信息。&lt;/p&gt;&#xA;&lt;p&gt;关键在于如何实现这种协议。&lt;/p&gt;&#xA;&lt;h3 id=&#34;数学原理&#34;&gt;数学原理&lt;/h3&gt;&#xA;&lt;p&gt;在进行分析之前，我们需要把 Chico &amp;amp; Dico 的魔术抽象成一个数学模型。&lt;/p&gt;&#xA;&lt;p&gt;魔术本身已经提供了一些建模信息。假设一共有 &lt;code&gt;$n$&lt;/code&gt; 张牌，抽取其中的 &lt;code&gt;$k$&lt;/code&gt; 张。在对牌进行某种排序之后，我们需要利用前 &lt;code&gt;$(k - j)$&lt;/code&gt; 张牌的信息，推测后 &lt;code&gt;$j$&lt;/code&gt; 张牌是什么。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Agent 实战：智能路由、任务拆解和链路工程</title>
      <link>https://luochang212.github.io/posts/agent_project/</link>
      <pubDate>Sun, 15 Jun 2025 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/agent_project/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;大模型天生具有幻觉，为了工程的准确性，我们奉行“非必要不Agent”原则。我们是专业的，除非忍不住，否则绝不用 Agent。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;特别声明：本文使用 &lt;a href=&#34;https://github.com/QwenLM/Qwen-Agent&#34;&gt;Qwen Agent&lt;/a&gt; 实现。&lt;/p&gt;&#xA;&lt;p&gt;本文包含以下两个项目：&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;1）智能路由&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;概述&lt;/strong&gt;：如果一个业务可以分很多种情况处理。针对每种情况，我们开发一个工具函数 (Function Calling)，来处理此种情况内部的复杂性。此时，Agent 充当智能路由的角色，将对应的情况路由到对应的工具函数。工具函数内部带有描述信息，Agent 可以访问这些信息，以此判断在何种情况下，调用这个工具函数。&lt;/p&gt;&#xA;&lt;p&gt;具体来讲，本项目开发了一个 &lt;strong&gt;客诉核查 Agent&lt;/strong&gt;。针对 物流逾期 和 假货 两种客诉，分别开发了对应的工具函数。&lt;strong&gt;Agent 通过接入工具函数，获得了核查以上两种客诉真实性的能力&lt;/strong&gt;。当我们将客诉信息传递给 Agent，它会输出针对该客诉的 &lt;strong&gt;核查结论&lt;/strong&gt; 和 &lt;strong&gt;相应证据&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;2）数据库查询优化&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;概述&lt;/strong&gt;：数据库查询是一个非常通用的需求，其中 &lt;strong&gt;NL2SQL&lt;/strong&gt; 是难点。为了提升 NL2SQL 的准确性，很容易想到把数据表的 Schema、样例数据、个别字段的枚举值作为上下文 (context) 注入到原始 Prompt 中。本项目实现了这一点。&lt;/p&gt;&#xA;&lt;p&gt;具体来说，本项目做了以下工作：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;启用 Qwen Agent 的 &lt;strong&gt;ReActChat&lt;/strong&gt; 模式，以提升多步骤情况下的性能&lt;/li&gt;&#xA;&lt;li&gt;开发定制的 &lt;strong&gt;Workflow&lt;/strong&gt;，用于将 Schema 等上下文信息注入原始 Prompt 中&lt;/li&gt;&#xA;&lt;li&gt;开发可流式对话的 &lt;strong&gt;Gradio WebUI&lt;/strong&gt;，以方便调试 Agent 和 Workflow&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;✨ 所有代码见 GitHub 仓库：&lt;a href=&#34;https://github.com/luochang212/agent-project&#34;&gt;luochang212/agent-project&lt;/a&gt;&lt;/p&gt;&#xA;&lt;!-- - 智能路由代码见：[intelligent_routing](https://github.com/luochang212/agent-project/tree/main/intelligent_routing)&#xA;- 数据库查询优化代码见：&#xA;    - Agent: [gradio_postgres_agent.py](https://github.com/luochang212/agent-project/blob/main/gradio_postgres_agent.py)&#xA;    - Workflow: [gradio_postgres_workflow.py](https://github.com/luochang212/agent-project/blob/main/gradio_postgres_workflow.py) --&gt;&#xA;&lt;h2 id=&#34;一引言&#34;&gt;一、引言&lt;/h2&gt;&#xA;&lt;h3 id=&#34;1-尚未到来的涌现&#34;&gt;1. 尚未到来的涌现&lt;/h3&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;We always overestimate the change that will occur in the next two years and underestimate the change that will occur in the next ten. &amp;ndash; Bill Gates&lt;/p&gt;</description>
    </item>
    <item>
      <title>AUV～ 演出现场</title>
      <link>https://luochang212.github.io/posts/underground_idols/</link>
      <pubDate>Sat, 17 May 2025 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/underground_idols/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;来看演出了，耶诶！✧\(&amp;gt;o&amp;lt;)ﾉ✧&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;style&gt;&#xA;.music-player {&#xA;  display: block;&#xA;}&#xA;&#xA;.row {&#xA;  display: flex;&#xA;  flex-wrap: wrap;&#xA;  padding: 2px 20px;&#xA;}&#xA;&#xA;.column {&#xA;  flex: 50%;&#xA;  padding: 4px;&#xA;}&#xA;&#xA;.column img {&#xA;  width: 100%;&#xA;  vertical-align: middle;&#xA;  border-radius: 0;&#xA;  margin-bottom: 8px;&#xA;}&#xA;&#xA;.column img:last-child {&#xA;  margin-bottom: 0;&#xA;}&#xA;&#xA;@media screen and (max-width: 768px) {&#xA;  .music-player {&#xA;    display: none;&#xA;  }&#xA;&#xA;  .row {&#xA;    display: flex;&#xA;    flex-wrap: wrap;&#xA;    padding: 2px 13px;&#xA;  }&#xA;&#xA;  .column {&#xA;    flex: 50%;&#xA;    padding: 2px;&#xA;  }&#xA;&#xA;  .column img {&#xA;    width: 100%;&#xA;    vertical-align: middle;&#xA;    border-radius: 0;&#xA;    margin-bottom: 4px;&#xA;  }&#xA;}&#xA;&lt;/style&gt;&#xA;&lt;div class=&#34;music-player&#34;&gt;&#xA;&lt;iframe frameborder=&#34;0&#34; border=&#34;1&#34; name=&#34;VOY@GER&#34; scrolling=&#34;no&#34; width=&#34;100%&#34; height=&#34;110&#34; src=&#34;//music.163.com/outchain/player?type=2&amp;id=1868672830&amp;auto=0&amp;height=90&#34; style=&#34;max-width:100%;&#34;&gt;&lt;/iframe&gt;&#xA;&lt;/div&gt;&#xA;&lt;div class=&#34;row&#34;&gt;&#xA;  &lt;div class=&#34;column&#34;&gt;&#xA;    &lt;img src=&#34;https://luochang212.github.io/img/idols/1.jpeg&#34; alt=&#34;1.jpeg&#34; loading=&#34;lazy&#34;&gt;&#xA;    &lt;img src=&#34;https://luochang212.github.io/img/idols/3.jpeg&#34; alt=&#34;3.jpeg&#34; loading=&#34;lazy&#34;&gt;&#xA;    &lt;img src=&#34;https://luochang212.github.io/img/idols/5.jpeg&#34; alt=&#34;5.jpeg&#34; loading=&#34;lazy&#34;&gt;&#xA;    &lt;img src=&#34;https://luochang212.github.io/img/idols/7.jpeg&#34; alt=&#34;7.jpeg&#34; loading=&#34;lazy&#34;&gt;&#xA;    &lt;img src=&#34;https://luochang212.github.io/img/idols/9.jpeg&#34; alt=&#34;9.jpeg&#34; loading=&#34;lazy&#34;&gt;&#xA;    &lt;img src=&#34;https://luochang212.github.io/img/idols/11.jpeg&#34; alt=&#34;11.jpeg&#34; loading=&#34;lazy&#34;&gt;&#xA;    &lt;img src=&#34;https://luochang212.github.io/img/idols/13.jpeg&#34; alt=&#34;13.jpeg&#34; loading=&#34;lazy&#34;&gt;&#xA;    &lt;img src=&#34;https://luochang212.github.io/img/idols/15.jpeg&#34; alt=&#34;15.jpeg&#34; loading=&#34;lazy&#34;&gt;&#xA;    &lt;img src=&#34;https://luochang212.github.io/img/idols/17.jpeg&#34; alt=&#34;17.jpeg&#34; loading=&#34;lazy&#34;&gt;&#xA;    &lt;img src=&#34;https://luochang212.github.io/img/idols/19.jpeg&#34; alt=&#34;19.jpeg&#34; loading=&#34;lazy&#34;&gt;&#xA;    &lt;img src=&#34;https://luochang212.github.io/img/idols/21.jpeg&#34; alt=&#34;21.jpeg&#34; loading=&#34;lazy&#34;&gt;&#xA;    &lt;img src=&#34;https://luochang212.github.io/img/idols/23.jpeg&#34; alt=&#34;23.jpeg&#34; loading=&#34;lazy&#34;&gt;&#xA;    &lt;img src=&#34;https://luochang212.github.io/img/idols/25.jpeg&#34; alt=&#34;25.jpeg&#34; loading=&#34;lazy&#34;&gt;&#xA;    &lt;img src=&#34;https://luochang212.github.io/img/idols/27.jpeg&#34; alt=&#34;27.jpeg&#34; loading=&#34;lazy&#34;&gt;&#xA;    &lt;img src=&#34;https://luochang212.github.io/img/idols/29.jpeg&#34; alt=&#34;29.jpeg&#34; loading=&#34;lazy&#34;&gt;&#xA;    &lt;img src=&#34;https://luochang212.github.io/img/idols/31.jpeg&#34; alt=&#34;31.jpeg&#34; loading=&#34;lazy&#34;&gt;&#xA;    &lt;img src=&#34;https://luochang212.github.io/img/idols/33.jpeg&#34; alt=&#34;33.jpeg&#34; loading=&#34;lazy&#34;&gt;&#xA;    &lt;img src=&#34;https://luochang212.github.io/img/idols/39.jpeg&#34; alt=&#34;39.jpeg&#34; loading=&#34;lazy&#34;&gt;&#xA;    &lt;img src=&#34;https://luochang212.github.io/img/idols/41.jpeg&#34; alt=&#34;41.jpeg&#34; loading=&#34;lazy&#34;&gt;&#xA;    &lt;img src=&#34;https://luochang212.github.io/img/idols/43.jpeg&#34; alt=&#34;43.jpeg&#34; loading=&#34;lazy&#34;&gt;&#xA;    &lt;img src=&#34;https://luochang212.github.io/img/idols/45.jpeg&#34; alt=&#34;45.jpeg&#34; loading=&#34;lazy&#34;&gt;&#xA;    &lt;img src=&#34;https://luochang212.github.io/img/idols/47.jpeg&#34; alt=&#34;47.jpeg&#34; loading=&#34;lazy&#34;&gt;&#xA;  &lt;/div&gt;&#xA;  &lt;div class=&#34;column&#34;&gt;&#xA;    &lt;img src=&#34;https://luochang212.github.io/img/idols/4.jpeg&#34; alt=&#34;2.jpeg&#34; loading=&#34;lazy&#34;&gt;&#xA;    &lt;img src=&#34;https://luochang212.github.io/img/idols/6.jpeg&#34; alt=&#34;6.jpeg&#34; loading=&#34;lazy&#34;&gt;&#xA;    &lt;img src=&#34;https://luochang212.github.io/img/idols/2.jpeg&#34; alt=&#34;4.jpeg&#34; loading=&#34;lazy&#34;&gt;&#xA;    &lt;img src=&#34;https://luochang212.github.io/img/idols/8.jpeg&#34; alt=&#34;8.jpeg&#34; loading=&#34;lazy&#34;&gt;&#xA;    &lt;img src=&#34;https://luochang212.github.io/img/idols/10.jpeg&#34; alt=&#34;10.jpeg&#34; loading=&#34;lazy&#34;&gt;&#xA;    &lt;img src=&#34;https://luochang212.github.io/img/idols/12.jpeg&#34; alt=&#34;12.jpeg&#34; loading=&#34;lazy&#34;&gt;&#xA;    &lt;img src=&#34;https://luochang212.github.io/img/idols/16.jpeg&#34; alt=&#34;16.jpeg&#34; loading=&#34;lazy&#34;&gt;&#xA;    &lt;img src=&#34;https://luochang212.github.io/img/idols/18.jpeg&#34; alt=&#34;18.jpeg&#34; loading=&#34;lazy&#34;&gt;&#xA;    &lt;img src=&#34;https://luochang212.github.io/img/idols/22.jpeg&#34; alt=&#34;22.jpeg&#34; loading=&#34;lazy&#34;&gt;&#xA;    &lt;img src=&#34;https://luochang212.github.io/img/idols/24.jpeg&#34; alt=&#34;24.jpeg&#34; loading=&#34;lazy&#34;&gt;&#xA;    &lt;img src=&#34;https://luochang212.github.io/img/idols/26.jpeg&#34; alt=&#34;26.jpeg&#34; loading=&#34;lazy&#34;&gt;&#xA;    &lt;img src=&#34;https://luochang212.github.io/img/idols/28.jpeg&#34; alt=&#34;28.jpeg&#34; loading=&#34;lazy&#34;&gt;&#xA;    &lt;img src=&#34;https://luochang212.github.io/img/idols/30.jpeg&#34; alt=&#34;30.jpeg&#34; loading=&#34;lazy&#34;&gt;&#xA;    &lt;img src=&#34;https://luochang212.github.io/img/idols/32.jpeg&#34; alt=&#34;32.jpeg&#34; loading=&#34;lazy&#34;&gt;&#xA;    &lt;img src=&#34;https://luochang212.github.io/img/idols/34.jpeg&#34; alt=&#34;34.jpeg&#34; loading=&#34;lazy&#34;&gt;&#xA;    &lt;img src=&#34;https://luochang212.github.io/img/idols/36.jpeg&#34; alt=&#34;36.jpeg&#34; loading=&#34;lazy&#34;&gt;&#xA;    &lt;img src=&#34;https://luochang212.github.io/img/idols/38.jpeg&#34; alt=&#34;38.jpeg&#34; loading=&#34;lazy&#34;&gt;&#xA;    &lt;img src=&#34;https://luochang212.github.io/img/idols/40.jpeg&#34; alt=&#34;40.jpeg&#34; loading=&#34;lazy&#34;&gt;&#xA;    &lt;img src=&#34;https://luochang212.github.io/img/idols/42.jpeg&#34; alt=&#34;42.jpeg&#34; loading=&#34;lazy&#34;&gt;&#xA;    &lt;img src=&#34;https://luochang212.github.io/img/idols/44.jpeg&#34; alt=&#34;44.jpeg&#34; loading=&#34;lazy&#34;&gt;&#xA;    &lt;img src=&#34;https://luochang212.github.io/img/idols/48.jpeg&#34; alt=&#34;48.jpeg&#34; loading=&#34;lazy&#34;&gt;&#xA;    &lt;img src=&#34;https://luochang212.github.io/img/idols/50.jpeg&#34; alt=&#34;50.jpeg&#34; loading=&#34;lazy&#34;&gt;&#xA;  &lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;&amp;ndash; Shot on iPhone 16&lt;/p&gt;</description>
    </item>
    <item>
      <title>三种方法实现监督微调：LLaMA Factory, trl 和 unsloth</title>
      <link>https://luochang212.github.io/posts/sft_note/</link>
      <pubDate>Sat, 26 Apr 2025 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/sft_note/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;尝试了三种流行的微调框架，其中最推荐的是 unsloth，因为快！另外两种框架 LLaMA Factory 和 trl 是在夜里跑的，显卡风扇响了一宿。第二天看日志，它们都跑了三个多小时才跑完。但是同样的任务，unsloth 只需要五分钟，快得有点离谱。当然，这么比不是完全公平的，因为它们的量化方法、LoRA 参数是不同的。但是 unsloth 快这一点依然是无可质疑的。如果在 GPU 服务器上认真微调，那么用 LLaMA Factory 没毛病；但如果只是在笔记本上随便玩玩，unsloth 的优势就太大了。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/sft-note&#34; target=&#34;_blank&#34;&gt;sft-note&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;⭐ 本文的内容包括：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;大模型微调的三种范式：无监督微调、监督微调、强化学习微调&lt;/li&gt;&#xA;&lt;li&gt;介绍用于监督微调的数据格式，以及如何加载数据集&lt;/li&gt;&#xA;&lt;li&gt;如何下载 Qwen 模型，代码见 &lt;a href=&#34;https://github.com/luochang212/sft-note/blob/main/model/download_qwen.py&#34; target=&#34;_blank&#34;&gt;download_qwen.py&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;使用三种框架微调大模型：LLaMA Factory, trl, unsloth&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;一引言&#34;&gt;一、引言&lt;/h2&gt;&#xA;&lt;p&gt;大语言模型有很强的通用能力，但在特定领域，它的表现不如领域小模型。为了让大模型适应特定任务，我们对大模型进行微调，使大模型在保持通用性的同时，兼具领域模型的专业知识、对话风格和输出格式等特质。&lt;/p&gt;&#xA;&lt;p&gt;微调大模型有三种范式：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;无监督微调&lt;/strong&gt;：在海量数据上进行二次预训练&#xA;&lt;ul&gt;&#xA;&lt;li&gt;PT 增量预训练&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;监督微调 (SFT)&lt;/strong&gt;：构造领域数据集，增强模型的指令遵循能力，并注入领域知识&#xA;&lt;ul&gt;&#xA;&lt;li&gt;指令微调&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;强化学习微调&lt;/strong&gt;：通过 reward 引导模型优化&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arxiv.org/abs/2203.02155&#34;&gt;RLHF&lt;/a&gt; 基于人类反馈的强化学习&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arxiv.org/abs/2305.18290&#34;&gt;DPO&lt;/a&gt; 直接偏好优化方法&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arxiv.org/abs/2403.07691&#34;&gt;ORPO&lt;/a&gt; 比值比偏好优化&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arxiv.org/abs/2402.03300&#34;&gt;GRPO&lt;/a&gt; 群体相对策略优化&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;本文聚焦 &lt;strong&gt;监督微调 (Supervised Fine-Tuning)&lt;/strong&gt;。监督微调是一种简单但有效的微调方式，能够快速融合业务数据、适应业务场景，因此它的性价比极高！&lt;/p&gt;&#xA;&lt;h3 id=&#34;1-sft-的简单介绍&#34;&gt;1. SFT 的简单介绍&lt;/h3&gt;&#xA;&lt;p&gt;监督微调的优化目标是 &lt;strong&gt;最小化模型生成回答与目标回答之间的差异&lt;/strong&gt;，通常使用交叉熵损失。为避免破坏预训练阶段获得的知识，SFT 阶段通常使用 &lt;strong&gt;较低的学习率&lt;/strong&gt;，并且只更新部分参数层，其他参数保持不变。与预训练阶段所需的海量数据相比，SFT 只需 &lt;strong&gt;较小的数据量&lt;/strong&gt;（数千到数十万样本），即可完成微调。&lt;/p&gt;&#xA;&lt;h3 id=&#34;2-sft-的使用场景&#34;&gt;2. SFT 的使用场景&lt;/h3&gt;&#xA;&lt;p&gt;为了让大家感受一下 SFT 能做什么，下面列举一些使用场景：&lt;/p&gt;</description>
    </item>
    <item>
      <title>DNN 模型聚类特征更新方法</title>
      <link>https://luochang212.github.io/posts/cluster_label_assign/</link>
      <pubDate>Sat, 19 Apr 2025 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/cluster_label_assign/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;本文探讨如何在 DNN 模型中天级更新聚类特征时，保持聚类标签的稳定性。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/label-assignment&#34; target=&#34;_blank&#34;&gt;label-assignment&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;本文的主要内容包括：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;使用 &lt;code&gt;BLIP-2&lt;/code&gt; 将图片转为 embedding&lt;/li&gt;&#xA;&lt;li&gt;使用匈牙利算法建立重训练标签到原标签的映射&#xA;&lt;ul&gt;&#xA;&lt;li&gt;开发以 &lt;strong&gt;样本重合率&lt;/strong&gt; 为度量的方法&lt;/li&gt;&#xA;&lt;li&gt;开发以 &lt;strong&gt;类心距离&lt;/strong&gt; 为度量的方法&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;赋予 embedding 近似聚类 ID 的方法：最近邻法&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;时至今日，多塔模型仍以 ID 类特征为主。将模型特征以 raw data 的形式直接送入模型，效果往往不好。因此，我们通常先将特征 ID 化，然后用 &lt;code&gt;mmh3&lt;/code&gt; 哈希打散后，再送入模型。其中，&lt;strong&gt;特征 ID 化&lt;/strong&gt; 是一个重要步骤，如果 ID 的粒度太细，细到极致相当于每个样本一个 ID，这时样本就无法和与之相似的样本通过 ID 进行交互；如果 ID 的粒度太粗，则 ID 下的样本过多，此时模型无法从中学到指向足够明确的信息。&lt;/p&gt;&#xA;&lt;p&gt;将模型特征 ID 化有很多方法，比如 聚类（无监督）、分类（有监督）、量化等等。本文仅讨论 &lt;strong&gt;聚类算法&lt;/strong&gt; 及其在深度学习模型中的应用。&lt;/p&gt;&#xA;&lt;h2 id=&#34;一引子频繁变更索引的代价&#34;&gt;一、引子：频繁变更索引的代价&lt;/h2&gt;&#xA;&lt;p&gt;为了理解聚类算法产生的聚类 ID 是如何在深度模型中发生作用的，有必要介绍一下 &lt;strong&gt;嵌入层 (Embedding Layer)&lt;/strong&gt; 的工作原理。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;嵌入层是聚类 ID 与深度模型连接的桥梁&lt;/strong&gt;。嵌入层的输入是聚类 ID，输出是该聚类 ID 对应的 embedding。在嵌入层中，聚类 ID 的每个枚举值都对应一个可学习的 embedding。如下图，假设聚类 ID 有 5 个枚举值 &lt;code&gt;[0, 1, 2, 3, 4]&lt;/code&gt;，枚举值对应的索引分别为 &lt;code&gt;idx0&lt;/code&gt;, &lt;code&gt;idx1&lt;/code&gt; &amp;hellip; &lt;code&gt;idx4&lt;/code&gt;。当一个样本进入模型，它会根据聚类 id 号（比如 2 号）去找对应的索引（&lt;code&gt;idx2&lt;/code&gt;），然后将索引下的 N 维 embedding 取回。嵌入层在有些地方也被称为码本 (codebook).&lt;/p&gt;</description>
    </item>
    <item>
      <title>本地部署大模型：Ollama 和 vLLM</title>
      <link>https://luochang212.github.io/posts/llm_deploy/</link>
      <pubDate>Fri, 21 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/llm_deploy/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;2023 年本地部署大模型的报价近千万，2024 年初便骤降至百万，如今是 2025 年，只需要一行 vLLM 命令就可以部署大模型，人工成本几近于零。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/llm-deploy&#34; target=&#34;_blank&#34;&gt;llm-deploy&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;本文内容包括：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;3 种方式部署 DeepSeek R1：Ollama, vLLM 和 Transformers&lt;/li&gt;&#xA;&lt;li&gt;使用 vLLM 部署 Qwen2.5 模型&lt;/li&gt;&#xA;&lt;li&gt;安装 Open WebUI 作为本地模型的前端聊天框&lt;/li&gt;&#xA;&lt;li&gt;通过 &lt;code&gt;vllm serve&lt;/code&gt; 实现一行代码启动 vLLM 推理服务&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;✨ 快速部署说明在 &lt;a href=&#34;https://github.com/luochang212/llm-deploy/tree/main/deploy&#34; target=&#34;_blank&#34;&gt;/deploy&lt;/a&gt;，vLLM 服务启动脚本在 &lt;a href=&#34;https://github.com/luochang212/llm-deploy/tree/main/server&#34; target=&#34;_blank&#34;&gt;/server&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;一本地部署-deepseek-r1&#34;&gt;一、本地部署 DeepSeek R1&lt;/h2&gt;&#xA;&lt;p&gt;大模型本地部署依赖推理引擎，目前比较流行的推理引擎有：&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;推理引擎&lt;/th&gt;&#xA;          &lt;th&gt;场景&lt;/th&gt;&#xA;          &lt;th&gt;介绍&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://github.com/ollama/ollama&#34;&gt;Ollama&lt;/a&gt;&lt;/td&gt;&#xA;          &lt;td&gt;适合个人开发者和轻量级应用&lt;/td&gt;&#xA;          &lt;td&gt;基于 &lt;a href=&#34;https://github.com/ggml-org/llama.cpp&#34;&gt;llama.cpp&lt;/a&gt; 开发，支持 CPU 推理，安装简单，开箱即用，适合快速原型开发和测试&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://github.com/vllm-project/vllm&#34;&gt;vLLM&lt;/a&gt;&lt;/td&gt;&#xA;          &lt;td&gt;适合高并发生产环境&lt;/td&gt;&#xA;          &lt;td&gt;支持多 GPU 并行、批处理、PagedAttention，吞吐量高，延迟低，适合大规模服务部署&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://github.com/huggingface/transformers&#34;&gt;Transformers&lt;/a&gt;&lt;/td&gt;&#xA;          &lt;td&gt;适合模型研究和实验&lt;/td&gt;&#xA;          &lt;td&gt;提供完整的模型训练和推理接口，支持模型微调、量化、加速，适合研究人员和需要深度定制的场景&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://github.com/sgl-project/sglang&#34;&gt;SGLang&lt;/a&gt;&lt;/td&gt;&#xA;          &lt;td&gt;适合需要复杂推理流程的场景&lt;/td&gt;&#xA;          &lt;td&gt;支持结构化输出、并行推理、流式输出，特别适合需要多轮对话和复杂推理的应用&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://github.com/InternLM/lmdeploy&#34;&gt;LMDeploy&lt;/a&gt;&lt;/td&gt;&#xA;          &lt;td&gt;适合企业级部署和边缘计算&lt;/td&gt;&#xA;          &lt;td&gt;由上海人工智能实验室开发，提供完整的模型量化、加速和部署工具链，支持多种硬件平台，特别适合资源受限场景&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;下面介绍如何部署 Ollama, vLLM, Transformers 这三款推理引擎，简要部署步骤见本项目的 &lt;a href=&#34;https://github.com/luochang212/llm-deploy/tree/main/deploy&#34;&gt;deploy&lt;/a&gt; 目录。&lt;/p&gt;&#xA;&lt;p&gt;目录：&lt;/p&gt;</description>
    </item>
    <item>
      <title>Langflow 实现本地知识库</title>
      <link>https://luochang212.github.io/posts/langflow_rag_app/</link>
      <pubDate>Sat, 15 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/langflow_rag_app/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;本项目将用 &lt;a href=&#34;https://github.com/langflow-ai/langflow&#34; target=&#34;_blank&#34;&gt;langflow&lt;/a&gt; 实现一个本地知识库。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;Langflow 是大模型可视化组件编排工具。它可以为大模型赋能，比如可以为大模型应用增加对话记忆、文档检索等等的功能。它基本上站到了 LangChain 类似的生态位。开发大模型应用的需求通常比较 flexible，在功能和性能都满足的条件下，Langflow 可以快速实现原型开发和模块复用，是目前的效率之选。&lt;/p&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/langflow-rag-app&#34; target=&#34;_blank&#34;&gt;langflow-rag-app&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;本文的内容包括：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;介绍 RAG 的相关概念&lt;/li&gt;&#xA;&lt;li&gt;使用 Langflow 实现简单的知识库&lt;/li&gt;&#xA;&lt;li&gt;使用 Langflow 实现带对话记忆功能的知识库&lt;/li&gt;&#xA;&lt;li&gt;使用 Langflow 实现代码检查 (code review) 功能&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;✨ 环境部署相关的脚本，我放在这里了 &lt;a href=&#34;https://github.com/luochang212/langflow-rag-app/tree/main/deploy&#34; target=&#34;_blank&#34;&gt;deploy&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;一rag-的概念介绍&#34;&gt;一、RAG 的概念介绍&lt;/h2&gt;&#xA;&lt;p&gt;这一节，我们先介绍 RAG 的相关概念，&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;知识库&lt;/strong&gt; 就像大语言模型的“小抄”。在回答你之前，大模型先瞅一眼小抄，看有没有和你的问题相关的内容。如果有，就会从知识库中取回相应的文本片段，再结合大模型自身的能力生成最终回答。&lt;/p&gt;&#xA;&lt;p&gt;知识库使用了一种叫 &lt;strong&gt;RAG（检索增强生成）&lt;/strong&gt; 的技术。通过 RAG，大模型可以检索我们给它的文档。比如我们给它数学、法律、金融相关的文档，它可以事先进行“消化”、“吸收”。当我们对它提问时，它就能够像真正的专家一样，结合这些领域知识回答问题。&lt;/p&gt;&#xA;&lt;p&gt;目录：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;提示词模板&lt;/li&gt;&#xA;&lt;li&gt;RAG 技术&#xA;&lt;ul&gt;&#xA;&lt;li&gt;文本向量化&lt;/li&gt;&#xA;&lt;li&gt;向量数据库&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;br&gt;&#xA;&lt;center&gt;&#xA;&lt;button class=&#34;demo-btn&#34; onclick=&#34;window_on(&#39;https://nbviewer.org/github/luochang212/langflow-rag-app/blob/main/1.road_map.ipynb&#39;)&#34;&gt;查看笔记&lt;/button&gt;&#xA;&lt;/center&gt;&#xA;&lt;br&gt;&#xA;&lt;h2 id=&#34;二简单的-rag-应用&#34;&gt;二、简单的 RAG 应用&lt;/h2&gt;&#xA;&lt;p&gt;本节我们完成一个简单的 RAG 应用。我们将一个文档向量化后，存入向量数据库中，然后用 deepseek-r1:1.5b 模型，整合 RAG 取回的内容后输出回答。&lt;/p&gt;&#xA;&lt;p&gt;最终的 langflow 工作流如下：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/simple_rag_app.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;目录：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;环境准备&#xA;&lt;ul&gt;&#xA;&lt;li&gt;安装 Ollama&lt;/li&gt;&#xA;&lt;li&gt;安装 langflow&lt;/li&gt;&#xA;&lt;li&gt;安装 chroma&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;langflow 搭建工作流&#xA;&lt;ul&gt;&#xA;&lt;li&gt;创建一个新的 Flow&lt;/li&gt;&#xA;&lt;li&gt;初始界面&lt;/li&gt;&#xA;&lt;li&gt;本地改造计划&lt;/li&gt;&#xA;&lt;li&gt;启动 Ollama 服务&lt;/li&gt;&#xA;&lt;li&gt;添加 Ollama Embeddings 组件&lt;/li&gt;&#xA;&lt;li&gt;添加 Chroma DB 组件&lt;/li&gt;&#xA;&lt;li&gt;添加 Ollama 组件&lt;/li&gt;&#xA;&lt;li&gt;传入文档&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;br&gt;&#xA;&lt;center&gt;&#xA;&lt;button class=&#34;demo-btn&#34; onclick=&#34;window_on(&#39;https://nbviewer.org/github/luochang212/langflow-rag-app/blob/main/2.simple_rag_app.ipynb&#39;)&#34;&gt;查看笔记&lt;/button&gt;&#xA;&lt;/center&gt;&#xA;&lt;br&gt;&#xA;&lt;h2 id=&#34;三带对话记忆功能的-rag&#34;&gt;三、带对话记忆功能的 RAG&lt;/h2&gt;&#xA;&lt;p&gt;通过添加 Messsage History 组件，就可以为 RAG 添加对历史对话的记忆。&lt;/p&gt;</description>
    </item>
    <item>
      <title>深度嵌入聚类算法 DEC</title>
      <link>https://luochang212.github.io/posts/dec_pytorch/</link>
      <pubDate>Sun, 09 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/dec_pytorch/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;如何对图片做聚类，我的直觉是：先用预训练模型计算图片 Embedding，然后用 cosine 度量的 DBSCAN 无监督地计算图片 label，再用 MLP 有监督地学习上一步产生的 label。DBSCAN 的好处是可以把无监督转为有监督，且由于它基于密度的特性，还不需要指定聚类的类别数，这方便了生产环境使用，因为生产环境通常也是不知道类别数的。MLP 的好处是可以对输入泛化，即使没见过的输入，在不重训练的情况下，也可以有一个对应输出。图片特征提取器 + 传统聚类 + 神经网络，是简单且符合直觉的方法，但恐怕不是最好的方法。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;我们探索使用更端到端的方法实现图片聚类：DINOv2 特征提取器 + DEC 聚类器&lt;/p&gt;&#xA;&lt;p&gt;使用 DEC 的好处起码有两点。一是让训练过程更简单，端到端的架构肯定比两阶段模型的架构更简单。二是 DEC 用特征向量表示聚类中心，这和传统聚类用标签表示不同。特征向量表示的类心更便于微调和增量更新。K-Means 每次更新 label 都是乱的，需要用匈牙利算法，对前后两次结果进行桥接。神经网络在这一点上天生有优势，因为它是顺着梯度一点一点更新的，所以前后两次结果是天然有联系，并且可以限制更新的幅度。&lt;/p&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/dec-pytorch&#34; target=&#34;_blank&#34;&gt;dec-pytorch&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;本文的工作包括：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;用 DINOv2 模型生成图片 Embeddings&lt;/li&gt;&#xA;&lt;li&gt;用 FastAPI 开发 DINOv2 批量推理服务，支持分 batch 和 模型结果归一化&lt;/li&gt;&#xA;&lt;li&gt;训练 DEC 模型的三阶段：训练降噪自编码器、初始化聚类中心、训练 DEC&lt;/li&gt;&#xA;&lt;li&gt;开发集成的 DEC 训练框架，支持训练、推理、保存，详见 &lt;a href=&#34;https://github.com/luochang212/dec-pytorch/blob/main/dec.py&#34; target=&#34;_blank&#34;&gt;dec.py&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;在我的数据集上，对比 DEC 与传统聚类算法的效果：与 K-Means 接近&lt;/li&gt;&#xA;&lt;li&gt;介绍 DEC 的创新点：软分配策略和目标分布优化&lt;/li&gt;&#xA;&lt;li&gt;在线学习探索：尝试两种思路，对 DEC 模型做小幅度的增量更新&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;✨ DEC 论文在这里 &lt;a href=&#34;https://arxiv.org/abs/1511.06335&#34; target=&#34;_blank&#34;&gt;&lt;em&gt;Unsupervised Deep Embedding for Clustering Analysis&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>搭建一款简单的『以文搜图』应用</title>
      <link>https://luochang212.github.io/posts/clip_app/</link>
      <pubDate>Sun, 29 Dec 2024 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/clip_app/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;在手机相册搜索框中输入“笔记本电脑”时，即使照片本身并未包含“笔记本电脑”这几个字，相关图片依然能够被精准地检索出来。这说明现代相册 APP 不仅使用图片 OCR 文本来召回搜索结果。它综合使用了多种技术，包括多模态技术。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;本文使用多模态模型 CLIP 搭建一个简单的『以文搜图』应用，实现与相册 APP 类似的搜索效果。&lt;/p&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/clip-app&#34; target=&#34;_blank&#34;&gt;clip-app&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;本文涉及的内容包括：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;用 FastAPI 搭建图文向量生成服务&lt;/li&gt;&#xA;&lt;li&gt;用 FastAPI 搭建 Faiss 向量搜索服务&lt;/li&gt;&#xA;&lt;li&gt;集成以上两个服务，实现『以文搜图』应用&lt;/li&gt;&#xA;&lt;li&gt;使用 &lt;code&gt;@torch.inference_mode()&lt;/code&gt; 装饰器，优化推理性能&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;✨ 如果你对多模态模型的效果有更高的要求，可以尝试 &lt;a href=&#34;https://huggingface.co/docs/transformers/en/model_doc/blip-2&#34; target=&#34;_blank&#34;&gt;BLIP-2&lt;/a&gt;。&lt;/p&gt;&#xA;&lt;h2 id=&#34;一加载-clip-模型&#34;&gt;一、加载 CLIP 模型&lt;/h2&gt;&#xA;&lt;p&gt;加载 CLIP 模型，生成图文 Embedding。&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;获取文本 Embedding&lt;/li&gt;&#xA;&lt;li&gt;获取图像 Embedding&lt;/li&gt;&#xA;&lt;li&gt;多条文本对一张图片&lt;/li&gt;&#xA;&lt;li&gt;一条文本对多张图片&lt;/li&gt;&#xA;&lt;li&gt;多条文本对多张图片&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;br&gt;&#xA;&lt;center&gt;&#xA;&lt;button class=&#34;demo-btn&#34; onclick=&#34;window_on(&#39;https://nbviewer.org/github/luochang212/clip-app/blob/main/1.clip_model.ipynb&#39;)&#34;&gt;查看笔记&lt;/button&gt;&#xA;&lt;/center&gt;&#xA;&lt;br&gt;&#xA;&lt;h2 id=&#34;二faiss-向量搜索&#34;&gt;二、Faiss 向量搜索&lt;/h2&gt;&#xA;&lt;p&gt;用 FastAPI + Faiss 写一个向量检索服务 &lt;a href=&#34;https://github.com/luochang212/clip-app/blob/main/faiss/server.py&#34; target=&#34;_blank&#34;&gt;faiss/server.py&lt;/a&gt;，该服务提供两个接口：&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;路由名&lt;/th&gt;&#xA;          &lt;th&gt;描述&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;add&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;用于向索引中添加新的 Embedding&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;search&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;用于从索引中取回给定 Embedding 的最近邻 Embedding&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;br&gt;&#xA;&lt;center&gt;&#xA;&lt;button class=&#34;demo-btn&#34; onclick=&#34;window_on(&#39;https://nbviewer.org/github/luochang212/clip-app/blob/main/2.faiss_client.ipynb&#39;)&#34;&gt;查看笔记&lt;/button&gt;&#xA;&lt;/center&gt;&#xA;&lt;br&gt;&#xA;&lt;h2 id=&#34;三clip-向量生成&#34;&gt;三、CLIP 向量生成&lt;/h2&gt;&#xA;&lt;p&gt;用 FastAPI 写一个简单的 CLIP Embedding 生成服务 &lt;a href=&#34;https://github.com/luochang212/clip-app/blob/main/embedding/server.py&#34; target=&#34;_blank&#34;&gt;embedding/server.py&lt;/a&gt;。接口输入是图片、文本，输出是图文 Embedding。该服务提供 3 个 API 接口：&lt;/p&gt;</description>
    </item>
    <item>
      <title>流式聚类算法：DenStream 和 CluStream</title>
      <link>https://luochang212.github.io/posts/stream_clustering/</link>
      <pubDate>Sun, 01 Dec 2024 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/stream_clustering/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;直接说结论：全量聚类用 DBSCAN；无监督流式聚类用 DenStream；已知聚类数、按较大时间间隔获取聚类标签且对计算量敏感，用 CluStream.&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/stream-clustering&#34; target=&#34;_blank&#34;&gt;stream-clustering&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;本文涉及的内容包括：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;提供 DBSCAN、DenStream 和 CluStream 三种聚类算法的使用示例&lt;/li&gt;&#xA;&lt;li&gt;开发对 DBSCAN 自动调参并输出聚类标签的函数 &lt;a href=&#34;https://github.com/luochang212/stream-clustering/blob/main/utils.py#L76&#34; target=&#34;_blank&#34;&gt;auto_dbscan&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;验证 DenStream 的推理结果（簇号）是否在学习过程中发生变化：会变&lt;/li&gt;&#xA;&lt;li&gt;DBSCAN、DenStream 和 CluStream 全量训练效果对比：DBSCAN 最好&lt;/li&gt;&#xA;&lt;li&gt;DenStream 和 CluStream 增量训练效果对比：DenStream 最好&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;✨ 注意：运行以下代码依赖 &lt;a href=&#34;https://github.com/luochang212/stream-clustering/blob/main/utils.py&#34; target=&#34;_blank&#34;&gt;utils.py&lt;/a&gt; 文件。&lt;/p&gt;&#xA;&lt;h3 id=&#34;一dbscan&#34;&gt;一、DBSCAN&lt;/h3&gt;&#xA;&lt;p&gt;DBSCAN 是一种基于密度的聚类算法，用于从大量数据中识别出高密度区域并将其分为不同的簇。与传统的基于划分的聚类算法（如 K-means）不同，DBSCAN 不需要预先指定簇的数量，并且能够识别噪声数据和异常值。&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;DBSCAN 算法介绍&lt;/li&gt;&#xA;&lt;li&gt;DBSCAN 的简单示例&lt;/li&gt;&#xA;&lt;li&gt;DBSCAN 的可选参数&lt;/li&gt;&#xA;&lt;li&gt;DBSCAN 自动调参：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;基于 K 距离图选择 &lt;code&gt;eps&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;选择 &lt;code&gt;min_samples&lt;/code&gt; 的经验法则&lt;/li&gt;&#xA;&lt;li&gt;使用网格搜索结合合适的评估指标&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;使用 &lt;code&gt;best_params&lt;/code&gt; 进行聚类&lt;/li&gt;&#xA;&lt;li&gt;一站式 DBSCAN 函数&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;br&gt;&#xA;&lt;center&gt;&#xA;&lt;button class=&#34;demo-btn&#34; onclick=&#34;window_on(&#39;https://nbviewer.org/github/luochang212/stream-clustering/blob/main/1.DBSCAN.ipynb&#39;)&#34;&gt;查看笔记&lt;/button&gt;&#xA;&lt;/center&gt;&#xA;&lt;br&gt;&#xA;&lt;h3 id=&#34;二denstream&#34;&gt;二、DenStream&lt;/h3&gt;&#xA;&lt;p&gt;DenStream 适合不知道具体的聚类数，且需要实时获取聚类标签的情况。&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;DenStream 算法介绍&lt;/li&gt;&#xA;&lt;li&gt;DenStream 的简单示例&lt;/li&gt;&#xA;&lt;li&gt;DenStream 的可选参数&lt;/li&gt;&#xA;&lt;li&gt;验证：推理结果是否随时间变化&lt;/li&gt;&#xA;&lt;li&gt;DBSCAN 与 DenStream 效果对比&lt;/li&gt;&#xA;&lt;li&gt;使用 DBSCAN 优化过的 &lt;code&gt;epsilon&lt;/code&gt; 参数&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;br&gt;&#xA;&lt;center&gt;&#xA;&lt;button class=&#34;demo-btn&#34; onclick=&#34;window_on(&#39;https://nbviewer.org/github/luochang212/stream-clustering/blob/main/2.DenStream.ipynb&#39;)&#34;&gt;查看笔记&lt;/button&gt;&#xA;&lt;/center&gt;&#xA;&lt;br&gt;&#xA;&lt;h3 id=&#34;三clustream&#34;&gt;三、CluStream&lt;/h3&gt;&#xA;&lt;p&gt;CluStream 是一种需要明确指定聚类数的算法。它在一段时间内的聚类效果不错，也就是说，如果你的需求是有时间间隔的，比如每 10 分钟获取一次聚类结果，CluStream 的效果是可以接受的。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Triton 部署 CLIP 图文 Embedding 推理服务</title>
      <link>https://luochang212.github.io/posts/clip_triton_server/</link>
      <pubDate>Sat, 30 Nov 2024 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/clip_triton_server/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;本文介绍如何用 Triton 在多 GPU 环境下部署高性能 CLIP 推理服务。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/clip-server&#34; target=&#34;_blank&#34;&gt;clip-server&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;CLIP 是一个多模态模型。它能将图像和文本映射到同一个向量空间中，由此可以产生诸多应用。比如，通过计算图片与文本的相似性，可以用近似最近邻 (ANN) 从相册中检索与给定 query 语义相近的图片。此外，CLIP 的 Vision Encoder 可以作为特征提取器使用，用于生成的图像 Embedding。如果在 Vision Encoder 后加一个 fc 层，并且冻住骨干网络仅对 fc 层做训练，通常可以得到一个效果不错的图像分类器。&lt;/p&gt;&#xA;&lt;p&gt;本文涉及的内容包括：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;用 &lt;code&gt;transformers&lt;/code&gt; 库运行 &lt;code&gt;openai/clip-vit-base-patch32&lt;/code&gt; 的简单示例&lt;/li&gt;&#xA;&lt;li&gt;在 &lt;code&gt;titanic&lt;/code&gt; 数据集上训练一个 MLP 并导出成 ONNX 格式&lt;/li&gt;&#xA;&lt;li&gt;介绍如何安装预装了 Triton 的 Nvidia 官方 Docker 镜像 &lt;code&gt;&amp;amp;&lt;/code&gt; 启动容器&lt;/li&gt;&#xA;&lt;li&gt;介绍如何将 MLP 的 ONNX 模型配置到 Triton 模型仓库中&lt;/li&gt;&#xA;&lt;li&gt;写了一个简单的 &lt;a href=&#34;https://github.com/luochang212/clip-server/blob/main/utils.py#L108&#34; target=&#34;_blank&#34;&gt;客户端&lt;/a&gt; 用于获取 Triton 的推理结果&lt;/li&gt;&#xA;&lt;li&gt;介绍 Triton 的 Python Backend，其通常用于模型预处理和后处理&lt;/li&gt;&#xA;&lt;li&gt;用 Model Ensemble 组装 Python Backend 和 ONNX 组成完整的推理服务&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;✨ 注意：运行以下代码依赖 &lt;a href=&#34;https://github.com/luochang212/clip-server/blob/main/utils.py&#34; target=&#34;_blank&#34;&gt;utils.py&lt;/a&gt; 文件和 &lt;a href=&#34;https://github.com/luochang212/clip-server/blob/main/mlp.py&#34; target=&#34;_blank&#34;&gt;mlp.py&lt;/a&gt; 文件。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Docker 命令速查手册</title>
      <link>https://luochang212.github.io/posts/docker_command/</link>
      <pubDate>Sat, 23 Nov 2024 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/docker_command/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;在低版本的服务器或存在共用关系的大组环境里，Docker 是个好东西。Docker 可以提供独立的运行时环境，以免受其他服务和人的干扰。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/docker-command&#34; target=&#34;_blank&#34;&gt;docker-command&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;一什么是-docker&#34;&gt;一、什么是 Docker&lt;/h3&gt;&#xA;&lt;p&gt;Docker 是一种容器技术。它通过轻量级的虚拟化，将程序及其依赖打包到一个被称为 &lt;strong&gt;容器&lt;/strong&gt; 的独立运行环境里，从而保证应用在不同环境中的一致性。&lt;/p&gt;&#xA;&lt;p&gt;容器与虚拟机，在功能上类似，但更加轻量化。容器提供的是操作系统级别的虚拟化；而虚拟机提供的是硬件级别的虚拟化。不同于虚拟机要为每个实例运行完整的操作系统，容器共享操作系统内核，因此更轻量、更高效。不过，轻量化的设计也带来了一些限制，例如 systemctl 等服务管理工具通常在容器中不可用。&lt;/p&gt;&#xA;&lt;h4 id=&#34;11-核心组件&#34;&gt;1.1 核心组件&lt;/h4&gt;&#xA;&lt;p&gt;在上手 Docker 前，有必要了解它的核心组件：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;镜像&lt;/strong&gt; (Image): 镜像拥有运行应用所需的一切，包括操作系统、代码、依赖等&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;容器&lt;/strong&gt; (Container): 容器由镜像创建，每个容器拥有独立的运行环境&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;你无法直接运行镜像，必须由镜像创建对应的容器才能运行。可以认为容器是镜像的实例。镜像负责存储与分发，容器负责提供服务。&lt;/p&gt;&#xA;&lt;h4 id=&#34;12-主要用途&#34;&gt;1.2 主要用途&lt;/h4&gt;&#xA;&lt;p&gt;Docker 的主要用途包括：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;轻量级虚拟化：可以当成虚拟机使用&lt;/li&gt;&#xA;&lt;li&gt;支持微服务架构：每个服务运行在独立容器中，易于扩展和管理&lt;/li&gt;&#xA;&lt;li&gt;支持 CI/CD 流水线：一次打包，即可在所有环境中运行&lt;/li&gt;&#xA;&lt;li&gt;保证环境的一致性：确保测试、开发、生产环境一致&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;如果你还不了解 Docker，可访问以下资源：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;官网：&lt;a href=&#34;https://www.docker.com/&#34; target=&#34;_blank&#34;&gt;&lt;a href=&#34;https://www.docker.com/&#34;&gt;https://www.docker.com/&lt;/a&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;入门文档：&lt;a href=&#34;https://docs.docker.com/guides/&#34; target=&#34;_blank&#34;&gt;&lt;a href=&#34;https://docs.docker.com/guides/&#34;&gt;https://docs.docker.com/guides/&lt;/a&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;二常用命令&#34;&gt;二、常用命令&lt;/h3&gt;&#xA;&lt;h4 id=&#34;21-基础操作&#34;&gt;2.1 基础操作&lt;/h4&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;命令&lt;/th&gt;&#xA;          &lt;th&gt;描述&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;docker info&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;查看 docker 系统信息&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;docker version&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;查看 docker 版本信息&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;docker --version&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;查看 docker 简略版本信息&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;docker login&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;登录 DockerHub&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;docker login nvcr.io &lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;登录 nvcr.io&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h4 id=&#34;22-镜像管理&#34;&gt;2.2 镜像管理&lt;/h4&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;命令&lt;/th&gt;&#xA;          &lt;th&gt;描述&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;docker images&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;查看镜像&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;docker pull [IMAGE]&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;拉取镜像&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;docker rmi [IMAGE]&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;删除镜像&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;docker commit [CONTAINER] [IMAGE]:[TAG]&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;将容器保存为新的镜像&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;docker save -o myimage.tar [IMAGE]&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;将镜像保存到指定路径&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;docker load -i path/to/myimage.tar&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;从 tar 文件中加载镜像&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;docker tag [IMAGE_ID] [NEW_NAME]:[NEW_TAG]&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;重命名 docker 镜像&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h4 id=&#34;23-容器管理&#34;&gt;2.3 容器管理&lt;/h4&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;命令&lt;/th&gt;&#xA;          &lt;th&gt;描述&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;docker create [IMAGE]&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;创建容器&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;docker run [IMAGE]&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;创建并运行容器&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;docker start [CONTAINER]&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;启动容器&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;docker stop [CONTAINER]&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;停止容器&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;docker restart [CONTAINER]&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;重启容器&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;docker ps&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;列出运行容器&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;docker ps -a&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;列出所有容器&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;docker exec -it [CONTAINER] /bin/bash&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;启动交互模式&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;docker rm [CONTAINER]&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;删除容器&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;docker port [CONTAINER]&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;查看端口映射&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;docker top [CONTAINER]&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;查看容器内进程&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;docker stats [CONTAINER]&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;查看资源使用情况&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;docker cp [CONTAINER]:[PATH] [LOCAL_PATH]&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;拷贝文本到本地&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;docker cp [LOCAL_PATH] [CONTAINER]:[PATH]&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;拷贝文件到容器&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;docker export -o mycontainer.tar [CONTAINER]&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;将容器存成文件&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;docker import path/to/mycontainer.tar [IMAGE]:[TAG]&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;文件加载成镜像&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h4 id=&#34;24-容器运行&#34;&gt;2.4 容器运行&lt;/h4&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;命令&lt;/th&gt;&#xA;          &lt;th&gt;描述&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;docker run --name [NAME] [IMAGE]&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;创建运行并命名容器&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;docker run -d [IMAGE]&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;创建容器并在后台运行&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;docker run -p [LOCAL_PORT]:[CONTAINER_PORT] [IMAGE]&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;创建容器并指定端口映射&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;docker run -v [LOCAL_PATH]:[CONTAINER_PATH] [IMAGE]&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;创建容器并将本地目录挂载到容器目录&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;docker run -it [IMAGE] /bin/bash&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;创建容器并启动交互式 shell&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h3 id=&#34;三docker-的简单使用&#34;&gt;三、Docker 的简单使用&lt;/h3&gt;&#xA;&lt;p&gt;Docker 是客户端 / 服务端分离的，因此使用前，通常需要检查一下服务端和客户端是否都在运行：&lt;/p&gt;</description>
    </item>
    <item>
      <title>频繁模式挖掘</title>
      <link>https://luochang212.github.io/posts/frequent_pattern_mining/</link>
      <pubDate>Thu, 05 Sep 2024 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/frequent_pattern_mining/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;挖掘 &lt;strong&gt;频繁项集&lt;/strong&gt; 和 &lt;strong&gt;频繁序列&lt;/strong&gt; 是频繁模式挖掘的两个经典任务。它俩的区别是：前者是顺序无关的，而后者关注顺序。对于这两种任务，Spark 已经有非常成熟的解决方案了，在当前主流公司的数据量级下是够用的。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/frequent-pattern-mining&#34; target=&#34;_blank&#34;&gt;frequent-pattern-mining&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;频繁项集&lt;/strong&gt; 经常被念叨的一个用途，是挖掘经常被一起购买的商品（比如奶粉和尿布）。如果知道哪些商品经常被一起购买，就可以将这些商品打包出售。或者放在超市里相隔较远的两个地方，引导用户多逛。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;频繁序列&lt;/strong&gt; 也很有用。用户的连续行为可以看作一个序列。通过分析用户的频繁序列，产品经理可以发现用户习惯，进而优化功能排布和页面顺序，达到提升链路转化效率的效果。&lt;/p&gt;&#xA;&lt;p&gt;✨ 注意：运行以下代码依赖 &lt;a href=&#34;https://github.com/luochang212/frequent-pattern-mining/blob/main/utils.py&#34; target=&#34;_blank&#34;&gt;utils.py&lt;/a&gt; 文件。&lt;/p&gt;&#xA;&lt;h3 id=&#34;一频繁项集算法fpgrowth&#34;&gt;一、频繁项集算法：FPGrowth&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;数据预处理&lt;/li&gt;&#xA;&lt;li&gt;频繁项挖掘&#xA;&lt;ul&gt;&#xA;&lt;li&gt;频繁项集&lt;/li&gt;&#xA;&lt;li&gt;关联规则&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;br&gt;&#xA;&lt;center&gt;&#xA;&lt;button class=&#34;demo-btn&#34; onclick=&#34;window_on(&#39;https://nbviewer.org/github/luochang212/frequent-pattern-mining/blob/main/1.FP-Growth.ipynb&#39;)&#34;&gt;查看示例&lt;/button&gt;&#xA;&lt;/center&gt;&#xA;&lt;br&gt;&#xA;&lt;h3 id=&#34;二频繁序列算法prefixspan&#34;&gt;二、频繁序列算法：PrefixSpan&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;一个简单的例子&lt;/li&gt;&#xA;&lt;li&gt;子序列挖掘&#xA;&lt;ul&gt;&#xA;&lt;li&gt;商品编码&lt;/li&gt;&#xA;&lt;li&gt;生成商品序列&lt;/li&gt;&#xA;&lt;li&gt;计算频繁子序列&lt;/li&gt;&#xA;&lt;li&gt;通过子序列回溯原始数据&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;br&gt;&#xA;&lt;center&gt;&#xA;&lt;button class=&#34;demo-btn&#34; onclick=&#34;window_on(&#39;https://nbviewer.org/github/luochang212/frequent-pattern-mining/blob/main/2.PrefixSpan.ipynb&#39;)&#34;&gt;查看示例&lt;/button&gt;&#xA;&lt;/center&gt;&#xA;&lt;br&gt;&#xA;&lt;p&gt;参考：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://spark.apache.org/docs/latest/ml-frequent-pattern-mining.html&#34; target=&#34;_blank&#34;&gt;Frequent Pattern Mining&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.kaggle.com/code/prasad22/market-basket-analysis-with-apriori-algorithm&#34; target=&#34;_blank&#34;&gt;Market Basket Analysis with Apriori Algorithm&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div id=&#34;mini-overlay&#34; onclick=&#34;overlay_off()&#34;&gt;&lt;/div&gt;&#xA;&lt;div id=&#34;mini-window&#34;&gt;&lt;iframe id=&#34;mini-iframe&#34; frameBorder=&#34;0&#34;&gt;&lt;/iframe&gt;&lt;/div&gt;&#xA;&lt;button id=&#34;btn-close&#34; onclick=&#34;overlay_off()&#34;&gt;×&lt;/button&gt;&#xA;&lt;script src=&#34;https://luochang212.github.io/python-tips/overlay.js&#34;&gt;&lt;/script&gt;&#xA;&lt;link rel=&#34;stylesheet&#34; href=&#34;https://luochang212.github.io/python-tips/style.css&#34;&gt;</description>
    </item>
    <item>
      <title>初见向量引擎：RediSearch 和 Milvus</title>
      <link>https://luochang212.github.io/posts/redis_util/</link>
      <pubDate>Sun, 18 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/redis_util/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;建索引 Redis 够用了。一旦需要搜索向量，就可以考虑使用向量引擎。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;!-- &gt; - **RediSearch** 是 Redis 的一个模块，支持向量相似度搜索，它的优点与 Redis 生态无缝衔接，可复制 Redis 的生态优势&#xA;&gt; - **Milvus** 是一个开箱即用的开源向量数据库，有预置的语言模型，可以方便地生成嵌入，且支持多种索引类型 --&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/redis-util&#34; target=&#34;_blank&#34;&gt;redis-util&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;本文干了啥：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;使用容器启动 Redis，并将数据卷挂载到本地&lt;/li&gt;&#xA;&lt;li&gt;通过 Redis 的 Python API 做基础的 CRUD 操作&lt;/li&gt;&#xA;&lt;li&gt;在不借助任何插件的情况下，使用原生 Redis 存取向量&lt;/li&gt;&#xA;&lt;li&gt;使用 RediSearch 存取向量，并获取 TOP N 最近邻向量&lt;/li&gt;&#xA;&lt;li&gt;尝试使用向量引擎 Milvus 的一些基础功能&lt;/li&gt;&#xA;&lt;li&gt;基于 Redis “自制”向量引擎，支持设置索引过期时间，支持生成文本嵌入&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;✨ 注意：运行以下代码依赖 &lt;a href=&#34;https://github.com/luochang212/redis-util/blob/main/util.py&#34; target=&#34;_blank&#34;&gt;util.py&lt;/a&gt; 文件。&lt;/p&gt;&#xA;&lt;h2 id=&#34;一安装-redis&#34;&gt;一、安装 Redis&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;下载镜像文件&lt;/li&gt;&#xA;&lt;li&gt;启动容器&lt;/li&gt;&#xA;&lt;li&gt;交互式 shell&lt;/li&gt;&#xA;&lt;li&gt;测试连接&lt;/li&gt;&#xA;&lt;li&gt;处理 CRUD 逻辑&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;br&gt;&#xA;&lt;center&gt;&#xA;&lt;button class=&#34;demo-btn&#34; onclick=&#34;window_on(&#39;https://nbviewer.org/github/luochang212/redis-util/blob/main/1.安装Redis.ipynb&#39;)&#34;&gt;查看笔记&lt;/button&gt;&#xA;&lt;/center&gt;&#xA;&lt;br&gt;&#xA;&lt;h2 id=&#34;二用-redis-存取-embedding&#34;&gt;二、用 Redis 存取 Embedding&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Word2vec 生成 Embedding&lt;/li&gt;&#xA;&lt;li&gt;数据类型转换&lt;/li&gt;&#xA;&lt;li&gt;存取 Embedding&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;br&gt;&#xA;&lt;center&gt;&#xA;&lt;button class=&#34;demo-btn&#34; onclick=&#34;window_on(&#39;https://nbviewer.org/github/luochang212/redis-util/blob/main/2.用Redis存取Embedding.ipynb&#39;)&#34;&gt;查看笔记&lt;/button&gt;&#xA;&lt;/center&gt;&#xA;&lt;br&gt;&#xA;&lt;h2 id=&#34;三redisearch-模块&#34;&gt;三、RediSearch 模块&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;安装 Docker 镜像&lt;/li&gt;&#xA;&lt;li&gt;存取向量&lt;/li&gt;&#xA;&lt;li&gt;查找最近邻向量&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;br&gt;&#xA;&lt;center&gt;&#xA;&lt;button class=&#34;demo-btn&#34; onclick=&#34;window_on(&#39;https://nbviewer.org/github/luochang212/redis-util/blob/main/3.RediSearch模块.ipynb&#39;)&#34;&gt;查看笔记&lt;/button&gt;&#xA;&lt;/center&gt;&#xA;&lt;br&gt;&#xA;&lt;h2 id=&#34;四开源向量引擎-milvus&#34;&gt;四、开源向量引擎 Milvus&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://milvus.io/docs/quickstart.md&#34; target=&#34;_blank&#34;&gt;Milvue&lt;/a&gt; 是一款为机器学习设计的开源向量数据库，支持存储、查询、索引向量。Milvus 的核心功能是向量相似度搜索，它使用近似最近邻搜索算法来加速搜索过程，找到与查询向量最相似的向量。Milvus 支持多种索引类型，包括 FLAT、IVF_FLAT、IVF_SQ8、IVF_PQ、HNSW 和 ANNOY，以适应不同的查询需求和数据规模。&lt;/p&gt;</description>
    </item>
    <item>
      <title>三种图神经网络算法：GraphSAGE, GCN 和 GAT</title>
      <link>https://luochang212.github.io/posts/graph_embedding/</link>
      <pubDate>Sat, 10 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/graph_embedding/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;GNN 处理图数据的方式还是很符合直觉的，基本沿袭了 CNN 的思路：每个神经元只看局部信息，通过层层汇聚掌握全貌。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/graph-embedding&#34; target=&#34;_blank&#34;&gt;graph-embedding&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;本文做了什么：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;对 GraphSAGE 的简单实现做逐行注释&lt;/li&gt;&#xA;&lt;li&gt;在 Docker 环境运行 GraphSAGE 的原版示例&lt;/li&gt;&#xA;&lt;li&gt;用 &lt;a href=&#34;https://pytorch-geometric.readthedocs.io/en/latest/&#34; target=&#34;_blank&#34;&gt;PyG&lt;/a&gt; 实现了 GCN 和 GAT&lt;/li&gt;&#xA;&lt;li&gt;为运行 PyG 写了一些 pipeline 代码&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;✨ 注意：运行以下代码依赖 &lt;a href=&#34;https://github.com/luochang212/graph-embedding/blob/main/util.py&#34; target=&#34;_blank&#34;&gt;util.py&lt;/a&gt; 文件。&lt;/p&gt;&#xA;&lt;h2 id=&#34;一graphsage-的简单实现&#34;&gt;一、GraphSAGE 的简单实现&lt;/h2&gt;&#xA;&lt;p&gt;主流图算法大致分两种：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;图嵌入算法 (GE): DeepWalk, Node2Vec 等&lt;/li&gt;&#xA;&lt;li&gt;图神经网络算法 (GNN): GraphSAGE, GCN, GAT 等&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;11-绪论图神经网络&#34;&gt;1.1 绪论：图神经网络&lt;/h3&gt;&#xA;&lt;!-- 图神经网络的输入是 **节点间关联关系** 和 **节点特征**，输出是图嵌入。 --&gt;&#xA;&lt;p&gt;图神经网络算法做的事，相当于把图这种复杂的数据结构，转换成低维向量，而低维向量往往是很好用的。&lt;/p&gt;&#xA;&lt;p&gt;拿到图嵌入可以做很多事情，比如：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;节点分类&lt;/li&gt;&#xA;&lt;li&gt;链接预测&lt;/li&gt;&#xA;&lt;li&gt;社区发现&lt;/li&gt;&#xA;&lt;li&gt;相似度量&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;总之，图嵌入是一种非常有用的特征。在实践中，甚至可以将图嵌入和其他特征 concat 起来，训练更复杂的模型。&lt;/p&gt;&#xA;&lt;h4 id=&#34;111-gnn-和-cnn&#34;&gt;1.1.1 GNN 和 CNN&lt;/h4&gt;&#xA;&lt;p&gt;GNN 和 CNN 的思路还挺像的，可以看作 CNN 在图数据上的推广。&lt;/p&gt;</description>
    </item>
    <item>
      <title>SynchroTrap 算法实现</title>
      <link>https://luochang212.github.io/posts/synchrotrap/</link>
      <pubDate>Sat, 27 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/synchrotrap/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;SynchroTrap 是基于 Jaccard 相似度和最大连通子图的异常检测算法，出自 Facebook 的论文 &lt;a href=&#34;https://users.cs.duke.edu/~xwy/publications/SynchroTrap-ccs14.pdf&#34; target=&#34;_blank&#34;&gt;Uncovering Large Groups of Active Malicious Accounts in Online Social Networks&lt;/a&gt;.&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/SynchroTrap&#34; target=&#34;_blank&#34;&gt;SynchroTrap&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;本文做了什么：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;用 &lt;code&gt;mimesis&lt;/code&gt; 生成源数据，并基于源数据构造正态分布的样本&lt;/li&gt;&#xA;&lt;li&gt;通过构造一个 $\lambda$ 可调的泊松过程，生成用户到访时间戳&lt;/li&gt;&#xA;&lt;li&gt;提供一个由 7 个变量控制的异常数据生成函数，见 &lt;a href=&#34;https://github.com/luochang212/SynchroTrap/blob/main/utils.py#L236&#34; target=&#34;_blank&#34;&gt;gen_attack_df&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;用 Jaccard 相似度构图，再用 &lt;code&gt;NetworkX&lt;/code&gt; 对图做可视化&lt;/li&gt;&#xA;&lt;li&gt;用 Spark 的 &lt;code&gt;graphframes&lt;/code&gt; 计算最大连通子图&lt;/li&gt;&#xA;&lt;li&gt;复现了论文 2.2 节的可视化效果，见 &lt;a href=&#34;https://luochang212.github.io/posts/synchrotrap/#%E4%B8%89%E8%AF%84%E4%BC%B0%E4%B8%8E%E5%8F%AF%E8%A7%86%E5%8C%96&#34;&gt;评估与可视化&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;介绍如何使用 &lt;code&gt;Docker&lt;/code&gt; 构建 Spark 开发环境&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;✨ 注意：运行以下代码依赖 &lt;a href=&#34;https://github.com/luochang212/SynchroTrap/blob/main/utils.py&#34; target=&#34;_blank&#34;&gt;utils.py&lt;/a&gt; 文件和 &lt;a href=&#34;https://github.com/luochang212/SynchroTrap/tree/main/gen_data&#34; target=&#34;_blank&#34;&gt;gen_data&lt;/a&gt; 库。&lt;/p&gt;&#xA;&lt;h3 id=&#34;一样本生成&#34;&gt;一、样本生成&lt;/h3&gt;&#xA;&lt;p&gt;脱离互联网企业，我们很难拿到可供挖掘的异常数据样本。一种方法是自己生成。自己生成样本的好处是能拿到真正的 ground truth，而且可以精细地控制异常的规模和程度。&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;生成源数据&lt;/li&gt;&#xA;&lt;li&gt;生成大盘数据&#xA;&lt;ul&gt;&#xA;&lt;li&gt;生成正态样本分布&lt;/li&gt;&#xA;&lt;li&gt;生成 uid 并计算访问次数&lt;/li&gt;&#xA;&lt;li&gt;时间与时间戳&lt;/li&gt;&#xA;&lt;li&gt;用户日志表&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;生成异常数据&#xA;&lt;ul&gt;&#xA;&lt;li&gt;选择攻击开始时间&lt;/li&gt;&#xA;&lt;li&gt;获取 ip 池&lt;/li&gt;&#xA;&lt;li&gt;发起攻击&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;整合两份数据&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; 与异常捕获的难度有关的变量：&lt;/p&gt;</description>
    </item>
    <item>
      <title>像搭积木一样搭神经网络</title>
      <link>https://luochang212.github.io/posts/dl_tricks/</link>
      <pubDate>Sun, 07 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/dl_tricks/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;搭积木的时候，需要将不同类型的积木搭在一起：门框、窗子、走廊、屋顶。对每一种类型的积木，又有多种变体可供选择。比如，屋顶可以用文艺复兴风格，也可以用中式庭园风格。神经网络也是，学神经网络，本质上就是认识各种各样“积木”的过程。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/dl-tricks/blob/main/note.ipynb&#34; target=&#34;_blank&#34;&gt;dl-tricks/note.ipynb&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;一必要组件&#34;&gt;一、必要组件&lt;/h3&gt;&#xA;&lt;h4 id=&#34;11-从-mlp-说起&#34;&gt;1.1 从 MLP 说起&lt;/h4&gt;&#xA;&lt;p&gt;我们从最简单的深度神经网络 &lt;strong&gt;多层感知机&lt;/strong&gt; (MLP) 开始说起。麻雀虽小，五脏俱全。了解数据如何在 MLP 中流动，就能大致勾勒一个神经网络的 &lt;strong&gt;必要组件&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;p&gt;下图是一个 4 层感知机，左边是特征，右边是标签。训练开始时，样本数据先从左到右做 &lt;strong&gt;正向传播&lt;/strong&gt;。待数据流到右侧，用 &lt;strong&gt;损失函数&lt;/strong&gt; 计算损失。此时损失是一个标量，而最后一层的节点权重 &lt;code&gt;$W$&lt;/code&gt; 是一个矩阵，标量对矩阵的偏导是矩阵。&lt;strong&gt;优化器&lt;/strong&gt; 会用大小合适的梯度矩阵，沿负梯度方向逐层反向更新权重 &lt;code&gt;$W$&lt;/code&gt;。这样下一 &lt;strong&gt;批量&lt;/strong&gt; (batch) 数据进入网络时，正好能用上一轮更新后的参数做正向传播。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/mlp_network.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h4 id=&#34;12-dataloader&#34;&gt;1.2 DataLoader&lt;/h4&gt;&#xA;&lt;p&gt;样本是有限的，为了让模型获得最强性能，必须榨干每个样本的价值。&lt;/p&gt;&#xA;&lt;p&gt;因此在训练中，一个样本往往要复用多次。&lt;code&gt;DataLoader&lt;/code&gt; 就在做这样一件事。它把数据编排成一个个批量，并构建一个迭代器。每次调用它，会返回一个从第一个批量开始遍历的迭代器。这个特性使得复用样本变得更加方便。&lt;/p&gt;&#xA;&lt;p&gt;原生的 PyTorch &lt;code&gt;DataLoader&lt;/code&gt; 很复杂，让我们来实现一个野生 &lt;code&gt;DataLoader&lt;/code&gt;：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;import math&#xA;import torch&#xA;&#xA;class DataLoader:&#xA;    def __init__(self, data: list, batch_size: int):&#xA;        self.i = 0&#xA;        self.batch_size = batch_size&#xA;        self.batch_num = math.ceil(len(data) / batch_size)&#xA;        self._data = self.gen_batch(data)&#xA;&#xA;    def gen_batch(self, data):&#xA;        lst = []&#xA;        s = self.batch_size&#xA;        for i in range(self.batch_num):&#xA;            start, end = s * i, s * (i + 1)&#xA;            X = torch.tensor([e[0] for e in data[start:end]])&#xA;            y = torch.tensor([e[1] for e in data[start:end]])&#xA;            lst.append((X, y))&#xA;&#xA;        return lst&#xA;&#xA;    def __iter__(self):&#xA;        self.i = 0&#xA;        return self&#xA;&#xA;    def __next__(self):&#xA;        if self.i &amp;lt; len(self._data):&#xA;            self.i += 1&#xA;            return self._data[self.i - 1]&#xA;        else:&#xA;            raise StopIteration&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;假设有 2560 个样本。计划分成 10 个批量，则每批量有 256 个样本。我们可以用上面的野生 &lt;code&gt;DataLoader&lt;/code&gt; 加载这些样本。&lt;/p&gt;</description>
    </item>
    <item>
      <title>文本情感分析</title>
      <link>https://luochang212.github.io/posts/sentiment_analysis/</link>
      <pubDate>Sat, 06 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/sentiment_analysis/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;用 Bert + Transformer Encoder + MLP 做文本情感分析。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/sentiment-analysis&#34; target=&#34;_blank&#34;&gt;sentiment-analysis&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;IMDB 数据集：&lt;a href=&#34;https://www.kaggle.com/datasets/lakshmi25npathi/imdb-dataset-of-50k-movie-reviews/data&#34; target=&#34;_blank&#34;&gt;imdb-dataset&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;本文要点：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;建立 词向量 ⇋ CSV 文件 双向 Pipeline&lt;/li&gt;&#xA;&lt;li&gt;用两种方法对 IMDB 电影评论做情感分析：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Bert 预训练词向量 + MLP&lt;/li&gt;&#xA;&lt;li&gt;Bert + Transformer Encoder + 全连接层&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;✨ PS: 前两章是 Pipeline 代码，建议从第三章看起。&lt;/p&gt;&#xA;&lt;h3 id=&#34;一读写词向量&#34;&gt;一、读写词向量&lt;/h3&gt;&#xA;&lt;p&gt;本节的主要目标是完成 &lt;code&gt;词向量 -&amp;gt; CSV 文件&lt;/code&gt; 和 &lt;code&gt;CSV 文件 -&amp;gt; 词向量&lt;/code&gt; 的 Pipeline。&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;对语料做预处理&lt;/li&gt;&#xA;&lt;li&gt;获取词向量和句子向量&lt;/li&gt;&#xA;&lt;li&gt;将词向量存入 csv&lt;/li&gt;&#xA;&lt;li&gt;从 csv 中读取词向量&lt;/li&gt;&#xA;&lt;li&gt;将读写词向量功能整合成函数&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;br&gt;&#xA;&lt;center&gt;&#xA;&lt;button class=&#34;demo-btn&#34; onclick=&#34;window_on(&#39;https://nbviewer.org/github/luochang212/sentiment-analysis/blob/main/1.store_embedding.ipynb&#39;)&#34;&gt;查看示例&lt;/button&gt;&#xA;&lt;/center&gt;&#xA;&lt;br&gt;&#xA;&lt;h3 id=&#34;二获取-imdb-数据集的-embedding&#34;&gt;二、获取 IMDB 数据集的 Embedding&lt;/h3&gt;&#xA;&lt;p&gt;将 IMDB 数据集中的电影评论转换成句子向量，然后存在 CSV 文件中。&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;文本预处理&lt;/li&gt;&#xA;&lt;li&gt;计算句子向量&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;br&gt;&#xA;&lt;center&gt;&#xA;&lt;button class=&#34;demo-btn&#34; onclick=&#34;window_on(&#39;https://nbviewer.org/github/luochang212/sentiment-analysis/blob/main/2.imdb_embedding.ipynb&#39;)&#34;&gt;查看示例&lt;/button&gt;&#xA;&lt;/center&gt;&#xA;&lt;br&gt;&#xA;&lt;h3 id=&#34;三用-mlp-做文本情感分析&#34;&gt;三、用 MLP 做文本情感分析&lt;/h3&gt;&#xA;&lt;p&gt;用 Bert + MLP 做 IMDB 电影评论文本情感分析。&lt;/p&gt;</description>
    </item>
    <item>
      <title>中文词向量生成</title>
      <link>https://luochang212.github.io/posts/chinese_embedding/</link>
      <pubDate>Sat, 29 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/chinese_embedding/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;本文做了一件有意思的事，用 Bert 生成《红楼梦》人名的词嵌入，再用 t-SNE 将高维的词向量降为二维后做可视化。结果发现，主角团三人的名字在向量空间中是紧紧挨在一起的。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/chinese-embedding&#34; target=&#34;_blank&#34;&gt;luochang212/chinese-embedding&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;本文探索的内容包括：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;如何生成词向量&lt;/li&gt;&#xA;&lt;li&gt;如何生成句子向量&lt;/li&gt;&#xA;&lt;li&gt;如何找到语义相近的词&lt;/li&gt;&#xA;&lt;li&gt;如何对 embedding 做降维及可视化&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;一用-word2vec-生成词向量&#34;&gt;一、用 Word2Vec 生成词向量&lt;/h3&gt;&#xA;&lt;p&gt;用 Word2Vec 生成中英文词向量。&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;英文词向量&lt;/li&gt;&#xA;&lt;li&gt;中文词向量&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;br&gt;&#xA;&lt;center&gt;&#xA;&lt;button class=&#34;demo-btn&#34; onclick=&#34;window_on(&#39;https://nbviewer.org/github/luochang212/chinese-embedding/blob/main/1.word2vec.ipynb&#39;)&#34;&gt;查看笔记&lt;/button&gt;&#xA;&lt;/center&gt;&#xA;&lt;br&gt;&#xA;&lt;h3 id=&#34;二用-bert-生成句子向量&#34;&gt;二、用 Bert 生成句子向量&lt;/h3&gt;&#xA;&lt;p&gt;用 Bert 生成中英文句子向量。&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;英文句子向量&lt;/li&gt;&#xA;&lt;li&gt;中文句子向量&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;br&gt;&#xA;&lt;center&gt;&#xA;&lt;button class=&#34;demo-btn&#34; onclick=&#34;window_on(&#39;https://nbviewer.org/github/luochang212/chinese-embedding/blob/main/2.bert.ipynb&#39;)&#34;&gt;查看笔记&lt;/button&gt;&#xA;&lt;/center&gt;&#xA;&lt;br&gt;&#xA;&lt;h3 id=&#34;三寻找最近邻-embedding&#34;&gt;三、寻找最近邻 embedding&lt;/h3&gt;&#xA;&lt;p&gt;我的构想是：拿到红楼梦里所有词汇的 embedding，然后看我们感兴趣的词（比如林黛玉）离哪个词最近。&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;分词&lt;/li&gt;&#xA;&lt;li&gt;批量计算 embedding&lt;/li&gt;&#xA;&lt;li&gt;计算每个词的 embedding&lt;/li&gt;&#xA;&lt;li&gt;计算我们关心词汇的近邻 embedding&lt;/li&gt;&#xA;&lt;li&gt;整合成一个类&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;br&gt;&#xA;&lt;center&gt;&#xA;&lt;button class=&#34;demo-btn&#34; onclick=&#34;window_on(&#39;https://nbviewer.org/github/luochang212/chinese-embedding/blob/main/3.neighbour.ipynb&#39;)&#34;&gt;查看笔记&lt;/button&gt;&#xA;&lt;/center&gt;&#xA;&lt;br&gt;&#xA;&lt;h3 id=&#34;四embedding-可视化&#34;&gt;四、Embedding 可视化&lt;/h3&gt;&#xA;&lt;p&gt;用 t-SNE 和 PCA 对 embedding 降维，做 2D &amp;amp; 3D 可视化&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;红楼梦中的人物关系&lt;/li&gt;&#xA;&lt;li&gt;中英美城市群&#xA;&lt;ul&gt;&#xA;&lt;li&gt;t-SNE&lt;/li&gt;&#xA;&lt;li&gt;PCA&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;br&gt;&#xA;&lt;center&gt;&#xA;&lt;button class=&#34;demo-btn&#34; onclick=&#34;window_on(&#39;https://nbviewer.org/github/luochang212/chinese-embedding/blob/main/4.visualization.ipynb&#39;)&#34;&gt;查看笔记&lt;/button&gt;&#xA;&lt;/center&gt;&#xA;&lt;br&gt;&#xA;&lt;h3 id=&#34;五头脑风暴&#34;&gt;五、头脑风暴&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Embedding 的稳定性&lt;/li&gt;&#xA;&lt;li&gt;Embedding 差值的意义&lt;/li&gt;&#xA;&lt;li&gt;输出 embedding 的数量&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;br&gt;&#xA;&lt;center&gt;&#xA;&lt;button class=&#34;demo-btn&#34; onclick=&#34;window_on(&#39;https://nbviewer.org/github/luochang212/chinese-embedding/blob/main/5.brainstorming.ipynb&#39;)&#34;&gt;查看笔记&lt;/button&gt;&#xA;&lt;/center&gt;&#xA;&lt;br&gt;&#xA;&lt;h3 id=&#34;附录和-qwen-25-的聊天记录&#34;&gt;附录：和 Qwen-2.5 的聊天记录&lt;/h3&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Q:&lt;/strong&gt; nn.Embedding 是一种预训练的embedding模型吗&lt;/p&gt;</description>
    </item>
    <item>
      <title>Attention Is All You Need 论文精读</title>
      <link>https://luochang212.github.io/posts/transformer_arxiv/</link>
      <pubDate>Sun, 16 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/transformer_arxiv/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;Transformer 的编码器变成了 BERT，解码器变成了 GPT。BERT 推动过去几年搜广推算法增长，而 GPT 促成了今天 GenAI 浪潮的爆发。这篇发表于 2017 年的论文，对今天产生了难以估量的影响。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;原文：&lt;a href=&#34;https://luochang212.github.io/gadget/attention-is-all-you-need/&#34; target=&#34;_blank&#34;&gt;Attention Is All You Need&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;论文翻译&#34;&gt;论文翻译&lt;/h2&gt;&#xA;&lt;h3 id=&#34;摘要&#34;&gt;摘要&lt;/h3&gt;&#xA;&lt;p&gt;主流 seq2seq 模型是基于编解码器架构实现的复杂 RNN 或 CNN 网络，其中表现最好的模型还会使用注意力机制来连接编码器和解码器。我们提出一种全新的简单网络架构：Transformer。它完全基于注意力机制，不使用 RNN 和 CNN。在两个机器翻译任务上的实验表明，它拥有更好的并行度，并且训练时间大大减少。在 WMT 2014 英德翻译任务上，我们的模型取得了 28.4 的 BLEU 分数，比现有最好模型提升 2 BLEU。在 WMT 2014 英法翻译任务上，我们的模型在 8 台 GPU 上训练 3.5 天后，在单一模型评分指标下获得 41.8 的最高分。相比之前文献的最佳模型，Transformer 极大降低了训练成本。我们还通过英语成分句法分析任务展示了 Transformer 的泛化能力，无论数据集大小，Transformer 都能很好地泛化到其他任务上。&lt;/p&gt;&#xA;&lt;h3 id=&#34;1-介绍&#34;&gt;1. 介绍&lt;/h3&gt;&#xA;&lt;p&gt;循环神经网络、长短记忆网络和门控循环网络被证明是序列模型和处理语言建模和机器翻译这类转换问题的最先进方法。在此之后，人们又花费大量努力挖掘循环神经网络语言模型和编解码器架构的潜力。&lt;/p&gt;&#xA;&lt;p&gt;循环神经网络对输入输出词元按位置进行计算，将词元的位置与时间步进行对齐，生成一系列隐状态 $h_t$。该隐状态是前一个隐状态 $h_{t-1}$ 和时间步 $t$ 时刻输入 $X_t$ 的函数。在训练样本时，这种内在的序列关系天然阻碍并行。对长序列文本，因为内存限制了批量样本的处理，导致这种阻碍更加明显。最近的研究利用因子分解和条件计算两种方法显著提升了计算效率，尤其后者还提高了模型的性能。但是序列计算这个最根本的限制依然存在。&lt;/p&gt;&#xA;&lt;p&gt;注意力机制在多种序列建模和转换建模任务中占有重要地位，它能对输入输出序列中的依赖关系进行位置无关的建模。除了少数几个例子外，注意力机制通常和循环神经网络一起使用。&lt;/p&gt;&#xA;&lt;p&gt;我们提出了 Transformer，一种不使用循环神经网络、纯基于注意力来捕获输入输出全局依赖关系的模型。Transformer 显著提高了并行度，并且在 8 台 P100 GPU 上训练 12 小时后，翻译质量达到了前所未有的高度。&lt;/p&gt;</description>
    </item>
    <item>
      <title>注意力机制笔记</title>
      <link>https://luochang212.github.io/posts/attention_note/</link>
      <pubDate>Sun, 09 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/attention_note/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://people.eecs.berkeley.edu/~yima/&#34; target=&#34;_blank&#34;&gt;马毅&lt;/a&gt;：要想正确理解深度神经网络，就必须认识到其本质是学习高维数据中的低维结构的手段。从第一性原理出发，把目的和手段分清楚，其余的都很容易被统一、被解释。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;从 Attention 的角度理解马毅老师这句话，Embedding 的时候本来就升维了，再做 QKV 就相当于在高维里面抽低维信息。而且 Q 也是可学习的，所以就既能学到好的抽取方法；对于每一种抽取方法，又能特别高效地抽取。&lt;/p&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/rnn-note&#34; target=&#34;_blank&#34;&gt;rnn-note&lt;/a&gt; / &lt;a href=&#34;https://github.com/luochang212/attention-note&#34; target=&#34;_blank&#34;&gt;attention-note&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;一语言模型入门rnn-lstm-gru&#34;&gt;一、语言模型入门：RNN, LSTM, GRU&lt;/h3&gt;&#xA;&lt;h4 id=&#34;11-序列模型&#34;&gt;1.1 序列模型&lt;/h4&gt;&#xA;&lt;p&gt;马尔可夫假设，当前数据只跟最近 τ 个数据点相关。把最近 τ 个数据点作为特征，用 MLP 预测当前数据点的值。&lt;/p&gt;&#xA;&lt;br&gt;&#xA;&lt;center&gt;&#xA;&lt;button class=&#34;demo-btn&#34; onclick=&#34;window_on(&#39;https://nbviewer.org/github/luochang212/rnn-note/blob/main/1.序列模型.ipynb&#39;)&#34;&gt;查看笔记&lt;/button&gt;&#xA;&lt;/center&gt;&#xA;&lt;br&gt;&#xA;&lt;h4 id=&#34;12-文本预处理&#34;&gt;1.2 文本预处理&lt;/h4&gt;&#xA;&lt;p&gt;对文本词元化 (tokenize) 并构建词表，就是把文本映射到从 0 开始的索引。&lt;/p&gt;&#xA;&lt;br&gt;&#xA;&lt;center&gt;&#xA;&lt;button class=&#34;demo-btn&#34; onclick=&#34;window_on(&#39;https://nbviewer.org/github/luochang212/rnn-note/blob/main/2.文本预处理.ipynb&#39;)&#34;&gt;查看笔记&lt;/button&gt;&#xA;&lt;/center&gt;&#xA;&lt;br&gt;&#xA;&lt;h4 id=&#34;13-语言模型和数据集&#34;&gt;1.3 语言模型和数据集&lt;/h4&gt;&#xA;&lt;p&gt;对语料分批量 (batch) 处理。介绍了两种（batch 内的）采样策略：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;随机采样策略：每个 batch 内的相邻子序列是随机的&lt;/li&gt;&#xA;&lt;li&gt;顺序分区策略：每个 batch 内的相邻子序列是顺序的&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;br&gt;&#xA;&lt;center&gt;&#xA;&lt;button class=&#34;demo-btn&#34; onclick=&#34;window_on(&#39;https://nbviewer.org/github/luochang212/rnn-note/blob/main/3.语言模型和数据集.ipynb&#39;)&#34;&gt;查看笔记&lt;/button&gt;&#xA;&lt;/center&gt;&#xA;&lt;br&gt;&#xA;&lt;h4 id=&#34;14-循环神经网络的从零开始实现&#34;&gt;1.4 循环神经网络的从零开始实现&lt;/h4&gt;&#xA;&lt;p&gt;每次输出仅由前一个隐状态和当前新输入 x 决定，是为 RNN。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/rnn_flow.svg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;提及的知识点：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;独热编码&lt;/strong&gt;：文本经过词元化后，还要经过 one-hot 处理，才能进入模型&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;困惑度&lt;/strong&gt;：我们用困惑度来描述文本生成的质量，通过一个序列中所有的 n 个词元的交叉熵损失的平均值来衡量&#xA;$$\frac{1}{n} \sum_{t=1}^n-\log P\left(x_t \mid x_{t-1}, \ldots, x_1\right)$$&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;梯度裁剪&lt;/strong&gt;：对于 $T$ 长序列将产生 $O(T)$ 长矩阵乘法链。当 $T$ 较大时，可能导致数值不稳定，例如可能导致梯度爆炸或梯度消失。这种情况下优化算法可能无法收敛。下式通过将梯度 $g$ 投影回给定半径 $\theta$ 来限制梯度的大小。其中 $\frac{\theta}{|\mathbf{g}|}$ 可以理解为梯度 $g$ 的单位方向向量。&#xA;$$\mathbf{g} \leftarrow \min\left(1, \frac{\theta}{|\mathbf{g}|}\right) \mathbf{g}$$&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;br&gt;&#xA;&lt;center&gt;&#xA;&lt;button class=&#34;demo-btn&#34; onclick=&#34;window_on(&#39;https://nbviewer.org/github/luochang212/rnn-note/blob/main/4.循环神经网络的从零开始实现.ipynb&#39;)&#34;&gt;查看笔记&lt;/button&gt;&#xA;&lt;/center&gt;&#xA;&lt;br&gt;&#xA;&lt;h4 id=&#34;15-循环神经网络的简洁实现&#34;&gt;1.5 循环神经网络的简洁实现&lt;/h4&gt;&#xA;&lt;p&gt;使用高级 API 实现循环神经网络。&lt;/p&gt;</description>
    </item>
    <item>
      <title>后台管理工具介绍</title>
      <link>https://luochang212.github.io/posts/process_manager/</link>
      <pubDate>Thu, 30 May 2024 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/process_manager/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;呀嘞呀嘞，我的 JupyterLab 怎么又挂了。&lt;/p&gt;&#xA;&lt;p&gt;简单的 &lt;code&gt;nohup [CMD] &amp;amp;&lt;/code&gt; 已经不够用，该研究一下后台管理工具了。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;问了一下 Qwen，大概有五款后台管理工具可用。这五款工具大致可分为两类：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;进程管理器：&lt;code&gt;systemd&lt;/code&gt;, &lt;code&gt;pm2&lt;/code&gt;, &lt;code&gt;supervisor&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;终端复用器：&lt;code&gt;screen&lt;/code&gt;, &lt;code&gt;tmux&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;总之，保持单个程序在后台运行，&lt;code&gt;systemd&lt;/code&gt; 就够用。如果要维持多个后台程序，&lt;code&gt;pm2&lt;/code&gt; 比较合适。&lt;code&gt;screen&lt;/code&gt; 和 &lt;code&gt;tmux&lt;/code&gt; 则是更临时的方案，适合偶尔用用的情况。&lt;/p&gt;&#xA;&lt;h3 id=&#34;一systemd&#34;&gt;一、systemd&lt;/h3&gt;&#xA;&lt;p&gt;使用 systemd 管理 Jupyter lab 服务，必须先创建一个 systemd unit 文件来定义服务的启动、重启等行为。以下是创建 systemd 服务的步骤。&lt;/p&gt;&#xA;&lt;h4 id=&#34;11-创建-unit-文件&#34;&gt;1.1 创建 unit 文件&lt;/h4&gt;&#xA;&lt;p&gt;用 &lt;code&gt;vi&lt;/code&gt; 新建并打开 &lt;code&gt;jupyterlab.service&lt;/code&gt; 文件：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo vi /etc/systemd/system/jupyterlab.service&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;配置如下：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[Unit]&#xA;Description=Jupyter Lab&#xA;After=network.target&#xA;&#xA;[Service]&#xA;Type=simple&#xA;User=[YOUR_USERNAME]&#xA;ExecStart=/home/[YOUR_USERNAME]/miniconda3/bin/jupyter lab --ip=0.0.0.0 --port=443 --no-browser --allow-root&#xA;WorkingDirectory=/home/[YOUR_USERNAME]/&#xA;Restart=on-failure&#xA;RestartSec=8s&#xA;&#xA;[Install]&#xA;WantedBy=multi-user.target&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;&#xA;&lt;li&gt;将 &lt;code&gt;[YOUR_USERNAME]&lt;/code&gt; 替换为你的用户名。如果你在 root 上开服务，记得在 ExecStart 后加一个 &lt;code&gt;--allow-root&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;如果你的服务不在 https 上，请用 &lt;code&gt;--port=80&lt;/code&gt; 或 &lt;code&gt;--port=8888&lt;/code&gt; 之类的其他端口&lt;/li&gt;&#xA;&lt;li&gt;在 https 上搭建 jupyter lab 服务的方法，参见 &lt;a href=&#34;https://luochang212.github.io/posts/jupyter_lab/#51-%E5%90%AF%E5%8A%A8-jupyterlab&#34; target=&#34;_blank&#34;&gt;在服务器上使用 JupyterLab&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;12-启动服务&#34;&gt;1.2 启动服务&lt;/h4&gt;&#xA;&lt;p&gt;1）重启守护进程，使新增的 systemd unit 文件生效。&lt;/p&gt;</description>
    </item>
    <item>
      <title>深度学习工具箱 FlameAI</title>
      <link>https://luochang212.github.io/posts/flameai/</link>
      <pubDate>Sat, 25 May 2024 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/flameai/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;在上一篇博客&lt;a href=&#34;https://luochang212.github.io/posts/lightgbm_practice/&#34; target=&#34;_blank&#34;&gt;《LightGBM 工程实践》&lt;/a&gt;中，我把通用函数写到 &lt;a href=&#34;https://github.com/luochang212/lightgbm-binary/blob/main/util.py&#34; target=&#34;_blank&#34;&gt;util.py&lt;/a&gt; 文件，以实现代码复用。但是这么复用好麻烦，每次开新项目，得把 util.py 文件贴过去才行。为了省下这个贴的动作，我把它写成 Python 包了。现在下载一次，就可以到处使用啦！&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/flameai&#34; target=&#34;_blank&#34;&gt;flameai&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;一简单介绍&#34;&gt;一、简单介绍&lt;/h3&gt;&#xA;&lt;p&gt;我的这个包叫 &lt;a href=&#34;https://pypi.org/project/flameai&#34; target=&#34;_blank&#34;&gt;FlameAI&lt;/a&gt;。作为一个深度学习工具包，它的主要功能是 &lt;strong&gt;数据预处理&lt;/strong&gt; 和 &lt;strong&gt;模型评估&lt;/strong&gt;。FlameAI 旨在解决最后一公里问题。即在框架之外，业务代码之内，寻求最佳实践。为了让我的包看起来上流一点，我让 Kimi 帮我想了几个名字，最后还是选择了 FlameAI，因为这个名字最霸气。&lt;/p&gt;&#xA;&lt;p&gt;执行以下命令安装 FlameAI：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;pip install flameai&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;如果嫌安装速度慢，可以使用腾讯源或阿里源：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# 腾讯源&#xA;pip install flameai -i https://mirrors.cloud.tencent.com/pypi/simple/&#xA;&#xA;# 阿里源&#xA;pip install flameai -i https://mirrors.aliyun.com/pypi/simple/&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;如果发现 pip 缓存目录占用了太多磁盘空间，可执行以下命令（通常不需要清理）&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# 清理 pip 缓存文件&#xA;pip cache purge&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;二模块功能介绍&#34;&gt;二、模块功能介绍&lt;/h3&gt;&#xA;&lt;h4 id=&#34;21-二分类模型评估&#34;&gt;2.1 二分类模型评估&lt;/h4&gt;&#xA;&lt;p&gt;二分类模型评估是咱们的拳头产品。只需一行命令，就可以计算下面全部指标：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;accuracy&lt;/code&gt;: 准确率&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;precision&lt;/code&gt;: 精确率&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;recall&lt;/code&gt;: 召回率&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;f1_score&lt;/code&gt;: 精确率和召回率的调和平均数&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;auc&lt;/code&gt;: ROC曲线下的面积&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;cross-entropy loss&lt;/code&gt;: 交叉熵损失&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;True Positive (TP)&lt;/code&gt;: 真阳&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;True Negative (TN)&lt;/code&gt;: 真阴&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;False Positive (FP)&lt;/code&gt;: 假阳&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;False Negative (FN)&lt;/code&gt;: 假阴&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;confusion matrix&lt;/code&gt;: 混淆矩阵&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h5 id=&#34;1简单用法&#34;&gt;1）简单用法&lt;/h5&gt;&#xA;&lt;p&gt;你可以直接指定阈值，下面代码中指定阈值为 &lt;code&gt;0.5&lt;/code&gt;。&lt;/p&gt;</description>
    </item>
    <item>
      <title>JupyterLab 中有哪些黑科技</title>
      <link>https://luochang212.github.io/posts/jupyter_lab/</link>
      <pubDate>Wed, 15 May 2024 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/jupyter_lab/</guid>
      <description>&lt;p&gt;JupyterLab 你是真的火了&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;5 月 14 号 &lt;a href=&#34;https://openai.com/index/spring-update/&#34; target=&#34;_blank&#34;&gt;OpenAI 春季发布会&lt;/a&gt; 出现了这个画面：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/openai_jupyter_lab.PNG&#34; alt=&#34;openai_jupyter_lab&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;才知道 &lt;a href=&#34;https://jupyterlab.readthedocs.io/en/latest/&#34; target=&#34;_blank&#34;&gt;JupyterLab&lt;/a&gt; 是 OpenAI 的日常开发工具。感谢 OpenAI 亲自带货。&lt;/p&gt;&#xA;&lt;p&gt;JupyterLab 拥有丰富的功能，并不只是 Python 解释器这么简单，让我向你们展示它的强大！&lt;/p&gt;&#xA;&lt;h3 id=&#34;安装-jupyterlab&#34;&gt;〇、安装 JupyterLab&lt;/h3&gt;&#xA;&lt;p&gt;执行以下命令安装 JupyterLab：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# For miniconda user&#xA;conda install -c conda-forge jupyterlab&#xA;&#xA;# For conda-forge user&#xA;# mamba install -c conda-forge jupyterlab&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: &lt;a href=&#34;https://github.com/mamba-org/mamba&#34; target=&#34;_blank&#34;&gt;mamba&lt;/a&gt; 是 &lt;a href=&#34;https://github.com/conda-forge/miniforge&#34; target=&#34;_blank&#34;&gt;miniforge&lt;/a&gt; 自带的包管理工具。在 miniforge 环境中，你可以用 &lt;code&gt;mamba&lt;/code&gt; 替代 &lt;code&gt;conda&lt;/code&gt;，比如 &lt;code&gt;mamba info --envs&lt;/code&gt;。使用 mamba 通常可以获得更高的下载速度。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;h3 id=&#34;一制作-ppt&#34;&gt;一、制作 PPT&lt;/h3&gt;&#xA;&lt;h4 id=&#34;11-notebook-转-ppt&#34;&gt;1.1 Notebook 转 PPT&lt;/h4&gt;&#xA;&lt;p&gt;只需两步，就能把 Notebook 转成 PPT：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;设置 Slide Type&lt;/strong&gt;：为保证页面被正确渲染，你需要设置 Cell 的 &lt;code&gt;Slide Type&lt;/code&gt;。对于新版 Jupyter Lab，在右侧边栏上有带俩齿轮的按钮，点进去，然后一路点 &lt;code&gt;[Property Inspector] -&amp;gt; [COMMON TOOLS] -&amp;gt; [Slide Type]&lt;/code&gt;，在这里对 Cell 进行设置。&lt;/p&gt;</description>
    </item>
    <item>
      <title>LSTM 家庭用电预测</title>
      <link>https://luochang212.github.io/posts/lstm_power_consumption/</link>
      <pubDate>Sun, 12 May 2024 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/lstm_power_consumption/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;长短期记忆网络（Long Short-Term Memory，LSTM）是一种 RNN 模型，常用于序列数据建模。尤其适合需要挖掘序列中长期依赖关系的问题。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/lstm-model&#34; target=&#34;_blank&#34;&gt;luochang212/lstm-model&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;一keras-模型训练&#34;&gt;一、keras 模型训练&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;数据导入&lt;/li&gt;&#xA;&lt;li&gt;数据预处理&lt;/li&gt;&#xA;&lt;li&gt;趋势可视化&lt;/li&gt;&#xA;&lt;li&gt;分割训练集和测试集&lt;/li&gt;&#xA;&lt;li&gt;定义 &amp;amp; 训练网络&lt;/li&gt;&#xA;&lt;li&gt;预测&lt;/li&gt;&#xA;&lt;li&gt;预测整个序列&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;br&gt;&#xA;&lt;center&gt;&#xA;&lt;button class=&#34;demo-btn&#34; onclick=&#34;window_on(&#39;https://nbviewer.jupyter.org/github/luochang212/lstm-model/blob/main/1.keras模型训练.ipynb&#39;)&#34;&gt;查看示例&lt;/button&gt;&#xA;&lt;/center&gt;&#xA;&lt;br&gt;&#xA;&lt;h3 id=&#34;二keras-模型推理&#34;&gt;二、keras 模型推理&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;数据预处理&lt;/li&gt;&#xA;&lt;li&gt;用训练好的 keras 模型做预测&lt;/li&gt;&#xA;&lt;li&gt;预测下一个值&lt;/li&gt;&#xA;&lt;li&gt;预测下一个序列&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;br&gt;&#xA;&lt;center&gt;&#xA;&lt;button class=&#34;demo-btn&#34; onclick=&#34;window_on(&#39;https://nbviewer.jupyter.org/github/luochang212/lstm-model/blob/main/2.keras模型推理.ipynb&#39;)&#34;&gt;查看示例&lt;/button&gt;&#xA;&lt;/center&gt;&#xA;&lt;br&gt;&#xA;&lt;h3 id=&#34;三pytorch-模型训练&#34;&gt;三、PyTorch 模型训练&lt;/h3&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;施工中&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;参考资料：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.kaggle.com/datasets/sagnikseal/household-power-consumption&#34; target=&#34;_blank&#34;&gt;Household_Power_consumption&lt;/a&gt; (dataset)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.kaggle.com/code/akdagmelih/ocean-wave-prediction-with-lstm/notebook&#34; target=&#34;_blank&#34;&gt;Ocean Wave Prediction with LSTM&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.kaggle.com/code/amirrezaeian/time-series-data-analysis-using-lstm-tutorial/notebook&#34; target=&#34;_blank&#34;&gt;Time-series data analysis using LSTM (Tutorial)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://docs.kanaries.net/pygwalker#a-python-library-for-exploratory-data-analysis-with-visualization---pygwalkers&#34; target=&#34;_blank&#34;&gt;PyGWalker&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/luochang212/rnn-note&#34; target=&#34;_blank&#34;&gt;luochang212/rnn-note&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div id=&#34;mini-overlay&#34; onclick=&#34;overlay_off()&#34;&gt;&lt;/div&gt;&#xA;&lt;div id=&#34;mini-window&#34;&gt;&lt;iframe id=&#34;mini-iframe&#34; frameBorder=&#34;0&#34;&gt;&lt;/iframe&gt;&lt;/div&gt;&#xA;&lt;button id=&#34;btn-close&#34; onclick=&#34;overlay_off()&#34;&gt;×&lt;/button&gt;&#xA;&lt;script src=&#34;https://luochang212.github.io/python-tips/overlay.js&#34;&gt;&lt;/script&gt;&#xA;&lt;link rel=&#34;stylesheet&#34; href=&#34;https://luochang212.github.io/python-tips/style.css&#34;&gt;</description>
    </item>
    <item>
      <title>LightGBM 工程实践</title>
      <link>https://luochang212.github.io/posts/lightgbm_practice/</link>
      <pubDate>Sat, 13 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/lightgbm_practice/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;LightGBM 是一种梯度提升树算法，可用于排序、分类和回归任务。本文由一系列 Jupyter Notebook 串成，介绍如何使用 LightGBM 训练二分类模型。本项目使用的数据集是 &lt;a href=&#34;https://archive.ics.uci.edu/dataset/2/adult&#34; target=&#34;_blank&#34;&gt;adult&lt;/a&gt; (・ω&amp;lt; )★&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/lightgbm-binary&#34; target=&#34;_blank&#34;&gt;lightgbm-binary&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;-本文亮点&#34;&gt;🚀 本文亮点&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;✅ 使用 Optuna 做超参数寻优&lt;/li&gt;&#xA;&lt;li&gt;✅ 使用 Treelite 做推理加速&lt;/li&gt;&#xA;&lt;li&gt;✅ 使用 Graphviz 做决策树模型可视化&lt;/li&gt;&#xA;&lt;li&gt;✅ 使用 &lt;code&gt;scale_pos_weight&lt;/code&gt; 参数，解决样本不均衡问题&lt;/li&gt;&#xA;&lt;li&gt;✅ 对标签概率生成标签的阈值寻优 (&lt;code&gt;y_pred -&amp;gt; y&lt;/code&gt;)，详见 &lt;code&gt;util.gen_threshold&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;✅ 编写自适应学习率衰减函数提高 AUC，详见 &lt;code&gt;util.AdaptiveLearningRate&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;✅ 编写一站式评估函数，可一次性输出多种指标，包括 accuracy, precision, recall, f1_score, auc, cross-entropy loss, confusion matrix，详见 &lt;code&gt;util.eval_binary&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;✨ 注意：以下代码运行时依赖 &lt;a href=&#34;https://github.com/luochang212/lightgbm-binary/blob/main/util.py&#34; target=&#34;_blank&#34;&gt;util.py&lt;/a&gt; 文件&lt;/p&gt;&#xA;&lt;h3 id=&#34;一数据可视化&#34;&gt;一、数据可视化&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;导入数据&lt;/li&gt;&#xA;&lt;li&gt;统计描述&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;describe()&lt;/code&gt; 方法&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;info()&lt;/code&gt; 方法&lt;/li&gt;&#xA;&lt;li&gt;统计各字段枚举值数量&lt;/li&gt;&#xA;&lt;li&gt;查看字段下所有枚举值&lt;/li&gt;&#xA;&lt;li&gt;查看空值个数&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;可视化&#xA;&lt;ul&gt;&#xA;&lt;li&gt;标号的值的比例&lt;/li&gt;&#xA;&lt;li&gt;小提琴图 (Violin Plot)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;center&gt;&#xA;&lt;button class=&#34;demo-btn&#34; onclick=&#34;window_on(&#39;https://nbviewer.jupyter.org/github/luochang212/lightgbm-binary/blob/main/1.数据可视化.ipynb&#39;)&#34;&gt;查看示例&lt;/button&gt;&#xA;&lt;/center&gt;&#xA;&lt;h3 id=&#34;二预处理与特征选择&#34;&gt;二、预处理与特征选择&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;预处理&#xA;&lt;ul&gt;&#xA;&lt;li&gt;标签编码&lt;/li&gt;&#xA;&lt;li&gt;更好的编码方式？&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;初次训练&#xA;&lt;ul&gt;&#xA;&lt;li&gt;使用 &lt;code&gt;lgb.LGBMClassifier&lt;/code&gt; 进行训练&lt;/li&gt;&#xA;&lt;li&gt;使用原生 API 进行训练&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;简单评估&lt;/li&gt;&#xA;&lt;li&gt;模型存储与导入&#xA;&lt;ul&gt;&#xA;&lt;li&gt;模型存储&lt;/li&gt;&#xA;&lt;li&gt;模型导入&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;特征选择&#xA;&lt;ul&gt;&#xA;&lt;li&gt;计算特征的重要程度&lt;/li&gt;&#xA;&lt;li&gt;多次实验求均值&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;center&gt;&#xA;&lt;button class=&#34;demo-btn&#34; onclick=&#34;window_on(&#39;https://nbviewer.jupyter.org/github/luochang212/lightgbm-binary/blob/main/2.预处理与特征选择.ipynb&#39;)&#34;&gt;查看示例&lt;/button&gt;&#xA;&lt;/center&gt;&#xA;&lt;h3 id=&#34;三超参数微调&#34;&gt;三、超参数微调&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;简单的例子&lt;/li&gt;&#xA;&lt;li&gt;稍微复杂的例子：随机森林&#xA;&lt;ul&gt;&#xA;&lt;li&gt;导入数据&lt;/li&gt;&#xA;&lt;li&gt;one-hot 编码&lt;/li&gt;&#xA;&lt;li&gt;训练&lt;/li&gt;&#xA;&lt;li&gt;评估&lt;/li&gt;&#xA;&lt;li&gt;超参数微调&lt;/li&gt;&#xA;&lt;li&gt;使用微调后的超参数训练&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;LightGMB 超参数微调&#xA;&lt;ul&gt;&#xA;&lt;li&gt;单次训练&lt;/li&gt;&#xA;&lt;li&gt;超参数寻优&lt;/li&gt;&#xA;&lt;li&gt;使用微调后的超参数训练&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;学习率衰减&#xA;&lt;ul&gt;&#xA;&lt;li&gt;指数衰减&lt;/li&gt;&#xA;&lt;li&gt;自适应衰减&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;center&gt;&#xA;&lt;button class=&#34;demo-btn&#34; onclick=&#34;window_on(&#39;https://nbviewer.jupyter.org/github/luochang212/lightgbm-binary/blob/main/3.超参数微调.ipynb&#39;)&#34;&gt;查看示例&lt;/button&gt;&#xA;&lt;/center&gt;&#xA;&lt;h3 id=&#34;四训练与评估&#34;&gt;四、训练与评估&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;基础模型&lt;/li&gt;&#xA;&lt;li&gt;N 折交叉验证&lt;/li&gt;&#xA;&lt;li&gt;超参寻优：N 折交叉验证&lt;/li&gt;&#xA;&lt;li&gt;使用微调后的超参数训练&lt;/li&gt;&#xA;&lt;li&gt;阈值选择 (&lt;code&gt;y_pred -&amp;gt; y&lt;/code&gt;)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;使用 &lt;code&gt;np.rint&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;尝试：考虑原标号的分布&#xA;&lt;ul&gt;&#xA;&lt;li&gt;训练标号的分布情况&lt;/li&gt;&#xA;&lt;li&gt;预测标号的概率密度函数 (PDF)&lt;/li&gt;&#xA;&lt;li&gt;预测标号的概率分布函数 (CDF)&lt;/li&gt;&#xA;&lt;li&gt;当 CDF = &lt;code&gt;训练数据 0 标号比例&lt;/code&gt; 时反推阈值&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;使用 optuna 寻优&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;评估&#xA;&lt;ul&gt;&#xA;&lt;li&gt;混淆矩阵&lt;/li&gt;&#xA;&lt;li&gt;准确率&lt;/li&gt;&#xA;&lt;li&gt;精确率和召回率&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;f1&lt;/code&gt; 值&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;log_loss&lt;/code&gt; 交叉熵损失&lt;/li&gt;&#xA;&lt;li&gt;ROC 曲线 与 AUC&lt;/li&gt;&#xA;&lt;li&gt;一站式评估函数&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;center&gt;&#xA;&lt;button class=&#34;demo-btn&#34; onclick=&#34;window_on(&#39;https://nbviewer.jupyter.org/github/luochang212/lightgbm-binary/blob/main/4.训练与评估.ipynb&#39;)&#34;&gt;查看示例&lt;/button&gt;&#xA;&lt;/center&gt;&#xA;&lt;h2 id=&#34;五加速推理&#34;&gt;五、加速推理&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;导入模型和数据&lt;/li&gt;&#xA;&lt;li&gt;使用 Treelite 加速推理&#xA;&lt;ul&gt;&#xA;&lt;li&gt;推理速度&lt;/li&gt;&#xA;&lt;li&gt;推理准度&lt;/li&gt;&#xA;&lt;li&gt;通用函数&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;center&gt;&#xA;&lt;button class=&#34;demo-btn&#34; onclick=&#34;window_on(&#39;https://nbviewer.jupyter.org/github/luochang212/lightgbm-binary/blob/main/5.加速推理.ipynb&#39;)&#34;&gt;查看示例&lt;/button&gt;&#xA;&lt;/center&gt;&#xA;&lt;h2 id=&#34;六部署&#34;&gt;六、部署&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;模型训练&lt;/li&gt;&#xA;&lt;li&gt;模型部署&#xA;&lt;ul&gt;&#xA;&lt;li&gt;离线部署&lt;/li&gt;&#xA;&lt;li&gt;在线部署&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;center&gt;&#xA;&lt;button class=&#34;demo-btn&#34; onclick=&#34;window_on(&#39;https://nbviewer.jupyter.org/github/luochang212/lightgbm-binary/blob/main/6.部署.ipynb&#39;)&#34;&gt;查看示例&lt;/button&gt;&#xA;&lt;/center&gt;&#xA;&lt;h2 id=&#34;七模型可视化&#34;&gt;七、模型可视化&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;创建可交互的可视化界面&lt;/li&gt;&#xA;&lt;li&gt;将决策树存成 PNG / PDF&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;center&gt;&#xA;&lt;button class=&#34;demo-btn&#34; onclick=&#34;window_on(&#39;https://nbviewer.jupyter.org/github/luochang212/lightgbm-binary/blob/main/7.模型可视化.ipynb&#39;)&#34;&gt;查看示例&lt;/button&gt;&#xA;&lt;/center&gt;&#xA;&lt;p&gt;参考：&lt;/p&gt;</description>
    </item>
    <item>
      <title>家庭网络拓扑</title>
      <link>https://luochang212.github.io/posts/home_network_topology/</link>
      <pubDate>Sat, 02 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/home_network_topology/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;本文介绍家庭局域网的数据传输过程。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;常见家庭网络拓扑如下：&lt;/p&gt;&#xA;&lt;pre class=&#34;mermaid&#34;&gt;&#xA;flowchart LR&#xA;    A[外网] --&gt;|光纤入户| B[光猫] --&gt;|路由器WAN| C[路由器] --&gt; D[交换机]&#xA;    D --&gt;|交换机LAN1| E[电脑]&#xA;    D --&gt;|交换机LAN2| F[笔记本]&#xA;    D--&gt;|交换机LAN3| G[电视机盒子]&#xA;&lt;/pre&gt;&#xA;&lt;p&gt;现代的 &lt;strong&gt;路由器&lt;/strong&gt; 和 &lt;strong&gt;交换机&lt;/strong&gt; 其实是一个设备，统称路由器。为了便于理解，我们还是把它们拆开。&lt;/p&gt;&#xA;&lt;h3 id=&#34;一局域网设备&#34;&gt;一、局域网设备&lt;/h3&gt;&#xA;&lt;p&gt;光猫、路由器、交换机 的连接方法。&lt;/p&gt;&#xA;&lt;h4 id=&#34;1光猫&#34;&gt;1）光猫&lt;/h4&gt;&#xA;&lt;p&gt;光猫一般放在弱电箱，它有一个 WAN 口和多个 LAN 口。我们把路由器插在其中一个 LAN 口上，假设插的是 LAN1&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;WAN&lt;/th&gt;&#xA;          &lt;th&gt;LAN1&lt;/th&gt;&#xA;          &lt;th&gt;LAN2&lt;/th&gt;&#xA;          &lt;th&gt;LAN3&lt;/th&gt;&#xA;          &lt;th&gt;&lt;code&gt;...&lt;/code&gt;&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;接外网网线&lt;/td&gt;&#xA;          &lt;td&gt;&lt;font color=&#34;red&#34;&gt;接路由器&lt;/font&gt;&lt;/td&gt;&#xA;          &lt;td&gt;空闲&lt;/td&gt;&#xA;          &lt;td&gt;空闲&lt;/td&gt;&#xA;          &lt;td&gt;空闲&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h4 id=&#34;2光猫-接-路由器&#34;&gt;2）光猫 接 路由器&lt;/h4&gt;&#xA;&lt;p&gt;然后将网线从光猫 LAN1 接到路由器 WAN&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;WAN&lt;/th&gt;&#xA;          &lt;th&gt;LAN&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;font color=&#34;red&#34;&gt;接光猫 LAN1&lt;/font&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;font color=&#34;blue&#34;&gt;接交换机&lt;/font&gt;（为了便于理解，虚拟出来的 LAN，实际不存在）&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h4 id=&#34;3路由器-接-交换机&#34;&gt;3）路由器 接 交换机&lt;/h4&gt;&#xA;&lt;p&gt;最后将网线从路由器 LAN 接到交换机 WAN&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;WAN&lt;/th&gt;&#xA;          &lt;th&gt;LAN1&lt;/th&gt;&#xA;          &lt;th&gt;LAN2&lt;/th&gt;&#xA;          &lt;th&gt;LAN3&lt;/th&gt;&#xA;          &lt;th&gt;&lt;code&gt;...&lt;/code&gt;&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;font color=&#34;blue&#34;&gt;接路由器 LAN&lt;/font&gt;&lt;/td&gt;&#xA;          &lt;td&gt;接电脑&lt;/td&gt;&#xA;          &lt;td&gt;接笔记本&lt;/td&gt;&#xA;          &lt;td&gt;接电视机盒子&lt;/td&gt;&#xA;          &lt;td&gt;空闲&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h3 id=&#34;二局域网概念&#34;&gt;二、局域网概念&lt;/h3&gt;&#xA;&lt;p&gt;当我们把网线从光猫到路由器再到设备一路接好，就有了一个 &lt;strong&gt;局域网&lt;/strong&gt; (Local Area Network，LAN)。由于我们主要关心局域网中发生了什么，因此不画光猫。下图是我们的局域网：&lt;/p&gt;</description>
    </item>
    <item>
      <title>图算法笔记</title>
      <link>https://luochang212.github.io/posts/graph_algorithms/</link>
      <pubDate>Sun, 25 Feb 2024 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/graph_algorithms/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;记笔记能让脑子里的知识结构化说是&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/graph-algorithm&#34; target=&#34;_blank&#34;&gt;graph-algorithm&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;一图的基础操作&#34;&gt;一、图的基础操作&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;1.创建图&#xA;&lt;ul&gt;&#xA;&lt;li&gt;1.1 从空图开始创建&lt;/li&gt;&#xA;&lt;li&gt;1.2 用边文件创建&lt;/li&gt;&#xA;&lt;li&gt;1.3 用已经存在的图、边的列表创建&lt;/li&gt;&#xA;&lt;li&gt;1.4 创建带权边&lt;/li&gt;&#xA;&lt;li&gt;1.5 为图添加属性&lt;/li&gt;&#xA;&lt;li&gt;1.6 创建有向图&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;2.可视化&#xA;&lt;ul&gt;&#xA;&lt;li&gt;random&lt;/li&gt;&#xA;&lt;li&gt;circular&lt;/li&gt;&#xA;&lt;li&gt;spectral&lt;/li&gt;&#xA;&lt;li&gt;shell&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;3.中心性度量&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Degree Centrality&lt;/li&gt;&#xA;&lt;li&gt;Closeness Centrality&lt;/li&gt;&#xA;&lt;li&gt;Betweenness Centrality&lt;/li&gt;&#xA;&lt;li&gt;Eigenvector Centrality&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;4.随机图生成&lt;/li&gt;&#xA;&lt;li&gt;5.读写文件&#xA;&lt;ul&gt;&#xA;&lt;li&gt;写入文件&lt;/li&gt;&#xA;&lt;li&gt;读出数据&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;br&gt;&#xA;&lt;center&gt;&#xA;&lt;button class=&#34;demo-btn&#34; onclick=&#34;window_on(&#39;https://nbviewer.org/github/luochang212/graph-algorithm/blob/main/1.base.ipynb&#39;)&#34;&gt;查看示例&lt;/button&gt;&#xA;&lt;/center&gt;&#xA;&lt;br&gt;&#xA;&lt;h3 id=&#34;二通用图算法&#34;&gt;二、通用图算法&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;连通性 Connectivity&lt;/li&gt;&#xA;&lt;li&gt;最短路 Shortest Paths&lt;/li&gt;&#xA;&lt;li&gt;相似性度量 Similarity Measures&lt;/li&gt;&#xA;&lt;li&gt;距离度量 Distance Measures&lt;/li&gt;&#xA;&lt;li&gt;链接预测 Link Prediction&lt;/li&gt;&#xA;&lt;li&gt;匹配 Matching&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;br&gt;&#xA;&lt;center&gt;&#xA;&lt;button class=&#34;demo-btn&#34; onclick=&#34;window_on(&#39;https://nbviewer.org/github/luochang212/graph-algorithm/blob/main/2.algorithms.ipynb&#39;)&#34;&gt;查看示例&lt;/button&gt;&#xA;&lt;/center&gt;&#xA;&lt;br&gt;&#xA;&lt;h3 id=&#34;三社区检测算法&#34;&gt;三、社区检测算法&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;1.常见社区检测算法&#xA;&lt;ul&gt;&#xA;&lt;li&gt;1.1 label Propagation&lt;/li&gt;&#xA;&lt;li&gt;1.2 Girvan-Newman&lt;/li&gt;&#xA;&lt;li&gt;1.3 Greedy Modularity&lt;/li&gt;&#xA;&lt;li&gt;1.4 Louvain&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;2.是否接受边权作为输入&#xA;&lt;ul&gt;&#xA;&lt;li&gt;推荐使用 louvain&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;br&gt;&#xA;&lt;center&gt;&#xA;&lt;button class=&#34;demo-btn&#34; onclick=&#34;window_on(&#39;https://nbviewer.org/github/luochang212/graph-algorithm/blob/main/3.community.ipynb&#39;)&#34;&gt;查看示例&lt;/button&gt;&#xA;&lt;/center&gt;&#xA;&lt;br&gt;&#xA;&lt;h3 id=&#34;四图嵌入&#34;&gt;四、图嵌入&lt;/h3&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;施工中&lt;/p&gt;</description>
    </item>
    <item>
      <title>树莓派 5 装机指南</title>
      <link>https://luochang212.github.io/posts/raspberry_pi_5/</link>
      <pubDate>Sat, 24 Feb 2024 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/raspberry_pi_5/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;2024 年 2 月，给我的 Raspberry Pi 5 安装 Ubuntu，最后踩了两次坑才装好。感觉搜索前几的教程都不对，没一个让我顺利装完的。那么我来记录一下安装过程吧&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;h3 id=&#34;一下载&#34;&gt;一、下载&lt;/h3&gt;&#xA;&lt;p&gt;你需要下载两个东西：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;ubuntu-23.10&lt;/strong&gt;：适用于树莓派 5 的 Ubuntu 镜像&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Raspberry Pi Imager&lt;/strong&gt;：将镜像写入 TF 卡的工具&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;1）&lt;strong&gt;ubuntu-23.10&lt;/strong&gt; 的下载页面：&lt;a href=&#34;https://ubuntu.com/download/raspberry-pi&#34; target=&#34;_blank&#34;&gt;ubuntu.com/download/raspberry-pi&lt;/a&gt;&lt;/p&gt;&#xA;&lt;!-- ubuntu-23.10-preinstalled-desktop-arm64+raspi.img.xz --&gt;&#xA;&lt;p&gt;PS: 你可以选择服务器版或桌面版，我安的是桌面版&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/rasp_ubuntu.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;2）&lt;strong&gt;Raspberry Pi Imager&lt;/strong&gt; 的下载页面：&lt;a href=&#34;https://www.raspberrypi.com/software&#34; target=&#34;_blank&#34;&gt;raspberrypi.com/software&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/rasp_img.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;二将镜像写入-tf-卡&#34;&gt;二、将镜像写入 TF 卡&lt;/h3&gt;&#xA;&lt;p&gt;下载好镜像之后，你需要把镜像写入 TF 卡。&lt;/p&gt;&#xA;&lt;p&gt;打开 &lt;strong&gt;Raspberry Pi Imager&lt;/strong&gt;，界面上有三个白框，分别是：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;CHOOSE DEVICE&lt;/code&gt;: 选择你的树莓派版本。选 &lt;code&gt;Raspberry Pi 5&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;CHOOSE OS&lt;/code&gt;: 选择你要安装的镜像。由于我们用的是本地镜像，下拉栏划到最底，选 &lt;code&gt;Use custom&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;CHOOSE STORAGE&lt;/code&gt;: 选择你的 TF 卡。没插卡的请插卡，然后在下拉栏选中你的卡。由于后续步骤会抹除 TF 卡数据，清确保卡内没有重要文件&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/rasp_img_ui.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;三首次启动-ubuntu&#34;&gt;三、首次启动 Ubuntu&lt;/h3&gt;&#xA;&lt;p&gt;在不插电源的情况下，将 TF 卡插入板子。&lt;/p&gt;&#xA;&lt;p&gt;然后连接外接显示屏、鼠标、键盘、网线（如果有），插电即可直接点亮。如果 1 分钟后没有任何反应，可以尝试按 TF 卡旁边的电源键。需要注意的是，树莓派 5 新加了实体电源键，老版本没有。&lt;/p&gt;</description>
    </item>
    <item>
      <title>手写深度学习</title>
      <link>https://luochang212.github.io/posts/d2l_from_scratch/</link>
      <pubDate>Fri, 09 Feb 2024 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/d2l_from_scratch/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;与其说深度学习是一门技术，不如说深度学习是一种语言&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/AI-Project/tree/main/scratch&#34; target=&#34;_blank&#34;&gt;AI-Project/scratch&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;一自动微分&#34;&gt;一、自动微分&lt;/h3&gt;&#xA;&lt;h4 id=&#34;1-简单的例子&#34;&gt;1. 简单的例子&lt;/h4&gt;&#xA;&lt;p&gt;1.1 张量 x 的梯度&lt;/p&gt;&#xA;&lt;p&gt;张量 &lt;code&gt;$x$&lt;/code&gt; 的梯度可以存储在 &lt;code&gt;$x$&lt;/code&gt; 上。&lt;/p&gt;&#xA;&lt;p&gt;要点：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;x.grad&lt;/code&gt;: 取 &lt;code&gt;$x$&lt;/code&gt; 的梯度&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;x.requires_grad_(True)&lt;/code&gt;: 允许 tenser &lt;code&gt;$x$&lt;/code&gt; 存储自己的梯度&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;x.grad.zero_()&lt;/code&gt;: 将 &lt;code&gt;$x$&lt;/code&gt; 的梯度置零&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;import torch&#xA;&#xA;# 初始化张量 x (tensor x)&#xA;x = torch.arange(4.0)&#xA;&#xA;x.requires_grad_(True)  # 允许 tensor x 存储梯度&#xA;x.grad is None  # 梯度默认为 None&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;&amp;gt; True&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;初始化带梯度的张量，下面是两个例子：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;torch.tensor([1., 2., 3.], requires_grad=True)&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;&amp;gt; tensor([1., 2., 3.], requires_grad=True)&lt;/code&gt;&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;torch.randn((2, 5), requires_grad=True)&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;&amp;gt; tensor([[ 0.4075,  1.1930,  0.5716, -1.0924,  0.0653], [-1.2869,  1.5768,  1.3445,  0.6309, -0.0484]], requires_grad=True)&lt;/code&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Linux 运维手册</title>
      <link>https://luochang212.github.io/posts/linux_handbook/</link>
      <pubDate>Sat, 03 Feb 2024 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/linux_handbook/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;基于 CentOS 系统&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;h3 id=&#34;一常见操作&#34;&gt;一、常见操作&lt;/h3&gt;&#xA;&lt;h4 id=&#34;1文件操作&#34;&gt;1）文件操作&lt;/h4&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;命令&lt;/th&gt;&#xA;          &lt;th&gt;描述&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;ls&lt;/td&gt;&#xA;          &lt;td&gt;列出当前文件夹下的文件&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;ls -alh&lt;/td&gt;&#xA;          &lt;td&gt;列出包括隐藏文件在内的所有文件，显示详细信息，并以人类可读的方式显示占用的磁盘空间大小&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;touch [FILE]&lt;/td&gt;&#xA;          &lt;td&gt;创建文件&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;vim [FILE]&lt;/td&gt;&#xA;          &lt;td&gt;打开文件&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;cat [FILE]&lt;/td&gt;&#xA;          &lt;td&gt;打印文件&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;head [FILE]&lt;/td&gt;&#xA;          &lt;td&gt;打印文件头 10 行，展示 20 行用 &lt;code&gt;head -n 20 [FILE]&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;tail [FILE]&lt;/td&gt;&#xA;          &lt;td&gt;打印文件尾 10 行，展示 20 行用 &lt;code&gt;tail -n 20 [FILE]&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;tail -f [FILE]&lt;/td&gt;&#xA;          &lt;td&gt;实时查看文件的末尾新增的内容，一般用于打印监控日志&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;less [FILE]&lt;/td&gt;&#xA;          &lt;td&gt;打印文件，可以用 &lt;code&gt;上键&lt;/code&gt; &lt;code&gt;下键&lt;/code&gt; 翻页&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;rm [FILE]&lt;/td&gt;&#xA;          &lt;td&gt;删除文件&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;rm -rf [DIR]&lt;/td&gt;&#xA;          &lt;td&gt;递归删除路径&lt;code&gt;DIR&lt;/code&gt;下所有文件&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;mv [FILE_A] [FILE_B]&lt;/td&gt;&#xA;          &lt;td&gt;文件&lt;code&gt;FILE_A&lt;/code&gt;改名为&lt;code&gt;FILE_B&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;mv [FILE] [DIR]&lt;/td&gt;&#xA;          &lt;td&gt;文件&lt;code&gt;FILE&lt;/code&gt;移动到路径&lt;code&gt;DIR&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;cd [PATH]&lt;/td&gt;&#xA;          &lt;td&gt;打开目录&lt;code&gt;PATH&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;mkdir [PATH]&lt;/td&gt;&#xA;          &lt;td&gt;创建目录&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;mkdir -p [PATH/TO/DIR]&lt;/td&gt;&#xA;          &lt;td&gt;创建多级目录&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;tar cvf file.tar ./data&lt;/td&gt;&#xA;          &lt;td&gt;把 &lt;code&gt;data&lt;/code&gt; 目录 压缩成 &lt;code&gt;file.tar&lt;/code&gt; 文件&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;tar xvf file.tar&lt;/td&gt;&#xA;          &lt;td&gt;解压 &lt;code&gt;file.tar&lt;/code&gt; 文件&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h4 id=&#34;2网络操作&#34;&gt;2）网络操作&lt;/h4&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;命令&lt;/th&gt;&#xA;          &lt;th&gt;描述&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;lsof -i&lt;/td&gt;&#xA;          &lt;td&gt;列出所有与网络连接有关的进程及其打开的端口信息&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;lsof -i :[PORT]&lt;/td&gt;&#xA;          &lt;td&gt;列出特定端口的进程信息&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;lsof | grep deleted&lt;/td&gt;&#xA;          &lt;td&gt;列出占用未被正确删除的文件的句柄的进程&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;ifconfig&lt;/td&gt;&#xA;          &lt;td&gt;查看有效的网络接口的状态&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;ifconfig -a&lt;/td&gt;&#xA;          &lt;td&gt;查看所有的网络接口的状态&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;arp -a&lt;/td&gt;&#xA;          &lt;td&gt;查看局域网中设备的ip地址&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;ping [SERVER_IP]&lt;/td&gt;&#xA;          &lt;td&gt;检查远端服务器连通性&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;telnet [SERVER_IP] [SERVER_PORT]&lt;/td&gt;&#xA;          &lt;td&gt;检查远端服务器的端口的连通性&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;hostname -I&lt;/td&gt;&#xA;          &lt;td&gt;awk &amp;lsquo;{print $1}&amp;rsquo;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;wget [URL]&lt;/td&gt;&#xA;          &lt;td&gt;下载文件到当前路径&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;curl [URL]&lt;/td&gt;&#xA;          &lt;td&gt;访问网页&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;netstat -tnpl&lt;/td&gt;&#xA;          &lt;td&gt;显示TCP类型的端口&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;netstat -unpl&lt;/td&gt;&#xA;          &lt;td&gt;显示UDP类型的端口&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;netstat -r&lt;/td&gt;&#xA;          &lt;td&gt;显示路由表信息&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;netstat -g&lt;/td&gt;&#xA;          &lt;td&gt;显示多重广播功能群组组员名单&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;netstat -s&lt;/td&gt;&#xA;          &lt;td&gt;显示按协议分类统计信息&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;netstat -l&lt;/td&gt;&#xA;          &lt;td&gt;显示所有监听端口&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;netstat -n&lt;/td&gt;&#xA;          &lt;td&gt;使用域名解析，将域名解析成ip地址&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;netstat -p&lt;/td&gt;&#xA;          &lt;td&gt;显示程序名和进程PID&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;netstat -t&lt;/td&gt;&#xA;          &lt;td&gt;显示所有的tcp协议的端口&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;netstat -u&lt;/td&gt;&#xA;          &lt;td&gt;显示所有的udp协议的端口&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;ssh -p [SERVER_PORT] [USER]@[SERVER_IP]&lt;/td&gt;&#xA;          &lt;td&gt;ssh连接远端服务器&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;ssh-keygen -R [SERVER_IP]&lt;/td&gt;&#xA;          &lt;td&gt;同IP机器重装后重连前注销老host&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;dig [example.com]&lt;/td&gt;&#xA;          &lt;td&gt;是 Linux 系统用于查询 DNS 信息的工具&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h4 id=&#34;3系统操作&#34;&gt;3）系统操作&lt;/h4&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;命令&lt;/th&gt;&#xA;          &lt;th&gt;描述&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;top&lt;/td&gt;&#xA;          &lt;td&gt;查看CPU占用率&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;hostname&lt;/td&gt;&#xA;          &lt;td&gt;查看主机名&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;uname -m&lt;/td&gt;&#xA;          &lt;td&gt;查看linux架构&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;uname -a&lt;/td&gt;&#xA;          &lt;td&gt;查看系统详细信息&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;cat /etc/centos-release&lt;/td&gt;&#xA;          &lt;td&gt;查看centos版本&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;ps aux&lt;/td&gt;&#xA;          &lt;td&gt;查看进程&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;ps -ef&lt;/td&gt;&#xA;          &lt;td&gt;查看进程&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;kill -9 [PID]&lt;/td&gt;&#xA;          &lt;td&gt;杀掉进程&lt;code&gt;[PID]&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;df -h&lt;/td&gt;&#xA;          &lt;td&gt;查看磁盘空间&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;du -h / | sort -rh&lt;/td&gt;&#xA;          &lt;td&gt;根据文件磁盘占用倒排&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;du -h --max-depth=1&lt;/td&gt;&#xA;          &lt;td&gt;查看当前目录占用的磁盘空间大小&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;history&lt;/td&gt;&#xA;          &lt;td&gt;查看历史命令&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;type [CMD]&lt;/td&gt;&#xA;          &lt;td&gt;查看命令所在路径，如&lt;code&gt;type mkdir&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;echo $LANG&lt;/td&gt;&#xA;          &lt;td&gt;查看字符编码&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;su -&lt;/td&gt;&#xA;          &lt;td&gt;切换到root用户&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;pip cache purge&lt;/td&gt;&#xA;          &lt;td&gt;pip缓存清理&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;conda clean --all&lt;/td&gt;&#xA;          &lt;td&gt;conda缓存清理&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;ldd --version&lt;/td&gt;&#xA;          &lt;td&gt;查看 GLIBC 版本&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h4 id=&#34;4文本处理&#34;&gt;4）文本处理&lt;/h4&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;命令&lt;/th&gt;&#xA;          &lt;th&gt;描述&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;awk&lt;/td&gt;&#xA;          &lt;td&gt;取列&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;awk -F&lt;/td&gt;&#xA;          &lt;td&gt;指定分割符取列&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;grep -v&lt;/td&gt;&#xA;          &lt;td&gt;查找不包含特定匹配模式的行&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;wc -l&lt;/td&gt;&#xA;          &lt;td&gt;输出文件的行数&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;echo &amp;ldquo;ABC&amp;rdquo; &amp;gt; [FILE]&lt;/td&gt;&#xA;          &lt;td&gt;将文本&lt;code&gt;ABC&lt;/code&gt;写入文件&lt;code&gt;FILE&lt;/code&gt;行尾&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;echo &amp;ldquo;ABC&amp;rdquo; &amp;raquo; [FILE]&lt;/td&gt;&#xA;          &lt;td&gt;用文本&lt;code&gt;ABC&lt;/code&gt;覆写文件&lt;code&gt;FILE&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h4 id=&#34;5bash-表达式&#34;&gt;5）Bash 表达式&lt;/h4&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;命令&lt;/th&gt;&#xA;          &lt;th&gt;描述&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;-gt&lt;/td&gt;&#xA;          &lt;td&gt;大于&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;-lt&lt;/td&gt;&#xA;          &lt;td&gt;小于&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;-eq&lt;/td&gt;&#xA;          &lt;td&gt;等于&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;-ne&lt;/td&gt;&#xA;          &lt;td&gt;不等于&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;-ge&lt;/td&gt;&#xA;          &lt;td&gt;大于等于&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;-le&lt;/td&gt;&#xA;          &lt;td&gt;小于等于&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;!&lt;/td&gt;&#xA;          &lt;td&gt;非&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;==&lt;/td&gt;&#xA;          &lt;td&gt;等于&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;=～&lt;/td&gt;&#xA;          &lt;td&gt;正则匹配，等式右侧写正则表达式&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;-a file&lt;/td&gt;&#xA;          &lt;td&gt;如果file存在则为真&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;-d file&lt;/td&gt;&#xA;          &lt;td&gt;如果file存在且为目录则为真&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;-f file&lt;/td&gt;&#xA;          &lt;td&gt;如果file存在且为普通文件则为真&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;sleep 1m&lt;/td&gt;&#xA;          &lt;td&gt;休眠一分钟&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;export PATH=[/some/new/path]:$PATH&lt;/td&gt;&#xA;          &lt;td&gt;新增环境变量&lt;code&gt;/some/new/path&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;$#&lt;/td&gt;&#xA;          &lt;td&gt;保存传递给shell脚本的命令行参数的数量&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;$*&lt;/td&gt;&#xA;          &lt;td&gt;保存所有传递给shell脚本的命令行参数 ($1 $2 &amp;hellip;)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;$@&lt;/td&gt;&#xA;          &lt;td&gt;保存所有传递给shell脚本的命令行参数 (&amp;quot;$1&amp;quot; &amp;ldquo;$2&amp;rdquo; &amp;hellip;)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;$0&lt;/td&gt;&#xA;          &lt;td&gt;保存shell脚本的名字&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;$?&lt;/td&gt;&#xA;          &lt;td&gt;保存上一个执行的命令的退出码&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;set -x&lt;/td&gt;&#xA;          &lt;td&gt;脚本调试命令，会打印当前脚本执行的所有命令及其参数&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h4 id=&#34;6vim-命令&#34;&gt;6）vim 命令&lt;/h4&gt;&#xA;&lt;p&gt;以下命令需用 &lt;code&gt;vim&lt;/code&gt; 打开文件，再按 &lt;code&gt;esc&lt;/code&gt; 后输入，再按 &lt;code&gt;enter&lt;/code&gt; 执行&lt;/p&gt;</description>
    </item>
    <item>
      <title>居家物资清单</title>
      <link>https://luochang212.github.io/posts/inventory_list/</link>
      <pubDate>Mon, 01 Jan 2024 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/inventory_list/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;Build your home from scratch.&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/new_home&#34; target=&#34;_blank&#34;&gt;new_home&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;一随身物品&#34;&gt;一、随身物品&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;身份证&lt;/li&gt;&#xA;&lt;li&gt;手机&lt;/li&gt;&#xA;&lt;li&gt;钥匙&lt;/li&gt;&#xA;&lt;li&gt;钱包&lt;/li&gt;&#xA;&lt;li&gt;脑子&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;二文具&#34;&gt;二、文具&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;通勤双肩包&lt;/li&gt;&#xA;&lt;li&gt;雨伞&lt;/li&gt;&#xA;&lt;li&gt;拍纸本&lt;/li&gt;&#xA;&lt;li&gt;中性笔&lt;/li&gt;&#xA;&lt;li&gt;铅笔&lt;/li&gt;&#xA;&lt;li&gt;毛笔&lt;/li&gt;&#xA;&lt;li&gt;秀丽笔&lt;/li&gt;&#xA;&lt;li&gt;少量专业书籍&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;三生活用品&#34;&gt;三、生活用品&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;衣服&lt;/li&gt;&#xA;&lt;li&gt;衣架&lt;/li&gt;&#xA;&lt;li&gt;毛巾 * 2&#xA;&lt;ul&gt;&#xA;&lt;li&gt;洗澡用&lt;/li&gt;&#xA;&lt;li&gt;垫枕头上&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;牙具&#xA;&lt;ul&gt;&#xA;&lt;li&gt;牙杯&lt;/li&gt;&#xA;&lt;li&gt;牙膏&lt;/li&gt;&#xA;&lt;li&gt;牙刷&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;鞋&#xA;&lt;ul&gt;&#xA;&lt;li&gt;拖鞋&lt;/li&gt;&#xA;&lt;li&gt;运动鞋&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;水杯：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;工位：带盖水杯&lt;/li&gt;&#xA;&lt;li&gt;家用：陶瓷水杯&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;脸盆&lt;/li&gt;&#xA;&lt;li&gt;指甲刀&lt;/li&gt;&#xA;&lt;li&gt;剃须刀&lt;/li&gt;&#xA;&lt;li&gt;剪刀&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;四床上用品&#34;&gt;四、床上用品&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;被子&lt;/li&gt;&#xA;&lt;li&gt;枕头&lt;/li&gt;&#xA;&lt;li&gt;床单&lt;/li&gt;&#xA;&lt;li&gt;床笠&lt;/li&gt;&#xA;&lt;li&gt;可爱靠枕&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;五电子产品&#34;&gt;五、电子产品&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;手机&lt;/li&gt;&#xA;&lt;li&gt;手机支架&lt;/li&gt;&#xA;&lt;li&gt;手表&lt;/li&gt;&#xA;&lt;li&gt;耳机&lt;/li&gt;&#xA;&lt;li&gt;平板&lt;/li&gt;&#xA;&lt;li&gt;树莓派&lt;/li&gt;&#xA;&lt;li&gt;Switch&lt;/li&gt;&#xA;&lt;li&gt;Mac mini&lt;/li&gt;&#xA;&lt;li&gt;笔记本电脑&lt;/li&gt;&#xA;&lt;li&gt;笔记本电脑支架&lt;/li&gt;&#xA;&lt;li&gt;外接显示器&lt;/li&gt;&#xA;&lt;li&gt;外接显示器支架&lt;/li&gt;&#xA;&lt;li&gt;鼠标&lt;/li&gt;&#xA;&lt;li&gt;鼠标垫&lt;/li&gt;&#xA;&lt;li&gt;拓展坞&lt;/li&gt;&#xA;&lt;li&gt;移动硬盘&lt;/li&gt;&#xA;&lt;li&gt;移动WIFI&lt;/li&gt;&#xA;&lt;li&gt;游戏手柄&lt;/li&gt;&#xA;&lt;li&gt;自拍杆&lt;/li&gt;&#xA;&lt;li&gt;充电宝&lt;/li&gt;&#xA;&lt;li&gt;充电器&#xA;&lt;ul&gt;&#xA;&lt;li&gt;充电头&lt;/li&gt;&#xA;&lt;li&gt;充电线&lt;/li&gt;&#xA;&lt;li&gt;插线板&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;六家具&#34;&gt;六、家具&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;桌子&lt;/li&gt;&#xA;&lt;li&gt;镜子&lt;/li&gt;&#xA;&lt;li&gt;阅读灯&lt;/li&gt;&#xA;&lt;li&gt;氛围灯&lt;/li&gt;&#xA;&lt;li&gt;拖把&lt;/li&gt;&#xA;&lt;li&gt;垃圾桶&lt;/li&gt;&#xA;&lt;li&gt;桶装矿泉水倒立支架&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;七电器&#34;&gt;七、电器&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;体重秤&lt;/li&gt;&#xA;&lt;li&gt;烧水壶&lt;/li&gt;&#xA;&lt;li&gt;智能音箱&lt;/li&gt;&#xA;&lt;li&gt;桌面时钟（带温度湿度功能）&lt;/li&gt;&#xA;&lt;li&gt;桌面风扇&lt;/li&gt;&#xA;&lt;li&gt;暖风机&lt;/li&gt;&#xA;&lt;li&gt;空气净化器&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;八消耗品&#34;&gt;八、消耗品&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;洗衣液&lt;/li&gt;&#xA;&lt;li&gt;沐浴露&lt;/li&gt;&#xA;&lt;li&gt;洗发液&lt;/li&gt;&#xA;&lt;li&gt;洗面奶&lt;/li&gt;&#xA;&lt;li&gt;面霜&lt;/li&gt;&#xA;&lt;li&gt;唇膏&lt;/li&gt;&#xA;&lt;li&gt;抽纸&lt;/li&gt;&#xA;&lt;li&gt;酒精湿巾&lt;/li&gt;&#xA;&lt;li&gt;垃圾袋&lt;/li&gt;&#xA;&lt;li&gt;保鲜袋&lt;/li&gt;&#xA;&lt;li&gt;抹布&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;九食品&#34;&gt;九、食品&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;调味料&#xA;&lt;ul&gt;&#xA;&lt;li&gt;基础&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;盐&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;生抽&lt;/strong&gt; / 蒸鱼豉油 / 寿喜烧酱汁 / 照烧汁&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;食用油&lt;/strong&gt; / 香油 / 黄油&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;生粉&lt;/strong&gt; / 粘米粉 / 白凉粉 / 面包粉&lt;/li&gt;&#xA;&lt;li&gt;辣椒 / 二荆条 / &lt;strong&gt;辣椒面&lt;/strong&gt; / 辣椒酱 / 泡椒&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;白砂糖&lt;/strong&gt; / 冰糖 / 红糖&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;生姜&lt;/strong&gt; / 泡仔姜&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;蒜&lt;/strong&gt; / 蒜泥 / 香蒜酱 / 青蒜酱 / 黑蒜酱 / 糖蒜&lt;/li&gt;&#xA;&lt;li&gt;香醋 / 米醋 / 白醋&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;咖喱块&lt;/strong&gt; / 咖喱粉&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;进阶&#xA;&lt;ul&gt;&#xA;&lt;li&gt;蜂蜜 / 蜂蜜芥末酱&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;黑胡椒&lt;/strong&gt; / 白胡椒 / 花椒&lt;/li&gt;&#xA;&lt;li&gt;花生酱&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;八角&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;月桂叶&lt;/li&gt;&#xA;&lt;li&gt;蚝油&lt;/li&gt;&#xA;&lt;li&gt;麻酱&lt;/li&gt;&#xA;&lt;li&gt;牛油火锅底料&lt;/li&gt;&#xA;&lt;li&gt;柠檬 / 青柠&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;药膳&#xA;&lt;ul&gt;&#xA;&lt;li&gt;当归&lt;/li&gt;&#xA;&lt;li&gt;党参&lt;/li&gt;&#xA;&lt;li&gt;黄芪&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;食材&#xA;&lt;ul&gt;&#xA;&lt;li&gt;主食&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;大米&lt;/strong&gt; / &lt;strong&gt;小米&lt;/strong&gt; / 莲子 / 薏米 / 黑米&lt;/li&gt;&#xA;&lt;li&gt;红豆 / 黄豆 / 绿豆 / 黑豆&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;粉丝&lt;/strong&gt; / 米线 / 河粉&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;挂面&lt;/strong&gt; / 龙须面 / 车仔面 / 荞麦面 / 刀削面 / 方便面 / 意大利面&lt;/li&gt;&#xA;&lt;li&gt;水饺 / 馄饨&lt;/li&gt;&#xA;&lt;li&gt;地瓜 / 土豆&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;麦片&lt;/strong&gt; / 藕粉 / 芝麻糊&lt;/li&gt;&#xA;&lt;li&gt;茶泡饭速食包 / 真空装玉米 / 真空装卷饼&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;佐食&#xA;&lt;ul&gt;&#xA;&lt;li&gt;牛奶 / 酸奶&lt;/li&gt;&#xA;&lt;li&gt;鸡蛋 / 咸鸭蛋 / 溏心蛋 / 皮蛋&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;茶叶&lt;/strong&gt; / 咖啡&lt;/li&gt;&#xA;&lt;li&gt;豆腐&lt;/li&gt;&#xA;&lt;li&gt;榨菜 / 香菜心 / 脆瓜 / 脆萝卜 / 海带丝&lt;/li&gt;&#xA;&lt;li&gt;香菇肉酱 / 红烧肉罐头 / 咖喱牛肉罐头 / 鱼罐头 / 午餐肉罐头&lt;/li&gt;&#xA;&lt;li&gt;猪肉松 / 鱼肉松&lt;/li&gt;&#xA;&lt;li&gt;板鸭 / 腊肉&lt;/li&gt;&#xA;&lt;li&gt;蛋挞皮 / 蛋挞液&lt;/li&gt;&#xA;&lt;li&gt;盐酥鸡 / 唐扬鸡块&lt;/li&gt;&#xA;&lt;li&gt;白斩鸡 / 烤鸭&lt;/li&gt;&#xA;&lt;li&gt;冰鲜披萨&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;蔬菜&#xA;&lt;ul&gt;&#xA;&lt;li&gt;小白菜 / 娃娃菜&lt;/li&gt;&#xA;&lt;li&gt;空心菜 / 地瓜叶&lt;/li&gt;&#xA;&lt;li&gt;包菜&lt;/li&gt;&#xA;&lt;li&gt;西红柿&lt;/li&gt;&#xA;&lt;li&gt;胡萝卜 / 白萝卜&lt;/li&gt;&#xA;&lt;li&gt;黄瓜 / 南瓜 / 西葫芦&lt;/li&gt;&#xA;&lt;li&gt;西兰花&lt;/li&gt;&#xA;&lt;li&gt;笋&lt;/li&gt;&#xA;&lt;li&gt;芹菜 / 香菜 / 韭菜&lt;/li&gt;&#xA;&lt;li&gt;四季豆 / 豌豆 / 毛豆&lt;/li&gt;&#xA;&lt;li&gt;香菇 / 红菇&lt;/li&gt;&#xA;&lt;li&gt;海带 / 紫菜&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;肉类&#xA;&lt;ul&gt;&#xA;&lt;li&gt;鸡肉 / 鸭肉 / 鸽子肉&lt;/li&gt;&#xA;&lt;li&gt;猪肉 / 牛肉 / 羊肉&lt;/li&gt;&#xA;&lt;li&gt;鱼 / 龙利鱼排 / 鱿鱼圈 / 虾仁&lt;/li&gt;&#xA;&lt;li&gt;鱼丸 / 牛肉丸&lt;/li&gt;&#xA;&lt;li&gt;牛排 / 汉堡肉 / 火腿&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;水果&#xA;&lt;ul&gt;&#xA;&lt;li&gt;苹果&lt;/li&gt;&#xA;&lt;li&gt;橘子&lt;/li&gt;&#xA;&lt;li&gt;橙子&lt;/li&gt;&#xA;&lt;li&gt;香蕉&lt;/li&gt;&#xA;&lt;li&gt;梨&lt;/li&gt;&#xA;&lt;li&gt;芒果&lt;/li&gt;&#xA;&lt;li&gt;椰子&lt;/li&gt;&#xA;&lt;li&gt;香瓜&lt;/li&gt;&#xA;&lt;li&gt;西瓜&lt;/li&gt;&#xA;&lt;li&gt;奇异果&lt;/li&gt;&#xA;&lt;li&gt;牛油果&lt;/li&gt;&#xA;&lt;li&gt;蓝莓 / 草莓&lt;/li&gt;&#xA;&lt;li&gt;葡萄&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;速食&#xA;&lt;ul&gt;&#xA;&lt;li&gt;面包 / 华夫饼&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;饼干&lt;/strong&gt; / 小熊饼干 / 趣多多 / 奥利奥 / 脆脆鲨&lt;/li&gt;&#xA;&lt;li&gt;蛋糕 / 提拉米苏 / 巧克力派 / 蛋黄派&lt;/li&gt;&#xA;&lt;li&gt;混合坚果&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;零食&#xA;&lt;ul&gt;&#xA;&lt;li&gt;巧克力&lt;/li&gt;&#xA;&lt;li&gt;冰淇淋 / 雪糕&lt;/li&gt;&#xA;&lt;li&gt;青团 / 糯米糍 / 年糕&lt;/li&gt;&#xA;&lt;li&gt;无骨鸭爪 / 鸭脖&lt;/li&gt;&#xA;&lt;li&gt;猪肉干 / 牛肉干 / 肉脯干&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;饮料&#xA;&lt;ul&gt;&#xA;&lt;li&gt;可乐&lt;/li&gt;&#xA;&lt;li&gt;雪碧&lt;/li&gt;&#xA;&lt;li&gt;菠萝啤 / 米酒 / 桂花酿&lt;/li&gt;&#xA;&lt;li&gt;橙汁&lt;/li&gt;&#xA;&lt;li&gt;椰汁&lt;/li&gt;&#xA;&lt;li&gt;咸柠七&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;十药品&#34;&gt;十、药品&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;口罩&lt;/li&gt;&#xA;&lt;li&gt;体温计&lt;/li&gt;&#xA;&lt;li&gt;药箱&#xA;&lt;ul&gt;&#xA;&lt;li&gt;感冒&#xA;&lt;ul&gt;&#xA;&lt;li&gt;藿香正气胶囊&lt;/li&gt;&#xA;&lt;li&gt;999感冒灵颗粒&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;化痰止咳&#xA;&lt;ul&gt;&#xA;&lt;li&gt;川贝枇杷颗粒&lt;/li&gt;&#xA;&lt;li&gt;乙酰半胱氨酸片&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;咽喉肿痛&#xA;&lt;ul&gt;&#xA;&lt;li&gt;咽喉清颗粒&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;发热流感&#xA;&lt;ul&gt;&#xA;&lt;li&gt;布洛芬（散利痛 / 布洛芬缓释胶囊）&lt;/li&gt;&#xA;&lt;li&gt;复方氨酚烷胺胶囊&lt;/li&gt;&#xA;&lt;li&gt;复方对乙酰氨基酚片(Ⅱ)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;抗生素（抗细菌）&#xA;&lt;ul&gt;&#xA;&lt;li&gt;头孢&lt;/li&gt;&#xA;&lt;li&gt;阿莫西林（青霉素）&lt;/li&gt;&#xA;&lt;li&gt;罗红霉素分散片&lt;/li&gt;&#xA;&lt;li&gt;盐酸左氧氟沙星片 [肠胃炎可用]&lt;/li&gt;&#xA;&lt;li&gt;诺氟沙星胶囊&lt;/li&gt;&#xA;&lt;li&gt;盐酸莫西沙星片&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;抗病毒&#xA;&lt;ul&gt;&#xA;&lt;li&gt;磷酸奥司他韦胶囊&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;唇炎&#xA;&lt;ul&gt;&#xA;&lt;li&gt;单乳膏 [上海市皮肤科医院有售]&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;抗过敏&#xA;&lt;ul&gt;&#xA;&lt;li&gt;氯雷他定&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;蚊虫叮咬&#xA;&lt;ul&gt;&#xA;&lt;li&gt;999皮炎平&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;消炎&#xA;&lt;ul&gt;&#xA;&lt;li&gt;莫匹罗星软膏（百多邦）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;消毒&#xA;&lt;ul&gt;&#xA;&lt;li&gt;碘伏&lt;/li&gt;&#xA;&lt;li&gt;酒精棉球&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;包扎&#xA;&lt;ul&gt;&#xA;&lt;li&gt;创可贴&lt;/li&gt;&#xA;&lt;li&gt;纱布片 / 绷带&lt;/li&gt;&#xA;&lt;li&gt;棉签&lt;/li&gt;&#xA;&lt;li&gt;医用胶带&lt;/li&gt;&#xA;&lt;li&gt;医用剪刀&lt;/li&gt;&#xA;&lt;li&gt;医用镊子&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;十一工具&#34;&gt;十一、工具&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;螺丝刀&lt;/li&gt;&#xA;&lt;li&gt;卷尺&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;十二厨具&#34;&gt;十二、厨具&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;中式炒锅&lt;/li&gt;&#xA;&lt;li&gt;电饭煲&lt;/li&gt;&#xA;&lt;li&gt;电磁炉&lt;/li&gt;&#xA;&lt;li&gt;碗 / 盘子&lt;/li&gt;&#xA;&lt;li&gt;勺子 / 筷子&lt;/li&gt;&#xA;&lt;li&gt;菜刀&lt;/li&gt;&#xA;&lt;li&gt;菜板&lt;/li&gt;&#xA;&lt;li&gt;茶漏&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;十三运动用品&#34;&gt;十三、运动用品&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;瑜伽垫&lt;/li&gt;&#xA;&lt;li&gt;俯卧撑支架&lt;/li&gt;&#xA;&lt;li&gt;双节棍&lt;/li&gt;&#xA;&lt;li&gt;长棍&lt;/li&gt;&#xA;&lt;li&gt;泳镜&lt;/li&gt;&#xA;&lt;li&gt;泳帽&lt;/li&gt;&#xA;&lt;li&gt;泳裤&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;十四保暖用品&#34;&gt;十四、保暖用品&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;手套&lt;/li&gt;&#xA;&lt;li&gt;护膝&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;十五证件&#34;&gt;十五、证件&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;护照&lt;/li&gt;&#xA;&lt;li&gt;驾驶证&lt;/li&gt;&#xA;&lt;li&gt;银行卡&lt;/li&gt;&#xA;&lt;li&gt;其他身份材料&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;十六xox&#34;&gt;十六、XOX&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;拍立得&lt;/li&gt;&#xA;&lt;li&gt;To签色纸&lt;/li&gt;&#xA;&lt;li&gt;应援棒&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;参考：&lt;/p&gt;</description>
    </item>
    <item>
      <title>深度学习笔记</title>
      <link>https://luochang212.github.io/posts/d2l/</link>
      <pubDate>Sat, 11 Nov 2023 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/d2l/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;跟李沐老师学深度学习，课程见 &lt;a href=&#34;https://zh-v2.d2l.ai/index.html&#34;&gt;d2l&lt;/a&gt;，如有错误，欢迎拍砖 &lt;img src=&#34;https://luochang212.github.io/img/quyin/witty.png&#34; class=&#34;my-emoji&#34; style = &#34;height: 32px;&#34;&gt;&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/AI-Project&#34; target=&#34;_blank&#34;&gt;AI-Project&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;技术路线图&#34;&gt;〇、技术路线图&lt;/h3&gt;&#xA;&lt;pre class=&#34;mermaid&#34;&gt;&#xA;flowchart TD&#xA;    A[softmax 回归] --&gt;|无法拟合 XOR 函数| B[多层感知机]&#xA;    B --&gt; |高像素图片作为输入，模型参数爆炸| C[卷积]&#xA;    C --&gt;|数据的长宽下降太快| D[填充]&#xA;    C --&gt;|数据的长宽下降太慢| E[步幅]&#xA;    C --&gt;|缓解卷积对位置敏感| F[池化]&#xA;    C --&gt;|多模式识别与组合| G[多通道输入/输出]&#xA;&#xA;&lt;/pre&gt;&#xA;&lt;center&gt;❤️ powered by &lt;a href=&#34;https://github.com/mermaid-js/mermaid&#34; target=&#34;_blank&#34;&gt;mermaid&lt;/a&gt;&lt;/center&gt;&#xA;&lt;h3 id=&#34;一softmax-回归&#34;&gt;一、softmax 回归&lt;/h3&gt;&#xA;&lt;h4 id=&#34;1-虽然叫回归但是softmax-解决的是分类问题&#34;&gt;1. 虽然叫回归，但是softmax 解决的是分类问题&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;回归估计是一个连续值&lt;/li&gt;&#xA;&lt;li&gt;分类预测是一个离散类别&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;2-分类应用举例&#34;&gt;2. 分类应用举例&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;MINIST&lt;/li&gt;&#xA;&lt;li&gt;ImageNet&lt;/li&gt;&#xA;&lt;li&gt;human-protein-atlas-image-classification (&lt;strong&gt;Kaggle&lt;/strong&gt;)&lt;/li&gt;&#xA;&lt;li&gt;malware-classification (&lt;strong&gt;Kaggle&lt;/strong&gt;)&lt;/li&gt;&#xA;&lt;li&gt;jigsaw-comment-classification (&lt;strong&gt;Kaggle&lt;/strong&gt;)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;3-从回归到多类分类--均方损失&#34;&gt;3. 从回归到多类分类 &amp;ndash; 均方损失&lt;/h4&gt;&#xA;&lt;p&gt;对分类结果做 one-hot 编码：&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;$y = [y_1, y_2, , ... , y_n]^T$&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;$y_i=\left\{\begin{array}{l}1 \text { if } i=y \\ 0 \text { otherwise }\end{array}\right.$&lt;/code&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>PyPI 打包小记</title>
      <link>https://luochang212.github.io/posts/pypi_packaging/</link>
      <pubDate>Wed, 18 Oct 2023 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/pypi_packaging/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;你们这些家伙，好好看看我是怎么打包的吧！&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/hit-and-blow&#34; target=&#34;_blank&#34;&gt;hit-and-blow&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;官方教程：&lt;a href=&#34;https://packaging.python.org/en/latest/tutorials/packaging-projects/&#34;&gt;Packaging Python Projects&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;背景知识：&lt;a href=&#34;https://docs.python.org/3/tutorial/modules.html#packages&#34;&gt;Modules&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;一文件结构介绍&#34;&gt;一、文件结构介绍&lt;/h3&gt;&#xA;&lt;p&gt;打包前，需构建如下文件结构：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;packaging_tutorial/&#xA;├── LICENSE&#xA;├── pyproject.toml&#xA;├── README.md&#xA;├── src/&#xA;│   └── YOUR_PACKAGE_NAME/&#xA;│       ├── __init__.py&#xA;│       └── example.py&#xA;└── tests/&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;各个 &lt;code&gt;文件&lt;/code&gt; / &lt;code&gt;文件夹&lt;/code&gt; 说明：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;packaging_tutorial&lt;/code&gt;: 项目文件夹&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;LICENSE&lt;/code&gt;: 开源协议，可由 GitHub 生成&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;pyproject.toml&lt;/code&gt;: 打包配置文件&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;README.md&lt;/code&gt;: 项目文档&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;src&lt;/code&gt;: 项目结构要求的，用来放主程序&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;YOUR_PACKAGE_NAME&lt;/code&gt;: 主程序文件夹，以“你的包名”命名文件夹&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;二添加配置文件&#34;&gt;二、添加配置文件&lt;/h3&gt;&#xA;&lt;p&gt;将以下内容修改一下，改改名字邮箱什么的，存成配置文件 &lt;code&gt;pyproject.toml&lt;/code&gt;&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[build-system]&#xA;requires = [&amp;#34;hatchling&amp;#34;]&#xA;build-backend = &amp;#34;hatchling.build&amp;#34;&#xA;&#xA;[project]&#xA;name = &amp;#34;example_package_YOUR_USERNAME_HERE&amp;#34;&#xA;version = &amp;#34;0.0.1&amp;#34;&#xA;authors = [&#xA;  { name=&amp;#34;Example Author&amp;#34;, email=&amp;#34;author@example.com&amp;#34; },&#xA;]&#xA;description = &amp;#34;A small example package&amp;#34;&#xA;readme = &amp;#34;README.md&amp;#34;&#xA;requires-python = &amp;#34;&amp;gt;=3.7&amp;#34;&#xA;classifiers = [&#xA;    &amp;#34;Programming Language :: Python :: 3&amp;#34;,&#xA;    &amp;#34;License :: OSI Approved :: MIT License&amp;#34;,&#xA;    &amp;#34;Operating System :: OS Independent&amp;#34;,&#xA;]&#xA;&#xA;[project.urls]&#xA;&amp;#34;Homepage&amp;#34; = &amp;#34;https://github.com/pypa/sampleproject&amp;#34;&#xA;&amp;#34;Bug Tracker&amp;#34; = &amp;#34;https://github.com/pypa/sampleproject/issues&amp;#34;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;三打包&#34;&gt;三、打包&lt;/h3&gt;&#xA;&lt;h4 id=&#34;31-准备打包环境&#34;&gt;3.1 准备打包环境&lt;/h4&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;python3 -m pip install --upgrade pip&#xA;python3 -m pip install --upgrade build&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&#34;32-打包&#34;&gt;3.2 打包&lt;/h4&gt;&#xA;&lt;p&gt;来到 &lt;code&gt;pyproject.toml&lt;/code&gt; 所在目录，打开命令行，运行代码：&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hive SQL 笔记</title>
      <link>https://luochang212.github.io/posts/hive_sql_note/</link>
      <pubDate>Sun, 25 Dec 2022 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/hive_sql_note/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;Hive SQL 不需要注释，它会自己解释自己&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;h3 id=&#34;1-数据表操作&#34;&gt;1. 数据表操作&lt;/h3&gt;&#xA;&lt;h4 id=&#34;11-创建-hive-表&#34;&gt;1.1 创建 Hive 表&lt;/h4&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;CREATE TABLE [DATABASE].[TABLE_NAME] (&#xA;    `id`    BIGINT    COMMENT &amp;#39;学号&amp;#39;,&#xA;    name    STRING    COMMENT &amp;#39;姓名&amp;#39;,&#xA;    ttl_score    DOUBLE    COMMENT &amp;#39;总分&amp;#39;&#xA;)&#xA;COMMENT &amp;#39;枝江中学五年级学生成绩明细表&amp;#39;&#xA;PARTITIONED BY (day STRING COMMENT &amp;#39;day&amp;#39;, hour STRING COMMENT &amp;#39;hour&amp;#39;)&#xA;ROW FORMAT DELIMITED &#xA;FIELDS TERMINATED BY &amp;#39;,&amp;#39; &#xA;STORED AS TEXTFILE;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: 想了解更多，请参考 &lt;a href=&#34;https://learn.microsoft.com/en-us/azure/databricks/sql/language-manual/sql-ref-syntax-ddl-create-table-hiveformat&#34;&gt;CREATE TABLE with Hive format&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;h4 id=&#34;12-删除-hive-表&#34;&gt;1.2 删除 Hive 表&lt;/h4&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;DROP TABLE [DATABASE].[TABLE_NAME];&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;DROP TABLE IF EXISTS [DATABASE].[TABLE_NAME];&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ALTER TABLE [DATABASE].[TABLE_NAME] DROP IF EXISTS PARTITION (dt=&amp;#39;2024-09-01&amp;#39;, country=&amp;#39;US&amp;#39;);&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&#34;13-插入新的行&#34;&gt;1.3 插入新的行&lt;/h4&gt;&#xA;&lt;p&gt;从查询结果插入：&lt;/p&gt;</description>
    </item>
    <item>
      <title>因果推断笔记</title>
      <link>https://luochang212.github.io/posts/causal_inference/</link>
      <pubDate>Sat, 16 Jul 2022 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/causal_inference/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;不谜语人的因果推断笔记！&lt;/p&gt;&#xA;&lt;p&gt;学习统计最好还是学习一下 &lt;a href=&#34;https://www.r-project.org&#34;&gt;R 语言&lt;/a&gt;。相比 Python，R 是专门用于统计的语言，它提供了更细致的函数和更标准的实现方法。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;h2 id=&#34;1-因果推断入门&#34;&gt;1. 因果推断入门&lt;/h2&gt;&#xA;&lt;p&gt;小朋友感冒，家长给他吃药，一个星期后就痊愈了。那么“吃药”和“痊愈”是否有因果关系呢？&lt;/p&gt;&#xA;&lt;p&gt;我们知道普通的小感冒，即使不吃药，一个星期后也会痊愈。因此未必是因为吃药才痊愈的，也有可能是小朋友凭借抵抗力恢复了健康。此时，要进一步分析“吃药”与“痊愈”的因果关系，就要用到因果推断技术。&lt;/p&gt;&#xA;&lt;p&gt;注意在上述例子中，原因存在两种状态：吃药/不吃药。结果也存在两种状态：痊愈/未痊愈。为了描述方便，我们把：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作为原因的变量：x 叫做控制变量 (control variable)，或解释变量 (explanatory variable)&lt;/li&gt;&#xA;&lt;li&gt;作为结果的变量：y 叫做响应变量 (response variable)，或被解释变量 (explained variable)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;11-如何测量因果关系&#34;&gt;1.1 如何测量因果关系&lt;/h3&gt;&#xA;&lt;p&gt;&lt;strong&gt;反事实因果分析框架&lt;/strong&gt; 是统计学中分析因果关系的一种常见思路。这种思路把一种“状态”与其“反事实状态”造成&lt;strong&gt;结果的差异&lt;/strong&gt;当作因果效应。对于小朋友 &lt;code&gt;$i$&lt;/code&gt;，反事实因果分析框架反映的因果效应 &lt;code&gt;$\tau_{i}$&lt;/code&gt; 表示为：&#xA;&lt;code&gt;$$\tau_{i} = Y_{i}(1) - Y_{i}(0)$$&lt;/code&gt;&#xA;这里 &lt;code&gt;$Y_{i}(1)$&lt;/code&gt; 代表吃药，&lt;code&gt;$Y_{i}(0)$&lt;/code&gt; 代表不吃药，它们都是观测值。&lt;/p&gt;&#xA;&lt;p&gt;不难发现，&lt;code&gt;$Y_{i}(1)$&lt;/code&gt; 和 &lt;code&gt;$Y_{i}(0)$&lt;/code&gt; 是无法同时观测到的。这被称为 &lt;strong&gt;因果推断的根本性问题&lt;/strong&gt; (Holland, 1986)。正如“人不能两次踏入同一条河流”，一旦做出某种选择，其他选择的结果就无从观测了。&lt;/p&gt;&#xA;&lt;p&gt;由于此“根本性问题”的存在，对 &lt;code&gt;$\tau$&lt;/code&gt; 算不了真实值，只能估计。因果效应 &lt;code&gt;$\tau$&lt;/code&gt; 有三种常见的&lt;strong&gt;估计值&lt;/strong&gt;：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;我们约定：是否吃药用 &lt;code&gt;$X$&lt;/code&gt; 表示，&lt;code&gt;$X = 0 \space or \space 1$&lt;/code&gt;，其中 1 代表吃药，0 代表不吃药。这里有必要区分下，&lt;code&gt;$Y_{i}|X=1$&lt;/code&gt; 是指那些真的吃了药的人的 &lt;code&gt;$Y$&lt;/code&gt; 值。&lt;code&gt;$Y_{i}(1)$&lt;/code&gt;、&lt;code&gt;$Y_{i}(0)$&lt;/code&gt; 则是看不到的一个潜在状态，可能是用统计方法算出的估计值，也可能是模型的外推。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;1.&lt;strong&gt;ATT&lt;/strong&gt; (average treatment effect on treated)：实验组平均因果效应&#xA;&lt;code&gt;$$\tau_{ATT} = E( \space (Y_{i}|X=1) - Y_{i}(0) \space )$$&lt;/code&gt;&#xA;2.&lt;strong&gt;ATU&lt;/strong&gt; (average treatment effect on untreated)：控制组平均因果处理效应&#xA;&lt;code&gt;$$\tau_{ATU} = E( \space Y_{i}(1) - (Y_{i}|X=0) \space )$$&lt;/code&gt;&#xA;3.&lt;strong&gt;ATE&lt;/strong&gt; (average treatment effect)：平均因果处理效应&#xA;&lt;code&gt;$$\tau_{ATE} = \pi * \tau_{ATT} + (1 - \pi) * \tau_{ATU} $$&lt;/code&gt;&#xA;其中，&lt;code&gt;$\pi$&lt;/code&gt; 是吃药的人（即&lt;code&gt;$X=1$&lt;/code&gt;）在所有样本中所占的比例。&lt;/p&gt;</description>
    </item>
    <item>
      <title>摸鱼侠极客版</title>
      <link>https://luochang212.github.io/posts/moyu_bash/</link>
      <pubDate>Sun, 03 Jul 2022 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/moyu_bash/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;老板：退退退&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/moyu-bash&#34; target=&#34;_blank&#34;&gt;moyu-bash&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;1-缘起&#34;&gt;1. 缘起&lt;/h3&gt;&#xA;&lt;p&gt;最近刷到一个微信小程序，叫 “摸鱼侠”，它长这样：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/moyuxia-demo.PNG&#34; alt=&#34;nature system&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;这里面有个栏目叫 “今日已摸到”，还挺有意思的，它会计算今日截至当前为止挣到的工资。&lt;/p&gt;&#xA;&lt;p&gt;我寻思这小程序颜色太过艳丽，容易被老板抓包，便计上心来，打算写个 &lt;strong&gt;bash 版摸鱼侠&lt;/strong&gt;。和生产环境融为一体，纯键盘操控，老板来了一个 &lt;code&gt;ctrl c&lt;/code&gt; 便能毁尸灭迹，大大滴方便。&lt;/p&gt;&#xA;&lt;h3 id=&#34;2-出生&#34;&gt;2. 出生&lt;/h3&gt;&#xA;&lt;p&gt;这要实现起来也不难，只要把 &lt;code&gt;(工作秒数 - 休息秒数) * 每秒工资&lt;/code&gt; 就好嘛。&lt;/p&gt;&#xA;&lt;p&gt;我纯纯的 bash 新手，不对之处大家批评。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#57606a&#34;&gt;# Author: github@luochang212&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#953800&#34;&gt;work_start&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt;10:00:00    &lt;span style=&#34;color:#57606a&#34;&gt;# 上班时间&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#953800&#34;&gt;lunch_start&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt;12:00:00    &lt;span style=&#34;color:#57606a&#34;&gt;# 午饭开始&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#953800&#34;&gt;lunch_end&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt;13:00:00    &lt;span style=&#34;color:#57606a&#34;&gt;# 午饭结束&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#953800&#34;&gt;dinner_start&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt;18:00:00    &lt;span style=&#34;color:#57606a&#34;&gt;# 晚饭开始&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#953800&#34;&gt;dinner_end&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt;19:00:00    &lt;span style=&#34;color:#57606a&#34;&gt;# 晚饭结束&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#953800&#34;&gt;work_end&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt;20:00:00    &lt;span style=&#34;color:#57606a&#34;&gt;# 下班时间&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#953800&#34;&gt;salary&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;40000&lt;/span&gt;    &lt;span style=&#34;color:#57606a&#34;&gt;# 月薪&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#953800&#34;&gt;day&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;22&lt;/span&gt;    &lt;span style=&#34;color:#57606a&#34;&gt;# 每月工作天数&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#953800&#34;&gt;CURRENT_TIME&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;$(&lt;/span&gt;date +&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;%T&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#953800&#34;&gt;EMOJI_ARRAY&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=(&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;(・▽ &amp;lt; )★&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;─=≡Σ((( つ•̀ 3 •́)つ&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;┗|｀O′|┛&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;_(┐「ε:)_&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;ヽ( ˘ω˘ )ゝ&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;get_second&lt;span style=&#34;color:#0550ae&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6639ba&#34;&gt;read&lt;/span&gt; -r h m s &lt;span style=&#34;color:#0550ae&#34;&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#cf222e&#34;&gt;$(&lt;/span&gt;&lt;span style=&#34;color:#6639ba&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;$1&lt;/span&gt; &lt;span style=&#34;color:#1f2328&#34;&gt;|&lt;/span&gt; tr &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;:&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6639ba&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#cf222e&#34;&gt;$((&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;10#&lt;/span&gt;&lt;span style=&#34;color:#953800&#34;&gt;$h&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;60&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;60&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;)+(&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;10#&lt;/span&gt;&lt;span style=&#34;color:#953800&#34;&gt;$m&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;60&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;)+&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;10#&lt;/span&gt;&lt;span style=&#34;color:#953800&#34;&gt;$s&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;calc_duration&lt;span style=&#34;color:#0550ae&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6639ba&#34;&gt;local&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;start&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;$(&lt;/span&gt;get_second &lt;span style=&#34;color:#953800&#34;&gt;$1&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6639ba&#34;&gt;local&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;end&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;$(&lt;/span&gt;get_second &lt;span style=&#34;color:#953800&#34;&gt;$2&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6639ba&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#cf222e&#34;&gt;$((&lt;/span&gt;end-start&lt;span style=&#34;color:#cf222e&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;calc_work_time&lt;span style=&#34;color:#0550ae&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6639ba&#34;&gt;local&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;lunch_time&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;$(&lt;/span&gt;calc_duration &lt;span style=&#34;color:#953800&#34;&gt;$lunch_start&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;$lunch_end&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6639ba&#34;&gt;local&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;dinner_time&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;$(&lt;/span&gt;calc_duration &lt;span style=&#34;color:#953800&#34;&gt;$dinner_start&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;$dinner_end&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#cf222e&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;[&lt;/span&gt; &lt;span style=&#34;color:#cf222e&#34;&gt;$(&lt;/span&gt;calc_duration &lt;span style=&#34;color:#953800&#34;&gt;$CURRENT_TIME&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;$work_start&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;)&lt;/span&gt; -gt &lt;span style=&#34;color:#0550ae&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color:#cf222e&#34;&gt;then&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6639ba&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#cf222e&#34;&gt;elif&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;[&lt;/span&gt; &lt;span style=&#34;color:#cf222e&#34;&gt;$(&lt;/span&gt;calc_duration &lt;span style=&#34;color:#953800&#34;&gt;$CURRENT_TIME&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;$lunch_start&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;)&lt;/span&gt; -gt &lt;span style=&#34;color:#0550ae&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color:#cf222e&#34;&gt;then&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6639ba&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#cf222e&#34;&gt;$(&lt;/span&gt;calc_duration &lt;span style=&#34;color:#953800&#34;&gt;$work_start&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;$CURRENT_TIME&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#cf222e&#34;&gt;elif&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;[&lt;/span&gt; &lt;span style=&#34;color:#cf222e&#34;&gt;$(&lt;/span&gt;calc_duration &lt;span style=&#34;color:#953800&#34;&gt;$CURRENT_TIME&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;$lunch_end&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;)&lt;/span&gt; -gt &lt;span style=&#34;color:#0550ae&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color:#cf222e&#34;&gt;then&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6639ba&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#cf222e&#34;&gt;$(&lt;/span&gt;calc_duration &lt;span style=&#34;color:#953800&#34;&gt;$work_start&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;$lunch_start&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#cf222e&#34;&gt;elif&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;[&lt;/span&gt; &lt;span style=&#34;color:#cf222e&#34;&gt;$(&lt;/span&gt;calc_duration &lt;span style=&#34;color:#953800&#34;&gt;$CURRENT_TIME&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;$dinner_start&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;)&lt;/span&gt; -gt &lt;span style=&#34;color:#0550ae&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color:#cf222e&#34;&gt;then&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6639ba&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#cf222e&#34;&gt;$(($(&lt;/span&gt;calc_duration &lt;span style=&#34;color:#953800&#34;&gt;$work_start&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;$CURRENT_TIME&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;-&lt;/span&gt; lunch_time&lt;span style=&#34;color:#cf222e&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#cf222e&#34;&gt;elif&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;[&lt;/span&gt; &lt;span style=&#34;color:#cf222e&#34;&gt;$(&lt;/span&gt;calc_duration &lt;span style=&#34;color:#953800&#34;&gt;$CURRENT_TIME&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;$dinner_end&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;)&lt;/span&gt; -gt &lt;span style=&#34;color:#0550ae&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color:#cf222e&#34;&gt;then&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6639ba&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#cf222e&#34;&gt;$(($(&lt;/span&gt;calc_duration &lt;span style=&#34;color:#953800&#34;&gt;$work_start&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;$dinner_start&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;-&lt;/span&gt; lunch_time&lt;span style=&#34;color:#cf222e&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#cf222e&#34;&gt;elif&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;[&lt;/span&gt; &lt;span style=&#34;color:#cf222e&#34;&gt;$(&lt;/span&gt;calc_duration &lt;span style=&#34;color:#953800&#34;&gt;$CURRENT_TIME&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;$work_end&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;)&lt;/span&gt; -gt &lt;span style=&#34;color:#0550ae&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color:#cf222e&#34;&gt;then&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6639ba&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#cf222e&#34;&gt;$(($(&lt;/span&gt;calc_duration &lt;span style=&#34;color:#953800&#34;&gt;$work_start&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;$CURRENT_TIME&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;-&lt;/span&gt; lunch_time &lt;span style=&#34;color:#0550ae&#34;&gt;-&lt;/span&gt; dinner_time&lt;span style=&#34;color:#cf222e&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#cf222e&#34;&gt;else&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6639ba&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#cf222e&#34;&gt;$(($(&lt;/span&gt;calc_duration &lt;span style=&#34;color:#953800&#34;&gt;$work_start&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;$work_end&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;-&lt;/span&gt; lunch_time &lt;span style=&#34;color:#0550ae&#34;&gt;-&lt;/span&gt; dinner_time&lt;span style=&#34;color:#cf222e&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#cf222e&#34;&gt;fi&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;show_work_time&lt;span style=&#34;color:#0550ae&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6639ba&#34;&gt;local&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;work_sec&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;$(&lt;/span&gt;calc_work_time&lt;span style=&#34;color:#cf222e&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6639ba&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;$((&lt;/span&gt;&lt;span style=&#34;color:#953800&#34;&gt;$work_sec&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;3600&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;))&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt; hours and &lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;$((&lt;/span&gt;&lt;span style=&#34;color:#953800&#34;&gt;$work_sec&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;%&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;3600&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;60&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;))&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt; minutes and &lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;$((&lt;/span&gt;&lt;span style=&#34;color:#953800&#34;&gt;$work_sec&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;%&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;60&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;))&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt; seconds&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;calc_money&lt;span style=&#34;color:#0550ae&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6639ba&#34;&gt;local&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;lunch_time&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;$(&lt;/span&gt;calc_duration &lt;span style=&#34;color:#953800&#34;&gt;$lunch_start&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;$lunch_end&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6639ba&#34;&gt;local&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;dinner_time&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;$(&lt;/span&gt;calc_duration &lt;span style=&#34;color:#953800&#34;&gt;$dinner_start&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;$dinner_end&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6639ba&#34;&gt;local&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;mnt&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;$((&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;$(&lt;/span&gt;calc_duration &lt;span style=&#34;color:#953800&#34;&gt;$work_start&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;$work_end&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;-&lt;/span&gt; lunch_time &lt;span style=&#34;color:#0550ae&#34;&gt;-&lt;/span&gt; dinner_time&lt;span style=&#34;color:#0550ae&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;60&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6639ba&#34;&gt;local&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;salary_per_mnt&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;$((&lt;/span&gt;&lt;span style=&#34;color:#953800&#34;&gt;$salary&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;100000000&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;$day&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;$mnt&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6639ba&#34;&gt;local&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;work_sec&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;$(&lt;/span&gt;calc_work_time&lt;span style=&#34;color:#cf222e&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6639ba&#34;&gt;local&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;money&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;$((&lt;/span&gt;salary_per_mnt &lt;span style=&#34;color:#0550ae&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;(&lt;/span&gt;work_sec &lt;span style=&#34;color:#0550ae&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;60&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;1000000&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6639ba&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;$money&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;show_money&lt;span style=&#34;color:#0550ae&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6639ba&#34;&gt;local&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;money&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;$(&lt;/span&gt;calc_money&lt;span style=&#34;color:#cf222e&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6639ba&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;已挣到：&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;$((&lt;/span&gt;&lt;span style=&#34;color:#953800&#34;&gt;$money&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;100&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;))&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;$((&lt;/span&gt;&lt;span style=&#34;color:#953800&#34;&gt;$money&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;%&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;100&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;))&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt; 元&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;calc_work_end&lt;span style=&#34;color:#0550ae&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#cf222e&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;[&lt;/span&gt; &lt;span style=&#34;color:#cf222e&#34;&gt;$(&lt;/span&gt;calc_duration &lt;span style=&#34;color:#953800&#34;&gt;$CURRENT_TIME&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;$work_start&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;)&lt;/span&gt; -gt &lt;span style=&#34;color:#0550ae&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color:#cf222e&#34;&gt;then&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6639ba&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;距离下班还有：[还没开始上班]&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#cf222e&#34;&gt;elif&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;[&lt;/span&gt; &lt;span style=&#34;color:#cf222e&#34;&gt;$(&lt;/span&gt;calc_duration &lt;span style=&#34;color:#953800&#34;&gt;$CURRENT_TIME&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;$work_end&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;)&lt;/span&gt; -gt &lt;span style=&#34;color:#0550ae&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color:#cf222e&#34;&gt;then&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6639ba&#34;&gt;local&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;time_left&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;$(&lt;/span&gt;calc_duration &lt;span style=&#34;color:#953800&#34;&gt;$CURRENT_TIME&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;$work_end&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6639ba&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;距离下班还有：&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;$((&lt;/span&gt;&lt;span style=&#34;color:#953800&#34;&gt;$time_left&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;3600&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;))&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt; 小时 &lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;$((&lt;/span&gt;&lt;span style=&#34;color:#953800&#34;&gt;$time_left&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;%&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;3600&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;60&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;))&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt; 分钟 &lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;$((&lt;/span&gt;&lt;span style=&#34;color:#953800&#34;&gt;$time_left&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;%&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;60&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;))&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt; 秒&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#cf222e&#34;&gt;else&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6639ba&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;距离下班还有：[下班啦]&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#cf222e&#34;&gt;fi&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;random_emoji&lt;span style=&#34;color:#0550ae&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6639ba&#34;&gt;local&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;len&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;${#&lt;/span&gt;&lt;span style=&#34;color:#953800&#34;&gt;EMOJI_ARRAY&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;[*]&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6639ba&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#953800&#34;&gt;EMOJI_ARRAY&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;[RANDOM % &lt;/span&gt;&lt;span style=&#34;color:#953800&#34;&gt;$len&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;random_emoji&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;show_money&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;calc_work_end&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;:&#xA;为了让界面可爱一点，我用颜文字润色了一下！&lt;/p&gt;</description>
    </item>
    <item>
      <title>统计学补完计划</title>
      <link>https://luochang212.github.io/posts/learning_statistics/</link>
      <pubDate>Sat, 01 May 2021 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/learning_statistics/</guid>
      <description>&lt;!-- &gt; 统计并非抽象的学科。虽然派生了推断、估计等抽象概念，但它并非为抽象而抽象，为思辩而思辨。&#xA;&gt; &#xA;&gt; 统计发展抽象概念，通常是为了解决现实中的问题。举个例子，一根头发也没有的人是秃子。那么有十根头发的人呢？有二十根头发的人呢？在一般的认识里，我们认为他们也是秃子。那么究竟要达到多少根毛，才能不被称为秃子呢？统计推断可以利用样本的分布信息，给这个问题一个量化的解答。这就是统计的魅力所在。 --&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;统计学绝非一门生硬无趣的学科，它有着鲜活的案例和丰富的实验，让我们循着公式乘着代码在统计的海洋里尽情摇摆叭 &lt;img src=&#34;https://luochang212.github.io/img/quyin/maimeng.png&#34; class=&#34;my-emoji&#34; style = &#34;height: 32px;&#34;&gt;&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;h3 id=&#34;1-回归分析&#34;&gt;1. 回归分析&lt;/h3&gt;&#xA;&lt;h4 id=&#34;11-简单线性回归模型&#34;&gt;1.1 简单线性回归模型&lt;/h4&gt;&#xA;&lt;h5 id=&#34;1-回归方程&#34;&gt;(1) 回归方程&lt;/h5&gt;&#xA;&lt;p&gt;许多回归分析都是在如下假设前提下开始的：&lt;code&gt;$y$&lt;/code&gt; 和 &lt;code&gt;$x$&lt;/code&gt; 是两个代表某个总体的变量，我们希望用 &lt;code&gt;$x$&lt;/code&gt; 解释 &lt;code&gt;$y$&lt;/code&gt;，通过一个线性方程，我们可以刻画 &lt;code&gt;$y$&lt;/code&gt; 和 &lt;code&gt;$x$&lt;/code&gt; 之间的关系：&#xA;&lt;code&gt;$$y=\beta_{0}+\beta_{1} x+u \quad (1.1)$$&lt;/code&gt;&#xA;假定方程 (1.1) 在我们所关注的总体中成立，它便定义了一个&lt;strong&gt;简单线性回归模型&lt;/strong&gt; (simple linear regression model).&lt;/p&gt;&#xA;&lt;p&gt;其中，各符号含义如下：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;$y$&lt;/code&gt;: 因变量（或被解释变量、回归子）&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;$x$&lt;/code&gt;: 自变量（或解释变量、回归元）&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;$u$&lt;/code&gt;: 误差项（或干扰项）&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;$\beta_{1}$&lt;/code&gt;: 斜率参数&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;$\beta_{0}$&lt;/code&gt;: 截距参数&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;举例来说，假设我们用方程 (1.1) 来刻画大豆收成：&lt;code&gt;$y$&lt;/code&gt; 表示收成，&lt;code&gt;$x$&lt;/code&gt; 表示施肥量，&lt;code&gt;$u$&lt;/code&gt; 则包括了诸如土地质量、降水量等因素。&lt;/p&gt;&#xA;&lt;h5 id=&#34;2-零条件均值假设&#34;&gt;(2) 零条件均值假设&lt;/h5&gt;&#xA;&lt;p&gt;只有在我们对 &lt;code&gt;$x$&lt;/code&gt; 和 &lt;code&gt;$u$&lt;/code&gt; 之间的关系做出&lt;strong&gt;某种约束&lt;/strong&gt;时，我们才能计算出 &lt;code&gt;$\beta_{1}$&lt;/code&gt; 和 &lt;code&gt;$\beta_{0}$&lt;/code&gt; 的可靠估计量。&lt;/p&gt;&#xA;&lt;p&gt;🌟 零条件均值假定：&#xA;&lt;code&gt;$$\begin{aligned} &amp;amp;\mathrm{E}(u)=0  \quad (1.2) \\ &amp;amp;\mathrm{E}(u \mid x)=\mathrm{E}(u)  \quad (1.3) \end{aligned}$$&lt;/code&gt;&#xA;方程 (1.2) 和 (1.3) 称作&lt;strong&gt;零条件均值假定&lt;/strong&gt; (zero conditional mean assumption). 有了这两个约束，我们就能计算 &lt;code&gt;$\beta_{1}$&lt;/code&gt; 和 &lt;code&gt;$\beta_{0}$&lt;/code&gt; 了。&lt;/p&gt;</description>
    </item>
    <item>
      <title>FastAPI 初见</title>
      <link>https://luochang212.github.io/posts/fastapi/</link>
      <pubDate>Sat, 21 Nov 2020 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/fastapi/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;什么是 API？如何从零开始，搭建自己的第一个API？本文带你搭建一个 API 小应用以了解 FastAPI 的使用细节&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;!-- &gt; 什么是 API？API 有什么用？本文从零开始教你搭建 API，认识 API 服务中的组件和 FastAPI 的使用细节。 --&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/calendar-api&#34; target=&#34;_blank&#34;&gt;calendar-api&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;什么是 API？&lt;/p&gt;&#xA;&lt;p&gt;简单来说，&lt;a href=&#34;https://en.wikipedia.org/wiki/API&#34;&gt;API&lt;/a&gt; &lt;!-- (application programming interface, 应用编程接口)  --&gt;是软件间相互传输数据的接口。它在生活中十分常见，比如博物馆订票系统中就使用了 API. 当你在手机应用上订票时，手机实际上发送了一个 HTTP 请求给远程服务器。远程服务器解析该请求。当确认所有字段信息均准确无误后，它才会把你的订票信息录入数据库，并回调成功标识。只有当上述操作全都被正确执行时，你的手机才会显示订票成功。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/fastapi-2.PNG&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;API 程序通常运行在服务端 (server) 上。&lt;strong&gt;客户端&lt;/strong&gt; (client) 通过向 API 提供的网络接口发送请求，以实现对&lt;strong&gt;服务端&lt;/strong&gt;的通信。服务端收到请求后，对请求进行解析。如果请求是合法的，则执行该请求，并将请求结果回调给客户端。一次典型的 API 请求大体上是这么个过程。&lt;/p&gt;&#xA;&lt;p&gt;在业务中，有时需要记录每次请求产生的中间状态、运行结果和日志数据。这时就需要 &lt;strong&gt;服务端&lt;/strong&gt; 调用 &lt;strong&gt;数据库&lt;/strong&gt; (database) 以存储业务中产生的各种信息。&lt;/p&gt;&#xA;&lt;h3 id=&#34;1-rest-api&#34;&gt;1. REST API&lt;/h3&gt;&#xA;&lt;p&gt;API 本身是高度个性化的，软件间可以用任意数据类型进行通信。但如果 API 缺少规范、各行其是，就会导致软件间沟通成本高企。&lt;a href=&#34;https://restfulapi.net/&#34;&gt;REST API&lt;/a&gt; 就是其中一种规范。REST API 提出了六项指导原则，只要 API 符合这六项指导原则，就可称之为“符合 REST 风格的 API”。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;REST API 提出的六项指导原则分别是：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Client–server&lt;/li&gt;&#xA;&lt;li&gt;Stateless&lt;/li&gt;&#xA;&lt;li&gt;Cacheable&lt;/li&gt;&#xA;&lt;li&gt;Uniform interface&lt;/li&gt;&#xA;&lt;li&gt;Layered system&lt;/li&gt;&#xA;&lt;li&gt;Code on demand (optional)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;[&lt;a href=&#34;https://restfulapi.net/&#34;&gt;了解更多&lt;/a&gt;]&lt;/p&gt;</description>
    </item>
    <item>
      <title>泊松分布的仿真及可视化</title>
      <link>https://luochang212.github.io/posts/poisson/</link>
      <pubDate>Sat, 19 Sep 2020 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/poisson/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;本文介绍泊松分布和泊松函数的定义，并通过 Python random 库对泊松分布进行仿真，带你触摸复杂表象下的简单本质。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/python-tips/blob/master/poisson/poisson.py&#34; target=&#34;_blank&#34;&gt;python-tips/poisson&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;1-从泊松函数讲起&#34;&gt;1. 从泊松函数讲起&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Poisson_distribution&#34;&gt;泊松分布&lt;/a&gt; 表示在&lt;strong&gt;给定时间段&lt;/strong&gt;内发生&lt;strong&gt;给定数量的事件&lt;/strong&gt;的概率。这个定义比较抽象。举个具体的例子，假设你每小时接到电话的概率是固定的，比如每小时 0.05 个，那么你在接下来 1 小时内接到电话个数的概率，就服从泊松分布:&lt;/p&gt;&#xA;&lt;p&gt;1 小时内接到 0 个电话，对应一个概率值 &lt;code&gt;$P_0$&lt;/code&gt;；&lt;/p&gt;&#xA;&lt;p&gt;1 小时内接到 1 个电话，对应一个概率值 &lt;code&gt;$P_1$&lt;/code&gt;；&lt;/p&gt;&#xA;&lt;p&gt;&amp;hellip; &amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;1 小时内接到 n 个电话，也对应一个概率值&lt;code&gt;$P_n$&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;p&gt;这些概率值组成一个概率分布列，它们的值  &lt;code&gt;$(n, P_n)$&lt;/code&gt;  在二维坐标下连成一条&lt;strong&gt;曲线&lt;/strong&gt;。这条曲线所在的函数就是&lt;strong&gt;泊松分布的概率密度函数&lt;/strong&gt;。其公式及图像如下：&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;$$\boxed{P(k | t, \lambda)=\frac{(\lambda t)^{k}}{k !} \exp (-\lambda t)}$$&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/The-Poisson-distribution.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;从公式中，我们可以看出：只要确定了 &lt;code&gt;$\lambda$&lt;/code&gt; 和 &lt;code&gt;$t$&lt;/code&gt;，该式就退化成了概率 &lt;code&gt;$P$&lt;/code&gt; 关于事件发生次数 &lt;code&gt;$k$&lt;/code&gt; 的函数。 类似地，如果我们确定了 &lt;code&gt;$\lambda$&lt;/code&gt; 和 &lt;code&gt;$k$&lt;/code&gt;，则该式退化成概率&lt;code&gt;$P$&lt;/code&gt; 关于时间范围 &lt;code&gt;$t$&lt;/code&gt; 的函数。&lt;/p&gt;&#xA;&lt;p&gt;“确定哪些参数，让函数最终退化成哪些参数的函数”，这个选择和我们的研究目的有关。如果你对不同 &lt;code&gt;$k$&lt;/code&gt; 如何影响 &lt;code&gt;$P$&lt;/code&gt; 值感兴趣，那么就应该确定参数 &lt;code&gt;$\lambda$&lt;/code&gt; 和 &lt;code&gt;$t$&lt;/code&gt;。如果对 &lt;code&gt;$t$&lt;/code&gt; 和 &lt;code&gt;$P$&lt;/code&gt; 之间的关系感兴趣，那么就应该确定参数 &lt;code&gt;$\lambda$&lt;/code&gt; 和 &lt;code&gt;$k$&lt;/code&gt;。&lt;/p&gt;</description>
    </item>
    <item>
      <title>漫谈 Hadoop Streaming</title>
      <link>https://luochang212.github.io/posts/hadoop_intro/</link>
      <pubDate>Sat, 25 Jul 2020 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/hadoop_intro/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;本文聚焦如何通过 Hadoop Streaming + Python 编写 Hadoop 程序。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;!-- [Hadoop](https://hadoop.apache.org/) 是一个用于大数据处理的分布式计算框架。 --&gt;&#xA;&lt;p&gt;众所周知，实现分布式计算是一个繁琐的过程。&lt;a href=&#34;https://hadoop.apache.org/&#34;&gt;Hadoop&lt;/a&gt; 通过一个标准化的数据处理流程，简化操作步骤，让没有分布式计算背景的程序员也能轻松写出分布式程序。Hadoop 本身是用 Java 写的，因此对于非 Java 程序员来说，学 Hadoop 必须先学 Java，这大大降低了 Hadoop 的友好程度。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://hadoop.apache.org/docs/current/hadoop-streaming/HadoopStreaming.html&#34;&gt;Hadoop Streaming&lt;/a&gt; 就是为了解决这个问题而生的，它支持用其他编程语言编写 Hadoop 程序。&lt;/p&gt;&#xA;&lt;h3 id=&#34;1-分布式系统的由来&#34;&gt;1. 分布式系统的由来&lt;/h3&gt;&#xA;&lt;p&gt;经历半个多世纪的高速增长，半导体工业在本世纪初触及了它的物理瓶颈，摩尔定律失灵，硬件算力不再高速增长，人们开始关注利用软件方法来提升算力。&lt;/p&gt;&#xA;&lt;p&gt;2003年，两名谷歌工程师开发了一个分布式存储系统，这是它的前身。经过几位后来者添枝加叶，该系统在 2006 年开源，并发展成为今天我们熟知的 Hadoop。&lt;/p&gt;&#xA;&lt;p&gt;使用分布式系统，显而易见的好处是能够缩短程序运行的时间。在常规时间就能跑完的程序上使用 Hadoop 无异于画蛇添足。但是对大数据开发人员来说，使用 Hadoop 意味着不必坐在电脑前为了结果等上一整天。如果集群效率够高，完全可能在几分钟内完成单机一天的计算量。&lt;/p&gt;&#xA;&lt;h3 id=&#34;2-hadoop-基本介绍&#34;&gt;2. Hadoop 基本介绍&lt;/h3&gt;&#xA;&lt;p&gt;Hadoop 有两个重要的组成部分：HDFS 和 MapReduce。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;HDFS&lt;/strong&gt; 是一个分布式存储系统，它负责将文件切割成分片，然后分发到集群中的目标机器上进行存储；&lt;strong&gt;MapReduce&lt;/strong&gt; 负责构建一个标准化的数据处理流程，在完成其规定的几道数据处理流程之后，用户将得到他们期望的结果。&lt;/p&gt;&#xA;&lt;p&gt;这意味着 Hadoop 的学习至少包括两个部分。要掌握 HDFS，你需要掌握 Hadoop 命令行命令，这将在第7节详细介绍。要掌握 MapReduce，如果你是 Python 开发者，你需要掌握 Hadoop Streaming，这将在下一节中介绍。&lt;/p&gt;&#xA;&lt;h3 id=&#34;3-mapreduce&#34;&gt;3. MapReduce&lt;/h3&gt;&#xA;&lt;p&gt;MapReduce 的重要性不言而喻，它定义了数据在 Hadoop 中被如何处理。MapReduce 包含三个重要过程：Map, Shuffle 和 Reduce。其中，Map 和 Reduce 由我们来编写，Shuffle 则由系统自动完成。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Python 工程化实践</title>
      <link>https://luochang212.github.io/posts/python_practice/</link>
      <pubDate>Sun, 14 Jun 2020 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/python_practice/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;学 Python 不应仅限于学编程，同样应该学习工程知识，比如虚拟环境、编码风格以及单元测试等。本文致力于介绍 Python 工程化所需的前置知识。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;font color=&#34;red&#34;&gt;⚠️&lt;/font&gt; 注意：以下教程适用于 MacOS。&lt;/p&gt;&#xA;&lt;h2 id=&#34;部署环境&#34;&gt;部署环境&lt;/h2&gt;&#xA;&lt;h3 id=&#34;1-anaconda&#34;&gt;1. Anaconda&lt;/h3&gt;&#xA;&lt;p&gt;Anaconda 是一个包管理器，它能让你方便的管理 Python 版本和包版本。并且， Anaconda 聚合了 Jupyter notebook，使其大受数据科学家和人工智能工程师的欢迎。下面我们来介绍如何用 Anaconda 管理我们的 Python 环境。&lt;/p&gt;&#xA;&lt;p&gt;如果你还没有 Anaconda，安装一个：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;海外用户直接访问 &lt;a href=&#34;https://www.anaconda.com/products/individual&#34;&gt;Anaconda 官网&lt;/a&gt; 下载即可&lt;/li&gt;&#xA;&lt;li&gt;国内用户无法访问 Anaconda 官网(被墙)，建议选择&lt;a href=&#34;https://mirrors.tuna.tsinghua.edu.cn/anaconda/&#34;&gt;清华镜像&lt;/a&gt;替代。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;安装完以后，在命令行界面输入 &lt;code&gt;conda&lt;/code&gt;，会打印一个帮助文档。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/conda-command.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;帮助文档大概是说 conda 有哪些常用命令，比如下面这些：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ conda &lt;span style=&#34;color:#6639ba&#34;&gt;help&lt;/span&gt;  &lt;span style=&#34;color:#57606a&#34;&gt;# 打印帮助文档&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ conda info  &lt;span style=&#34;color:#57606a&#34;&gt;# 查看conda信息，包括当前在哪个环境，环境路径，Python版本等信息&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ conda list  &lt;span style=&#34;color:#57606a&#34;&gt;# 列出conda下安装了哪些包&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ conda install &lt;span style=&#34;color:#0550ae&#34;&gt;[&lt;/span&gt;package_name&lt;span style=&#34;color:#0550ae&#34;&gt;]&lt;/span&gt;  &lt;span style=&#34;color:#57606a&#34;&gt;# 在conda环境中安装某个包&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ conda update &lt;span style=&#34;color:#0550ae&#34;&gt;[&lt;/span&gt;package_name&lt;span style=&#34;color:#0550ae&#34;&gt;]&lt;/span&gt;  &lt;span style=&#34;color:#57606a&#34;&gt;# 升级conda环境中的某个包&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;：后文仅专注介绍虚拟环境相关内容，更多内容请在 &lt;a href=&#34;https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html&#34;&gt;Anaconda 官方文档&lt;/a&gt; 中查看。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;Python 环境分为本地环境(lcoal env) 和全局环境 (global env) 。为一个项目配置环境，应该配置本地环境；为本机所有项目配置环境，则应该配置全局环境。&lt;/p&gt;&#xA;&lt;h4 id=&#34;-部署全局环境&#34;&gt;① 部署全局环境&lt;/h4&gt;&#xA;&lt;p&gt;📖 新建环境&lt;/p&gt;</description>
    </item>
    <item>
      <title>算法集萃</title>
      <link>https://luochang212.github.io/posts/algorithms/</link>
      <pubDate>Fri, 03 Apr 2020 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/algorithms/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;算法学习笔记，长期更新 &lt;img src=&#34;https://luochang212.github.io/img/quyin/witty.png&#34; class=&#34;my-emoji&#34; style = &#34;height: 32px;&#34;&gt;&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/python-tips/tree/master/algorithms&#34; target=&#34;_blank&#34;&gt;python-tips/algorithms&lt;/a&gt;&lt;/p&gt;&#xA;&lt;!-- ### 查找&#xA;&#xA;（1）二分查找&#xA;&#xA;LeetCode 704&#xA;&#xA;给定有序列表 nums，查找目标 target。如果不存在输出 -1；存在则输出下标。&#xA;```python&#xA;class Solution:&#xA;    def search(self, nums, target):&#xA;        if nums:&#xA;            left = mid = 0&#xA;            right = len(nums)&#xA;            while left &lt; right:&#xA;                mid = left + (right - left) // 2&#xA;                if nums[mid] == target:&#xA;                    return mid&#xA;                elif nums[mid] &lt; target:&#xA;                    left = mid + 1&#xA;                elif nums[mid] &gt; target:&#xA;                    right = mid&#xA;        return -1&#xA;```&#xA;&#xA;（2）100 以内质数&#xA;&#xA;统计 100 以内质数的数量。&#xA;&#xA;```python&#xA;class Solution:&#xA;    def prime(self):&#xA;        ans = [2]&#xA;        for i in range(3, 100):&#xA;            flag = True&#xA;            for j in ans:&#xA;                if i % j == 0:&#xA;                    flag = False&#xA;            if flag:&#xA;                ans.append(i)&#xA;        return ans&#xA;```&#xA;&#xA;（3）计数质数&#xA;&#xA;LeetCode 204&#xA;&#xA;统计所有小于非负整数 n 的质数的数量。&#xA;&#xA;```python&#xA;class Solution:&#xA;    def countPrimes(self, n):&#xA;        if n &lt; 3:&#xA;            return 0&#xA;        res = [1] * n&#xA;        res[0], res[1] = 0, 0&#xA;        for i in range(2, int(n**0.5)+1):&#xA;            if res[i] == 1:&#xA;                res[i*i:n:i] = [0]*len(res[i*i:n:i])&#xA;        return sum(res)&#xA;``` &#xA;--&gt;&#xA;&lt;h3 id=&#34;排序&#34;&gt;排序&lt;/h3&gt;&#xA;&lt;p&gt;本节介绍各种排序算法的思路和特点，并提供了示例代码。&lt;/p&gt;</description>
    </item>
    <item>
      <title>用魔法打败魔法！</title>
      <link>https://luochang212.github.io/posts/chico_and_dico/</link>
      <pubDate>Fri, 21 Feb 2020 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/chico_and_dico/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;Chico 和 Dico 是两位魔术师，他们有一个经典魔术：根据任意四张牌猜第五张牌。但完成这个魔术并不需要任何魔术师的技巧，因为它完全建立在数学原理之上。只需要一点数学知识和充分的练习，你也能表演这个魔术！&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/chico-and-dico&#34; target=&#34;_blank&#34;&gt;chico-and-dico&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;chico-和-dico-的魔术&#34;&gt;Chico 和 Dico 的魔术&lt;/h3&gt;&#xA;&lt;p&gt;Chico 和 Dico 是两位魔术师，他们经常表演的一个魔术是这样的：Chico 将一副 52 张的扑克牌交给一位观众，让他随机抽取其中的 5 张。然后 Chico 将这 5 张牌按一定的顺序重新排列，再将其还给观众。上述整个过程 Dico 都是看不见的。然而，当观众按 Chico 排好的顺序依次展示前四张牌之后，Dico 却能准确地说出第五张牌是什么。&lt;/p&gt;&#xA;&lt;p&gt;乍一看这个魔术很神奇。随机抽取 5 张牌，你能从前 4 张牌中看出第 5 张牌是什么吗？对于普通人来说，当然不可能。Chico 和 Dico 的秘诀在于 Chico 有机会将扑克重新排序。如果两人事先约定好某种协议，Chico 是有可能通过扑克排列的顺序，向 Dico 传递关于第 5 张牌的信息的。&lt;/p&gt;&#xA;&lt;p&gt;关键在于如何实现这种协议。&lt;/p&gt;&#xA;&lt;h3 id=&#34;数学模型&#34;&gt;数学模型&lt;/h3&gt;&#xA;&lt;p&gt;在进行分析之前，我们需要把 Chico 和 Dico 的魔术抽象成一个数学模型。&lt;/p&gt;&#xA;&lt;p&gt;魔术本身已经提供了一些建模信息。我们可以假设一共有 n 张牌，抽取其中的 k 张。在对牌组进行某种排序之后，我们需要利用前 (k - j) 张牌的信息，推测后 j 张牌是什么。&lt;/p&gt;&#xA;&lt;!-- 其中，中间那步排序操作，本质上是利用前 (k - j) 张牌的顺序信息对后 j 张牌进行编码。 --&gt;&#xA;&lt;p&gt;现在我们有 n, j, k 三个变量，下面我们来进一步探究三个变量之间究竟服从何种关系。&lt;/p&gt;</description>
    </item>
    <item>
      <title>达尔文的故乡</title>
      <link>https://luochang212.github.io/posts/uk_experience/</link>
      <pubDate>Wed, 12 Feb 2020 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/uk_experience/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;英国小镇 Shrewsbury 是达尔文的故乡。这里有丰沛的水系、星罗棋布的公园、历史悠久的建筑。这里没有如织的游人，是一座安静的小镇。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;9月初，新生乍到老生未还，突然涌现的短租需求，使本地短租公寓一时爆火。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/ukexp-2.jpeg&#34; alt=&#34;我的长租公寓&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;看着 Airbnb 上比平时高了百分之两百的房租。我决定离开这座城市，去别处居住一段时间。&lt;/p&gt;&#xA;&lt;h3 id=&#34;达尔文的故乡&#34;&gt;达尔文的故乡&lt;/h3&gt;&#xA;&lt;p&gt;Shrewsbury 是达尔文的故乡。这座小镇水系纵横，有很多河流、小桥、公园。人不多，十分安逸。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/ukexp-3.jpeg&#34; alt=&#34;小桥流水&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;这并不是我第一次来这里。寒假我曾周游英国，游历 11 座城市，对 Shrewsbury 颇有好感。所以这次离开英国之前，选择故地重游。&lt;/p&gt;&#xA;&lt;h3 id=&#34;房东&#34;&gt;房东&lt;/h3&gt;&#xA;&lt;p&gt;房东是一对老夫妻，有很多孩子，现在已与他们分居，所以剩下了许多空房。我住的是他们小儿子的卧室。&lt;/p&gt;&#xA;&lt;p&gt;吃完早餐，我问女房东英国还有像 Shrewsbury 这样美丽的小镇吗？房东对我的问题有些不解，她说 everywhere in this country。嘿嘿嘿，这回答可有些过于骄傲了。英国美丽的小镇不少，但此地绝对算中上水平。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/ukexp-4.jpeg&#34; alt=&#34;窗台和花&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;夫妻俩日子过得讲究，早上要喝茶，晚上要下馆子。只有中午吃得简陋一点，一般是烤面包或者三明治。&lt;/p&gt;&#xA;&lt;p&gt;他们下午去遛狗。狗是一只小母狗，叫莉莉。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/ukexp-5.jpeg&#34; alt=&#34;莉莉&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;有天我去超市买东西，正好遇见他们遛狗回家。逆着夕阳，两人牵手回家的场景让我有一瞬恍惚，仿佛我看到的是两个夕阳下的青年，他们脸上明媚的笑容和热情的招呼让我忘记他们的年纪。&lt;/p&gt;&#xA;&lt;h3 id=&#34;屋里屋外&#34;&gt;屋里屋外&lt;/h3&gt;&#xA;&lt;p&gt;房子是独栋别墅，有车库和后院。从房子的年龄看，他们已经富裕了很多年。&lt;/p&gt;&#xA;&lt;p&gt;我房间的窗外是一片森林。夜晚森林里黑得诡异，让人想起中世纪的欧洲。白天森林里阳光普照，林间空地上，几个孩子在做游戏，边上是孩儿妈，坐在木头长椅上发呆。&lt;/p&gt;&#xA;&lt;p&gt;房东很有品味，屋里挂着很多抽象到看不懂的布艺和画，桌子上摆着陶的、木的装饰品。当然，最令人羡慕的还是他们的阳光房，布置得实在太美啦！&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/ukexp-7.jpeg&#34; alt=&#34;阳光房&#34;&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;小镇风光&#34;&gt;小镇风光&lt;/h3&gt;&#xA;&lt;p&gt;房东家在郊区，但距离小镇不算太远，步行半小时能到镇上。&lt;/p&gt;&#xA;&lt;p&gt;和大多数英国小镇一样，这里有许多老房子、老街道。数百年前的城市风貌一直延续到了今天。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/ukexp-8.jpeg&#34; alt=&#34;老街&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;众多的水系、桥梁、公园组成了这座小镇迥异的风景线。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/gallery-12.jpg&#34; alt=&#34;水系&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;一条凶狠霸道的链子！&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/ukexp-9.jpeg&#34; alt=&#34;链子&#34;&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;后记&#34;&gt;后记&lt;/h3&gt;&#xA;&lt;p&gt;为什么英国城市会形成如此风光，我试图总结一些因素：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;英国的主要产业是金融、教育和文化产业。这些行业污染低利润高，所以英伦三岛才有如此美丽的自然风光&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;近代城市文明是英国率先建立起来的&lt;!-- （日本最早的城市建设就是向英国学习） --&gt;。无论是建筑技术还是审美都是一脉相承。所以英国的古建筑和现代建筑之间能够相处融洽、相得益彰&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;英国的城市一般规模小车流小，很少有建宽大主干道的需求。客观上道路对行人通行的切割和限制就少了很多，更加 walkable&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;重视社区氛围营造，社区内有充足的休憩空间和社交空间，比如驻唱酒吧、公园长椅、咖啡馆、书店、中古商店&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;这些因素造就了英国独特的城市风貌和交通格局。有些优点中国无法照搬照抄，但也许可以启发当代中国建设者。尤其是城市格局与英国相似的中国县城和小镇，颇能借鉴英国在城市交通、景观园林、商业布局方面的设计。&lt;/p&gt;&#xA;&lt;!-- 这个世界没有完美的体制，没有天堂。哪怕是英国这样已经高度发达的国家，拥有美丽的田园风光，宏伟的建筑和闪耀了数百年的科技之光。也依然存在许多社会问题。&#xA;&#xA;2019 年初，在伦敦一家 KFC 里，一位流浪汉向我要钱。因为我拒绝给钱，他就抡起铁椅子朝地上砸，然后转身离去。这并不是孤例。2019 年的英国街头，到处游荡着流浪汉。在这种背景下，小范围骚动不过再微小不过的点缀。阶级分化，难民问题，深深地困扰着这个国家。&#xA;&#xA;2019 年的中国，依旧笼罩在工业的尘霾之下。但尘归尘，土归土，我们建设的未来终将从尘霾中诞生。我们期待遇见一个更浪漫美好，分配合理的未来。&#xA;&#xA;西方做对了一些事，所以称霸数百年。中国学习西方，亦历百年。历史是不断演化的。总体来说，西方走在我们前面，因此有不少经验值得借鉴。为了我们的未来，将来我们还要继续学习西方。不但要学习他们做对的地方，还要学习他们做错的经验。 --&gt;&#xA;&lt;!-- 看见另一种生活的可能，对当下来说，是一种超脱。 --&gt;&#xA;&lt;!-- 在中关村实习三个月后，回看这段生活，它已经有了不一样的意义。ß --&gt;&#xA;&lt;!-- ### 后记&#xA;&#xA;城市的样貌，总是体现着城市的价值取向。中国的公园，总是有气派的水泥广场。英国的公园，则经常是草地上摆几张木质长椅。&#xA;&#xA;这种区别背后，其实体现的是集体与个体孰轻孰重的问题。如果集体重要，那么公共空间就应该为“公众”而建；如果个体重要，就应该为“个体”设计。&#xA;&#xA;城市无言，但她告诉我们，在这个世界的某个地方，还存在着另一种生活的样貌，存在另一种价值取向。这多多少少能让我们脱离当下生活的视野局限，短暂地超脱于现实，获得一些心灵的安慰。 --&gt;</description>
    </item>
    <item>
      <title>贝叶斯方法</title>
      <link>https://luochang212.github.io/posts/bayesian/</link>
      <pubDate>Fri, 31 Jan 2020 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/bayesian/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;统计学中有两大学派，频率学派和贝叶斯学派。频率派用总体信息和样本信息进行统计推断。而贝叶斯派除了使用以上两种信息之外，还使用&lt;strong&gt;先验信息&lt;/strong&gt;进行统计推断。本文从数学原理和编程实践两个方向探究贝叶斯方法。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;本文从数学原理和编程实践两个方面来介绍贝叶斯方法。&lt;/p&gt;&#xA;&lt;h2 id=&#34;数学原理&#34;&gt;数学原理&lt;/h2&gt;&#xA;&lt;p&gt;贝叶斯理论包含很多内容。我们熟悉的利用先验分布推后验分布的方法被称为&lt;strong&gt;贝叶斯推理&lt;/strong&gt;（Bayesian inference）。此外，还可以利用参数的后验分布的均值作为该参数的点估计，这种方法被称为&lt;strong&gt;贝叶斯估计&lt;/strong&gt;（Bayesian estimation）。本文数学原理部分主要介绍贝叶斯推理和贝叶斯估计。&lt;/p&gt;&#xA;&lt;p&gt;理论部分为六节，各节的主要内容如下。&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;章节&lt;/th&gt;&#xA;          &lt;th&gt;主要内容&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;第一节&lt;/td&gt;&#xA;          &lt;td&gt;用一个简单的实例，让大家对贝叶斯方法有一个形象的认识。&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;第二节&lt;/td&gt;&#xA;          &lt;td&gt;用一个复杂的实例，让大家对贝叶斯方法的术语有一个形象的认识。&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;第三节&lt;/td&gt;&#xA;          &lt;td&gt;介绍贝叶斯公式的事件形式及其推导。&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;第四节&lt;/td&gt;&#xA;          &lt;td&gt;介绍贝叶斯公式的密度函数形式及其推导。&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;第五节&lt;/td&gt;&#xA;          &lt;td&gt;介绍贝叶斯估计。&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;第六节&lt;/td&gt;&#xA;          &lt;td&gt;探索联合分布蕴含了哪些信息。&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h3 id=&#34;一实例癌症化验的准确率&#34;&gt;一、实例：癌症化验的准确率&lt;/h3&gt;&#xA;&lt;p&gt;下面请各位做题家们做一下你们最爱的经典老题 &lt;img src=&#34;https://luochang212.github.io/img/quyin/watermaleon.png&#34; class=&#34;my-emoji&#34; style = &#34;height: 32px;&#34;&gt;&lt;/p&gt;&#xA;&lt;h4 id=&#34;-题目&#34;&gt;📖 题目&lt;/h4&gt;&#xA;&lt;p&gt;&lt;strong&gt;有两个可选的假设&lt;/strong&gt;：&lt;/p&gt;&#xA;&lt;p&gt;病人有癌症（cancer）、病人无癌症（normal）&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;可用数据来自化验结果&lt;/strong&gt;：&lt;/p&gt;&#xA;&lt;p&gt;正（+）、负（-）&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;有先验知识&lt;/strong&gt;：&lt;/p&gt;&#xA;&lt;p&gt;在所有人口中，患病率是 0.8%。对确实有病的患者的化验准确率为 98%，对确实无病的患者的化验准确率为 97%，总结如下：&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;$ P(cancer) = 0.008, P(normal) = 0.992 \\ P(+ | cancer) = 0.98, P(- | cancer) = 0.02 \\ P(+ | normal) = 0.03, P(- | normal) = 0.97 $&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;问题&lt;/strong&gt;：&lt;/p&gt;</description>
    </item>
    <item>
      <title>我的 Python 不可能这么可爱</title>
      <link>https://luochang212.github.io/posts/python_tips/</link>
      <pubDate>Thu, 14 Nov 2019 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/python_tips/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;Python 学习笔记，如有错误，欢迎指正 &lt;img src=&#34;https://luochang212.github.io/img/quyin/witty.png&#34; class=&#34;my-emoji&#34; style = &#34;height: 32px;&#34;&gt;&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/python-tips&#34; target=&#34;_blank&#34;&gt;python-tips&lt;/a&gt;&lt;/p&gt;&#xA;&lt;!-- 本文从 2019 年 11 月一路更新到了 2020 年 11 月，我也从实习转向了正式工作。一年前，我尚未将 Python 视作主力编程语言。但今天，它毫无疑问已经是我最熟稔的伙伴之一了。&#xA;&#xA;Python 有许多缺点，但是它在机器学习、科学计算、可视化、网络编程等方面的优势，几乎无可匹敌。它的身影在一些不追求高性能的、离线低频次的场景下频繁出现。在诸如数据分析、算法预研、仿真建模等领域，都将 Python 作为首选语言。 --&gt;&#xA;&lt;!-- 它的实用性毋庸置疑，在与计算机有学科交叉的科研院所，包括物理学、天文学、地质学、飞行动力学、地理信息系统、药学等领域的学术研究中都有 Python 的身影；此外，在大厂的数据中台，诸如数据开发、数据分析、数据挖掘等工作，通常也都是用 Python 完成的。 --&gt;&#xA;&lt;!-- 但是，入门 Python 并不容易。因为除了学习使用 Python 写代码，你还要学习关于这门语言自身的知识。例如，Python 有将文件视作模块 (module) 的机制。如果你要具体地理解这件事，你还需要深究 `import` 、 `if __name__ == &#34;__main__&#34;` 和 `__init__.py` 的含义。&#xA;&#xA;Python 语言就像一棵枝叶繁茂的树。如果你找不到枝干，就会被无数琐碎细节淹没，无从入手。《大学》云，知所先后则近道矣，正有其意。我衷心希望本文能成为学习你 Python 的“枝干”和“抓手”。 --&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;相关书籍推荐&lt;/strong&gt;：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;入门：《Python编程从入门到实践》 [&lt;a href=&#34;https://book.douban.com/subject/26829016/&#34;&gt;豆瓣链接&lt;/a&gt;]&lt;/li&gt;&#xA;&lt;li&gt;初级：《Python学习手册》(英文名 &lt;em&gt;Learning Python&lt;/em&gt;) [&lt;a href=&#34;https://book.douban.com/subject/30364619/&#34;&gt;豆瓣链接&lt;/a&gt;]&lt;/li&gt;&#xA;&lt;li&gt;中级：《流畅的Python》[&lt;a href=&#34;https://book.douban.com/subject/27028517/&#34;&gt;豆瓣链接&lt;/a&gt;]&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;PS: 针对每个阶段，我推荐的是我认为最好的那本书。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;h2 id=&#34;语言基础&#34;&gt;语言基础&lt;/h2&gt;&#xA;&lt;h3 id=&#34;列表&#34;&gt;列表&lt;/h3&gt;&#xA;&lt;p&gt;本文从以下几个方面介绍列表：&lt;/p&gt;</description>
    </item>
    <item>
      <title>Elasticsearch 初探</title>
      <link>https://luochang212.github.io/posts/elastic_search/</link>
      <pubDate>Thu, 24 Oct 2019 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/elastic_search/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/elastic/elasticsearch&#34;&gt;Elasticsearch&lt;/a&gt; 是一个开源分布式全文搜索引擎。它建立在当前最先进有效的搜索引擎库 &lt;a href=&#34;https://lucene.apache.org/&#34;&gt;Lucene&lt;/a&gt; 之上。Elasticsearch 集成了 Lucene 的检索功能，并通过一套简单的 API 隐藏了 Lucene 的复杂性，使之简单易用。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;h2 id=&#34;初识&#34;&gt;初识&lt;/h2&gt;&#xA;&lt;hr&gt;ES 的初步介绍&#xA;&lt;p&gt;本节将介绍 ES 的几个特性。这些介绍能帮助我们理解 ES 是应什么需求诞生的？它解决了什么问题？它为何如此架构？以及这种架构方式为它带来哪些性能上的提升？这些信息虽然不能直接提升我们使用 ES 的能力，但能从更深的维度帮助我们使用好它。&lt;/p&gt;&#xA;&lt;h3 id=&#34;不仅仅是搜索&#34;&gt;不仅仅是搜索&lt;/h3&gt;&#xA;&lt;p&gt;ES 不仅能够搜索，它还提供一套分布式实时存储文档的解决方案。 ES 允许用户将数据存储在多个服务器节点上。这些节点能实时共享数据。一旦主节点的内容发生改变，这些改变会实时传递到副节点上，以保证主副节点的内容一致。如果主节点掉线，ES 能立即选举出一个副节点充当主节点。选举过程就像切换开关一样，能够在瞬间完成，从而保证了 ES 的可靠性。&lt;/p&gt;&#xA;&lt;p&gt;分布式的存储方案不仅仅是基于数据安全的考量，同时也是为了加快检索的速度。利用 &lt;a href=&#34;https://research.google.com/archive/mapreduce-osdi04-slides/index.html&#34;&gt;MapReduce&lt;/a&gt;，ES 可以在多个节点上并行地检索数据，大大缩短了海量数据处理的时间。&lt;/p&gt;&#xA;&lt;h3 id=&#34;领域专用语言&#34;&gt;领域专用语言&lt;/h3&gt;&#xA;&lt;p&gt;为了统一查询语法，ES 设计了一套领域专用语言 (DSL, domain specific language)。这套语言基于 JSON，优点是简单易学，缺点是在表达复杂的查询时，会显得格外冗长，阅读起来也不太友好。&lt;/p&gt;&#xA;&lt;h3 id=&#34;sql-和-nosql&#34;&gt;SQL 和 NoSQL&lt;/h3&gt;&#xA;&lt;p&gt;SQL 全称 Structured Query Language。SQL 中的 Structured 突出了它是结构化的查询语言。结构化即受字段限制。SQL 数据库中的每条数据都具有相同的长度，因此可以被视作一张数据表。&lt;!-- 比如有一组结构化的数据，已知它有3条数据、5个字段，那么我们可以确定它就是一张3乘5的数据表。--&gt;相比于 SQL，NoSQL 能表达更复杂的内部数据结构。字段之间不相互影响，可以拥有各自的层级结构。因此 NoSQL 数据库要比 SQL 数据库更加灵活且易于拓展。NoSQL 数据库中的数据通常用 JSON 表示。&lt;/p&gt;&#xA;&lt;h2 id=&#34;入门&#34;&gt;入门&lt;/h2&gt;&#xA;&lt;hr&gt;一些简单概念&#xA;&lt;h3 id=&#34;文档&#34;&gt;文档&lt;/h3&gt;&#xA;&lt;p&gt;在 ES 中，文档是一个特定的术语。它表示用来存储对象的存储单元。一个对象通常不会是简单的键值对，它可能包含更复杂的数据结构，比如日期、地理数据、数组等。为表达这种复杂的、多层次的数据，ES 将 JSON 作为文档存储的固定格式。也就是说在 ES 里，一个文档被存成一个 JSON 值。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Monaco Editor 入门指南</title>
      <link>https://luochang212.github.io/posts/monaco_editor_tutorial/</link>
      <pubDate>Mon, 07 Oct 2019 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/monaco_editor_tutorial/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;⚠️ 注意：本教程已过时。本教程的正确食用方法是从 GitHub &lt;a href=&#34;https://github.com/luochang212/monaco-editor-demos&#34; target=&#34;_blank&#34;&gt;monaco-editor-demos&lt;/a&gt; 上直接下载代码，然后点击 index.html 直接查看 Demo 及 源码。本文中描述的构建方法可能已不适用（更新于 2024.04）&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;!-- &gt; [Monaco Editor](https://github.com/microsoft/monaco-editor) 是一款开源的在线代码编辑器。它是 [VSCode](https://code.visualstudio.com/) 的浏览器版本，随着近年 VSCode 大热，Monaco Editor 也随之走红。目前虽未登上 Online Editor 领域的宝座，却也俨然有超越几位&lt;a onclick=&#34;show_name(&#39;hide-1&#39;)&#34;&gt;老前辈&lt;/a&gt;&lt;span id=&#34;hide-1&#34; style=&#34;display: none;&#34;&gt;（指 CodeMirror, Ace 之流）&lt;/span&gt;之势。 --&gt;&#xA;&lt;script&gt;&#xA;    var i = 0;&#xA;    function show_name(id) {&#xA;        i += 1;&#xA;        if (i%2 == 0) {&#xA;            document.getElementById(id).style.display = &#34;none&#34;;&#xA;        } else {&#xA;            document.getElementById(id).style.display = &#34;inline&#34;;&#xA;        }&#xA;    }&#xA;&lt;/script&gt;&#xA;&lt;p&gt;GitHub项目链接：&lt;a href=&#34;https://github.com/luochang212/monaco-editor-demos&#34; target=&#34;_blank&#34;&gt;monaco-editor-demos&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;在学习 Monaco Editor 的过程中，我发现网络上的中文教程很少。为了填补这部分空白，我决定写一份入门教程，帮助初学者快速熟悉 Monaco Editor。通过阅读本文，你可以了解以下内容：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;如何安装&lt;/li&gt;&#xA;&lt;li&gt;如何搭建&lt;/li&gt;&#xA;&lt;li&gt;如何调用常用 API&lt;/li&gt;&#xA;&lt;li&gt;如何寻找学习资源&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;安装&#34;&gt;安装&lt;/h3&gt;&#xA;&lt;p&gt;新建项目文件夹，打开它：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ mkdir my-application&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ &lt;span style=&#34;color:#6639ba&#34;&gt;cd&lt;/span&gt; my-application&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;确保你已经下载了 &lt;code&gt;npm&lt;/code&gt;，然后安装 Monaco Editor：&lt;!--以下命令会在当前目录下新建一个名为 `node_modules` 的文件夹:--&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>【项目】摩纳哥语音编辑器</title>
      <link>https://luochang212.github.io/posts/monaco_speech_editor/</link>
      <pubDate>Thu, 22 Aug 2019 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/monaco_speech_editor/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;摩纳哥语音编辑器（Monaco Speech Editor）是一款适用于视障人群的在线代码编辑器。它在开源编辑器 Monaco Editor 的基础上，开发了专为视障者设计的语音辅助功能，包括鼠标悬浮提示，快捷键操作和代码阅读。&lt;/p&gt;&#xA;&lt;p&gt;其代码阅读功能尤其强大，用户可以用键盘精确定位指定内容进行阅读。针对同一段代码，它提供多种语音输出模式：字符模式、代码模式、音乐模式、全局模式。这些模式根据用户在不同编程阶段的不同需求，提供差异化的语音输出。比如，当用户对一个语句进行 debug 时，推荐使用字符模式进行语音播放。&lt;/p&gt;&#xA;&lt;p&gt;如果你对它的功能感兴趣，点击下方链接尝试一下吧 &lt;img src=&#34;https://luochang212.github.io/img/hanser/png/song.png&#34; class=&#34;my-emoji&#34; style = &#34;height: 64px;&#34;&gt;&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/monaco-speech-editor&#34; target=&#34;_blank&#34;&gt;monaco-speech-editor&lt;/a&gt;&lt;/p&gt;&#xA;&lt;!-- 本文是我开发Monaco Speech Editor的总结，内容主要包括技术栈的介绍、需求分析，应用的使用说明，设计思路以及界面优化。 --&gt;&#xA;&lt;!-- 可以提提web application --&gt;&#xA;&lt;!-- 涉及的技术，通过阅读这篇文章，能了解到什么，我对技术栈的想法，为什么采用的是这些技术呢 --&gt;&#xA;&lt;h3 id=&#34;项目背景&#34;&gt;项目背景&lt;/h3&gt;&#xA;&lt;p&gt;根据&lt;a href=&#34;https://www.who.int/blindness/GLOBALDATAFINALforweb.pdf&#34;&gt;世界卫生组织2010年的数据&lt;/a&gt;，全盲者在全年龄段人口中所占比例为0.58%。在全盲人口中，大部分是中老年人口。从下图可以看出，致盲风险随着年龄快速升高。在0～14岁人群中，全盲比例仅有0.07%；在15～49岁人群中，全盲比例稍高一些，为0.16%；而在50岁以上人群中，全盲比例则达到了2.39%。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/monaco_speech_editor_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;全盲人口的比例不大，但从绝对数值来看却是非常可观的。2010年，世界全盲人口比例为0.58%，但全盲人口数却达到了3936.5万。即使14岁以下人口的全盲比例仅有0.07%，但考虑绝对数值，也达到了142.1万人。&lt;/p&gt;&#xA;&lt;p&gt;而且并非只有全盲者才需要语音辅助。有相当比例的视力障碍者，即使使用眼镜，也无法矫正到正常视力。这部分的视障者，也是需要语音辅助的。&lt;!--全盲人群是视障人群的一个子集，这里的意思是除掉全盲人群之外的视障者--&gt;相比于全盲者，视力障碍者的人口则更为庞大，达到了惊人的2亿8538万。&lt;/p&gt;&#xA;&lt;!--21世纪，--&gt;在提倡公平的原则下，我们希望视障者和视力正常的人一样，也能自由地选择职业。事实上现在已经有[部分视障工程师](http://www.xinhuanet.com/2018-01/04/c_1122206710.htm)，出现在程序员岗位上，证明着他们的实力。本项目旨在为视障程序员编程无障碍化做一些贡献，[项目源代码](https://github.com/luochang212/monaco-speech-editor)现已在GitHub上以MIT许可证开源。&#xA;&lt;!-- 为什么要有这么一款软件 --&gt;&#xA;&lt;h3 id=&#34;技术选择&#34;&gt;技术选择&lt;/h3&gt;&#xA;&lt;p&gt;本编辑器是用JavaScript编写的网络应用 (web application)。它只有两项功能需要外部依赖，一个是在线代码编辑器模块，一个是文字转语音模块。&lt;/p&gt;&#xA;&lt;p&gt;（一）在线代码编辑器&lt;/p&gt;&#xA;&lt;p&gt;开源的在线代码编辑器还是挺多的，比如：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://ace.c9.io/&#34;&gt;Ace&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://codemirror.net/&#34;&gt;CodeMirror&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://microsoft.github.io/monaco-editor/&#34;&gt;Monaco Editor&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;它们对语法高亮、缩进、代码补全等基础功能都有比较好的支持，用起来大同小异。选择Monaco Editor是因为用惯了VSCode。毕竟Monaco Editor的源代码就是直接从VSCode贴过去的，两者的界面风格和操作方式都极其相似，对VSCode用户比较友好。但后来使用过程中发现打脸了，&lt;!--现在让我重写一个我会尝试另外两个依赖，--&gt;当然这是后话。&lt;/p&gt;&#xA;&lt;p&gt;（二）文字转语音&lt;/p&gt;&#xA;&lt;p&gt;文字转语音 (text to speech) 的应用就更多了，几乎各大公司都推出了自己的应用：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://aws.amazon.com/polly/&#34;&gt;Amazon Polly&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://cloud.google.com/text-to-speech/&#34;&gt;Cloud Text-to-Speech&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://azure.microsoft.com/en-gb/services/cognitive-services/text-to-speech/&#34;&gt;Microsoft text to speech API&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;但鉴于这些应用都需要网络连接，才能获取语音。考虑到网络延迟和脱机使用的问题，本项目并未采用以上任何一种API，而是选择了&lt;a href=&#34;https://w3c.github.io/speech-api/&#34;&gt;Web Speech API&lt;/a&gt;。Web Speech API本身并不提供语音服务，它事实上起到资源连接的作用。它首先会搜索操作系统，然后将操作系统提供的语音支持集合成一个列表，提供给浏览器使用。所以Web Speech API提供的语音支持会随用户系统的语音支持项而发生变化。因此不排除一些较老的机型无法使用的可能。但本项目认为本地化语音支持比之于对老机型的支持更加重要，因此选择了Web Speech API。这也是一个取向问题。&lt;/p&gt;</description>
    </item>
    <item>
      <title>排队论在网络性能分析中的应用</title>
      <link>https://luochang212.github.io/posts/network_performance_analysis/</link>
      <pubDate>Thu, 04 Jul 2019 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/network_performance_analysis/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;排队论&lt;/strong&gt;(queueing theory)也称随机服务系统理论，它研究的内容有三部分：性态问题、最优化问题和统计推断问题。（《运筹学》清华大学出版社）&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;下图描述了排队过程的一般流程：&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/queue.png&#34; alt=&#34;排队论&#34;&gt;&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;现实中的排队问题是多种多样的，对上述“顾客源”和“服务机构”应该作宽泛的理解。顾客和服务机构可以是生物，也可以是非生物；排队结构可以是有形的，也可以是无形的，比如向交换台要求通话的请求；顾客可以走向服务机构，也可以相反，比如送货上门。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;在网络中，服务器和用户之间相互传送数据包。数据包的传送需要时间，因此或多或少都会产生延迟。为了分析这些延迟，我们引入了一系列假设，并利用排队论对网络延迟进行建模分析。&lt;/p&gt;&#xA;&lt;p&gt;本文将着重介绍&lt;strong&gt;网络性能分析&lt;/strong&gt;(Network performance analysis)中几种常见的排队模型。它们是：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;The M/M/1 queuing system&lt;/li&gt;&#xA;&lt;li&gt;The birth-death process&lt;/li&gt;&#xA;&lt;li&gt;The M/M/m queuing system&lt;/li&gt;&#xA;&lt;li&gt;The M/M/1/m queuing system&lt;/li&gt;&#xA;&lt;li&gt;The M/M/∞ queuing system&lt;/li&gt;&#xA;&lt;li&gt;The M/M/m/m queuing system&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;另外，作为以上模型的理论基础，本文将首先介绍&lt;strong&gt;泊松过程&lt;/strong&gt;(Poisson process)。&lt;/p&gt;&#xA;&lt;h3 id=&#34;泊松过程的推导&#34;&gt;泊松过程的推导&lt;/h3&gt;&#xA;&lt;p&gt;泊松过程是马尔可夫过程的一个特例，在排队论中经常被用来估计顾客到达的概率分布。&lt;/p&gt;&#xA;&lt;p&gt;（一）泊松过程的假设&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;在时间间隔$\Delta t$内，有且仅有一位顾客到达的概率$P$和$\Delta t$成比例，比例系数为$\lambda$&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;在时间间隔$\Delta t$内，至多只允许一位顾客到达（否则应该选取一个更短的时间间隔）&#xA;&lt;code&gt;$$\begin{aligned} P(\text { 在时间间隔 }[t, t+\Delta t] \text { 内，有且仅有一位顾客到达 }) &amp;amp;=\lambda \Delta t \\ P(\text { 在时间间隔 }[t, t+\Delta t]\text { 内，没有顾客到达 }) &amp;amp;=1-\lambda \Delta t \\ P(\text { 在时间间隔 }[t, t+\Delta t]\text { 内，多于一位顾客到达 }) &amp;amp;=0 \end{aligned}$$&lt;/code&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>厨房笔记（二）：快手菜合集</title>
      <link>https://luochang212.github.io/posts/kitchen_time_2/</link>
      <pubDate>Tue, 02 Jul 2019 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/kitchen_time_2/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;做饭累不累？如果你只是偶尔做一顿饭以娱身心，还是挺快乐的。但要是餐餐下厨，就没那么好玩了。一日三餐，少说也要花费两三个小时的光景，不但耗损精力，还挤占学习时间。日复一日地做下来，不累才怪。因此，长期做饭的留学生往往会体现三种趋势：做饭价格向便宜收敛，做饭速度向手快收敛，做饭味道向好吃收敛。因为咱追求的就是便宜美味的同时，又省时省力不麻烦。那么下面就由我来给大家盘点一下那些好吃又方便的快手菜吧&lt;img src=&#34;https://luochang212.github.io/img/quyin/huaji.png&#34; class=&#34;my-emoji&#34; style = &#34;height: 32px;&#34;&gt;&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;br&gt;&#xA;&lt;h3 id=&#34;牛肉丸子汤&#34;&gt;牛肉丸子汤&lt;/h3&gt;&#xA;&lt;p&gt;原料：牛肉丸、醋、香油、白胡椒粉、辣椒粉、葱&lt;/p&gt;&#xA;&lt;p&gt;做法：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;锅内放牛肉丸，加水至没过牛肉丸，火开到最大。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;等水煮开的同时，把葱切成葱花备用。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;待水煮开，调成中火，保持水面沸腾。然后开始调味，按个人口味加醋和辣椒粉。加白胡椒半勺，香油数滴。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;牛肉丸还是比较易熟的，水开后再煮五至七分钟，加葱花，稍微再煮一分钟，即可起锅。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/kitchen-beef-ball-soup.jpg&#34; alt=&#34;牛肉丸子汤&#34;&gt;&lt;/p&gt;&#xA;&lt;br&gt;&#xA;&lt;h3 id=&#34;炸三文鱼&#34;&gt;炸三文鱼&lt;/h3&gt;&#xA;&lt;p&gt;原料：三文鱼片、面粉、盐&lt;/p&gt;&#xA;&lt;p&gt;做法：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;TESCO买的厚三文鱼片，均匀地敷上面粉，直至表面摸不到水分。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;锅里倒少量油铺匀锅底，开中火将油烧热。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;注意三文鱼易焦，只能开小火煎。翻面也不能太勤，否则鱼容易碎。大概三分钟左右翻一次面，反复翻面直至两面煎至金黄。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;煎十分种左右起锅。注意火候，煎得太短里面不熟，煎得太久肉会变柴。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/kitchen-salmon.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;br&gt;&#xA;&lt;h3 id=&#34;烤羊排&#34;&gt;烤羊排&lt;/h3&gt;&#xA;&lt;p&gt;原料：羊排、酱油、孜然、黑胡椒、盐、芝麻&lt;/p&gt;&#xA;&lt;p&gt;做法：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;羊排切段，加黑胡椒，加酱油，加孜然，加盐腌二十分钟。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;放入烤箱，开170度，烤四十分钟。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;出烤箱后撒点芝麻点缀。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/kitchen-lamb.jpg&#34; alt=&#34;烤羊排&#34;&gt;&lt;/p&gt;&#xA;&lt;br&gt;&#xA;&lt;h3 id=&#34;淡菜排骨汤&#34;&gt;淡菜排骨汤&lt;/h3&gt;&#xA;&lt;p&gt;原料：排骨、淡菜、豆腐、生姜、蒜&lt;/p&gt;&#xA;&lt;p&gt;做法：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;烧一锅水，同时把豆腐切块，淡菜洗干净备用。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;下排骨，煮出浮沫后，将排骨捞出，用冷水把排骨冲洗干净。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;再烧一锅水，下淡菜、排骨、豆腐、两瓣蒜、几片生姜，盖上锅盖煮十分钟。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;淡菜有自身的鲜味，不用调味，起锅即食。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/kitchen-mussel.jpg&#34; alt=&#34;淡菜排骨汤&#34;&gt;&lt;/p&gt;&#xA;&lt;br&gt;&#xA;&lt;h3 id=&#34;炒鸡蛋&#34;&gt;炒鸡蛋&lt;/h3&gt;&#xA;&lt;p&gt;原料：鸡蛋、葱、洋葱、猪油&lt;/p&gt;&#xA;&lt;p&gt;做法：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;葱和洋葱切段备用。蛋打成蛋液，加盐备用。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;把葱白和洋葱下锅炒香，剩余葱段放入蛋液中拌匀，待锅内葱香味溢出，下鸡蛋液。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;鸡蛋液微微凝固时，立刻用筷子从四周向中间拨动，使蛋液凝固过程中均匀受热。注意拨动的节奏，不需要拨得太勤或者太缓。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;当鸡蛋熟了以后，应该还是一整块的，而且比较滑嫩。此时，把筷子插入鸡蛋块中，画圆圈将鸡蛋块打散。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;把打散的鸡蛋再翻炒几下，当鸡蛋表面微焦、香味溢出时即可出锅。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;注：如果油放得少，油温不宜太高，因为鸡蛋容易焦。如果油放得多，那么油温可以适当高一点，这样炒蛋会有油炸的效果，蛋的边边被油炸过后会卷起来，酥酥脆脆的很香。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/kitchen-egg.jpg&#34; alt=&#34;炒鸡蛋&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>生态系统建模</title>
      <link>https://luochang212.github.io/posts/nature_system/</link>
      <pubDate>Wed, 12 Jun 2019 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/nature_system/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;本文介绍如何用 Agent-based model 的方法，对一个包含狼、麋鹿、草三种生物的生态系统建模。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/nature-system&#34; target=&#34;_blank&#34;&gt;nature-system&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Agent指个体，Agent-base model即基于个体的模型。在Agent-based model中，虚拟实体(virtual entity)和现实个体一一对应。一般来说，虚拟实体的属性是对现实个体的抽象，虚拟实体的行为则是依照已经写好的规则迭代。这种建模方式往往涉及个体详细的行为模式，因此适合以研究个体行为规则为目的的建模。&lt;/p&gt;&#xA;&lt;p&gt;需要注意的是，利用Agent-based model方法建模，并不是变量越多越好，过多的变量会造成调试上的困难。选取的变量足够支撑起我们研究的问题就可以了。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; 除了Agent-base model之外，Equation-based model也是一种比较常见的建模方式。Agent-based model适合表达每个个体身上发生了什么，比如个体的速度、位置的变化等。Equation-based model则而更适合表达系统平均发生了什么，比如人口模型中人口数量变化就更适合用Equation-based model建模。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;h3 id=&#34;模型假设&#34;&gt;模型假设&lt;/h3&gt;&#xA;&lt;p&gt;（一）生物的属性&lt;/p&gt;&#xA;&lt;p&gt;模型内有三种生物：狼(wolf)、麋鹿(moose)、草(grass)。此外，狼还分为头狼和普通狼。下面这张表展示了头狼、普通狼、麋鹿的属性：&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;#&lt;/th&gt;&#xA;          &lt;th&gt;age&lt;/th&gt;&#xA;          &lt;th&gt;food&lt;/th&gt;&#xA;          &lt;th&gt;pos&lt;/th&gt;&#xA;          &lt;th&gt;speed&lt;/th&gt;&#xA;          &lt;th&gt;last_breed&lt;/th&gt;&#xA;          &lt;th&gt;population&lt;/th&gt;&#xA;          &lt;th&gt;packNo&lt;/th&gt;&#xA;          &lt;th&gt;range&lt;/th&gt;&#xA;          &lt;th&gt;eaten&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;头狼&lt;/td&gt;&#xA;          &lt;td&gt;√&lt;/td&gt;&#xA;          &lt;td&gt;√&lt;/td&gt;&#xA;          &lt;td&gt;√&lt;/td&gt;&#xA;          &lt;td&gt;√&lt;/td&gt;&#xA;          &lt;td&gt;√&lt;/td&gt;&#xA;          &lt;td&gt;√&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;√&lt;/td&gt;&#xA;          &lt;td&gt;√&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;普通狼&lt;/td&gt;&#xA;          &lt;td&gt;√&lt;/td&gt;&#xA;          &lt;td&gt;√&lt;/td&gt;&#xA;          &lt;td&gt;√&lt;/td&gt;&#xA;          &lt;td&gt;√&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;√&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;麋鹿&lt;/td&gt;&#xA;          &lt;td&gt;√&lt;/td&gt;&#xA;          &lt;td&gt;√&lt;/td&gt;&#xA;          &lt;td&gt;√&lt;/td&gt;&#xA;          &lt;td&gt;√&lt;/td&gt;&#xA;          &lt;td&gt;√&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;从上表可以看出，年龄、食物、位置、速度是头狼、普通狼和麋鹿的共有属性。last_breed指和上一次生育的时间间隔，在模型内用一次迭代表示一次时间间隔，因为迭代必须是整数，因此last_breed也是整型变量。头狼特有population属性，用来表示该头狼所在狼群中狼的数量；头狼特有range属性，表示该狼群活动的范围；头狼特有eaten属性，表示狼群在一次迭代中，全体成员吃到的麋鹿的总数。普通狼特有packNo属性，用来标记其所属狼群的头狼在列表中的索引号。普通狼没有last_breed属性，是因为其生育是以整个狼群为单位的。由于狼群是由头狼定义的，狼群相关的属性和行为也绑定在头狼身上，因此在代码实现上，狼群的生育是通过头狼实现的。&lt;/p&gt;&#xA;&lt;p&gt;草没有上述生物那么复杂的模型，本模型中的草均匀平铺在环境中，且不会生长，吃完就没了。因此麋鹿为了获取新的食物来源，需要经常迁徙。&lt;/p&gt;&#xA;&lt;p&gt;（二）生物的行为&lt;/p&gt;&#xA;&lt;p&gt;头狼、普通狼和麋鹿都具有四种行为：死亡、迁徙、生育、捕猎。这四种行为在不同的生物种类上有不同的定义。比如麋鹿的迁徙规则是等到自己的位置没草吃了，才开始迁徙。而头狼迁徙规则则比较复杂，头狼会根据狼群内的种群数量，判断狼群的散布范围，以及调整迁徙的积极性。&lt;/p&gt;&#xA;&lt;p&gt;1.死亡(die)&lt;/p&gt;&#xA;&lt;p&gt;狼有两种死法：饿死或老死。麋鹿则有三种死法：饿死、老死或者被吃。&lt;/p&gt;</description>
    </item>
    <item>
      <title>JavaScript 初探</title>
      <link>https://luochang212.github.io/posts/to_do_list/</link>
      <pubDate>Fri, 24 May 2019 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/to_do_list/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;初次学习JavaScript，用JS写了一个计划表生成工具。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;项目链接：&lt;a href=&#34;https://luochang212.github.io/gadget/to-do-list&#34;&gt;计划表生成工具&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;JavaScript是一个神奇的语言。它既不像Java原生地支持类和继承，也不如Python声明变量方便，更兼闹出&amp;quot;===&amp;ldquo;这样的麻烦。但我依旧深知它的强大，尤其是在可视化这一方面，在接触&lt;code&gt;qtwebengine&lt;/code&gt;的时候已经感受过一次了。目前，我学习JS的平台是&lt;a href=&#34;http://www.w3school.com.cn/&#34;&gt;W3Schools&lt;/a&gt; 和&lt;a href=&#34;https://www.liaoxuefeng.com/wiki/1022910821149312&#34;&gt;廖雪峰的网站&lt;/a&gt;。&lt;/p&gt;&#xA;&lt;p&gt;话说这是我自学JS以来写的第一个程序，求轻虐(￣▽￣)&lt;/p&gt;&#xA;&lt;h3 id=&#34;我的初衷&#34;&gt;我的初衷&lt;/h3&gt;&#xA;&lt;p&gt;我的初衷是制作一个&lt;strong&gt;习惯统计工具&lt;/strong&gt;，用来分析我在长期计划上的坚持能力。于是照例我对它做了一个需求分析。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;习惯统计工具的需求分析：&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;需要用户能够注册。即能够声明我是谁，并且把我和我的数据绑定。&lt;/li&gt;&#xA;&lt;li&gt;需要将数据存在文件里，而不是存在缓存文件里。&lt;/li&gt;&#xA;&lt;li&gt;需要按时间戳对生成的数据进行统计。&lt;/li&gt;&#xA;&lt;li&gt;需要对最终结果制作统计图表。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;通过分析，我发现静态网页很难实现第一第二步。能不能实现我不敢下定论，但肯定有技术难度。目前，我只有一个由GitHub page托管的静态网页，因此我选择退而求其次。先学习生成一个单一的表格，来记录当天计划的执行情况。我把这个工具叫做&lt;strong&gt;计划表生成工具&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;h3 id=&#34;需求分析&#34;&gt;需求分析&lt;/h3&gt;&#xA;&lt;p&gt;计划表生成工具好比是习惯统计工具的一个子系统。习惯统计工具面向的是连续多天，而计划表生成工具只面向单独一天。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;计划表生成工具的需求分析：&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;一个UI界面（前端）&lt;/li&gt;&#xA;&lt;li&gt;一个允许用户做输入、选择和修改操作的数据流（后端）&lt;/li&gt;&#xA;&lt;li&gt;一个最终显示的表格（前端）&lt;/li&gt;&#xA;&lt;li&gt;判断此工具是否easy to use，找到不好用的因素并改进 （测试）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;此时我们的big picture就已经明确。战略定了，下面来定战术。&lt;/p&gt;&#xA;&lt;h3 id=&#34;步骤分析&#34;&gt;步骤分析&lt;/h3&gt;&#xA;&lt;p&gt;&lt;strong&gt;（一）添加计划&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;对于前端UI，首先我们需要一个textarea，用来接收每项计划的内容。还需要一个按钮，点下这个按钮时，将文本框内的信息添加到计划列表。为了便于存储，我为计划(item)设计了一个类。&lt;/p&gt;&#xA;&lt;p&gt;这个类的声明如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#1f2328&#34;&gt;Items&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#1f2328&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;　　　　    &lt;span style=&#34;color:#1f2328&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;　　　　    &lt;span style=&#34;color:#1f2328&#34;&gt;isCheck&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;false&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           &lt;span style=&#34;color:#1f2328&#34;&gt;isDelete&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;false&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#1f2328&#34;&gt;};&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;可以看出这个类有三个值。它们分别表示该对象的名称，是否完成，以及是否删除。每次添加计划，用以下代码实例化这个类(items)，生成一个对象(item)：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#1f2328&#34;&gt;item&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#6639ba&#34;&gt;Object&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;create&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;Items&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;（二）生成表格&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;这一步要把复选框(checkbox)和按钮(button)都和每一行的计划绑定。那么如何绑定呢？&lt;/p&gt;&#xA;&lt;p&gt;要知道，用for loop遍历subArray的过程，就是生成表格内容的过程。所以，checkbox和button也都是在这次遍历中生成的。那么，我们就可以在它们的生成过程中，创建它们的id，并把id和计划对应起来。&lt;/p&gt;&#xA;&lt;p&gt;具体到代码中，我用了&lt;code&gt;i.toString(10)&lt;/code&gt;将循环数转成string类型，然后加到id上。于是，第一项计划对应的checkbox的id就是&amp;quot;cb0&amp;rdquo;, 对应的button的id就是&amp;quot;btn0&amp;quot;, 以此类推。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color:#1f2328&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#1f2328&#34;&gt;subArray&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color:#1f2328&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;++&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#1f2328&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#cf222e&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#1f2328&#34;&gt;index&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#1f2328&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#1f2328&#34;&gt;body&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;&amp;lt;tr&amp;gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#1f2328&#34;&gt;body&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;&amp;lt;td&amp;gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#1f2328&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;toString&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;10&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;&amp;lt;/td&amp;gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#1f2328&#34;&gt;body&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;&amp;lt;td&amp;gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;&amp;lt;input type=&amp;#34;checkbox&amp;#34; id=\&amp;#34;cb&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#1f2328&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;toString&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;10&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;\&amp;#34; onclick=&amp;#34;isChecked(this);&amp;#34;&amp;gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;&amp;lt;/td&amp;gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#1f2328&#34;&gt;body&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;&amp;lt;td&amp;gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;&amp;lt;input type=&amp;#34;button&amp;#34; id=\&amp;#34;btn&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#1f2328&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;toString&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;10&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;\&amp;#34; onclick=&amp;#34;isDeleted(this);&amp;#34;&amp;gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;&amp;lt;/td&amp;gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#1f2328&#34;&gt;body&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;&amp;lt;/tr&amp;gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后在勾选复选框或者删除的时候，只需要把前面的&amp;quot;cb&amp;quot;和&amp;quot;btn&amp;quot;去掉，剩下的数字&lt;code&gt;i&lt;/code&gt;带入&lt;code&gt;subArray()&lt;/code&gt;，得到的&lt;code&gt;subArray(i)&lt;/code&gt;就表示着该checkbox或者button对应的计划。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;（三）下载表格&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;这一步在我编程之前，还不知道用什么方法实现。最后被我查到了一段代码，它能在静态网页下生成文件并提供下载。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#cf222e&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#1f2328&#34;&gt;download&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;filename&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#1f2328&#34;&gt;text&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#1f2328&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#cf222e&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#1f2328&#34;&gt;element&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#6639ba&#34;&gt;document&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;createElement&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#1f2328&#34;&gt;element&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;setAttribute&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;href&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;data:text/plain;charset=utf-8,&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#6639ba&#34;&gt;encodeURIComponent&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;text&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;));&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#1f2328&#34;&gt;element&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;setAttribute&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;download&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#1f2328&#34;&gt;filename&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#1f2328&#34;&gt;element&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;style&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;display&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;none&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6639ba&#34;&gt;document&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;body&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;appendChild&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;element&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#1f2328&#34;&gt;element&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;click&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6639ba&#34;&gt;document&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;body&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;removeChild&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;element&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#1f2328&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;技术总结&#34;&gt;技术总结&lt;/h3&gt;&#xA;&lt;p&gt;总体来说，这三步都不困难。我花了大约8小时写这个project，其实还是吃亏在初学。前期两小时左右，在画图、规划、分析、简化功能&amp;hellip;&amp;hellip;直到把野心降低到我能完成的程度。接着连续编了四小时的程序，整个项目就从无到有做出来了。然后又花了一些时间修改CSS，美化页面。第二天上午又花了近两小时，把&lt;code&gt;Enter&lt;/code&gt;键变成“添加计划”的快捷键，并用&lt;code&gt;Shift + Enter&lt;/code&gt;替代原本&lt;code&gt;Enter&lt;/code&gt;键的功能。这是easy to use上的改进。&lt;/p&gt;</description>
    </item>
    <item>
      <title>PyQt5 侧边栏布局</title>
      <link>https://luochang212.github.io/posts/pyqt5_layout_sidebar/</link>
      <pubDate>Fri, 10 May 2019 21:43:09 +0100</pubDate>
      <guid>https://luochang212.github.io/posts/pyqt5_layout_sidebar/</guid>
      <description>&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/pyqt5-demo&#34; target=&#34;_blank&#34;&gt;pyqt5-demo&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;主流软件如网易云音乐、腾讯电脑管家，都有侧边栏。侧边栏能有效扩展应用空间，使软件功能的层次更加分明。&lt;/p&gt;&#xA;&lt;p&gt;但PyQt5并没有一个专门的方法实现侧边栏。要实现侧边栏，主要有两种技术路线。一是从标签部件(QTabWidget)改造而来，二是用网格布局(QGridLayout)画出来。本文采用第一种技术路线，制作一个简单的侧边栏应用。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; 两种技术路线制作的侧边栏有细微的差别。如果采用第二种技术路线(QGridLayout)，侧边栏和内容页之间没有明显的分界。所以需要额外地在侧边栏和内容页之间加一条线，来突出两者属于不同的组件。而第一种技术路线(QTabWidget)不需要，创建的侧边栏和内容页之间的区别明显。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;下图是一个用第二种技术路线(QGridLayout)制作的应用，可以看到侧边栏和内容页中间画了一条线，以突出两个组件的分界。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/QGridLayout.png&#34; alt=&#34;QGridLayout&#34;&gt;&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;h3 id=&#34;步骤分析&#34;&gt;步骤分析&lt;/h3&gt;&#xA;&lt;p&gt;在开始写代码之前，我们先分析一下制作侧边栏需要几个步骤。&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;添加部件&lt;/li&gt;&#xA;&lt;li&gt;为部件设置布局&lt;/li&gt;&#xA;&lt;li&gt;将标签部件改造成侧边栏的内容页&lt;/li&gt;&#xA;&lt;li&gt;为侧边栏按钮编写函数，实现内容页之间的跳转&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;添加部件并设置布局&#34;&gt;添加部件并设置布局&lt;/h3&gt;&#xA;&lt;p&gt;此段不详述。关于部件和布局的基础知识，在上一篇中有介绍，详见&lt;a href=&#34;https://www.luochang.ink/posts/pyqt5_layout/&#34;&gt;PyQt5 布局浅析&lt;/a&gt;。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;下面这段代码添加了部件且设置了布局。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#24292e&#34;&gt;PyQt5.QtWidgets&lt;/span&gt; &lt;span style=&#34;color:#cf222e&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;*&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#24292e&#34;&gt;sys&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#1f2328&#34;&gt;Window&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;QMainWindow&lt;span style=&#34;color:#1f2328&#34;&gt;):&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#cf222e&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#6639ba&#34;&gt;__init__&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;):&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6639ba&#34;&gt;super&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;()&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#6639ba&#34;&gt;__init__&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#57606a&#34;&gt;# set the title of main window&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;setWindowTitle&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;Sidebar layout - www.luochang.ink&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#57606a&#34;&gt;# set the size of window&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;width &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;800&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;height &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#6639ba&#34;&gt;int&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;0.618&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;width&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;resize&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;width&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;height&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#57606a&#34;&gt;# add all widgets&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;btn_1 &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; QPushButton&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;1&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;btn_2 &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; QPushButton&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;2&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;btn_3 &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; QPushButton&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;3&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;btn_4 &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; QPushButton&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;4&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;initUI&lt;span style=&#34;color:#1f2328&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#cf222e&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#6639ba&#34;&gt;initUI&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;):&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        left_layout &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; QVBoxLayout&lt;span style=&#34;color:#1f2328&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        left_layout&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;addWidget&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;btn_1&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        left_layout&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;addWidget&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;btn_2&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        left_layout&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;addWidget&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;btn_3&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        left_layout&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;addWidget&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;btn_4&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        left_layout&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;addStretch&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;5&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        left_layout&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;setSpacing&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;20&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        left_widget &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; QWidget&lt;span style=&#34;color:#1f2328&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        left_widget&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;setLayout&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;left_layout&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;right_widget &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; QTabWidget&lt;span style=&#34;color:#1f2328&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;right_widget&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;tabBar&lt;span style=&#34;color:#1f2328&#34;&gt;()&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;setObjectName&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;mainTab&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        main_layout &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; QHBoxLayout&lt;span style=&#34;color:#1f2328&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        main_layout&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;addWidget&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;left_widget&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        main_layout&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;addWidget&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;right_widget&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        main_layout&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;setStretch&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;40&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        main_layout&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;setStretch&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;200&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        main_widget &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; QWidget&lt;span style=&#34;color:#1f2328&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        main_widget&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;setLayout&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;main_layout&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;setCentralWidget&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;main_widget&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;__name__&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    app &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; QApplication&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;sys&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;argv&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ex &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; Window&lt;span style=&#34;color:#1f2328&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ex&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;show&lt;span style=&#34;color:#1f2328&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    sys&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;exit&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;app&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;exec_&lt;span style=&#34;color:#1f2328&#34;&gt;())&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/sidebar_basic.JPG&#34; alt=&#34;sidebar_basic&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>PyQt5 布局浅析</title>
      <link>https://luochang212.github.io/posts/pyqt5_layout/</link>
      <pubDate>Fri, 03 May 2019 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/pyqt5_layout/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;PyQt5是Python环境下用来开发UI界面的一个包。它容易上手，对初学者友好，并且拥有丰富的函数库，可以实现大部分桌面应用的开发需求，且支持QSS语言，能够对界面风格做个性化调整。总体来说，PyQt5是一款开发效率极高的UI框架。这篇文章从零开始，教你搭建一个属于自己的桌面应用。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/pyqt5-demo&#34; target=&#34;_blank&#34;&gt;pyqt5-demo&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;创建第一个窗口&#34;&gt;创建第一个窗口&lt;/h3&gt;&#xA;&lt;p&gt;一般来说，桌面应用都以窗口(window)形式呈现。因此，要搭建桌面应用，首先要创建窗口。&lt;/p&gt;&#xA;&lt;p&gt;下面这段代码创建了一个空的窗口。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#24292e&#34;&gt;PyQt5.QtWidgets&lt;/span&gt; &lt;span style=&#34;color:#cf222e&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;*&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#24292e&#34;&gt;sys&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#1f2328&#34;&gt;Window&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;QMainWindow&lt;span style=&#34;color:#1f2328&#34;&gt;):&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#cf222e&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#6639ba&#34;&gt;__init__&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;):&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6639ba&#34;&gt;super&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;()&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#6639ba&#34;&gt;__init__&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#57606a&#34;&gt;# set the title of main window&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;setWindowTitle&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;My first window - www.luochang.ink&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#57606a&#34;&gt;# set the size of window&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;Width &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;500&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;height &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#6639ba&#34;&gt;int&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;0.618&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;Width&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;resize&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;Width&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;height&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;__name__&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    app &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; QApplication&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;sys&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;argv&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ex &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; Window&lt;span style=&#34;color:#1f2328&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ex&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;show&lt;span style=&#34;color:#1f2328&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    sys&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;exit&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;app&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;exec_&lt;span style=&#34;color:#1f2328&#34;&gt;())&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/blankWindow.png&#34; alt=&#34;blank window&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;这段代码仅仅设置了窗口的标题和大小。下一步，我们要往这个空的窗口里添加部件(widget). 为了规范性，我们在Window类里新建一个函数initUI, 然后在initUI里为窗口添加部件。&lt;/p&gt;&#xA;&lt;h3 id=&#34;为窗口添加部件&#34;&gt;为窗口添加部件&lt;/h3&gt;&#xA;&lt;p&gt;下面这段代码为窗口添加了一个按钮部件(QPushButton).&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#24292e&#34;&gt;PyQt5.QtWidgets&lt;/span&gt; &lt;span style=&#34;color:#cf222e&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;*&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#24292e&#34;&gt;sys&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#1f2328&#34;&gt;Window&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;QMainWindow&lt;span style=&#34;color:#1f2328&#34;&gt;):&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#cf222e&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#6639ba&#34;&gt;__init__&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;):&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6639ba&#34;&gt;super&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;()&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#6639ba&#34;&gt;__init__&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#57606a&#34;&gt;# set the title of main window&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;setWindowTitle&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;My first window - www.luochang.ink&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#57606a&#34;&gt;# set the size of window&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;Width &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;500&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;height &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#6639ba&#34;&gt;int&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;0.618&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;Width&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;resize&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;Width&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;height&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;initUI&lt;span style=&#34;color:#1f2328&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#cf222e&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#6639ba&#34;&gt;initUI&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;):&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#57606a&#34;&gt;# create a new button&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;btn &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; QPushButton&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;first Button&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;btn&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;resize&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;300&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;90&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;__name__&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    app &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; QApplication&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;sys&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;argv&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ex &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; Window&lt;span style=&#34;color:#1f2328&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ex&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;show&lt;span style=&#34;color:#1f2328&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    sys&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;exit&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;app&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;exec_&lt;span style=&#34;color:#1f2328&#34;&gt;())&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/firstWidget.png&#34; alt=&#34;first widget&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>微博数据可视化</title>
      <link>https://luochang212.github.io/posts/my_weibo/</link>
      <pubDate>Sat, 20 Apr 2019 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/my_weibo/</guid>
      <description>&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/weibo-analysis&#34; target=&#34;_blank&#34;&gt;weibo-analysis&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;这次的数据用的是本科期间就已经爬好，但因为当时没有足够的处理技巧，这些数据在硬盘里一丢就是两年。如今，本Python初丁趁着还有机会摸鱼，赶紧把数据翻出来，让它们发光发热。&lt;/p&gt;&#xA;&lt;h3 id=&#34;文本获取&#34;&gt;文本获取&lt;/h3&gt;&#xA;&lt;p&gt;因为新浪微博的严防死打，现如今微博的数据越来越不好爬。GitHub上的微博爬虫生存周期通常都很短，使爬取数据的成本大大增加。这里我用的是微博@失眠狸 同学的方法，用鼠标精灵写了个插件，控制快捷键和页面拖动，把内容从浏览器上粘贴到sublime里。&lt;/p&gt;&#xA;&lt;h3 id=&#34;生成csv文件&#34;&gt;生成csv文件&lt;/h3&gt;&#xA;&lt;p&gt;有了原始数据，接下来我们要把数据归一化，做成方便处理的数据。一个常用的方法就是将数据整理成csv文件。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Step 1.&lt;/strong&gt; 分析需要保存的字段以及数据的维度，从而设计出数据的存储结构。根据原数据，我划分了五个字段: id, date, time, device, content, 它们分别记录一条微博的文件位置、发布日期、发布时间、发送设备和文本内容。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Step 2.&lt;/strong&gt; 分割raw data. 先用split函数进行粗略分割，再用find函数精确分割。接着将分割好的内容提取到各字段，并依次存入csv。&lt;/p&gt;&#xA;&lt;p&gt;经过上述两步，数据的整理工作就做完啦。&lt;/p&gt;&#xA;&lt;h3 id=&#34;可视化微博数据&#34;&gt;可视化微博数据&lt;/h3&gt;&#xA;&lt;p&gt;有了csv文件，做数据可视化是分分钟的事。此时我把工作平台从&lt;code&gt;PyCharm&lt;/code&gt;搬到了&lt;code&gt;Jupyter Notebook&lt;/code&gt;。这是因为&lt;code&gt;Jupyter Notebook&lt;/code&gt;可以制作的各式各样的可视化图表和窗口小工具(widget), 比&lt;code&gt;PyCharm&lt;/code&gt;更适合数据处理。至于工具包，这里我选的是pandas和seaborn.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;首先是需求分析，我的目标如下:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;绘制日期分布热力图，观察今年使用微博频率的趋势&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;绘制设备使用直方图，看看平时最常用什么平台发博&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;绘制时间分布直方图，观察一天之中各时段的发博频率&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;使用窗口滑块小部件，拖动查看各个时间段都发了什么内容&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;这里不描述具体过程，详见&lt;a href=&#34;https://github.com/luochang212/weibo-analysis&#34; target=&#34;_blank&#34;&gt;GitHub Repository&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;分析结果如下:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/heat_map.png&#34; alt=&#34;Heat map&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;热力图总体来说颜色逐年加深，说明我正在逐渐成为一个微博控。而且注意到往年年初我是不怎么玩微博的，但随着年纪渐长，1-3月份我玩微博的频率越来越高，这意味着过年可能越来越无聊，没有年味，从而加长了我混迹微博的时间。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/device_distribution.png&#34; alt=&#34;Device distribution&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;是你吗？华为的舔狗~&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/time_distribution.png&#34; alt=&#34;Sending time distribution&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;晚上2点不睡的坏小孩，早上10点起的偷懒者。（此处是一个卑微的笑容）&lt;/p&gt;&#xA;&lt;h3 id=&#34;附录部分代码&#34;&gt;附录：部分代码&lt;/h3&gt;&#xA;&lt;p&gt;&lt;strong&gt;下面这段代码分割了文本。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#cf222e&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#6639ba&#34;&gt;classification&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; txt_array&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; file_index&lt;span style=&#34;color:#1f2328&#34;&gt;):&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6639ba&#34;&gt;id&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; np&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;array&lt;span style=&#34;color:#1f2328&#34;&gt;([])&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        date &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; np&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;array&lt;span style=&#34;color:#1f2328&#34;&gt;([])&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        time &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; np&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;array&lt;span style=&#34;color:#1f2328&#34;&gt;([])&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        device &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; np&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;array&lt;span style=&#34;color:#1f2328&#34;&gt;([])&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        content &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; np&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;array&lt;span style=&#34;color:#1f2328&#34;&gt;([])&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        count &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#cf222e&#34;&gt;for&lt;/span&gt; ite &lt;span style=&#34;color:#0550ae&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#6639ba&#34;&gt;range&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; np&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;size&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;txt_array&lt;span style=&#34;color:#1f2328&#34;&gt;),&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;):&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#cf222e&#34;&gt;if&lt;/span&gt; txt_array&lt;span style=&#34;color:#1f2328&#34;&gt;[&lt;/span&gt;ite&lt;span style=&#34;color:#1f2328&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;find&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;YOUR_NAME&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                cur_sentence &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; txt_array&lt;span style=&#34;color:#1f2328&#34;&gt;[&lt;/span&gt;ite&lt;span style=&#34;color:#1f2328&#34;&gt;][&lt;/span&gt;txt_array&lt;span style=&#34;color:#1f2328&#34;&gt;[&lt;/span&gt;ite&lt;span style=&#34;color:#1f2328&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;rfind&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;YOUR_NAME&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#6639ba&#34;&gt;len&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;YOUR_NAME&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;:&lt;/span&gt;txt_array&lt;span style=&#34;color:#1f2328&#34;&gt;[&lt;/span&gt;ite&lt;span style=&#34;color:#1f2328&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;find&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;\u200b&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                count &lt;span style=&#34;color:#0550ae&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#6639ba&#34;&gt;id&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; np&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;append&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#6639ba&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#6639ba&#34;&gt;str&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;file_index&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;.&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#6639ba&#34;&gt;str&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;count&lt;span style=&#34;color:#1f2328&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                device &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; np&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;append&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;device&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; cur_sentence&lt;span style=&#34;color:#1f2328&#34;&gt;[&lt;/span&gt;cur_sentence&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;find&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;come from&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;10&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;:]&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;split&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)[&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;])&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                content &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; np&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;append&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;content&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#6639ba&#34;&gt;str&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;cur_sentence&lt;span style=&#34;color:#1f2328&#34;&gt;[&lt;/span&gt;cur_sentence&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;find&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;:]))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#cf222e&#34;&gt;if&lt;/span&gt; cur_sentence &lt;span style=&#34;color:#0550ae&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    start &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; cur_sentence&lt;span style=&#34;color:#1f2328&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;11&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;rfind&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    end &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; cur_sentence&lt;span style=&#34;color:#1f2328&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;16&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;rfind&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;:&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    date &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; np&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;append&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;date&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; cur_sentence&lt;span style=&#34;color:#1f2328&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;:&lt;/span&gt;start&lt;span style=&#34;color:#0550ae&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;])&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    time &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; np&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;append&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;time&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; cur_sentence&lt;span style=&#34;color:#1f2328&#34;&gt;[&lt;/span&gt;end&lt;span style=&#34;color:#0550ae&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;:&lt;/span&gt;end&lt;span style=&#34;color:#0550ae&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;])&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#cf222e&#34;&gt;else&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    date &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; np&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;append&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;date&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    time &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; np&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;append&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;time&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        flag &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#cf222e&#34;&gt;if&lt;/span&gt; count &lt;span style=&#34;color:#0550ae&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#6639ba&#34;&gt;len&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;time&lt;span style=&#34;color:#1f2328&#34;&gt;):&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6639ba&#34;&gt;print&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;Error: time and sentence do not have same size in file &lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;format&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#6639ba&#34;&gt;str&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;file_index&lt;span style=&#34;color:#1f2328&#34;&gt;)))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            flag &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#cf222e&#34;&gt;if&lt;/span&gt; count &lt;span style=&#34;color:#0550ae&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#6639ba&#34;&gt;len&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;device&lt;span style=&#34;color:#1f2328&#34;&gt;):&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6639ba&#34;&gt;print&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;Error: device and sentence do not have same size in file &lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;format&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#6639ba&#34;&gt;str&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;file_index&lt;span style=&#34;color:#1f2328&#34;&gt;)))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            flag &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#cf222e&#34;&gt;if&lt;/span&gt; count &lt;span style=&#34;color:#0550ae&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#6639ba&#34;&gt;len&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;content&lt;span style=&#34;color:#1f2328&#34;&gt;):&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6639ba&#34;&gt;print&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;Error: content and sentence do not have same size in file &lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;format&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#6639ba&#34;&gt;str&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;file_index&lt;span style=&#34;color:#1f2328&#34;&gt;)))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            flag &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#cf222e&#34;&gt;if&lt;/span&gt; flag &lt;span style=&#34;color:#0550ae&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6639ba&#34;&gt;id&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; np&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;array&lt;span style=&#34;color:#1f2328&#34;&gt;([])&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            date &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; np&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;array&lt;span style=&#34;color:#1f2328&#34;&gt;([])&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            time &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; np&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;array&lt;span style=&#34;color:#1f2328&#34;&gt;([])&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            device &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; np&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;array&lt;span style=&#34;color:#1f2328&#34;&gt;([])&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            content &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; np&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;array&lt;span style=&#34;color:#1f2328&#34;&gt;([])&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#cf222e&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6639ba&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; date&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; time&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; device&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; content&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;下面这段代码绘制了热力图。&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>【项目】TSP旅行路线规划</title>
      <link>https://luochang212.github.io/posts/tsp_route/</link>
      <pubDate>Wed, 10 Apr 2019 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/tsp_route/</guid>
      <description>&lt;!--原题：用Jupyter notebook规划旅行路线--&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/tsp-route&#34; target=&#34;_blank&#34;&gt;tsp-route&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;对于在欧洲的小伙伴们，复活节假在这一周就正式开始啦。大家都是怎么计划旅行的呢？&lt;/p&gt;&#xA;&lt;p&gt;我的习惯是在出发前最后一晚，花上半小时，搜索目的地景点 (Point of interest, POI), 然后在Google Maps上为它们点上小星星，以免和它们擦肩而过。我的地图经过一番操作，就成了下面这副模样。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/bristol.png&#34; alt=&#34;攒满了小星星&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;此时此刻，望着这些密集的星星，我不禁自问：如何才能走最少的路，遍历所有景点呢?&lt;/p&gt;&#xA;&lt;p&gt;搜索了谷歌和百度，都没找到我要路径规划功能。最接近需求的是谷歌地图的&amp;quot;Add destination&amp;quot;功能。然而这个功能只是依次连接你点选的地点。并不能由一组地点，确定连接它们的一条全局最短路径。&lt;/p&gt;&#xA;&lt;p&gt;没有现成应用怎么办，我打算自己动手写一个。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;下图是Google Add destination功能。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/googlemap.JPG&#34; alt=&#34;Add destination 功能&#34;&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;适用模型tsp-模型&#34;&gt;适用模型：TSP 模型&lt;/h3&gt;&#xA;&lt;p&gt;用一句话概括需求就是：我们需要一条从某地方出发，遍历所有地点，最终回到起点的最短路径。&lt;/p&gt;&#xA;&lt;p&gt;这个需求其实就是运筹学的一个经典问题，旅行商问题(TSP)。旅行商问题的确切描述是这样的：一个商人在各个城市之间旅行，要求遍历所有城市并返回到出发点，要如何规划路线，才能使总路径最短。（打开&lt;a href=&#34;https://zh.wikipedia.org/wiki/%E6%97%85%E8%A1%8C%E6%8E%A8%E9%94%80%E5%91%98%E9%97%AE%E9%A2%98&#34; target=&#34;_blank&#34;&gt;维基百科&lt;/a&gt;了解更多)&lt;/p&gt;&#xA;&lt;h3 id=&#34;解决思路&#34;&gt;解决思路&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;用googlemaps包获取纬度和经度信息&lt;/li&gt;&#xA;&lt;li&gt;用OR-Tools包求解TSP问题&lt;/li&gt;&#xA;&lt;li&gt;最后用gmaps可视化结果&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;在敲代码的过程中，最难的地方莫过于看文档查API, 搞清楚输入输出和调用结构。不过敲完这一顿之后我还是不禁感慨，Google 太为开发者着想了。一旦学会调用API，实现一个简单应用的代码量还是很小的 orz&lt;/p&gt;&#xA;&lt;h3 id=&#34;食用指南&#34;&gt;食用指南&lt;/h3&gt;&#xA;&lt;p&gt;项目地址 &amp;ndash;&amp;gt; &lt;a href=&#34;https://github.com/luochang212/tsp-route&#34; target=&#34;_blank&#34;&gt;传送门&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;在运行代码之前，你需要以下配置：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;一个Jupyter Notebook. &lt;!--推荐安装Anaconda3，Anaconda3自带Jupyter Notebook和全套Python依赖.--&gt;&lt;/li&gt;&#xA;&lt;li&gt;你需要安装这些包：googleplaces, googlemaps, gmaps, ortools.&lt;/li&gt;&#xA;&lt;li&gt;你需要一个Google Maps API key, &lt;a href=&#34;https://developers.google.com/maps/documentation/distance-matrix/start#get-a-key&#34; target=&#34;_blank&#34;&gt;从这里获取API&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;完成配置等于成功的一半。在Jupyter notebook打开&lt;code&gt;TSPSolver.ipynb&lt;/code&gt;，将第二个代码块的所有变量，改成自己的，比如自己的目的地自己的区域和自己的API密码……最后从头到尾运行所有代码块，你就可以得到自己的定制路线辣~&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/my_route.JPG&#34; alt=&#34;my route&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;配置代码如下。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#57606a&#34;&gt;# input the places of interest (POI)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;places &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;YHA London Central Hostel&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;Coca-Cola London Eye&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;St. Paul&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;\&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;s Cathedral&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;Leadenhall Market&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;The National Gallery&amp;#39;&lt;/span&gt; \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;Big Ben&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;Buckingham Palace&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;Waterloo Station&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#57606a&#34;&gt;# the region&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Location&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;London&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#57606a&#34;&gt;# choose a mode&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Mode &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;walking&amp;#34;&lt;/span&gt;  &lt;span style=&#34;color:#57606a&#34;&gt;# &amp;#34;driving&amp;#34;, &amp;#34;walking&amp;#34;, &amp;#34;bicycling&amp;#34;, &amp;#34;transit&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#57606a&#34;&gt;# get Google API key from following website: &lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#57606a&#34;&gt;# https://developers.google.com/maps/documentation/distance-matrix/start#get-a-key&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;password &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;YOUR_GOOGLE_API_KEY_HERE&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;&#xA;&lt;center&gt; 欢迎Star, Pull, Pr.&lt;/center&gt;</description>
    </item>
    <item>
      <title>Python 解置换群问题</title>
      <link>https://luochang212.github.io/posts/python_math_problem/</link>
      <pubDate>Sat, 16 Mar 2019 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/python_math_problem/</guid>
      <description>&lt;p&gt;室友问我一个问题，把我难住了。&lt;/p&gt;&#xA;&lt;p&gt;想不出解法，遂写了个程序暴力求解。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;**题目：**A permutation is applied to the string SUPERBGOLDHAT. The same permutation is applied to the output from this operation. The second output is OGTHLEPDSUARB. What was the first output? (Note: as an example, the permutation(1 3 4) applied to WOLF gives FOWL. Write your answer in capital letters inside quotation marks, e.g. &amp;ldquo;BEARDPLUGHOST&amp;rdquo;.)&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;把它译成中文就是：已知将某个置换作用于字符串SUPERBGOLDHAT两次，生成字符串OGTHLEPDSUARB. 求该置换作用于字符串SUPERBGOLDHAT一次时，生成的结果。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; 作用两次的意思就是，当一个置换规则作用于字符串一次时，会生成一个新字符串。将这个规则作用在这个新字符串上，又会生成一个字符串，这个字符串就是两次作用的结果。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;h3 id=&#34;近世代数基础&#34;&gt;近世代数基础&lt;/h3&gt;&#xA;&lt;p&gt;如果你不知道什么是置换的话，可以看一下本节。学过近世代数的同学请自觉跳过这部分ꉂ(ˊᗜˋ*)&lt;/p&gt;&#xA;&lt;p&gt;我们给定一个序列$a ={1, 2, 3, 4, 5, 6} $ 。然后给定一个作用于该序列的置换：&lt;/p&gt;</description>
    </item>
    <item>
      <title>厨房笔记（一）：牛刀小试</title>
      <link>https://luochang212.github.io/posts/kitchen_time_1/</link>
      <pubDate>Mon, 06 Aug 2018 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/kitchen_time_1/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;刚到英国那会儿，做饭的兴致很高。每天都跟过家家似的，买菜，钻研菜谱，然后做饭，在厨房里待上四五个小时也不觉得累。大概这就是“人生若只如初见”吧。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;br&gt;&#xA;&lt;!--原文首发于我的豆瓣--&gt;&#xA;&lt;h3 id=&#34;拌牛肉&#34;&gt;拌牛肉&lt;/h3&gt;&#xA;&lt;!--2017-08-05 21:26:06--&gt;&#xA;&lt;p&gt;原料：牛肉3两，猪油，葱，酱油，地瓜粉1匙半，盐&lt;/p&gt;&#xA;&lt;p&gt;做法：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;牛肉顺纹路切成宽约一寸的肉条，肉条逆纹路切片，装碗，用自来水清洗，沥干，加入一匙猪油和适量的盐与酱油，用手抓揉片刻后，加入一匙半的地瓜粉，继续抓握揉捏约3分钟即可，葱切好备用；&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;五匙猪油下锅，至微热，放入适量葱头和小半葱段，煎至略有香味溢出，起锅备用；&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;水烧沸，调至小火，牛肉下锅，先不要搅动，待地瓜粉固结后，可用筷子将牛肉摊开，当水再次沸腾时，用漏勺将肉舀出，趁热放入煎好的猪油中搅拌，菜即成。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/kitchen-beef.jpg&#34; alt=&#34;拌牛肉配面吃&#34;&gt;&lt;/p&gt;&#xA;&lt;br&gt;&#xA;&lt;h3 id=&#34;亲子丼&#34;&gt;亲子丼&lt;/h3&gt;&#xA;&lt;!--2018-08-07 15:40:25--&gt;&#xA;&lt;p&gt;原料：米饭，鸡肉，洋葱，鸡蛋，酱油，盐，糖，料酒&lt;/p&gt;&#xA;&lt;p&gt;做法：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;米饭下锅煮，可弃之不顾。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;鸡肉切小块，放酱油、盐、料酒腌一下；洋葱切短条；鸡蛋稍稍打散。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;鸡肉下锅煎至出油，起锅。此时锅不必洗，放半碗水，加酱油、少量料酒和糖。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;待水烧开，放入鸡肉和洋葱。盖锅盖将鸡肉焖熟，然后倒入一半蛋液，盖锅盖小火焖3分钟。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;起锅盖，倒入剩下一半蛋液。菜即成。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/kitchen-chicken-egg.jpg&#34; alt=&#34;亲子丼&#34;&gt;&lt;/p&gt;&#xA;&lt;br&gt;&#xA;&lt;h3 id=&#34;红烧肉&#34;&gt;红烧肉&lt;/h3&gt;&#xA;&lt;!--2018-08-07 16:13:03--&gt;&#xA;&lt;p&gt;原料：五花肉，葱，姜，蒜，大料，老抽，生抽，糖，油&lt;/p&gt;&#xA;&lt;p&gt;做法：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;五花肉切块，葱切段，蒜切末，姜切条。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;倒油，加葱头、姜条、蒜末、大料，小火熬油。油熬出香味后，放五花肉翻炒，闻香即可起锅。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;另起一锅油，倒六七小勺糖，中火将糖煮化。倒入五花肉，翻炒片刻后，加少量水、老抽、生抽。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;时不时搅拌，尝肉汁甜度，不够可加糖。待锅内汤汁收浓稠，起锅享用。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/kitchen-pork-stewed-in-soy-sauce.jpg&#34; alt=&#34;红烧肉&#34;&gt;&lt;/p&gt;&#xA;&lt;br&gt;&#xA;&lt;h3 id=&#34;牛肉丸意大利面&#34;&gt;牛肉丸意大利面&lt;/h3&gt;&#xA;&lt;!--2018-08-07 16:25:29--&gt;&#xA;&lt;p&gt;原料：意面、牛肉丸、葱、蒜、番茄、番茄酱&lt;/p&gt;&#xA;&lt;p&gt;做法：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;烧一壶开水，倒入电饭锅，加两勺盐，放入螺旋意大利面。面煮不烂，可以弃之不顾。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;切葱头，剁蒜泥，番茄切小块备用。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;烧一锅油，放入丸子，翻面煎至定型。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;起锅后油不倒，加入蒜泥葱头炒香。番茄块倒入锅中炒软，然后加大量番茄酱，继续翻炒，以防番茄酱烧焦。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;捞面放入锅中和酱汁搅和搅和，放入丸子，起锅开吃。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/kitchen-beef-ball.jpg&#34; alt=&#34;牛肉丸意大利面&#34;&gt;&lt;/p&gt;&#xA;&lt;br&gt;&#xA;&lt;h3 id=&#34;葱油鸡&#34;&gt;葱油鸡&lt;/h3&gt;&#xA;&lt;!--2018-08-07 16:29:43--&gt;&#xA;&lt;p&gt;原料：大鸡腿、葱、姜、蒜、料酒&lt;/p&gt;&#xA;&lt;p&gt;做法：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;鸡肉处理干净后，用盐给它来个大宝剑。盘中先放葱结、姜片、鸡肉，次淋白葡萄酒。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;鸡肉盛于盘内，冷水入锅，小火蒸20分钟。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;此时切葱末、蒜泥、姜泥备用。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;起油锅，小火炸葱头，出香味后放入葱末、蒜泥、姜泥，煸炒出香味。待肉出锅后，可拿干净的刀切片，再浇葱油。亦可不切，大口嚼之可也。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;br&gt;&#xA;&lt;h3 id=&#34;芋头的鸡丝凉面&#34;&gt;芋头的鸡丝凉面！&lt;/h3&gt;&#xA;&lt;!--2018-08-07 17:31:52--&gt;&#xA;&lt;p&gt;原教程链接：https://www.bilibili.com/video/av28407533&lt;/p&gt;&#xA;&lt;p&gt;原料：鸡胸肉、黄瓜、意大利面、花生酱、松子、生抽、醋、料酒、辣椒、蒜头、橄榄油&lt;/p&gt;&#xA;&lt;p&gt;做法：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;电饭锅加水放面，加盐巴煮。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;鸡胸肉处理干净，将肉肉锤松。开水放肉，加八角、葱段、姜片、料酒。再次煮沸后关火，焖十分钟。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;意面起锅，放凉水里泡一哈，滤出面条，加橄榄油拌一拌，放在一边就好啦！&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;黄瓜去皮切条，葱切成细细的小圈，菜码就做好啦！&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;花生酱加两份生抽一份醋，调成酸奶一样的质感，凉面汁就做好啦！&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;蒜切末，松子装进保鲜袋用书脊砸碎。碗内放辣椒、松子碎末、蒜末。烧一锅油，倒入碗中搅合搅合，油泼辣子（伪）就做好啦！&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;拿个盘中，放面，放菜码，放葱花，放凉面汁，放油泼辣子。鸡丝凉面就做好啦~&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;注：根据个人口味适当调整了生抽和醋的比例，凉面汁的稠度以及简化了蒜汁的制作（直接把蒜末加到油泼辣子中）另本人冰箱里没有鸡胸肉，所以本次图片中的成品是牛肉丝凉面，事实证明牛肉丝并不适合做凉面，别问我怎么知道的（皮）&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/kitchen-chicken-noodle.jpg&#34; alt=&#34;鸡丝凉面&#34;&gt;&lt;/p&gt;&#xA;&lt;br&gt;</description>
    </item>
    <item>
      <title>【项目】基于蚁群算法的证券投资组合优化</title>
      <link>https://luochang212.github.io/posts/markowitz_model/</link>
      <pubDate>Tue, 15 May 2018 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/markowitz_model/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;在证券交易中，为了降低风险，经常使用一笔资金购买多支股票。那么，如何合理地选择证券组合，并确定每支证券的资金分配系数，以使预期风险最低，预期收益最高，就成了一个经典的经济学问题 &amp;ndash; 证券投资组合优化问题。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;1952年，马科维茨首次提出均值-方差模型(Markowitz Mean-Variance Model)。该模型利用股票的历史交易数据，定义了股票的预期风险与收益，并引入“无差异曲线”和“有效市场边界”的概念，最终导出了最佳投资组合的计算公式。&lt;/p&gt;&#xA;&lt;p&gt;本文利用蚁群算法，求解马科维茨均值-方差模型。蚁群算法是一个群体智能算法，因其较强的鲁棒性和适用性，被广泛应用于工业界，是一种研究较为成熟的算法。&lt;/p&gt;&#xA;&lt;h3 id=&#34;研究背景&#34;&gt;研究背景&lt;/h3&gt;&#xA;&lt;p&gt;一个证券投资组合，简单来说就是一组证券及其选购系数的组合。选购系数均大于零（不允许做空），且和为1。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/portfolio_bar_chart.JPG&#34; alt=&#34;portfolio&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;余超在**《基于蚁群算法的投资组合优化研究》**中给出了完整的模型假设。概括如下：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;一只蚂蚁代表了一个投资组合；&lt;/li&gt;&#xA;&lt;li&gt;在投资组合优化问题中的蚁群算法要采用连续域优化；&lt;/li&gt;&#xA;&lt;li&gt;相较于传统蚁群问题，该算法中信息素应该在城市而非路径上积累；&lt;/li&gt;&#xA;&lt;li&gt;可在蚂蚁移动过程中加入随机扰动以增加全局搜索能力。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;余超在模型基础上已经做了非常完整的工作，但是没能求出完整的有效市场边界。&lt;/p&gt;&#xA;&lt;p&gt;于是，卞蓓丽在**《蚁群算法在多目标优化的证券投资组合中的应用研究》**中指出，多目标优化的证券投资组合问题是没有绝对最优解的，而是有一群无法相互支配的解形成的有效边界。对多目标优化问题而言，最重要的是求出有效边界，而不仅仅是求出一两个更优解，后者用单目标就可以完成。余超的多目标研究没有求出有效边界。”&lt;/p&gt;&#xA;&lt;p&gt;卞蓓丽提示我们：因为，投资组合问题，本质上是一个多目标优化问题。所以，我们要计算出完整的有效边界曲线，才算达成预期目标。&lt;/p&gt;&#xA;&lt;p&gt;余超建立了基础模型，而卞蓓丽在余超的基础上进行了改进。本文借鉴他们二人建立的数学模型，利用多元函数连续域蚁群算法，求解马科维茨均值-方差模型。&lt;/p&gt;&#xA;&lt;h3 id=&#34;研究方法&#34;&gt;研究方法&lt;/h3&gt;&#xA;&lt;p&gt;&lt;strong&gt;（一）马科维茨投资组合理论简介&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;投资组合的预期收益&lt;/strong&gt;(&lt;code&gt;$𝒓_𝒑$&lt;/code&gt;)：单一证券&lt;code&gt;i&lt;/code&gt;的预期收益为&lt;code&gt;$E\left(r_{i}\right) $&lt;/code&gt;，式中&lt;code&gt;$r_{i s}$&lt;/code&gt;为针对状况&lt;code&gt;s&lt;/code&gt;证券&lt;code&gt;i&lt;/code&gt;的收益率，&lt;code&gt;$P_{s}$&lt;/code&gt;是状态&lt;code&gt;s&lt;/code&gt;出现的概率；在计算了所有&lt;code&gt;N&lt;/code&gt;个证券的预期收益率后，就可以计算出证券组合的预期收益率&lt;code&gt;$𝒓_𝒑$&lt;/code&gt;，式中&lt;code&gt;$x_{i}$&lt;/code&gt;表示组合中证券&lt;code&gt;i&lt;/code&gt;所占的比例，即加权系数。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;单一证券&lt;code&gt;i&lt;/code&gt;的预期收益: &lt;code&gt;$E\left(r_{i}\right)=\sum_{s=1}^{n} r_{i s} * P_{s}$&lt;/code&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;证券组合的预期收益: &lt;code&gt;$\overline{r_{p}}=\sum_{i=1}^{N} x_{i} * E\left(r_{i}\right)$&lt;/code&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;strong&gt;投资组合的预期风险&lt;/strong&gt;($𝝈_{𝒑}$)：单一证券&lt;code&gt;i&lt;/code&gt;的预期风险为&lt;code&gt;$\sigma_{\mathrm{i}} $&lt;/code&gt;，式中&lt;code&gt;$r_{i s}$&lt;/code&gt;为针对状况&lt;code&gt;s&lt;/code&gt;证券&lt;code&gt;i&lt;/code&gt;的收益率，&lt;code&gt;$P_{S}$&lt;/code&gt;是状态&lt;code&gt;s&lt;/code&gt;出现的概率，&lt;code&gt;$E\left(r_{i}\right) $&lt;/code&gt;为证券&lt;code&gt;i&lt;/code&gt;的预期收益率 ；在计算了所有&lt;code&gt;N&lt;/code&gt;个证券的预期风险后，就可以计算出证券组合的预期风险&lt;code&gt;$\sigma_{\mathrm{p}}$ &lt;/code&gt;，式中&lt;code&gt;$\operatorname{cov}_{i j}$&lt;/code&gt;表示证券&lt;code&gt;i&lt;/code&gt;和证券&lt;code&gt;j&lt;/code&gt;的协方差，&lt;code&gt;$x_{i}$&lt;/code&gt;和&lt;code&gt;$x_{j}$&lt;/code&gt;表示组合中证券&lt;code&gt;i&lt;/code&gt;和证券&lt;code&gt;j&lt;/code&gt;所占的比例，即加权系数。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;单一证券&lt;code&gt;i&lt;/code&gt;的预期风险: &lt;code&gt;$\sigma_{\mathrm{i}}=\left(\sum_{s=1}^{n}\left[r_{i s}-E\left(r_{i}\right)\right]^{2} * P_{S}\right)^{\frac{1}{2}}$&lt;/code&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;证券组合的预期风险: &lt;code&gt;$\sigma_{\mathrm{p}}=\left(\sum_{i=1}^{N} \sum_{j=1}^{N} \operatorname{cov}_{i j} * x_{i} * x_{j}\right)^{\frac{1}{2}}$&lt;/code&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;strong&gt;有效市场边界&lt;/strong&gt;: 有效市场边界是所有最佳投资组合(Efficient Portfolio)的集合。有效前沿曲线上面的每一点都代表一个最佳投资组合。下图曲线就是有效市场边界，有效市场边界满足以下两个条件：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;对每一水平的风险，该组合提供最大的预期收益；&lt;/li&gt;&#xA;&lt;li&gt;对每一水平的预期收益，该组合能提供最小的风险。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/portfolio_1.jpg&#34; alt=&#34;有效市场边界&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;（二）蚁群算法在马科维茨模型中的应用&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;具体到蚁群算法中，一只蚂蚁代表一个投资组合&lt;code&gt;$𝑃=\{𝑥_1,𝑥_2,⋯,𝑥_𝑛\}$&lt;/code&gt;。通过马科维茨理论，我们可以计算出该投资组合&lt;code&gt;P&lt;/code&gt;对应的均值和方差。将均值、方差绘制在&lt;code&gt;r-σ&lt;/code&gt;二维空间上，可以观察各个投资组合之间的&lt;strong&gt;帕累托关系&lt;/strong&gt;，可分为三种情况：明显优于、明显劣于、和无法比较优劣。&lt;/p&gt;&#xA;&lt;p&gt;最终我们求出的有效市场边界上的近似点，就是由这样一组无法比较优劣的点组成的，我们把它叫作一组无法相互支配的最优解。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://luochang212.github.io/img/portfolio_4.png&#34; alt=&#34;投资组合之间的关系&#34;&gt;&lt;/p&gt;&#xA;&lt;!--&#xA;&#xA;**无差异曲线**: 无差异曲线能衡量投资者的风险收益偏好程度。无差异曲线具有以下特征：&#xA;&#xA;1. 每个投资者都有无数条无差异曲线，位于上方的无差异曲线所代表的效用水平比下方的无差异曲线所代表的效用高；&#xA;2. 每一条无差异曲线都是上升的，因为投资者是风险厌恶的，如果面临更高的风险需要支付更高的收益；&#xA;3. 无差异曲线上升的速度是递增的，即该函数的二阶导大于零，是下凹的。这说明随着风险增加投资者的厌恶程度是上升的；&#xA;4. 无差异曲线是不相交的，因为同一条无差异曲线上财富效用是相同的，两条无差异曲线相交会导出同风险下高收益和低收益具有相同财富效用这样的谬论，利用反证法可得原假设不成立，故不相交。&#xA;&#xA;![无差异曲线](/img/portfolio_2.png)&#xA;&#xA;**最优投资组合**: 有效市场边界由所选取的投资组合唯一确定，而无差异曲线则由所选取的投资者唯一确定。无差异曲线中和有效市场边界相切的那一点`P`代表了对此位投资者而言的最优投资组合。&#xA;&#xA;![无差异曲线](/img/portfolio_3.png)&#xA;&#xA;--&gt;&#xA;&lt;h3 id=&#34;研究模型&#34;&gt;研究模型&lt;/h3&gt;&#xA;&lt;p&gt;&lt;strong&gt;（一）模型假设&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>观影：少女哪吒</title>
      <link>https://luochang212.github.io/posts/nezha/</link>
      <pubDate>Tue, 11 Jul 2017 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/posts/nezha/</guid>
      <description>&lt;!--原文首发于我的微博--&gt;&#xA;&lt;p&gt;青春可贵，文学高华，可是越是珍贵就越脆弱越易碎。对于一般人来说，破碎的疼痛也许还能承受得住，可是对内心敏感的人，这几乎是欲死的折磨。&lt;/p&gt;&#xA;&lt;p&gt;我发现，影片中很多人都沉浸于某种爱好。王晓冰喜欢文学和音乐，晓冰妈喜欢舞蹈，晓冰爸外面的女人喜欢钢琴。但他们的爱好不是为了艺术，他们只是借沉浸艺术来麻痹自己。&lt;/p&gt;&#xA;&lt;p&gt;我猜，王晓冰对家人大喊“虚伪”的原因，大概就是看不惯家人的这种自我麻痹吧？看不惯这种因为怯懦、无法承受就转向麻痹自我的态度。她不满拿音乐和舞蹈麻痹自己的母亲，不满借口“恋爱自由”为自己脱责的父亲。&lt;/p&gt;&#xA;&lt;p&gt;每个人都为着生活痛苦、狂燥、疲惫不堪，在生活的折磨下渐渐失去勇气。因为不忍正视生活之残酷，他们选择戴上虚伪的面具，假装做出幸福的样子。但晓冰不，她个性干爽利落，追求三毛式的真诚和坦率。就算现实让她疼痛到龇牙咧嘴，她也要把那撇开的嘴角当作笑容。&lt;/p&gt;&#xA;&lt;p&gt;影片里李小路就像一个完美的存在，她的出现对晓冰而言是上苍的馈赠。就像徐杰说小路是侠女，小路确有一股特殊的气质。英气里带点活泼，让人倍感亲切。有时紧锁的眉头和尖利的眼神又不时提醒着她已是一个有了主见的少女。是小路，让晓冰的生活里有了短暂的纯粹的欢乐。&lt;/p&gt;&#xA;&lt;p&gt;造成晓冰痛苦的原因是多方位的，家庭的破碎，平庸又手握权力的老师的刁难，爱情的不如意，学业的不顺遂等等。对于这一切，晓冰都毅然决然、不顾后果、绝不妥协地抗争。永远高昂着头，又不幸身为下贱，这场景让我想起妙玉。&lt;/p&gt;&#xA;&lt;p&gt;总体上讲，电影的场景感觉很碎，只给人提供一种感觉。影片没有悲壮的结局，因此对应地也缺少回响。因为没有回响，因此又显得生涩。也不知道这生涩是好是坏，虽说失掉了反复品咂的回味，但又给思考和体验留了更多空间。&lt;/p&gt;&#xA;&lt;p&gt;（看的电影很少，还是第一次看这么文艺的电影，写一点个人的感觉 Σ Σ Σ (|||▽||| )&lt;/p&gt;</description>
    </item>
    <item>
      <title>基于蚁群算法的证券投资组合优化</title>
      <link>https://luochang212.github.io/portfolio/1/</link>
      <pubDate>Sat, 01 Jun 2019 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/portfolio/1/</guid>
      <description>&lt;p&gt;在证券交易中，为了降低风险，经常使用一笔资金购买多支股票。那么，如何合理地选择证券组合，并确定每支证券的资金分配系数，以使预期风险最低，预期收益最高，就成了一种经典的金融问题 &amp;ndash; 证券投资组合优化问题。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;马科维茨均值-方差模型&lt;/strong&gt;(Markowitz Mean-Variance Model)是一种用于求解证券投资组合优化问题的数学模型。本文改进了一种多元函数连续域蚁群算法，用于求解马科维茨均值-方差模型。&lt;/p&gt;</description>
    </item>
    <item>
      <title>TSP旅行路线规划</title>
      <link>https://luochang212.github.io/portfolio/2/</link>
      <pubDate>Wed, 01 May 2019 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/portfolio/2/</guid>
      <description>&lt;p&gt;旅行中的一天通常这样度过：清晨从宾馆出发，去第一个景点。第一个景点逛完，去下一个景点&amp;hellip;&amp;hellip;直到最后一个景点逛完，行程结束返回宾馆。那么如何规划一条最短的路线走完一天的行程呢？这就涉及到一个经典的运筹学问题 &amp;ndash; TSP问题。本项目用googlemaps库获取纬度和经度信息，用OR-Tools库求解TSP问题，用gmaps库可视化输出结果。利用本项目，用户只需输入景点名称，即可获得一张周游所有景点的最短路线图。可以说是一个即插即用的TSP路线规划工具。&lt;/p&gt;</description>
    </item>
    <item>
      <title>团队软件项目</title>
      <link>https://luochang212.github.io/portfolio/3/</link>
      <pubDate>Mon, 01 Apr 2019 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/portfolio/3/</guid>
      <description>&lt;p&gt;每年，教学经理(Learning and Teaching Manager)都必须从老师那里收集课程信息。如果发现考试时间重叠或者太过密集，教学经理都必须通知老师调整时间。此外，教学经理还必须核对课程信息是否正确。比如各项考核分数之和是否为100分，考试时间是否与节假日重叠，作业的截至日期是否在发布日期之后等。核对完成后，还必须将每个课程的信息打印出来。这个过程非常手动，对用户也不友好。因此，团队编写了本软件。本软件能自动核对、打印、可视化课程信息，并允许用户将课程信息以邮件形式返回给教学经理，以帮助课程经理提高工作效率。&lt;/p&gt;</description>
    </item>
    <item>
      <title>自然系统的建模与仿真</title>
      <link>https://luochang212.github.io/portfolio/4/</link>
      <pubDate>Fri, 01 Mar 2019 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/portfolio/4/</guid>
      <description>&lt;p&gt;本项目采用 Agent-based model 的方式，为狼-麋鹿-草生态系统建模。技术上采用了 MATLAB 面向对象编程，为狼和麋鹿的四种行为，分别是捕食、迁徙、生育、死亡，编写了规则。其中狼群拥有智能，可以利用有限信息搜索羊群，并且在头狼的带领下，狼群还表现出集群行为。给定初始条件以后，本模型会模拟生态系统的运作，输出一个时刻更新的二维图以展示各生物位置的变化情况。此外，还会输出一个折线图以表示各生物数量的变化情况。&lt;/p&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://luochang212.github.io/gadget/algorithms/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/gadget/algorithms/</guid>
      <description>&lt;!DOCTYPE html&gt;&#xA;&lt;html lang=&#34;en&#34;&gt;&#xA;&#xA;&lt;head&gt;&#xA;    &lt;meta charset=&#34;UTF-8&#34;&gt;&#xA;    &lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&gt;&#xA;    &lt;title&gt;算法集萃&lt;/title&gt;&#xA;    &lt;link rel=&#34;shortcut icon&#34; type=&#34;image/png&#34; href=&#34;https://luochang212.github.io/favicon.png&#34;&gt;&#xA;    &lt;link rel=&#34;stylesheet&#34; href=&#34;style.css&#34;&gt;&#xA;    &lt;link rel=&#34;stylesheet&#34; href=&#34;https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css&#34;&gt;&#xA;    &lt;link rel=&#34;stylesheet&#34; href=&#34;https://luochang212.github.io/scss/hyde-hyde.6a83d62c39a364f036df4db1ecd564645635d6c7fc182425cb501218fec485f5.css&#34;&#xA;        integrity=&#34;sha256-aoPWLDmjZPA2302x7NVkZFY11sf8GCQly1ASGP7EhfU=&#34;&gt;&#xA;&lt;/head&gt;&#xA;&#xA;&lt;body&gt;&#xA;    &lt;div id=&#34;header&#34;&gt;&#xA;        &lt;div class=&#34;navbar&#34;&gt;&#xA;            &lt;a href=&#34;https://luochang212.github.io/&#34;&gt;Home&lt;/a&gt;&#xA;            &lt;a href=&#34;https://luochang212.github.io/portfolio/&#34;&gt;Projects&lt;/a&gt;&#xA;            &lt;a href=&#34;https://luochang212.github.io/about/&#34;&gt;About&lt;/a&gt;&#xA;        &lt;/div&gt;&#xA;        &lt;!-- &lt;div id=&#34;link&#34;&gt;&lt;a href=&#34;https://github.com/luochang212&#34;&gt;© 2019 Chang Luo&lt;/a&gt;&lt;/div&gt; --&gt;&#xA;    &lt;/div&gt;&#xA;    &lt;div id=&#34;container&#34;&gt;&#xA;        &lt;center&gt;&#xA;            &lt;br&gt;&#xA;            &lt;h1&gt;算法集萃&lt;/h1&gt;&#xA;        &lt;/center&gt;&#xA;&#xA;&#xA;        &lt;br&gt;&#xA;        &lt;h3&gt;1. 分配货物&lt;/h3&gt;&#xA;        &lt;p&gt;有四条船，有一堆货物。往每条船上分配货物，要求每条船上货物的重量相等。&#xA;            列表中的元素表示每个货物的重量。&#xA;            返回 Ture 或者 False 表示是否存在满足条件的装货方式。&#xA;        &lt;/p&gt;&#xA;        &lt;p&gt;&lt;b&gt;示例：&lt;/b&gt;&lt;/p&gt;&#xA;        &lt;pre&gt;&lt;code class=&#34;language-python&#34;&gt;输入: [2,2,2,1,1]&#xA;输出: True&#xA;&#xA;输入: [2,2,2,3]&#xA;输出: False&lt;/code&gt;&lt;/pre&gt;&#xA;&#xA;        &lt;p&gt;&lt;b&gt;解答：&lt;/b&gt;&lt;/p&gt;&#xA;        &lt;pre&gt;&lt;code class=&#34;language-python&#34;&gt;None&lt;/code&gt;&lt;/pre&gt;&#xA;&#xA;&#xA;        &lt;br&gt;&#xA;        &lt;h3&gt;2. 复原IP地址&lt;a href=&#34;https://leetcode-cn.com/problems/restore-ip-addresses/solution/fu-yuan-ipdi-zhi-by-leetcode/&#34;&gt;[LeetCode]&lt;/a&gt;&lt;/h3&gt;&#xA;        &lt;p&gt;给定一个只包含数字的字符串，复原它并返回所有可能的 IP 地址格式。&#xA;        &lt;/p&gt;&#xA;        &lt;p&gt;&lt;b&gt;示例：&lt;/b&gt;&lt;/p&gt;&#xA;        &lt;pre&gt;&lt;code class=&#34;language-python&#34;&gt;输入: &#34;25525511135&#34;&#xA;输出: [&#34;255.255.11.135&#34;, &#34;255.255.111.35&#34;]&lt;/code&gt;&lt;/pre&gt;&#xA;&#xA;        &lt;p&gt;&lt;b&gt;解答：&lt;/b&gt;&lt;/p&gt;&#xA;        &lt;pre&gt;&lt;code class=&#34;language-python&#34;&gt;None&lt;/code&gt;&lt;/pre&gt;&#xA;    &lt;/div&gt;&#xA;    &lt;script src=&#34;https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.13.1/highlight.min.js&#34;&gt;&lt;/script&gt;&#xA;    &lt;script type=&#34;text/javascript&#34;&gt;&#xA;        hljs.initHighlightingOnLoad();&#xA;    &lt;/script&gt;&#xA;&lt;/body&gt;&#xA;&#xA;&lt;/html&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://luochang212.github.io/gadget/attention-is-all-you-need/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/gadget/attention-is-all-you-need/</guid>
      <description>&lt;!DOCTYPE html&gt;&#xA;&lt;!-- saved from url=(0044)https://ar5iv.labs.arxiv.org/html/1706.03762 --&gt;&#xA;&lt;html lang=&#34;en&#34; data-theme=&#34;light&#34;&gt;&lt;head&gt;&lt;meta http-equiv=&#34;Content-Type&#34; content=&#34;text/html; charset=UTF-8&#34;&gt;&#xA;&#xA;&lt;title&gt;[1706.03762] Attention Is All You Need&lt;/title&gt;&lt;meta property=&#34;og:description&#34; content=&#34;The dominant sequence transduction models are based on complex recurrent or convolutional neural networks that include an encoder and a decoder. The best performing models also connect the encoder and decoder through a…&#34;&gt;&#xA;&lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1&#34;&gt;&#xA;&lt;meta name=&#34;twitter:card&#34; content=&#34;summary&#34;&gt;&#xA;&lt;meta name=&#34;twitter:title&#34; content=&#34;Attention Is All You Need&#34;&gt;&#xA;&lt;meta name=&#34;twitter:image:src&#34; content=&#34;https://ar5iv.labs.arxiv.org/assets/ar5iv_card.png&#34;&gt;&#xA;&lt;meta name=&#34;twitter:image:alt&#34; content=&#34;ar5iv logo&#34;&gt;&#xA;&lt;meta property=&#34;og:title&#34; content=&#34;Attention Is All You Need&#34;&gt;&#xA;&lt;meta property=&#34;og:site_name&#34; content=&#34;ar5iv&#34;&gt;&#xA;&lt;meta property=&#34;og:image&#34; content=&#34;https://ar5iv.labs.arxiv.org/assets/ar5iv_card.png&#34;&gt;&#xA;&lt;meta property=&#34;og:type&#34; content=&#34;article&#34;&gt;&#xA;&lt;meta property=&#34;og:url&#34; content=&#34;https://ar5iv.labs.arxiv.org/html/1706.03762&#34;&gt;&#xA;&#xA;&lt;!--Generated on Sun Mar  3 23:17:54 2024 by LaTeXML (version 0.8.8) http://dlmf.nist.gov/LaTeXML/.--&gt;&#xA;&lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1, shrink-to-fit=no&#34;&gt;&#xA;&#xA;&lt;script&gt;&#xA;  function detectColorScheme(){&#xA;    var theme=&#34;light&#34;;&#xA;    var current_theme = localStorage.getItem(&#34;ar5iv_theme&#34;);&#xA;    if(current_theme){&#xA;      if(current_theme == &#34;dark&#34;){&#xA;        theme = &#34;dark&#34;;&#xA;      } }&#xA;    else if(!window.matchMedia) { return false; }&#xA;    else if(window.matchMedia(&#34;(prefers-color-scheme: dark)&#34;).matches) {&#xA;      theme = &#34;dark&#34;; }&#xA;    if (theme==&#34;dark&#34;) {&#xA;      document.documentElement.setAttribute(&#34;data-theme&#34;, &#34;dark&#34;);&#xA;    } else {&#xA;      document.documentElement.setAttribute(&#34;data-theme&#34;, &#34;light&#34;); } }&#xA;&#xA;  detectColorScheme();&#xA;&#xA;  function toggleColorScheme(){&#xA;    var current_theme = localStorage.getItem(&#34;ar5iv_theme&#34;);&#xA;    if (current_theme) {&#xA;      if (current_theme == &#34;light&#34;) {&#xA;        localStorage.setItem(&#34;ar5iv_theme&#34;, &#34;dark&#34;); }&#xA;      else {&#xA;        localStorage.setItem(&#34;ar5iv_theme&#34;, &#34;light&#34;); } }&#xA;    else {&#xA;        localStorage.setItem(&#34;ar5iv_theme&#34;, &#34;dark&#34;); }&#xA;    detectColorScheme(); }&#xA;&lt;/script&gt;&#xA;&lt;link media=&#34;all&#34; rel=&#34;stylesheet&#34; href=&#34;https://luochang212.github.io/[1706.03762] Attention Is All You Need_files/ar5iv-fonts.0.7.9.min.css&#34;&gt;&lt;link media=&#34;all&#34; rel=&#34;stylesheet&#34; href=&#34;https://luochang212.github.io/[1706.03762] Attention Is All You Need_files/ar5iv.0.7.9.min.css&#34;&gt;&lt;link media=&#34;all&#34; rel=&#34;stylesheet&#34; href=&#34;https://luochang212.github.io/[1706.03762] Attention Is All You Need_files/ar5iv-site.0.2.2.css&#34;&gt;&#xA;&lt;/head&gt;&#xA;&lt;body&gt;&#xA;&lt;div class=&#34;ltx_page_main&#34;&gt;&#xA;&lt;div class=&#34;ltx_page_content&#34;&gt;&#xA;&lt;article class=&#34;ltx_document ltx_authors_1line&#34;&gt;&#xA;&lt;div id=&#34;p1&#34; class=&#34;ltx_para&#34;&gt;&#xA;&lt;p id=&#34;p1.1&#34; class=&#34;ltx_p ltx_align_center&#34;&gt;&lt;span id=&#34;p1.1.1&#34; class=&#34;ltx_text&#34; style=&#34;color:#FF0000;&#34;&gt;Provided proper attribution is provided, Google hereby grants permission to reproduce the tables and figures in this paper solely for use in journalistic or scholarly works.&lt;/span&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://luochang212.github.io/gadget/baijiahao/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/gadget/baijiahao/</guid>
      <description>&lt;!DOCTYPE html&gt;&#xA;&lt;html lang=&#34;en&#34;&gt;&#xA;&lt;head&gt;&#xA;&#x9;&lt;meta charset=&#34;UTF-8&#34;&gt;&#xA;&#x9;&lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&gt;&#xA;&#x9;&lt;title&gt;百家号模拟器&lt;/title&gt;&#xA;&#x9;&lt;link rel=&#34;stylesheet&#34; href=&#34;style.css&#34;&gt;&#xA;&#x9;&#xA;&lt;/head&gt;&#xA;&lt;body&gt;&#xA;&#x9;&lt;div id=&#34;header&#34;&gt;&#xA;&#x9;&#x9;&lt;div class=&#34;navbar&#34;&gt;&#xA;&#x9;&#x9;&#x9;&lt;a href=&#34;https://luochang212.github.io/&#34;&gt;Home&lt;/a&gt;&#xA;&#x9;&#x9;&#x9;&lt;a href=&#34;https://luochang212.github.io/portfolio/&#34;&gt;Projects&lt;/a&gt;&#xA;&#x9;&#x9;&#x9;&lt;a href=&#34;https://luochang212.github.io/about/&#34;&gt;About&lt;/a&gt;&#xA;&#x9;&#x9;&lt;/div&gt;&#xA;&#x9;&lt;/div&gt;&#xA;&#x9;&lt;div id=&#34;container&#34;&gt;&#xA;&#x9;&#x9;&lt;center&gt;&#xA;&#x9;&#x9;&#x9;&lt;br&gt;&lt;br&gt;&#xA;&#x9;&#x9;&#x9;&lt;h1&gt;百家号模拟器&lt;/h1&gt;&#xA;&#x9;&#x9;&#x9;&lt;br&gt;&lt;br&gt;&#xA;&#x9;&#x9;&#x9;主题：&lt;input type=&#34;text&#34; id=&#34;theme&#34; value=&#34;老八秘制小憨堡&#34;/&gt;&#xA;&#x9;&#x9;&#x9;&lt;br&gt;&lt;br&gt;&#xA;&#x9;&#x9;&#x9;属性：&lt;input type=&#34;text&#34; id=&#34;attribute&#34; value=&#34;梗&#34;/&gt;&#xA;&#x9;&#x9;&#x9;&lt;br&gt;&lt;br&gt;&#xA;&#x9;&#x9;&#x9;&lt;button class=&#34;btn&#34; onclick=&#34;main()&#34;&gt;生成文章&lt;/button&gt;&#xA;&#x9;&#x9;&#x9;&lt;br&gt;&lt;br&gt;&lt;br&gt;&#xA;&#x9;&#x9;&lt;/center&gt;&#xA;&#x9;&#x9;&#x9;&lt;div id=&#34;content&#34;&gt;&lt;/div&gt;&#xA;&#x9;&#x9;&#x9;&lt;br&gt;&lt;br&gt;&#xA;&#x9;&lt;/div&gt;&#xA;&#x9;&lt;script src=&#34;./script.js&#34;&gt;&lt;/script&gt;&#xA;&lt;/body&gt;&#xA;&lt;/html&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://luochang212.github.io/gadget/flockn-roll/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/gadget/flockn-roll/</guid>
      <description>&lt;!DOCTYPE html&gt;&#xA;&#xA;&lt;html lang=&#34;en&#34; class=&#34;gr__rocs_hu-berlin_de&#34;&gt;&lt;head&gt;&lt;meta http-equiv=&#34;Content-Type&#34; content=&#34;text/html; charset=UTF-8&#34;&gt;&#xA;&#xA;&#x9;&#x9;&lt;link rel=&#34;stylesheet&#34; type=&#34;text/css&#34; href=&#34;https://luochang212.github.io/Flock&#39;n Roll/style.css&#34;&gt;&#xA;&#x9;&#x9;&lt;link rel=&#34;stylesheet&#34; type=&#34;text/css&#34; href=&#34;https://luochang212.github.io/Flock&#39;n Roll/slider.css&#34;&gt;&#xA;&#x9;&#x9;&lt;link href=&#34;https://luochang212.github.io/Flock&#39;n Roll/css&#34; rel=&#34;stylesheet&#34; type=&#34;text/css&#34;&gt;&#xA;&#x9;&#x9;&#xA;&#x9;&#x9;&lt;script src=&#34;https://luochang212.github.io/Flock&#39;n Roll/d3.v4.min.js.download&#34; type=&#34;text/javascript&#34;&gt;&lt;/script&gt;&#xA;&#x9;&#x9;&lt;script src=&#34;https://luochang212.github.io/Flock&#39;n Roll/widget.2.2.js.download&#34; type=&#34;text/javascript&#34;&gt;&lt;/script&gt;&#xA;&#x9;&#xA;&#x9;&#x9;&lt;title&gt;Collective Motion&lt;/title&gt;&#xA;&#x9;&lt;/head&gt;&#xA;&#x9;&#xA;&#x9;&lt;body data-gr-c-s-loaded=&#34;true&#34;&gt;&#xA;&#x9;&#x9;&lt;div id=&#34;content&#34;&gt;&#xA;&#x9;&#x9;&lt;div id=&#34;container&#34;&gt;&#xA;&#xA;&#x9;&#x9;&lt;g id=&#34;sliders&#34; transform=&#34;translate(10,30)&#34;&gt;&#xA;&#x9;&#x9;&#x9;&lt;g class=&#34;slider&#34; id=&#34;slider_speed&#34; transform=&#34;translate(0,0)&#34;&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;line class=&#34;track&#34; style=&#34;stroke-width: 5;&#34; x1=&#34;0&#34; x2=&#34;180&#34;&gt;&lt;/line&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;line class=&#34;track-inset&#34; style=&#34;stroke-width: 4;&#34; x1=&#34;0&#34; x2=&#34;180&#34;&gt;&lt;/line&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;circle class=&#34;handle&#34; cx=&#34;144&#34; id=&#34;handle_speed&#34; r=&#34;6&#34;&gt;&lt;/circle&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;line class=&#34;track-overlay&#34; style=&#34;stroke-width: 12; -webkit-tap-highlight-color: rgba(0, 0, 0, 0);&#34; x1=&#34;0&#34; x2=&#34;180&#34;&gt;&lt;/line&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;text class=&#34;tag&#34; style=&#34;text-anchor: start; alignment-baseline: middle; font-size: 12px; opacity: 1;&#34; transform=&#34;translate(0,-12)&#34;&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;Speed&#xA;&#x9;&#x9;&#x9;&#x9;&lt;/text&gt;&#xA;&#x9;&#x9;&#x9;&lt;/g&gt;&#xA;&#x9;&#x9;&#x9;&lt;g class=&#34;slider&#34; id=&#34;slider_noise_heading&#34; transform=&#34;translate(0,38)&#34;&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;line class=&#34;track&#34; style=&#34;stroke-width: 5;&#34; x1=&#34;0&#34; x2=&#34;180&#34;&gt;&lt;/line&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;line class=&#34;track-inset&#34; style=&#34;stroke-width: 4;&#34; x1=&#34;0&#34; x2=&#34;180&#34;&gt;&lt;/line&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;circle class=&#34;handle&#34; cx=&#34;90&#34; id=&#34;handle_noise_heading&#34; r=&#34;6&#34;&gt;&lt;/circle&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;line class=&#34;track-overlay&#34; style=&#34;stroke-width: 12; -webkit-tap-highlight-color: rgba(0, 0, 0, 0);&#34; x1=&#34;0&#34; x2=&#34;180&#34;&gt;&lt;/line&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;text class=&#34;tag&#34; style=&#34;text-anchor: start; alignment-baseline: middle; font-size: 12px; opacity: 1;&#34; transform=&#34;translate(0,-12)&#34;&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;Wiggle&#xA;&#x9;&#x9;&#x9;&#x9;&lt;/text&gt;&#xA;&#x9;&#x9;&#x9;&lt;/g&gt;&#xA;&#x9;&#x9;&#x9;&lt;g class=&#34;slider&#34; id=&#34;slider_rcoll&#34; transform=&#34;translate(0,86)&#34;&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;line class=&#34;track&#34; style=&#34;stroke-width: 5;&#34; x1=&#34;0&#34; x2=&#34;180&#34;&gt;&lt;/line&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;line class=&#34;track-inset&#34; style=&#34;stroke-width: 4;&#34; x1=&#34;0&#34; x2=&#34;180&#34;&gt;&lt;/line&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;circle class=&#34;handle&#34; cx=&#34;9&#34; id=&#34;handle_rcoll&#34; r=&#34;6&#34;&gt;&lt;/circle&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;line class=&#34;track-overlay&#34; style=&#34;stroke-width: 12; -webkit-tap-highlight-color: rgba(0, 0, 0, 0);&#34; x1=&#34;0&#34; x2=&#34;180&#34;&gt;&lt;/line&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;text class=&#34;tag&#34; style=&#34;text-anchor: start; alignment-baseline: middle; font-size: 12px; opacity: 1;&#34; transform=&#34;translate(0,-12)&#34;&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;Collision Radius&#xA;&#x9;&#x9;&#x9;&#x9;&lt;/text&gt;&#xA;&#x9;&#x9;&#x9;&lt;/g&gt;&#xA;&#x9;&#x9;&#x9;&lt;g class=&#34;slider&#34; id=&#34;slider_ralign&#34; transform=&#34;translate(0,124)&#34;&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;line class=&#34;track&#34; style=&#34;stroke-width: 5;&#34; x1=&#34;0&#34; x2=&#34;180&#34;&gt;&lt;/line&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;line class=&#34;track-inset&#34; style=&#34;stroke-width: 4;&#34; x1=&#34;0&#34; x2=&#34;180&#34;&gt;&lt;/line&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;circle class=&#34;handle&#34; cx=&#34;45&#34; id=&#34;handle_ralign&#34; r=&#34;6&#34;&gt;&lt;/circle&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;line class=&#34;track-overlay&#34; style=&#34;stroke-width: 12; -webkit-tap-highlight-color: rgba(0, 0, 0, 0);&#34; x1=&#34;0&#34; x2=&#34;180&#34;&gt;&lt;/line&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;text class=&#34;tag&#34; style=&#34;text-anchor: start; alignment-baseline: middle; font-size: 12px; opacity: 1;&#34; transform=&#34;translate(0,-12)&#34;&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;Alignment Radius&#xA;&#x9;&#x9;&#x9;&#x9;&lt;/text&gt;&#xA;&#x9;&#x9;&#x9;&lt;/g&gt;&#xA;&#x9;&#x9;&#x9;&lt;g class=&#34;slider&#34; id=&#34;slider_rattract&#34; transform=&#34;translate(0,162)&#34;&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;line class=&#34;track&#34; style=&#34;stroke-width: 5;&#34; x1=&#34;0&#34; x2=&#34;180&#34;&gt;&lt;/line&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;line class=&#34;track-inset&#34; style=&#34;stroke-width: 4;&#34; x1=&#34;0&#34; x2=&#34;180&#34;&gt;&lt;/line&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;circle class=&#34;handle&#34; cx=&#34;135&#34; id=&#34;handle_rattract&#34; r=&#34;6&#34;&gt;&lt;/circle&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;line class=&#34;track-overlay&#34; style=&#34;stroke-width: 12; -webkit-tap-highlight-color: rgba(0, 0, 0, 0);&#34; x1=&#34;0&#34; x2=&#34;180&#34;&gt;&lt;/line&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;text class=&#34;tag&#34; style=&#34;text-anchor: start; alignment-baseline: middle; font-size: 12px; opacity: 1;&#34; transform=&#34;translate(0,-12)&#34;&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;Attraction Radius&#xA;&#x9;&#x9;&#x9;&#x9;&lt;/text&gt;&#xA;&#x9;&#x9;&#x9;&lt;/g&gt;&#xA;&#x9;&#x9;&#x9;&lt;g class=&#34;slider&#34; id=&#34;slider_blindspot&#34; transform=&#34;translate(0,210)&#34;&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;line class=&#34;track&#34; style=&#34;stroke-width: 5;&#34; x1=&#34;0&#34; x2=&#34;180&#34;&gt;&lt;/line&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;line class=&#34;track-inset&#34; style=&#34;stroke-width: 4;&#34; x1=&#34;0&#34; x2=&#34;180&#34;&gt;&lt;/line&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;circle class=&#34;handle&#34; cx=&#34;59.66573816155989&#34; id=&#34;handle_blindspot&#34; r=&#34;6&#34;&gt;&lt;/circle&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;line class=&#34;track-overlay&#34; style=&#34;stroke-width: 12; -webkit-tap-highlight-color: rgba(0, 0, 0, 0);&#34; x1=&#34;0&#34; x2=&#34;180&#34;&gt;&lt;/line&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;text class=&#34;tag&#34; style=&#34;text-anchor: start; alignment-baseline: middle; font-size: 12px; opacity: 1;&#34; transform=&#34;translate(0,-12)&#34;&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;Blind Spot&#xA;&#x9;&#x9;&#x9;&#x9;&lt;/text&gt;&#xA;&#x9;&#x9;&#x9;&lt;/g&gt;&#xA;&#x9;&#x9;&lt;/g&gt;&#xA;&#x9;&#x9;&lt;g transform=&#34;translate(320,67.5)&#34;&gt;&#xA;&#x9;&#x9;&#x9;&lt;path d=&#34;M 0,0 L -40.59494080239556,23.437500000000004 A 46.875 46.875 0 1 1 40.59494080239556,23.437500000000004L 0,0&#34; id=&#34;attract_scope&#34;&gt;&lt;/path&gt;&#xA;&#x9;&#x9;&#x9;&lt;path d=&#34;M 0,0 L -13.531646934131853,7.812500000000002 A 15.625 15.625 0 1 1 13.531646934131853,7.812500000000002L 0,0&#34; id=&#34;orient_scope&#34;&gt;&lt;/path&gt;&#xA;&#x9;&#x9;&#x9;&lt;path d=&#34;M 0,0 L -12.940952255126042,-48.29629131445341 A 50 50 0 0 1 12.940952255126042,-48.29629131445341L 0,0&#34; id=&#34;speed&#34;&gt;&lt;/path&gt;&#xA;&#x9;&#x9;&#x9;&lt;path class=&#34;drop&#34; d=&#34;M-10,0L-9.781476007338057,0.0000013559894431524102L-9.135454576426008,0.00016426943596341506L-8.090169943749475,0.0025590741750720378L-6.691306063588582,0.016823767664085196L-5.000000000000001,0.06765823467065922L-3.0901699437494745,0.19610489832639383L-1.0452846326765346,0.4463234694540685L1.0452846326765333,0.8375776926373233L3.0901699437494736,1.3332825570450615L4.999999999999998,1.8267723361077999L6.691306063588579,2.1598542120919086L8.090169943749473,2.1748366492414193L9.13545457642601,1.7811876213190558L9.781476007338057,1.0058541416985987L10,6.123233995736766e-16L9.781476007338057,-1.005854141698598L9.13545457642601,-1.7811876213190547L8.090169943749475,-2.17483664924142L6.691306063588584,-2.1598542120919086L5.000000000000004,-1.8267723361078005L3.0901699437494754,-1.3332825570450613L1.0452846326765424,-0.8375776926373246L-1.0452846326765388,-0.4463234694540675L-3.0901699437494723,-0.1961048983263941L-5.000000000000001,-0.06765823467065922L-6.691306063588584,-0.016823767664085165L-8.090169943749473,-0.0025590741750720447L-9.13545457642601,-0.00016426943596341506L-9.781476007338055,-0.0000013559894431524354&#34; style=&#34;fill-opacity: 1; fill: black; stroke: black;&#34; transform=&#34;scale(4)translate(0,6.25)rotate(-90)&#34;&gt;&lt;/path&gt;&#xA;&#x9;&#x9;&#x9;&lt;circle id=&#34;repell_scope&#34; r=&#34;3.125&#34;&gt;&lt;/circle&gt;&#xA;&#x9;&#x9;&lt;/g&gt;&#xA;&#x9;&#x9;&lt;g transform=&#34;translate(300,218.75)&#34;&gt;&#xA;&#x9;&#x9;&#x9;&lt;g transform=&#34;translate(-60,0)&#34;&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;g class=&#34;button&#34; id=&#34;button_b1&#34;&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;circle class=&#34;button-background&#34; r=&#34;25&#34;&gt;&lt;/circle&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;path class=&#34;button-symbol&#34; d=&#34;M12.5,0L-6.25,10.825317547305483L-6.25,-10.825317547305483Z&#34;&gt;&lt;/path&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;text class=&#34;tag&#34; style=&#34;opacity: 1; text-anchor: middle; font-size: 12px; alignment-baseline: hanging;&#34; transform=&#34;translate(0,30)&#34;&gt;&lt;/text&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;/g&gt;&#xA;&#x9;&#x9;&#x9;&lt;/g&gt;&#xA;&#x9;&#x9;&#x9;&lt;g transform=&#34;translate(0,0)&#34;&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;g class=&#34;button&#34; id=&#34;button_b2&#34;&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;circle class=&#34;button-background&#34; r=&#34;25&#34;&gt;&lt;/circle&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;path class=&#34;button-symbol&#34; d=&#34;M-12.5,0L6.25,10.825317547305483L6.25,-10.825317547305483Z&#34;&gt;&lt;/path&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;text class=&#34;tag&#34; style=&#34;opacity: 1; text-anchor: middle; font-size: 12px; alignment-baseline: hanging;&#34; transform=&#34;translate(0,30)&#34;&gt;&lt;/text&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;/g&gt;&#xA;&#x9;&#x9;&#x9;&lt;/g&gt;&#xA;&#x9;&#x9;&#x9;&lt;g transform=&#34;translate(60,0)&#34;&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;g class=&#34;button&#34; id=&#34;button_b3&#34;&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;circle class=&#34;button-background&#34; r=&#34;25&#34;&gt;&lt;/circle&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;path class=&#34;button-symbol&#34; d=&#34;M10.112712429686841,-7.347315653655917A12.5,12.5,0,1,0,10.112712429686843,7.347315653655914L5.056356214843421,3.673657826827957A6.25,6.25,0,1,1,5.0563562148434205,-3.6736578268279585L1.5169068644530264,-1.1020973480483878L11.992923714458682,0.5571407175701673L13.652161780077236,-9.918876132435487Z&#34;&gt;&lt;/path&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;text class=&#34;tag&#34; style=&#34;opacity: 1; text-anchor: middle; font-size: 12px; alignment-baseline: hanging;&#34; transform=&#34;translate(0,30)&#34;&gt;&lt;/text&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;/g&gt;&#xA;&#x9;&#x9;&#x9;&lt;/g&gt;&#xA;&#x9;&#x9;&lt;/g&gt;&#xA;&#x9;    &lt;/div&gt;&#xA;&#x9;&#x9;&#xA;&#x9;&#x9;&lt;/div&gt;&#xA;&#x9;&#x9;&#xA;&#x9;&#x9;&lt;script src=&#34;https://luochang212.github.io/Flock&#39;n Roll/sim.js.download&#34; type=&#34;text/javascript&#34;&gt;&lt;/script&gt;&#xA;&#xA;&lt;/html&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://luochang212.github.io/gadget/font/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/gadget/font/</guid>
      <description>&lt;blockquote class=&#34;style1&#34;&gt;&#xA;  Don&#39;t threaten me with a good time &amp;#9834;&#xA;&lt;/blockquote&gt;&#xA;&#xA;&lt;blockquote class=&#34;style2&#34;&gt;&#xA;  Don&#39;t threaten me with a good time &amp;#9834;&#xA;&lt;/blockquote&gt;&#xA;&#xA;&lt;blockquote class=&#34;style3&#34;&gt;&#xA;  Don&#39;t threaten me with a good time &amp;#9834;&#xA;&lt;/blockquote&gt;&#xA;&#xA;&lt;link rel=&#34;stylesheet&#34; type=&#34;text/css&#34; href=&#34;style.css&#34;&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://luochang212.github.io/gadget/gallery/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/gadget/gallery/</guid>
      <description>&lt;!DOCTYPE html&gt;&#xA;&lt;html&gt;&#xA;&#xA;&lt;head&gt;&#xA;  &lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&gt;&#xA;  &lt;style&gt;&#xA;    * {&#xA;      box-sizing: border-box;&#xA;    }&#xA;&#xA;    body {&#xA;      margin: 0;&#xA;      font-family: Arial, Helvetica, sans-serif;&#xA;    }&#xA;&#xA;    .header {&#xA;      text-align: center;&#xA;      padding: 32px;&#xA;    }&#xA;&#xA;    .row {&#xA;      display: -ms-flexbox;&#xA;      /* IE 10 */&#xA;      display: flex;&#xA;      -ms-flex-wrap: wrap;&#xA;      /* IE 10 */&#xA;      flex-wrap: wrap;&#xA;      padding: 0 4px;&#xA;    }&#xA;&#xA;    /* Create two equal columns that sits next to each other */&#xA;    /* 列数初始化 */&#xA;    .column {&#xA;      -ms-flex: 25%;&#xA;      /* IE 10 */&#xA;      flex: 25%;&#xA;      padding: 0 4px;&#xA;    }&#xA;&#xA;    .column img {&#xA;      margin-top: 8px;&#xA;      vertical-align: middle;&#xA;    }&#xA;&#xA;    /* Style the buttons */&#xA;    .btn {&#xA;      border: none;&#xA;      outline: none;&#xA;      padding: 10px 16px;&#xA;      background-color: #f1f1f1;&#xA;      cursor: pointer;&#xA;      font-size: 18px;&#xA;    }&#xA;&#xA;    .btn:hover {&#xA;      background-color: #ddd;&#xA;    }&#xA;&#xA;    .btn.active {&#xA;      background-color: #666;&#xA;      color: white;&#xA;    }&#xA;  &lt;/style&gt;&#xA;&lt;/head&gt;&#xA;&#xA;&lt;body&gt;&#xA;&#xA;  &lt;!-- Header --&gt;&#xA;  &lt;div class=&#34;header&#34; id=&#34;myHeader&#34;&gt;&#xA;    &lt;h1&gt;Gallery&lt;/h1&gt;&#xA;    &lt;p&gt;Click on the buttons to change the grid view.&lt;/p&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://luochang212.github.io/gadget/happy-birthday/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/gadget/happy-birthday/</guid>
      <description>&lt;!DOCTYPE html&gt;&#xA;&lt;html&gt;&#xA;&#xA;&lt;head&gt;&#xA;    &lt;meta charset=&#34;UTF-8&#34; /&gt;&#xA;    &lt;title&gt;┗|｀O′|┛&lt;/title&gt;&#xA;    &lt;link rel=&#34;stylesheet&#34; href=&#34;./bulb.css&#34;&gt;&#xA;    &lt;link rel=&#34;stylesheet&#34; href=&#34;./style.css&#34;&gt;&#xA;&lt;/head&gt;&#xA;&#xA;&lt;body&gt;&#xA;    &lt;div id=&#34;ttl&#34; class=&#34;title&#34;&gt;&#xA;        Happy Birthday&lt;br&gt;&#xA;        To&lt;br&gt;&#xA;        赵公公&#xA;    &lt;/div&gt;&#xA;    &lt;img id=&#34;robot&#34; class=&#34;robot-img&#34; src=&#34;./assets/robot.png&#34; /&gt;&#xA;    &lt;div id=&#34;dots-root&#34;&gt;&#xA;        &lt;div id=&#34;dots&#34;&gt;&lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;    &lt;div id=&#34;balloons-root&#34;&gt;&lt;/div&gt;&#xA;    &lt;div id=&#34;bulbs-root&#34;&gt;&lt;/div&gt;&#xA;&#xA;    &lt;script src=&#34;./animation.js&#34;&gt;&lt;/script&gt;&#xA;&lt;/body&gt;&#xA;&#xA;&lt;/html&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://luochang212.github.io/gadget/how-old-are-you/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/gadget/how-old-are-you/</guid>
      <description>&lt;!DOCTYPE html&gt;&#xA;&lt;html lang=&#34;en&#34;&gt;&#xA;&lt;head&gt;&#xA;&#x9;&lt;meta charset=&#34;UTF-8&#34;&gt;&#xA;&#x9;&lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&gt;&#xA;&#x9;&lt;title&gt;年龄可视化&lt;/title&gt;&#xA;&#x9;&lt;link rel=&#34;stylesheet&#34; href=&#34;style.css&#34;&gt;&#xA;&#x9;&#xA;&lt;/head&gt;&#xA;&lt;body&gt;&#xA;&#x9;&lt;div id=&#34;header&#34;&gt;&#xA;&#x9;&#x9;&lt;div class=&#34;navbar&#34;&gt;&#xA;&#x9;&#x9;&#x9;&lt;a href=&#34;https://luochang212.github.io/&#34;&gt;Home&lt;/a&gt;&#xA;&#x9;&#x9;&#x9;&lt;a href=&#34;https://luochang212.github.io/portfolio/&#34;&gt;Projects&lt;/a&gt;&#xA;&#x9;&#x9;&#x9;&lt;a href=&#34;https://luochang212.github.io/about/&#34;&gt;About&lt;/a&gt;&#xA;&#x9;&#x9;&lt;/div&gt;&#xA;&#x9;&#x9;&lt;!-- &lt;div id=&#34;link&#34;&gt;&lt;a href=&#34;https://github.com/luochang212&#34;&gt;© 2019 Chang Luo&lt;/a&gt;&lt;/div&gt; --&gt;&#xA;&#x9;&lt;/div&gt;&#xA;&#x9;&lt;div id=&#34;container&#34;&gt;&#xA;&#x9;&#x9;&lt;center&gt;&#xA;&#x9;&#x9;&#x9;&lt;br&gt;&#xA;&#x9;&#x9;&#x9;&lt;h1&gt;A 90-Year Human Life in Months&lt;/h1&gt;&#xA;&#x9;&#x9;&#x9;&lt;br&gt;&lt;br&gt;&#xA;&#x9;&#x9;&#x9;Your Age: &lt;input type=&#34;text&#34; id=&#34;your-age&#34;&gt;&#xA;&#x9;&#x9;&#x9;&lt;input type=&#34;button&#34; value=&#34;Submit&#34; onclick=&#34;draw();&#34;&gt;&#xA;&#x9;&#x9;&#x9;&lt;br&gt;&lt;br&gt;&lt;br&gt;&#xA;&#x9;&#x9;&#x9;&lt;div id=&#34;graph-container&#34;&gt;&lt;/div&gt;&#xA;&#x9;&#x9;&#x9;&lt;br&gt;&lt;br&gt;&#xA;&#x9;&#x9;&#x9;Inspired by &lt;a href=&#34;https://waitbutwhy.com/2014/05/life-weeks.html&#34; target=&#34;_blank&#34;&gt;Your Life in Weeks&lt;/a&gt;.&#xA;&#x9;&#x9;&#x9;&lt;br&gt;&lt;br&gt;&lt;br&gt;&#xA;&#x9;&#x9;&lt;/center&gt;&#xA;&#x9;&lt;/div&gt;&#xA;&#x9;&lt;script src=&#34;./script.js&#34;&gt;&lt;/script&gt;&#xA;&lt;/body&gt;&#xA;&lt;/html&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://luochang212.github.io/gadget/hydra/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/gadget/hydra/</guid>
      <description>&lt;!DOCTYPE html&gt;&#xA;&lt;html lang=&#34;en&#34; &gt;&#xA;&lt;head&gt;&#xA;  &lt;meta charset=&#34;UTF-8&#34;&gt;&#xA;  &lt;title&gt;Hydra&lt;/title&gt;&#xA;&lt;/head&gt;&#xA;hydra&#xA;&lt;body&gt;&#xA;  &lt;button class=&#39;glowing-btn&#39;&gt;&lt;span class=&#39;glowing-txt&#39;&gt;H&lt;/H1&gt;&lt;span class=&#39;faulty-letter&#39;&gt;Y&lt;/span&gt;DRA&lt;/span&gt;&lt;/button&gt;&#xA;&lt;/body&gt;&#xA;&#xA;&lt;style&gt;&#xA;  @import url(&#34;https://fonts.googleapis.com/css?family=Raleway&#34;);&#xA;&#xA;  :root {&#xA;    --glow-color: hsl(186 100% 69%);&#xA;  }&#xA;&#xA;  *,&#xA;  *::before,&#xA;  *::after {&#xA;    box-sizing: border-box;&#xA;  }&#xA;&#xA;  html,&#xA;  body {&#xA;    height: 100%;&#xA;    width: 100%;&#xA;    overflow: hidden;&#xA;  }&#xA;&#xA;  body {&#xA;    min-height: 100vh;&#xA;    display: flex;&#xA;    justify-content: center;&#xA;    align-items: center;&#xA;    background: black;&#xA;  }&#xA;&#xA;  .glowing-btn {&#xA;    position: relative;&#xA;    color: var(--glow-color);&#xA;    cursor: pointer;&#xA;    padding: 0.35em 1em;&#xA;    border: 0.15em solid var(--glow-color);&#xA;    border-radius: 0.45em;&#xA;    background: none;&#xA;    perspective: 2em;&#xA;    font-family: &#34;Raleway&#34;, sans-serif;&#xA;    font-size: 2em;&#xA;    font-weight: 900;&#xA;    letter-spacing: 1em;&#xA;&#xA;    -webkit-box-shadow: inset 0px 0px 0.5em 0px var(--glow-color),&#xA;      0px 0px 0.5em 0px var(--glow-color);&#xA;    -moz-box-shadow: inset 0px 0px 0.5em 0px var(--glow-color),&#xA;      0px 0px 0.5em 0px var(--glow-color);&#xA;    box-shadow: inset 0px 0px 0.5em 0px var(--glow-color),&#xA;      0px 0px 0.5em 0px var(--glow-color);&#xA;    animation: border-flicker 2s linear infinite;&#xA;  }&#xA;&#xA;  .glowing-txt {&#xA;    float: left;&#xA;    margin-right: -0.8em;&#xA;    -webkit-text-shadow: 0 0 0.125em hsl(0 0% 100% / 0.3),&#xA;      0 0 0.45em var(--glow-color);&#xA;    -moz-text-shadow: 0 0 0.125em hsl(0 0% 100% / 0.3),&#xA;      0 0 0.45em var(--glow-color);&#xA;    text-shadow: 0 0 0.125em hsl(0 0% 100% / 0.3), 0 0 0.45em var(--glow-color);&#xA;    animation: text-flicker 3s linear infinite;&#xA;  }&#xA;&#xA;  .faulty-letter {&#xA;    opacity: 0.5;&#xA;    animation: faulty-flicker 2s linear infinite;&#xA;  }&#xA;&#xA;  .glowing-btn::before {&#xA;    content: &#34;&#34;;&#xA;    position: absolute;&#xA;    top: 0;&#xA;    bottom: 0;&#xA;    left: 0;&#xA;    right: 0;&#xA;    opacity: 0.7;&#xA;    filter: blur(1em);&#xA;    transform: translateY(120%) rotateX(95deg) scale(1, 0.35);&#xA;    background: var(--glow-color);&#xA;    pointer-events: none;&#xA;  }&#xA;&#xA;  .glowing-btn::after {&#xA;    content: &#34;&#34;;&#xA;    position: absolute;&#xA;    top: 0;&#xA;    left: 0;&#xA;    right: 0;&#xA;    bottom: 0;&#xA;    opacity: 0;&#xA;    z-index: -1;&#xA;    background-color: var(--glow-color);&#xA;    box-shadow: 0 0 2em 0.2em var(--glow-color);&#xA;    transition: opacity 100ms linear;&#xA;  }&#xA;&#xA;  .glowing-btn:hover {&#xA;    color: rgba(0, 0, 0, 0.8);&#xA;    text-shadow: none;&#xA;    animation: none;&#xA;  }&#xA;&#xA;  .glowing-btn:hover .glowing-txt {&#xA;    animation: none;&#xA;  }&#xA;&#xA;  .glowing-btn:hover .faulty-letter {&#xA;    animation: none;&#xA;    text-shadow: none;&#xA;    opacity: 1;&#xA;  }&#xA;&#xA;  .glowing-btn:hover:before {&#xA;    filter: blur(1.5em);&#xA;    opacity: 1;&#xA;  }&#xA;&#xA;  .glowing-btn:hover:after {&#xA;    opacity: 1;&#xA;  }&#xA;&#xA;  @keyframes faulty-flicker {&#xA;    0% {&#xA;      opacity: 0.1;&#xA;    }&#xA;    2% {&#xA;      opacity: 0.1;&#xA;    }&#xA;    4% {&#xA;      opacity: 0.5;&#xA;    }&#xA;    19% {&#xA;      opacity: 0.5;&#xA;    }&#xA;    21% {&#xA;      opacity: 0.1;&#xA;    }&#xA;    23% {&#xA;      opacity: 1;&#xA;    }&#xA;    80% {&#xA;      opacity: 0.5;&#xA;    }&#xA;    83% {&#xA;      opacity: 0.4;&#xA;    }&#xA;&#xA;    87% {&#xA;      opacity: 1;&#xA;    }&#xA;  }&#xA;&#xA;  @keyframes text-flicker {&#xA;    0% {&#xA;      opacity: 0.1;&#xA;    }&#xA;&#xA;    2% {&#xA;      opacity: 1;&#xA;    }&#xA;&#xA;    8% {&#xA;      opacity: 0.1;&#xA;    }&#xA;&#xA;    9% {&#xA;      opacity: 1;&#xA;    }&#xA;&#xA;    12% {&#xA;      opacity: 0.1;&#xA;    }&#xA;    20% {&#xA;      opacity: 1;&#xA;    }&#xA;    25% {&#xA;      opacity: 0.3;&#xA;    }&#xA;    30% {&#xA;      opacity: 1;&#xA;    }&#xA;&#xA;    70% {&#xA;      opacity: 0.7;&#xA;    }&#xA;    72% {&#xA;      opacity: 0.2;&#xA;    }&#xA;&#xA;    77% {&#xA;      opacity: 0.9;&#xA;    }&#xA;    100% {&#xA;      opacity: 0.9;&#xA;    }&#xA;  }&#xA;&#xA;  @keyframes border-flicker {&#xA;    0% {&#xA;      opacity: 0.1;&#xA;    }&#xA;    2% {&#xA;      opacity: 1;&#xA;    }&#xA;    4% {&#xA;      opacity: 0.1;&#xA;    }&#xA;&#xA;    8% {&#xA;      opacity: 1;&#xA;    }&#xA;    70% {&#xA;      opacity: 0.7;&#xA;    }&#xA;    100% {&#xA;      opacity: 1;&#xA;    }&#xA;  }&#xA;&#xA;  @media only screen and (max-width: 600px) {&#xA;    .glowing-btn{&#xA;      font-size: 1em;&#xA;    }&#xA;  }&#xA;&lt;/style&gt;&#xA;&lt;/html&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://luochang212.github.io/gadget/live2d/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/gadget/live2d/</guid>
      <description>&lt;!DOCTYPE html&gt;&#xA;&lt;html&gt;&#xA;&lt;head&gt;&#xA;    &lt;meta charset=&#34;utf-8&#34;&gt;&#xA;&#x9;&lt;title&gt;Live2D！&lt;/title&gt;&#xA;    &lt;link rel=&#34;stylesheet&#34; href=&#34;https://luochang212.github.io/gadget/live2d/live2d/css/live2d.css&#34; /&gt;&#xA;&lt;/head&gt;&#xA;&lt;body&gt;&#xA;&lt;div id=&#34;landlord&#34;&gt;&#xA;    &lt;div class=&#34;message&#34; style=&#34;opacity:0&#34;&gt;&lt;/div&gt;&#xA;    &lt;canvas id=&#34;live2d&#34; width=&#34;280&#34; height=&#34;525&#34; class=&#34;live2d&#34;&gt;&lt;/canvas&gt;   &#xA;    &lt;div class=&#34;hide-button&#34;&gt;隐藏&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;!-- &lt;script src=&#34;https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js&#34;&gt;&lt;/script&gt; --&gt;&#xA;&lt;script src=&#34;https://upcdn.b0.upaiyun.com/libs/jquery/jquery-2.0.3.min.js&#34;&gt;&lt;/script&gt;&#xA;&lt;script type=&#34;text/javascript&#34;&gt;&#xA;    var message_Path = &#39;/live2d/&#39;&#xA;    var home_Path = &#39;http://localhost&#39;&#xA;&lt;/script&gt;&#xA;&lt;script type=&#34;text/javascript&#34; src=&#34;https://luochang212.github.io/gadget/live2d/live2d/js/live2d.js&#34;&gt;&lt;/script&gt;&#xA;&lt;script type=&#34;text/javascript&#34; src=&#34;https://luochang212.github.io/gadget/live2d/live2d/js/message.js&#34;&gt;&lt;/script&gt;&#xA;&lt;script type=&#34;text/javascript&#34;&gt;&#xA;    loadlive2d(&#34;live2d&#34;, &#34;/gadget/live2d/live2d/model/live2d-widget-model-shizuku/assets/shizuku.model.json&#34;);&#xA;&lt;/script&gt;&#xA;&lt;/body&gt;&#xA;&lt;/html&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://luochang212.github.io/gadget/monaco-speech-editor/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/gadget/monaco-speech-editor/</guid>
      <description>&lt;!DOCTYPE html&gt;&#xA;&lt;html&gt;&#xA;&#xA;&lt;head&gt;&#xA;    &lt;title&gt;Monaco Speech Editor&lt;/title&gt;&#xA;    &lt;meta http-equiv=&#34;X-UA-Compatible&#34; content=&#34;IE=edge&#34; /&gt;&#xA;    &lt;meta http-equiv=&#34;Content-Type&#34; content=&#34;text/html;charset=utf-8&#34;&gt;&#xA;    &lt;meta name=&#34;description&#34; content=&#34;online code editor&#34;&gt;&#xA;    &lt;meta name=&#34;keywords&#34; content=&#34;speech,editor,code editor,blind,visually impaired,accessibility,JavaScript&#34;&gt;&#xA;    &lt;meta name=&#34;author&#34; content=&#34;Chang Luo&#34;&gt;&#xA;    &lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&gt;&#xA;    &lt;link rel=&#34;stylesheet&#34; href=&#34;./src/style.css&#34;&gt;&#xA;    &lt;link rel=&#34;shortcut icon&#34; type=&#34;image/png&#34; href=&#34;./images/logo-1.jpeg&#34;&gt;&#xA;    &lt;script src=&#34;https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js&#34;&gt;&lt;/script&gt;&#xA;    &lt;script&gt;&#xA;        // Check before leave website&#xA;        window.addEventListener(&#39;beforeunload&#39;, function (e) {&#xA;            // Cancel the event&#xA;            e.preventDefault();&#xA;            // Chrome requires returnValue to be set&#xA;            e.returnValue = &#39;Do you sure&#39;;&#xA;        });&#xA;    &lt;/script&gt;&#xA;&lt;/head&gt;&#xA;&#xA;&lt;body&gt;&#xA;    &lt;div id=&#34;header&#34;&gt;&#xA;        &lt;div id=&#34;show-file-name&#34;&gt;&#xA;            &lt;input class=&#34;textarea-readonly&#34; id=&#34;editable-textarea&#34; readonly value=&#34;Untitled-1&#34; /&gt;&#xA;        &lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;&#xA;    &lt;div id=&#34;left-nav&#34;&gt;&#xA;        &lt;div role=button class=&#34;left-nav-button&#34; id=&#34;left-nav-button-1&#34; onclick=&#34;clickLeftNav(event, &#39;sidebar-1&#39;)&#34;&gt;&#xA;            &lt;svg aria-hidden=&#34;true&#34; focusable=&#34;false&#34; data-prefix=&#34;far&#34; data-icon=&#34;file-alt&#34;&#xA;                class=&#34;svg-inline--fa fa-file-alt fa-w-12&#34; role=&#34;img&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;                viewBox=&#34;0 0 384 512&#34;&gt;&#xA;                &lt;path fill=&#34;currentColor&#34;&#xA;                    d=&#34;M288 248v28c0 6.6-5.4 12-12 12H108c-6.6 0-12-5.4-12-12v-28c0-6.6 5.4-12 12-12h168c6.6 0 12 5.4 12 12zm-12 72H108c-6.6 0-12 5.4-12 12v28c0 6.6 5.4 12 12 12h168c6.6 0 12-5.4 12-12v-28c0-6.6-5.4-12-12-12zm108-188.1V464c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V48C0 21.5 21.5 0 48 0h204.1C264.8 0 277 5.1 286 14.1L369.9 98c9 8.9 14.1 21.2 14.1 33.9zm-128-80V128h76.1L256 51.9zM336 464V176H232c-13.3 0-24-10.7-24-24V48H48v416h288z&#34;&gt;&#xA;                &lt;/path&gt;&#xA;            &lt;/svg&gt;&#xA;        &lt;/div&gt;&#xA;&#xA;        &lt;div role=button class=&#34;left-nav-button&#34; id=&#34;left-nav-button-2&#34; onclick=&#34;clickLeftNav(event, &#39;sidebar-2&#39;)&#34;&gt;&#xA;            &lt;svg aria-hidden=&#34;true&#34; focusable=&#34;false&#34; data-prefix=&#34;fas&#34; data-icon=&#34;upload&#34;&#xA;                class=&#34;svg-inline--fa fa-upload fa-w-16&#34; role=&#34;img&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;                viewBox=&#34;0 0 512 512&#34;&gt;&#xA;                &lt;path fill=&#34;currentColor&#34;&#xA;                    d=&#34;M296 384h-80c-13.3 0-24-10.7-24-24V192h-87.7c-17.8 0-26.7-21.5-14.1-34.1L242.3 5.7c7.5-7.5 19.8-7.5 27.3 0l152.2 152.2c12.6 12.6 3.7 34.1-14.1 34.1H320v168c0 13.3-10.7 24-24 24zm216-8v112c0 13.3-10.7 24-24 24H24c-13.3 0-24-10.7-24-24V376c0-13.3 10.7-24 24-24h136v8c0 30.9 25.1 56 56 56h80c30.9 0 56-25.1 56-56v-8h136c13.3 0 24 10.7 24 24zm-124 88c0-11-9-20-20-20s-20 9-20 20 9 20 20 20 20-9 20-20zm64 0c0-11-9-20-20-20s-20 9-20 20 9 20 20 20 20-9 20-20z&#34;&gt;&#xA;                &lt;/path&gt;&#xA;            &lt;/svg&gt;&#xA;        &lt;/div&gt;&#xA;&#xA;        &lt;div role=button class=&#34;left-nav-button&#34; id=&#34;left-nav-button-3&#34; onclick=&#34;clickLeftNav(event, &#39;sidebar-3&#39;)&#34;&gt;&#xA;            &lt;svg aria-hidden=&#34;true&#34; focusable=&#34;false&#34; data-prefix=&#34;fas&#34; data-icon=&#34;tools&#34;&#xA;                class=&#34;svg-inline--fa fa-tools fa-w-16&#34; role=&#34;img&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;                viewBox=&#34;0 0 512 512&#34;&gt;&#xA;                &lt;path fill=&#34;currentColor&#34;&#xA;                    d=&#34;M501.1 395.7L384 278.6c-23.1-23.1-57.6-27.6-85.4-13.9L192 158.1V96L64 0 0 64l96 128h62.1l106.6 106.6c-13.6 27.8-9.2 62.3 13.9 85.4l117.1 117.1c14.6 14.6 38.2 14.6 52.7 0l52.7-52.7c14.5-14.6 14.5-38.2 0-52.7zM331.7 225c28.3 0 54.9 11 74.9 31l19.4 19.4c15.8-6.9 30.8-16.5 43.8-29.5 37.1-37.1 49.7-89.3 37.9-136.7-2.2-9-13.5-12.1-20.1-5.5l-74.4 74.4-67.9-11.3L334 98.9l74.4-74.4c6.6-6.6 3.4-17.9-5.7-20.2-47.4-11.7-99.6.9-136.6 37.9-28.5 28.5-41.9 66.1-41.2 103.6l82.1 82.1c8.1-1.9 16.5-2.9 24.7-2.9zm-103.9 82l-56.7-56.7L18.7 402.8c-25 25-25 65.5 0 90.5s65.5 25 90.5 0l123.6-123.6c-7.6-19.9-9.9-41.6-5-62.7zM64 472c-13.2 0-24-10.8-24-24 0-13.3 10.7-24 24-24s24 10.7 24 24c0 13.2-10.7 24-24 24z&#34;&gt;&#xA;                &lt;/path&gt;&#xA;            &lt;/svg&gt;&#xA;        &lt;/div&gt;&#xA;&#xA;        &lt;div role=button class=&#34;left-nav-button&#34; id=&#34;left-nav-button-4&#34; onclick=&#34;clickLeftNav(event, &#39;sidebar-4&#39;)&#34;&gt;&#xA;            &lt;svg aria-hidden=&#34;true&#34; focusable=&#34;false&#34; data-prefix=&#34;fas&#34; data-icon=&#34;cog&#34;&#xA;                class=&#34;svg-inline--fa fa-cog fa-w-16&#34; role=&#34;img&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;                viewBox=&#34;0 0 512 512&#34;&gt;&#xA;                &lt;path fill=&#34;currentColor&#34;&#xA;                    d=&#34;M487.4 315.7l-42.6-24.6c4.3-23.2 4.3-47 0-70.2l42.6-24.6c4.9-2.8 7.1-8.6 5.5-14-11.1-35.6-30-67.8-54.7-94.6-3.8-4.1-10-5.1-14.8-2.3L380.8 110c-17.9-15.4-38.5-27.3-60.8-35.1V25.8c0-5.6-3.9-10.5-9.4-11.7-36.7-8.2-74.3-7.8-109.2 0-5.5 1.2-9.4 6.1-9.4 11.7V75c-22.2 7.9-42.8 19.8-60.8 35.1L88.7 85.5c-4.9-2.8-11-1.9-14.8 2.3-24.7 26.7-43.6 58.9-54.7 94.6-1.7 5.4.6 11.2 5.5 14L67.3 221c-4.3 23.2-4.3 47 0 70.2l-42.6 24.6c-4.9 2.8-7.1 8.6-5.5 14 11.1 35.6 30 67.8 54.7 94.6 3.8 4.1 10 5.1 14.8 2.3l42.6-24.6c17.9 15.4 38.5 27.3 60.8 35.1v49.2c0 5.6 3.9 10.5 9.4 11.7 36.7 8.2 74.3 7.8 109.2 0 5.5-1.2 9.4-6.1 9.4-11.7v-49.2c22.2-7.9 42.8-19.8 60.8-35.1l42.6 24.6c4.9 2.8 11 1.9 14.8-2.3 24.7-26.7 43.6-58.9 54.7-94.6 1.5-5.5-.7-11.3-5.6-14.1zM256 336c-44.1 0-80-35.9-80-80s35.9-80 80-80 80 35.9 80 80-35.9 80-80 80z&#34;&gt;&#xA;                &lt;/path&gt;&#xA;            &lt;/svg&gt;&#xA;        &lt;/div&gt;&#xA;&#xA;        &lt;div id=&#34;github-link&#34;&gt;&#xA;            &lt;a href=&#34;https://github.com/luochang212/monaco-speech-editor&#34; target=&#34;_blank&#34;&gt;&lt;img&#xA;                    src=&#34;./images/GitHub-Mark-Light-64px.png&#34; alt=&#34;github&#34;&gt;&lt;/a&gt;&#xA;        &lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;&#xA;    &lt;div id=&#34;left-sidebar&#34;&gt;&#xA;&#xA;        &lt;div id=&#34;sidebar-1&#34; class=&#34;tabcontent&#34;&gt;&#xA;            &lt;div class=&#34;sidebar-top-title&#34;&gt;&#xA;                &lt;p&gt;Explorer&lt;/p&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://luochang212.github.io/gadget/mozi/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/gadget/mozi/</guid>
      <description>&lt;!DOCTYPE html&gt;&#xA;&lt;!--[if lt IE 7 ]&gt;&lt;html class=&#34;ie ie6&#34; lang=&#34;en&#34;&gt; &lt;![endif]--&gt;&#xA;&lt;!--[if IE 7 ]&gt;&lt;html class=&#34;ie ie7&#34; lang=&#34;en&#34;&gt; &lt;![endif]--&gt;&#xA;&lt;!--[if IE 8 ]&gt;&lt;html class=&#34;ie ie8&#34; lang=&#34;en&#34;&gt; &lt;![endif]--&gt;&#xA;&lt;!--[if (gte IE 9)|!(IE)]&gt;&lt;!--&gt;&#xA;&lt;html lang=&#34;en&#34;&gt;&#xA;&lt;!--&lt;![endif]--&gt;&#xA;&#xA;&lt;head&gt;&#xA;&#xA;    &lt;meta charset=&#34;utf-8&#34;&gt;&#xA;    &lt;meta http-equiv=&#34;X-UA-Compatible&#34; content=&#34;IE=edge&#34;&gt;&#xA;    &lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1, maximum-scale=1&#34;&gt;&#xA;    &lt;meta name=&#34;description&#34; content=&#34;读书笔记&#34;&gt;&#xA;    &lt;meta name=&#34;author&#34; content=&#34;Chang Luo&#34;&gt;&#xA;    &lt;meta name=&#34;keywords&#34; content=&#34;墨子&#34;&gt;&#xA;    &#xA;    &lt;title&gt;墨子 | 读书笔记&lt;/title&gt;&#xA;    &#xA;    &lt;link rel=&#34;shortcut icon&#34; href=&#34;https://luochang212.github.io/doc/images/favicon.ico&#34; type=&#34;image/x-icon&#34;&gt;&#xA;    &#xA;    &lt;link rel=&#34;stylesheet&#34; type=&#34;text/css&#34; href=&#34;https://luochang212.github.io/doc/fonts/font-awesome-4.3.0/css/font-awesome.min.css&#34;&gt;&#xA;    &lt;link rel=&#34;stylesheet&#34; type=&#34;text/css&#34; href=&#34;https://luochang212.github.io/doc/css/stroke.css&#34;&gt;&#xA;    &lt;link rel=&#34;stylesheet&#34; type=&#34;text/css&#34; href=&#34;https://luochang212.github.io/doc/css/bootstrap.css&#34;&gt;&#xA;    &lt;link rel=&#34;stylesheet&#34; type=&#34;text/css&#34; href=&#34;https://luochang212.github.io/doc/css/animate.css&#34;&gt;&#xA;    &lt;link rel=&#34;stylesheet&#34; type=&#34;text/css&#34; href=&#34;https://luochang212.github.io/doc/css/prettyPhoto.css&#34;&gt;&#xA;    &lt;link rel=&#34;stylesheet&#34; type=&#34;text/css&#34; href=&#34;https://luochang212.github.io/doc/css/style.css&#34;&gt;&#xA;    &#xA;    &lt;link rel=&#34;stylesheet&#34; type=&#34;text/css&#34; href=&#34;https://luochang212.github.io/doc/js/syntax-highlighter/styles/shCore.css&#34; media=&#34;all&#34;&gt;&#xA;    &lt;link rel=&#34;stylesheet&#34; type=&#34;text/css&#34; href=&#34;https://luochang212.github.io/doc/js/syntax-highlighter/styles/shThemeRDark.css&#34; media=&#34;all&#34;&gt;&#xA;    &#xA;    &lt;!-- CUSTOM --&gt;&#xA;    &lt;link rel=&#34;stylesheet&#34; type=&#34;text/css&#34; href=&#34;https://luochang212.github.io/doc/css/custom.css&#34;&gt;&#xA;    &#xA;    &lt;!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries --&gt;&#xA;    &lt;!--[if lt IE 9]&gt;&#xA;      &lt;script src=&#34;https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js&#34;&gt;&lt;/script&gt;&#xA;      &lt;script src=&#34;https://oss.maxcdn.com/respond/1.4.2/respond.min.js&#34;&gt;&lt;/script&gt;&#xA;    &lt;![endif]--&gt;&#xA;&#xA;&lt;/head&gt;&#xA;&#xA;&lt;body&gt;&#xA;&#xA;    &lt;div id=&#34;wrapper&#34;&gt;&#xA;    &#xA;        &lt;div class=&#34;container&#34;&gt;&#xA;    &#xA;            &lt;section id=&#34;top&#34; class=&#34;section docs-heading&#34;&gt;&#xA;    &#xA;                &lt;div class=&#34;row&#34;&gt;&#xA;                    &lt;div class=&#34;col-md-12&#34;&gt;&#xA;                        &lt;div class=&#34;big-title text-center&#34;&gt;&#xA;                            &lt;h1&gt;墨子&lt;/h1&gt;&#xA;                            &lt;p class=&#34;lead&#34;&gt;原文及读书笔记&lt;/p&gt;&#xA;                        &lt;/div&gt;&#xA;                        &lt;!-- end title --&gt;&#xA;                    &lt;/div&gt;&#xA;                    &lt;!-- end 12 --&gt;&#xA;                &lt;/div&gt;&#xA;                &lt;!-- end row --&gt;&#xA;    &#xA;                &lt;hr&gt;&#xA;    &#xA;            &lt;/section&gt;&#xA;            &lt;!-- end section --&gt;&#xA;    &#xA;            &lt;div class=&#34;row&#34;&gt;&#xA;    &#xA;                &lt;div class=&#34;col-md-3&#34;&gt;&#xA;                    &lt;nav class=&#34;docs-sidebar&#34; data-spy=&#34;affix&#34; data-offset-top=&#34;300&#34; data-offset-bottom=&#34;200&#34; role=&#34;navigation&#34;&gt;&#xA;                        &lt;ul class=&#34;nav&#34;&gt;&#xA;                            &lt;li&gt;&lt;a href=&#34;#line1&#34;&gt;卷一&lt;/a&gt;&#xA;    &#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;ul class=&#34;nav&#34;&gt;&#xA;                                    &lt;li&gt;&lt;a href=&#34;#line1_1&#34;&gt;亲士&lt;/a&gt;&lt;/li&gt;&#xA;                                    &lt;li&gt;&lt;a href=&#34;#line1_2&#34;&gt;修身&lt;/a&gt;&lt;/li&gt;&#xA;                                    &lt;li&gt;&lt;a href=&#34;#line1_3&#34;&gt;所染&lt;/a&gt;&lt;/li&gt;&#xA;                                    &lt;li&gt;&lt;a href=&#34;#line1_4&#34;&gt;法仪&lt;/a&gt;&lt;/li&gt;&#xA;                                    &lt;li&gt;&lt;a href=&#34;#line1_5&#34;&gt;七患&lt;/a&gt;&lt;/li&gt;&#xA;                                    &lt;li&gt;&lt;a href=&#34;#line1_6&#34;&gt;辞过&lt;/a&gt;&lt;/li&gt;&#xA;                                    &lt;li&gt;&lt;a href=&#34;#line1_7&#34;&gt;三辩&lt;/a&gt;&lt;/li&gt;&#xA;                                &lt;/ul&gt;&#xA;    &#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;/li&gt;&#xA;                            &lt;li&gt;&lt;a href=&#34;#line2&#34;&gt;卷二&lt;/a&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;ul class=&#34;nav&#34;&gt;&#xA;                                    &lt;li&gt;&lt;a href=&#34;#line2_1&#34;&gt;尚贤上&lt;/a&gt;&lt;/li&gt;&#xA;                                    &lt;li&gt;&lt;a href=&#34;#line2_2&#34;&gt;尚贤中&lt;/a&gt;&lt;/li&gt;&#xA;                                    &lt;li&gt;&lt;a href=&#34;#line2_3&#34;&gt;尚贤下&lt;/a&gt;&lt;/li&gt;&#xA;                                &lt;/ul&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;/li&gt;&#xA;                            &lt;li&gt;&lt;a href=&#34;#line3&#34;&gt;卷三&lt;/a&gt;&#xA;                                &lt;ul class=&#34;nav&#34;&gt;&#xA;                                    &lt;li&gt;&lt;a href=&#34;#line3_1&#34;&gt;尚同上&lt;/a&gt;&lt;/li&gt;&#xA;                                    &lt;li&gt;&lt;a href=&#34;#line3_2&#34;&gt;尚同中&lt;/a&gt;&lt;/li&gt;&#xA;                                    &lt;li&gt;&lt;a href=&#34;#line3_3&#34;&gt;尚同下&lt;/a&gt;&lt;/li&gt;&#xA;                                &lt;/ul&gt;&#xA;                            &lt;/li&gt;&#xA;                            &lt;li&gt;&lt;a href=&#34;#line4&#34;&gt;卷四&lt;/a&gt;&#xA;                                &lt;ul class=&#34;nav&#34;&gt;&#xA;                                    &lt;li&gt;&lt;a href=&#34;#line4_1&#34;&gt;兼爱上&lt;/a&gt;&lt;/li&gt;&#xA;                                    &lt;li&gt;&lt;a href=&#34;#line4_2&#34;&gt;兼爱中&lt;/a&gt;&lt;/li&gt;&#xA;                                    &lt;li&gt;&lt;a href=&#34;#line4_3&#34;&gt;兼爱下&lt;/a&gt;&lt;/li&gt;&#xA;                                &lt;/ul&gt;&#xA;                            &lt;/li&gt;&#xA;                            &lt;li&gt;&lt;a href=&#34;#line5&#34;&gt;卷五&lt;/a&gt;&#xA;                                &lt;ul class=&#34;nav&#34;&gt;&#xA;                                    &lt;li&gt;&lt;a href=&#34;#line5_1&#34;&gt;非攻上&lt;/a&gt;&lt;/li&gt;&#xA;                                    &lt;li&gt;&lt;a href=&#34;#line5_2&#34;&gt;非攻中&lt;/a&gt;&lt;/li&gt;&#xA;                                    &lt;li&gt;&lt;a href=&#34;#line5_3&#34;&gt;非攻下&lt;/a&gt;&lt;/li&gt;&#xA;                                &lt;/ul&gt;&#xA;                            &lt;/li&gt;&#xA;                            &lt;li&gt;&lt;a href=&#34;#line6&#34;&gt;卷六&lt;/a&gt;&#xA;                                &lt;ul class=&#34;nav&#34;&gt;&#xA;                                    &lt;li&gt;&lt;a href=&#34;#line6_1&#34;&gt;节用上&lt;/a&gt;&lt;/li&gt;&#xA;                                    &lt;li&gt;&lt;a href=&#34;#line6_2&#34;&gt;节用中&lt;/a&gt;&lt;/li&gt;&#xA;                                    &lt;li&gt;&lt;a href=&#34;#line6_3&#34;&gt;节葬下&lt;/a&gt;&lt;/li&gt;&#xA;                                &lt;/ul&gt;&#xA;                            &lt;/li&gt;&#xA;                            &lt;li&gt;&lt;a href=&#34;#line7&#34;&gt;卷七&lt;/a&gt;&#xA;                                &lt;ul class=&#34;nav&#34;&gt;&#xA;                                    &lt;li&gt;&lt;a href=&#34;#line7_1&#34;&gt;天志上&lt;/a&gt;&lt;/li&gt;&#xA;                                    &lt;li&gt;&lt;a href=&#34;#line7_2&#34;&gt;天志中&lt;/a&gt;&lt;/li&gt;&#xA;                                    &lt;li&gt;&lt;a href=&#34;#line7_3&#34;&gt;天志下&lt;/a&gt;&lt;/li&gt;&#xA;                                &lt;/ul&gt;&#xA;                            &lt;/li&gt;&#xA;                            &lt;li&gt;&lt;a href=&#34;#line8&#34;&gt;卷九&lt;/a&gt;&lt;/li&gt;&#xA;                            &lt;li&gt;&lt;a href=&#34;#line9&#34;&gt;卷十&lt;/a&gt;&lt;/li&gt;&#xA;                            &lt;li&gt;&lt;a href=&#34;#line10&#34;&gt;卷十一&lt;/a&gt;&lt;/li&gt;&#xA;                            &lt;li&gt;&lt;a href=&#34;#line11&#34;&gt;卷十二&lt;/a&gt;&lt;/li&gt;&#xA;                        &lt;/ul&gt;&#xA;                    &lt;/nav &gt;&#xA;                &lt;/div&gt;&#xA;                &lt;div class=&#34;col-md-9&#34;&gt;&#xA;                    &lt;section class=&#34;welcome&#34;&gt;&#xA;    &#xA;                        &lt;div class=&#34;row&#34;&gt;&#xA;                            &lt;div class=&#34;col-md-12 left-align&#34;&gt;&#xA;                                &lt;h2 class=&#34;dark-text&#34;&gt;介绍&lt;hr&gt;&lt;/h2&gt;&#xA;                                &lt;div class=&#34;row&#34;&gt;&#xA;    &#xA;                                    &lt;div class=&#34;col-md-12 full&#34;&gt;&#xA;                                        &lt;div class=&#34;intro1&#34;&gt;&#xA;                                            &lt;ul&gt;&#xA;                                                &lt;li&gt;&lt;strong&gt;作者 : &lt;/strong&gt;墨翟&lt;/li&gt;&#xA;                                                &lt;li&gt;&lt;strong&gt;成书时间 : &lt;/strong&gt;[春秋 - 战国] 公元前490年-公元前221年&lt;/li&gt;&#xA;                                                &lt;li&gt;&lt;strong&gt;篇目数量  : &lt;/strong&gt;原有71篇，现存53篇&lt;/a&gt;&lt;/li&gt;&#xA;                                            &lt;/ul&gt;&#xA;                                        &lt;/div&gt;&#xA;    &#xA;                                        &lt;hr&gt;&#xA;                                        &lt;div&gt;&#xA;    &#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;    &#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;p&gt;墨家主张“兼爱”，和西方的“博爱”相似；墨家重视技术，这也与西方不谋而合。在诸子百家中，墨家可能是最接近西方文明的学派。因此，当近代中国在西方的坚船利炮下生灵涂炭之时，中国的学者们不由开始缅怀墨子。倘若当年汉武帝不尊儒而尊墨，或许就能引领中华文明走上一条科技之路，从而免于两千多年后落得一个被列强欺凌的下场。这当然是臆想，但这却让墨家在近代意外走红，引起了关注。&lt;/p&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://luochang212.github.io/gadget/my-first-try/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/gadget/my-first-try/</guid>
      <description>&lt;!DOCTYPE html&gt;&#xA;&lt;html&gt;&#xA;&#xA;&lt;head&gt;&#xA;    &lt;meta charset=&#34;UTF-8&#34;&gt;&#xA;    &lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&gt;&#xA;    &lt;meta http-equiv=&#34;X-UA-Compatible&#34; content=&#34;ie=edge&#34;&gt;&#xA;    &lt;title&gt;Document&lt;/title&gt;&#xA;    &lt;!-- &lt;script crossorigin src=&#34;https://unpkg.com/react-dom@16/umd/react-dom.development.js&#34;&gt;&lt;/script&gt; --&gt;&#xA;    &lt;script crossorigin src=&#34;https://unpkg.com/react@16/umd/react.production.min.js&#34;&gt;&lt;/script&gt;&#xA;    &lt;script crossorigin src=&#34;https://unpkg.com/react-dom@16/umd/react-dom.production.min.js&#34;&gt;&lt;/script&gt;&#xA;    &lt;!-- &lt;script src=&#34;react.js&#34;&gt;&lt;/script&gt;&#xA;    &lt;script src=&#34;react-dom.js&#34;&gt;&lt;/script&gt;&#xA;    &lt;script src=&#34;babel.min.js&#34;&gt;&lt;/script&gt; --&gt;&#xA;&lt;/head&gt;&#xA;&#xA;&lt;body&gt;&#xA;    &lt;div id=&#34;root&#34;&gt;&lt;/div&gt;&#xA;    &lt;script src=&#34;./index.js&#34;&gt;&lt;/script&gt;&#xA;&lt;/body&gt;&#xA;&#xA;&lt;/html&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://luochang212.github.io/gadget/new-to-do-list/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/gadget/new-to-do-list/</guid>
      <description>&lt;!DOCTYPE html&gt;&#xA;&lt;html&gt;&#xA;&lt;head&gt;&#xA;&lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1&#34;&gt;&#xA;&lt;style&gt;&#xA;body {&#xA;  margin: 0;&#xA;  min-width: 250px;&#xA;}&#xA;&#xA;/* Include the padding and border in an element&#39;s total width and height */&#xA;* {&#xA;  box-sizing: border-box;&#xA;}&#xA;&#xA;/* Remove margins and padding from the list */&#xA;ul {&#xA;  margin: 0;&#xA;  padding: 0;&#xA;}&#xA;&#xA;/* Style the list items */&#xA;ul li {&#xA;  cursor: pointer;&#xA;  position: relative;&#xA;  padding: 12px 8px 12px 40px;&#xA;  list-style-type: none;&#xA;  background: #eee;&#xA;  font-size: 18px;&#xA;  transition: 0.2s;&#xA;  &#xA;  /* make the list items unselectable */&#xA;  -webkit-user-select: none;&#xA;  -moz-user-select: none;&#xA;  -ms-user-select: none;&#xA;  user-select: none;&#xA;}&#xA;&#xA;/* Set all odd list items to a different color (zebra-stripes) */&#xA;ul li:nth-child(odd) {&#xA;  background: #f9f9f9;&#xA;}&#xA;&#xA;/* Darker background-color on hover */&#xA;ul li:hover {&#xA;  background: #ddd;&#xA;}&#xA;&#xA;/* When clicked on, add a background color and strike out text */&#xA;ul li.checked {&#xA;  background: #888;&#xA;  color: #fff;&#xA;  text-decoration: line-through;&#xA;}&#xA;&#xA;/* Add a &#34;checked&#34; mark when clicked on */&#xA;ul li.checked::before {&#xA;  content: &#39;&#39;;&#xA;  position: absolute;&#xA;  border-color: #fff;&#xA;  border-style: solid;&#xA;  border-width: 0 2px 2px 0;&#xA;  top: 10px;&#xA;  left: 16px;&#xA;  transform: rotate(45deg);&#xA;  height: 15px;&#xA;  width: 7px;&#xA;}&#xA;&#xA;/* Style the close button */&#xA;.close {&#xA;  position: absolute;&#xA;  right: 0;&#xA;  top: 0;&#xA;  padding: 12px 16px 12px 16px;&#xA;}&#xA;&#xA;.close:hover {&#xA;  background-color: #f44336;&#xA;  color: white;&#xA;}&#xA;&#xA;/* Style the header */&#xA;.header {&#xA;  background-color: #f44336;&#xA;  padding: 30px 40px;&#xA;  color: white;&#xA;  text-align: center;&#xA;}&#xA;&#xA;/* Clear floats after the header */&#xA;.header:after {&#xA;  content: &#34;&#34;;&#xA;  display: table;&#xA;  clear: both;&#xA;}&#xA;&#xA;/* Style the input */&#xA;input {&#xA;  margin: 0;&#xA;  border: none;&#xA;  border-radius: 0;&#xA;  width: 75%;&#xA;  padding: 10px;&#xA;  float: left;&#xA;  font-size: 16px;&#xA;}&#xA;&#xA;/* Style the &#34;Add&#34; button */&#xA;.addBtn {&#xA;  padding: 10px;&#xA;  width: 25%;&#xA;  background: #d9d9d9;&#xA;  color: #555;&#xA;  float: left;&#xA;  text-align: center;&#xA;  font-size: 16px;&#xA;  cursor: pointer;&#xA;  transition: 0.3s;&#xA;  border-radius: 0;&#xA;}&#xA;&#xA;.addBtn:hover {&#xA;  background-color: #bbb;&#xA;}&#xA;&lt;/style&gt;&#xA;&lt;/head&gt;&#xA;&lt;body&gt;&#xA;&#xA;&lt;div id=&#34;myDIV&#34; class=&#34;header&#34;&gt;&#xA;  &lt;h2 style=&#34;margin:5px&#34;&gt;My To Do List&lt;/h2&gt;&#xA;  &lt;input type=&#34;text&#34; onkeydown=&#34;handleEnter(event)&#34; id=&#34;myInput&#34; placeholder=&#34;Title...&#34;&gt;&#xA;  &lt;span onclick=&#34;newElement()&#34; class=&#34;addBtn&#34;&gt;Add&lt;/span&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;ul id=&#34;myUL&#34;&gt;&#xA;&lt;!--  &lt;li&gt;Hit the gym&lt;/li&gt;&#xA;  &lt;li class=&#34;checked&#34;&gt;Pay bills&lt;/li&gt;&#xA;  &lt;li&gt;Meet George&lt;/li&gt;&#xA;  &lt;li&gt;Buy eggs&lt;/li&gt;&#xA;  &lt;li&gt;Read a book&lt;/li&gt;&#xA;  &lt;li&gt;Organize office&lt;/li&gt; --&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;script&gt;&#xA;// Create a &#34;close&#34; button and append it to each list item&#xA;var myNodelist = document.getElementsByTagName(&#34;LI&#34;);&#xA;var i;&#xA;for (i = 0; i &lt; myNodelist.length; i++) {&#xA;  var span = document.createElement(&#34;SPAN&#34;);&#xA;  var txt = document.createTextNode(&#34;\u00D7&#34;);&#xA;  span.className = &#34;close&#34;;&#xA;  span.appendChild(txt);&#xA;  myNodelist[i].appendChild(span);&#xA;}&#xA;&#xA;// Click on a close button to hide the current list item&#xA;var close = document.getElementsByClassName(&#34;close&#34;);&#xA;var i;&#xA;for (i = 0; i &lt; close.length; i++) {&#xA;  close[i].onclick = function() {&#xA;    var div = this.parentElement;&#xA;    div.style.display = &#34;none&#34;;&#xA;  }&#xA;}&#xA;&#xA;// Add a &#34;checked&#34; symbol when clicking on a list item&#xA;var list = document.querySelector(&#39;ul&#39;);&#xA;list.addEventListener(&#39;click&#39;, function(ev) {&#xA;  if (ev.target.tagName === &#39;LI&#39;) {&#xA;    ev.target.classList.toggle(&#39;checked&#39;);&#xA;  }&#xA;}, false);&#xA;&#xA;// Create a new list item when clicking on the &#34;Add&#34; button&#xA;function newElement() {&#xA;  var li = document.createElement(&#34;li&#34;);&#xA;  var inputValue = document.getElementById(&#34;myInput&#34;).value;&#xA;  var t = document.createTextNode(inputValue);&#xA;  li.appendChild(t);&#xA;  if (inputValue === &#39;&#39;) {&#xA;    alert(&#34;You must write something!&#34;);&#xA;  } else {&#xA;    document.getElementById(&#34;myUL&#34;).appendChild(li);&#xA;  }&#xA;  document.getElementById(&#34;myInput&#34;).value = &#34;&#34;;&#xA;&#xA;  var span = document.createElement(&#34;SPAN&#34;);&#xA;  var txt = document.createTextNode(&#34;\u00D7&#34;);&#xA;  span.className = &#34;close&#34;;&#xA;  span.appendChild(txt);&#xA;  li.appendChild(span);&#xA;&#xA;  for (i = 0; i &lt; close.length; i++) {&#xA;    close[i].onclick = function() {&#xA;      var div = this.parentElement;&#xA;      div.style.display = &#34;none&#34;;&#xA;    }&#xA;  }&#xA;}&#xA;&#xA;function handleEnter(event) {&#xA;&#x9;if (event.keyCode == 13 &amp;&amp; !event.shiftKey) {&#xA;&#x9;&#x9;newElement();&#xA;&#x9;}&#xA;}&#xA;&lt;/script&gt;&#xA;&#xA;&lt;/body&gt;&#xA;&lt;/html&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://luochang212.github.io/gadget/piano/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/gadget/piano/</guid>
      <description>&lt;body&gt;&#xA;  &lt;section id=&#34;wrap&#34;&gt;&#xA;    &lt;header&gt;&#xA;      &lt;h1&gt;JS Piano&lt;/h1&gt;&#xA;      &lt;h2&gt;Use your keyboard. Hover for hints.&lt;/h2&gt;&#xA;&#x9;  &#xA;&#x9;&lt;style type=&#34;text/css&#34;&gt;&#xA;&#x9;html  {&#xA;        background: #000;&#xA;        font-family: &#39;Noto Serif&#39;, serif;&#xA;        -webkit-font-smoothing: antialiased;&#xA;        text-align: center;&#xA;    }&#xA;&#xA;    video#bgvid { &#xA;        position: fixed;&#xA;        top: 50%;&#xA;        left: 50%;&#xA;        min-width: 100%;&#xA;        min-height: 100%;&#xA;        width: auto;&#xA;        height: auto;&#xA;        z-index: -100;&#xA;        transform: translateX(-50%) translateY(-50%);&#xA;        background-size: cover; &#xA;    }&#xA;&#xA;    header {&#xA;      position: relative;&#xA;      margin: 30px 0;&#xA;    }&#xA;&#xA;    header:after {&#xA;      content: &#39;&#39;;&#xA;      width: 460px;&#xA;      height: 15px;&#xA;      background: url(images/intro-div.svg) no-repeat center;&#xA;      display: inline-block;&#xA;      text-align: center;&#xA;      background-size: 70%;&#xA;    }&#xA;&#xA;    h1 {&#xA;      color: #fff;&#xA;      font-size: 50px;&#xA;      font-weight: 400;&#xA;      letter-spacing: 0.18em;&#xA;      text-transform: uppercase;&#xA;      margin: 0;&#xA;    }&#xA;&#xA;    h2 {&#xA;      color: #fff;&#xA;      font-size: 24px;&#xA;      font-style: italic;&#xA;      font-weight: 400;&#xA;      margin: 0 0 30px;&#xA;    }&#xA;&#xA;    .nowplaying {&#xA;      font-size: 120px;&#xA;      line-height: 1;&#xA;      color: #eee;&#xA;      text-shadow: 0 0 5rem #028ae9;&#xA;      transition: all .07s ease;&#xA;      min-height: 120px;&#xA;    }&#xA;&#xA;    .keys {&#xA;      display: block;&#xA;      width: 100%;&#xA;      height: 350px;&#xA;      max-width: 880px;&#xA;      position: relative;&#xA;      margin: 40px auto 0;&#xA;      cursor: none;&#xA;    }&#xA;&#xA;    .key {&#xA;      position: relative;&#xA;      border: 4px solid black;&#xA;      border-radius: .5rem;&#xA;      transition: all .07s ease;&#xA;      display: block;&#xA;      box-sizing: border-box;&#xA;      z-index: 2;&#xA;    }&#xA;&#xA;    .key:not(.sharp) {&#xA;      float: left;&#xA;      width: 10%;&#xA;      height: 100%;&#xA;      background: rgba(255, 255, 255, .8);    &#xA;    }&#xA;&#xA;    .key.sharp {&#xA;      position: absolute;&#xA;      width: 6%;&#xA;      height: 60%;&#xA;      background: #000;&#xA;      color: #eee;&#xA;      top: 0;&#xA;      z-index: 3;&#xA;    }&#xA;&#xA;    .key[data-key=&#34;87&#34;] {&#xA;      left: 7%;&#xA;    }&#xA;&#xA;    .key[data-key=&#34;69&#34;] {&#xA;      left: 17%;&#xA;    }&#xA;&#xA;    .key[data-key=&#34;84&#34;]  {&#xA;      left: 37%;&#xA;    }&#xA;&#xA;    .key[data-key=&#34;89&#34;] {&#xA;      left: 47%;&#xA;    }&#xA;&#xA;    .key[data-key=&#34;85&#34;] {&#xA;      left: 57%;    &#xA;    }&#xA;&#xA;    .key[data-key=&#34;79&#34;] {&#xA;      left: 77%;    &#xA;    }&#xA;&#xA;    .key[data-key=&#34;80&#34;] {&#xA;      left: 87%;    &#xA;    }&#xA;&#xA;    .playing {&#xA;      transform: scale(.95);&#xA;      border-color: #028ae9;&#xA;      box-shadow: 0 0 1rem #028ae9;&#xA;    }&#xA;&#xA;    .hints {&#xA;      display: block;&#xA;      width: 100%;&#xA;      opacity: 0;&#xA;      position: absolute;&#xA;      bottom: 7px;&#xA;      transition: opacity .3s ease-out;&#xA;      font-size: 20px;&#xA;    }&#xA;&#xA;    .keys:hover .hints {&#xA;      opacity: 1;&#xA;    }&#xA;&#x9;&lt;/style&gt;&#xA;&#x9;  &#xA;&#x9;  &#xA;    &lt;/header&gt;&#xA;    &lt;section id=&#34;main&#34;&gt;&#xA;      &lt;div class=&#34;nowplaying&#34;&gt;&lt;/div&gt;&#xA;      &lt;div class=&#34;keys&#34;&gt;&#xA;        &lt;div data-key=&#34;65&#34; class=&#34;key&#34; data-note=&#34;C&#34;&gt;&#xA;            &lt;span class=&#34;hints&#34;&gt;A&lt;/span&gt;&#xA;        &lt;/div&gt;&#xA;        &lt;div data-key=&#34;87&#34; class=&#34;key sharp&#34; data-note=&#34;C#&#34;&gt;&#xA;            &lt;span class=&#34;hints&#34;&gt;W&lt;/span&gt;&#xA;        &lt;/div&gt;&#xA;        &lt;div data-key=&#34;83&#34; class=&#34;key&#34; data-note=&#34;D&#34;&gt;&#xA;            &lt;span class=&#34;hints&#34;&gt;S&lt;/span&gt;&#xA;        &lt;/div&gt;&#xA;        &lt;div data-key=&#34;69&#34; class=&#34;key sharp&#34; data-note=&#34;D#&#34;&gt;&#xA;            &lt;span class=&#34;hints&#34;&gt;E&lt;/span&gt;&#xA;        &lt;/div&gt;&#xA;        &lt;div data-key=&#34;68&#34; class=&#34;key&#34; data-note=&#34;E&#34;&gt;&#xA;            &lt;span class=&#34;hints&#34;&gt;D&lt;/span&gt;&#xA;        &lt;/div&gt;&#xA;        &lt;div data-key=&#34;70&#34; class=&#34;key&#34; data-note=&#34;F&#34;&gt;&#xA;            &lt;span class=&#34;hints&#34;&gt;F&lt;/span&gt;&#xA;        &lt;/div&gt;&#xA;        &lt;div data-key=&#34;84&#34; class=&#34;key sharp&#34; data-note=&#34;F#&#34;&gt;&#xA;            &lt;span class=&#34;hints&#34;&gt;T&lt;/span&gt;&#xA;        &lt;/div&gt;&#xA;        &lt;div data-key=&#34;71&#34; class=&#34;key&#34; data-note=&#34;G&#34;&gt;&#xA;            &lt;span class=&#34;hints&#34;&gt;G&lt;/span&gt;&#xA;        &lt;/div&gt;&#xA;        &lt;div data-key=&#34;89&#34; class=&#34;key sharp&#34; data-note=&#34;G#&#34;&gt;&#xA;            &lt;span class=&#34;hints&#34;&gt;Y&lt;/span&gt;&#xA;        &lt;/div&gt;&#xA;        &lt;div data-key=&#34;72&#34; class=&#34;key&#34; data-note=&#34;A&#34;&gt;&#xA;            &lt;span class=&#34;hints&#34;&gt;H&lt;/span&gt;&#xA;        &lt;/div&gt;&#xA;        &lt;div data-key=&#34;85&#34; class=&#34;key sharp&#34; data-note=&#34;A#&#34;&gt;&#xA;            &lt;span class=&#34;hints&#34;&gt;U&lt;/span&gt;&#xA;        &lt;/div&gt;&#xA;        &lt;div data-key=&#34;74&#34; class=&#34;key&#34; data-note=&#34;B&#34;&gt;&#xA;            &lt;span class=&#34;hints&#34;&gt;J&lt;/span&gt;&#xA;        &lt;/div&gt;&#xA;        &lt;div data-key=&#34;75&#34; class=&#34;key&#34; data-note=&#34;C&#34;&gt;&#xA;            &lt;span class=&#34;hints&#34;&gt;K&lt;/span&gt;&#xA;        &lt;/div&gt;&#xA;        &lt;div data-key=&#34;79&#34; class=&#34;key sharp&#34; data-note=&#34;C#&#34;&gt;&#xA;            &lt;span class=&#34;hints&#34;&gt;O&lt;/span&gt;&#xA;        &lt;/div&gt;&#xA;        &lt;div data-key=&#34;76&#34; class=&#34;key&#34; data-note=&#34;D&#34;&gt;&#xA;            &lt;span class=&#34;hints&#34;&gt;L&lt;/span&gt;&#xA;        &lt;/div&gt;&#xA;        &lt;div data-key=&#34;80&#34; class=&#34;key sharp&#34; data-note=&#34;D#&#34;&gt;&#xA;            &lt;span class=&#34;hints&#34;&gt;P&lt;/span&gt;&#xA;        &lt;/div&gt;&#xA;        &lt;div data-key=&#34;186&#34; class=&#34;key&#34; data-note=&#34;E&#34;&gt;&#xA;            &lt;span class=&#34;hints&#34;&gt;;&lt;/span&gt;&#xA;        &lt;/div&gt;&#xA;      &lt;/div&gt;&#xA;&#xA;      &lt;audio data-key=&#34;65&#34; src=&#34;http://carolinegabriel.com/demo/js-keyboard/sounds/040.wav&#34;&gt;&lt;/audio&gt;&#xA;      &lt;audio data-key=&#34;87&#34; src=&#34;http://carolinegabriel.com/demo/js-keyboard/sounds/041.wav&#34;&gt;&lt;/audio&gt;&#xA;      &lt;audio data-key=&#34;83&#34; src=&#34;http://carolinegabriel.com/demo/js-keyboard/sounds/042.wav&#34;&gt;&lt;/audio&gt;&#xA;      &lt;audio data-key=&#34;69&#34; src=&#34;http://carolinegabriel.com/demo/js-keyboard/sounds/043.wav&#34;&gt;&lt;/audio&gt;&#xA;      &lt;audio data-key=&#34;68&#34; src=&#34;http://carolinegabriel.com/demo/js-keyboard/sounds/044.wav&#34;&gt;&lt;/audio&gt;&#xA;      &lt;audio data-key=&#34;70&#34; src=&#34;http://carolinegabriel.com/demo/js-keyboard/sounds/045.wav&#34;&gt;&lt;/audio&gt;&#xA;      &lt;audio data-key=&#34;84&#34; src=&#34;http://carolinegabriel.com/demo/js-keyboard/sounds/046.wav&#34;&gt;&lt;/audio&gt;&#xA;      &lt;audio data-key=&#34;71&#34; src=&#34;http://carolinegabriel.com/demo/js-keyboard/sounds/047.wav&#34;&gt;&lt;/audio&gt;&#xA;      &lt;audio data-key=&#34;89&#34; src=&#34;http://carolinegabriel.com/demo/js-keyboard/sounds/048.wav&#34;&gt;&lt;/audio&gt;&#xA;      &lt;audio data-key=&#34;72&#34; src=&#34;http://carolinegabriel.com/demo/js-keyboard/sounds/049.wav&#34;&gt;&lt;/audio&gt;&#xA;      &lt;audio data-key=&#34;85&#34; src=&#34;http://carolinegabriel.com/demo/js-keyboard/sounds/050.wav&#34;&gt;&lt;/audio&gt;&#xA;      &lt;audio data-key=&#34;74&#34; src=&#34;http://carolinegabriel.com/demo/js-keyboard/sounds/051.wav&#34;&gt;&lt;/audio&gt;&#xA;      &lt;audio data-key=&#34;75&#34; src=&#34;http://carolinegabriel.com/demo/js-keyboard/sounds/052.wav&#34;&gt;&lt;/audio&gt;&#xA;      &lt;audio data-key=&#34;79&#34; src=&#34;http://carolinegabriel.com/demo/js-keyboard/sounds/053.wav&#34;&gt;&lt;/audio&gt;&#xA;      &lt;audio data-key=&#34;76&#34; src=&#34;http://carolinegabriel.com/demo/js-keyboard/sounds/054.wav&#34;&gt;&lt;/audio&gt;&#xA;      &lt;audio data-key=&#34;80&#34; src=&#34;http://carolinegabriel.com/demo/js-keyboard/sounds/055.wav&#34;&gt;&lt;/audio&gt;&#xA;      &lt;audio data-key=&#34;186&#34; src=&#34;http://carolinegabriel.com/demo/js-keyboard/sounds/056.wav&#34;&gt;&lt;/audio&gt;&#xA;      &lt;/section&gt;&#xA;  &lt;/section&gt;&#xA;  &lt;video playsinline autoplay muted loop id=&#34;bgvid&#34; poster=&#34;http://carolinegabriel.com/demo/js-keyboard/video/bg.jpg&#34;&gt;&#xA;      &lt;source src=&#34;http://carolinegabriel.com/demo/js-keyboard/video/bg.mp4&#34; type=&#34;video/mp4&#34;&gt;&#xA;  &lt;/video&gt;&#xA;  &#xA;&lt;script&gt;&#xA;const keys = document.querySelectorAll(&#34;.key&#34;),&#xA;  note = document.querySelector(&#34;.nowplaying&#34;),&#xA;  hints = document.querySelectorAll(&#34;.hints&#34;);&#xA;&#xA;function playNote(e) {&#xA;  const audio = document.querySelector(`audio[data-key=&#34;${e.keyCode}&#34;]`),&#xA;    key = document.querySelector(`.key[data-key=&#34;${e.keyCode}&#34;]`);&#xA;&#xA;  if (!key) return;&#xA;&#xA;  const keyNote = key.getAttribute(&#34;data-note&#34;);&#xA;&#xA;  key.classList.add(&#34;playing&#34;);&#xA;  note.innerHTML = keyNote;&#xA;  audio.currentTime = 0;&#xA;  audio.play();&#xA;}&#xA;&#xA;function removeTransition(e) {&#xA;  if (e.propertyName !== &#34;transform&#34;) return;&#xA;  this.classList.remove(&#34;playing&#34;);&#xA;}&#xA;&#xA;function hintsOn(e, index) {&#xA;  e.setAttribute(&#34;style&#34;, &#34;transition-delay:&#34; + index * 50 + &#34;ms&#34;);&#xA;}&#xA;&#xA;hints.forEach(hintsOn);&#xA;&#xA;keys.forEach(key =&gt; key.addEventListener(&#34;transitionend&#34;, removeTransition));&#xA;&#xA;window.addEventListener(&#34;keydown&#34;, playNote);&#xA;&#xA;&lt;/script&gt;&#xA;  &lt;/body&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://luochang212.github.io/gadget/plan/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/gadget/plan/</guid>
      <description>&lt;!DOCTYPE html&gt;&#xA;&lt;html lang=&#34;en&#34;&gt;&#xA;&#xA;&lt;head&gt;&#xA;    &lt;meta charset=&#34;UTF-8&#34;&gt;&#xA;    &lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&gt;&#xA;    &lt;meta http-equiv=&#34;X-UA-Compatible&#34; content=&#34;ie=edge&#34;&gt;&#xA;    &lt;title&gt;Plan&lt;/title&gt;&#xA;    &lt;style&gt;&#xA;        body {&#xA;            font-family: &#34;Source Han Sans&#34;, &#34;San Francisco&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Droid Sans Fallback&#34;, &#34;Microsoft YaHei&#34;, &#34;sans-serif&#34;;&#xA;            font-size: 17px;&#xA;            margin: 0;&#xA;        }&#xA;&#xA;        #header {&#xA;            position: relative;&#xA;            top: 0px;&#xA;            left: 0px;&#xA;            width: 100%;&#xA;            height: 50px;&#xA;            background: #333333;&#xA;            box-shadow: 0 1px 2px rgba(0, 0, 0, 0.5);&#xA;            z-index: 2;&#xA;        }&#xA;&#xA;        .navbar {&#xA;            position: relative;&#xA;            margin-left: 10%;&#xA;            color: white;&#xA;            font-size: 1.25rem;&#xA;        }&#xA;&#xA;        .figure {&#xA;            position: relative;&#xA;            width: 80%;&#xA;        }&#xA;&#xA;        .container {&#xA;            position: relative;&#xA;            width: 80%;&#xA;            max-width: 960px;&#xA;            padding: 0 50px 0 50px;&#xA;            margin: 0 auto;&#xA;            overflow-x: hidden;&#xA;            text-align: center;&#xA;        }&#xA;&#xA;        .container h3, p {&#xA;            text-align: left;&#xA;        }&#xA;&#xA;        .container ol {&#xA;            text-align: left;&#xA;            font-family: &#39;Lato&#39;, san-serif;&#xA;            font-size: 17px;&#xA;        }&#xA;&#xA;        .dropbtn {&#xA;            background-color: transparent;&#xA;            color: white;&#xA;            padding: 16px;&#xA;            font-size: 18px;&#xA;            border: none;&#xA;            outline: none;&#xA;        }&#xA;&#xA;        .dropup {&#xA;            position: relative;&#xA;            display: inline-block;&#xA;        }&#xA;&#xA;        .dropup-content {&#xA;            display: none;&#xA;            position: absolute;&#xA;            background-color: #f1f1f1;&#xA;            min-width: 150px;&#xA;            top: 50px;&#xA;            z-index: 1;&#xA;        }&#xA;&#xA;        .dropup-content a {&#xA;            color: black;&#xA;            padding: 12px 16px;&#xA;            text-decoration: none;&#xA;            display: block;&#xA;        }&#xA;&#xA;        .dropup-content a:hover {&#xA;            background-color: #ccc&#xA;        }&#xA;&#xA;        .dropup:hover .dropup-content {&#xA;            display: block;&#xA;        }&#xA;&#xA;        .dropup:hover .dropbtn {&#xA;            background-color: #2980B9;&#xA;        }&#xA;    &lt;/style&gt;&#xA;&lt;/head&gt;&#xA;&#xA;&lt;body&gt;&#xA;    &lt;div id=&#34;header&#34;&gt;&#xA;        &lt;div class=&#34;navbar&#34;&gt;&#xA;            &lt;div class=&#34;dropup&#34;&gt;&#xA;                &lt;button class=&#34;dropbtn&#34;&gt;MORE PLANS&lt;/button&gt;&#xA;                &lt;div class=&#34;dropup-content&#34;&gt;&#xA;                    &lt;a id=&#34;month-1&#34;&gt;1月&lt;/a&gt;&#xA;                    &lt;a id=&#34;month-2&#34;&gt;2月&lt;/a&gt;&#xA;                    &lt;a id=&#34;month-3&#34;&gt;3月&lt;/a&gt;&#xA;                &lt;/div&gt;&#xA;            &lt;/div&gt;&#xA;        &lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;&#xA;    &lt;div id=&#34;container-2&#34; class=&#34;container&#34;&gt;&#xA;        &lt;h1&gt;2020年2月计划&lt;/h1&gt;&#xA;        &lt;h3&gt;一、计划内容&lt;/h3&gt;&#xA;        &#xA;        &lt;ol&gt;&#xA;            &lt;li&gt;学习计划 📖&lt;/li&gt;&#xA;            &lt;br&gt;&#xA;            &lt;ul&gt;&#xA;                &lt;li&gt;LeetCode (1 题/天)&lt;/li&gt;&#xA;                &lt;li&gt;读书 (10 页/天)&lt;/li&gt;&#xA;            &lt;/ul&gt;&#xA;            &lt;br&gt;&#xA;            &lt;li&gt;运动计划 🏃&lt;/li&gt;&#xA;            &lt;br&gt;&#xA;            &lt;ul&gt;&#xA;                &lt;li&gt;跑步 (1000 米/天)&lt;/li&gt;&#xA;                &lt;li&gt;仰卧起坐 (10 次/天)&lt;/li&gt;&#xA;            &lt;/ul&gt;&#xA;            &lt;br&gt;&#xA;        &lt;/ol&gt;&#xA;&#xA;        &lt;p&gt;注：括号内是计量单位，不是计划数。&lt;/p&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://luochang212.github.io/gadget/react-lifecycle-demo/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/gadget/react-lifecycle-demo/</guid>
      <description>&lt;!DOCTYPE html&gt;&#xA;&lt;html&gt;&#xA;  &lt;head&gt;&#xA;    &lt;meta charset=&#34;utf-8&#34;&gt;&#xA;    &lt;script src=&#34;react.js&#34;&gt;&lt;/script&gt;&#xA;    &lt;script src=&#34;react-dom.js&#34;&gt;&lt;/script&gt;&#xA;    &lt;script src=&#34;jquery.js&#34;&gt;&lt;/script&gt;&#xA;    &lt;script src=&#34;babel.min.js&#34;&gt;&lt;/script&gt;&#xA;  &lt;/head&gt;&#xA;  &lt;body&gt;&#xA;    &lt;div id=&#34;example&#34;&gt;&lt;/div&gt;&#xA;    &lt;script type=&#34;text/babel&#34;&gt;&#xA;  class MyList extends React.Component {&#xA;    constructor(...args) {&#xA;      super(...args);&#xA;      this.state = {&#xA;        loading: true,&#xA;        error: null,&#xA;        data: null&#xA;      };&#xA;    }&#xA;&#xA;    componentDidMount() {&#xA;      const url = &#39;https://api.github.com/search/repositories?q=javascript&amp;sort=stars&#39;;&#xA;      $.getJSON(url)&#xA;       .done(&#xA;        (value) =&gt; this.setState({&#xA;          loading: false,&#xA;          data: value&#xA;        })&#xA;      ).fail(&#xA;        (jqXHR, textStatus) =&gt; this.setState({&#xA;          loading: false,&#xA;          error: jqXHR.status&#xA;        })&#xA;      );&#xA;    }&#xA;&#xA;    render() {&#xA;      if (this.state.loading) {&#xA;        return &lt;span&gt;Loading...&lt;/span&gt;;&#xA;      } else if (this.state.error !== null) {&#xA;        return &lt;span&gt;Error: {this.state.error}&lt;/span&gt;;&#xA;      } else {&#xA;        /* 你的代码填入这里 */&#xA;        console.log(this.state.data)&#xA;        var projects = this.state.data.items;&#xA;        var result = [];&#xA;        projects.forEach(p =&gt; {&#xA;          var item = &lt;li&gt;&lt;a href={p.html_url}&gt;{p.name}&lt;/a&gt;&lt;/li&gt;;&#xA;          result.push(item);&#xA;        });&#xA;        // console.log(result);&#xA;        return (&#xA;          &lt;div&gt;&#xA;            &lt;p&gt;API 数据获取成功&lt;/p&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://luochang212.github.io/gadget/read-zip-file-by-url/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/gadget/read-zip-file-by-url/</guid>
      <description>&lt;!DOCTYPE html&gt;&#xA;&lt;html class=&#34;gr__gildas-lormeau_github_io&#34;&gt;&#xA;&#xA;&lt;head&gt;&#xA;&#x9;&lt;meta http-equiv=&#34;Content-Type&#34; content=&#34;text/html; charset=UTF-8&#34;&gt;&#xA;&#xA;&#x9;&lt;title&gt;Read a zip file demo&lt;/title&gt;&#xA;&#xA;&lt;/head&gt;&#xA;&#xA;&lt;body data-gr-c-s-loaded=&#34;true&#34;&gt;&#xA;&#x9;&lt;span style=&#34;color:#333;&#34;&gt;&#xA;&#x9;&#x9;操作方法：&#xA;&#x9;&#x9;&lt;ol&gt;&#xA;&#x9;&#x9;&#x9;&lt;li&gt;选中下方文本框;&lt;/li&gt;&#xA;&#x9;&#x9;&#x9;&lt;li&gt;按 Ctrl + v 粘贴链接;&lt;/li&gt;&#xA;&#x9;&#x9;&#x9;&lt;li&gt;点击文本框外任意区域。&lt;/li&gt;&#xA;&#x9;&#x9;&lt;/ol&gt;&#xA;&#x9;&lt;/span&gt;&#xA;&#x9;&lt;input id=&#34;file-input&#34; style=&#34;margin-left: 25px;width: 150px;&#34; /&gt;&#xA;&#x9;&lt;br&gt;&lt;br&gt;&#xA;&#x9;&lt;hr&gt;&#xA;&#xA;&#x9;&lt;div id=&#34;wait&#34; style=&#34;color:#333; font-size: 15px; display: none;margin-left: 25px;&#34;&gt;&#xA;&#x9;&#x9;Please wait.&#xA;&#x9;&lt;/div&gt;&#xA;&#xA;&#x9;&lt;div id=&#34;file-list&#34;&gt;&#xA;&#x9;&lt;/div&gt;&#xA;&#xA;&#x9;&lt;script type=&#34;text/javascript&#34; async=&#34;&#34; src=&#34;./lib/ga.js&#34;&gt;&lt;/script&gt;&#xA;&#x9;&lt;script type=&#34;text/javascript&#34; src=&#34;./lib/zip.js&#34;&gt;&lt;/script&gt;&#xA;&#x9;&lt;script type=&#34;text/javascript&#34; src=&#34;./lib/zip-ext.js&#34;&gt;&lt;/script&gt;&#xA;&#x9;&lt;script type=&#34;text/javascript&#34; src=&#34;./lib/demo2.js&#34;&gt;&lt;/script&gt;&#xA;&#xA;&#x9;&lt;audio controls=&#34;controls&#34; style=&#34;display: none;&#34;&gt;&lt;/audio&gt;&#xA;&lt;/body&gt;&#xA;&lt;style&gt;&#xA;&#x9;body {&#xA;&#x9;&#x9;background-color: rgb(238, 224, 224);&#xA;&#x9;}&#xA;&lt;/style&gt;&#xA;&#xA;&lt;/html&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://luochang212.github.io/gadget/show-time/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/gadget/show-time/</guid>
      <description>&lt;!DOCTYPE html&gt;&#xA;&lt;html lang=&#34;zh-Hans&#34; dir=&#34;ltr&#34; class=&#34;gr__fiammanda_com&#34;&gt;&#xA;&lt;head&gt;&lt;meta http-equiv=&#34;Content-Type&#34; content=&#34;text/html; charset=UTF-8&#34;&gt;&#xA;&#xA;&lt;title&gt;现在几点了？&lt;/title&gt;&#xA;&#xA;&lt;style type=&#34;text/css&#34;&gt;&#xA;&#x9;body {&#xA;&#x9;&#x9;font-family: &#34;Source Han Sans&#34;, &#34;San Francisco&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Droid Sans Fallback&#34;, &#34;Microsoft YaHei&#34;, sans-serif;&#xA;&#x9;&#x9;font-size: 14px;&#xA;&#x9;&#x9;color: #333;&#xA;&#x9;}&#xA;&#x9;a {&#xA;&#x9;&#x9;text-decoration: none;&#xA;&#x9;&#x9;color: #f66;&#xA;&#x9;&#x9;transition-property: color;&#xA;&#x9;&#x9;transition-duration: .2s;&#xA;&#x9;&#x9;transition-timing-function: ease-in-out;&#xA;&#x9;}&#xA;&#x9;a:hover {&#xA;&#x9;&#x9;color: #333;&#xA;&#x9;}&#xA;&#x9;p {&#xA;&#x9;&#x9;margin: 1em 0;&#xA;&#x9;}&#xA;&#x9;p:empty {&#xA;&#x9;&#x9;height: 1.5em;&#xA;&#x9;}&#xA;&#x9;main {&#xA;&#x9;&#x9;margin: 0 5em;&#xA;&#x9;&#x9;max-width: 48em;&#xA;&#x9;}&#xA;&#x9;h1 {&#xA;&#x9;&#x9;margin: 1em 0;&#xA;&#x9;&#x9;font-size: 24px;&#xA;&#x9;&#x9;font-weight: 300;&#xA;&#x9;}&#xA;&#x9;textarea, article {&#xA;&#x9;&#x9;width: 100%;&#xA;&#x9;&#x9;height: 12em;&#xA;&#x9;&#x9;margin: 2em 0;&#xA;&#x9;&#x9;padding: .5em;&#xA;&#x9;&#x9;overflow-y: scroll;&#xA;&#x9;&#x9;border: 1px solid #999;&#xA;&#x9;&#x9;border-radius: 2px;&#xA;&#x9;&#x9;line-height: 1.5;&#xA;&#x9;&#x9;text-align: justify;&#xA;&#x9;&#x9;text-justify: inter-ideograph;&#xA;&#x9;}&#xA;&#x9;textarea {&#xA;&#x9;&#x9;height: 9em;&#xA;&#x9;&#x9;font-size: 14px;&#xA;&#x9;&#x9;font-family: &#34;Source Han Sans&#34;, &#34;San Francisco&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Droid Sans Fallback&#34;, &#34;Microsoft YaHei&#34;, sans-serif;&#xA;&#x9;&#x9;color: #333;&#xA;&#x9;}&#xA;&#x9;article {&#xA;&#x9;&#x9;cursor: pointer;&#xA;&#x9;}&#xA;&#x9;button {&#xA;&#x9;&#x9;background: #fff;&#xA;&#x9;&#x9;border: 1px solid #ccc;&#xA;&#x9;&#x9;border-radius: 2px;&#xA;&#x9;&#x9;line-height: 1;&#xA;&#x9;&#x9;padding: .5em;&#xA;&#x9;&#x9;color: #666;&#xA;&#x9;&#x9;transition-property: color, background, border;&#xA;&#x9;&#x9;transition-duration: .2s;&#xA;&#x9;&#x9;transition-timing-function: ease-in-out;&#xA;&#x9;}&#xA;&#x9;button[id] {&#xA;&#x9;&#x9;border: 1px solid #999;&#xA;&#x9;&#x9;color: #333;&#xA;&#x9;&#x9;cursor: pointer;&#xA;&#x9;}&#xA;&#x9;button[id]:hover {&#xA;&#x9;&#x9;background: #666;&#xA;&#x9;&#x9;border-color: #666;&#xA;&#x9;&#x9;color: #fff;&#xA;&#x9;}&#xA;&#x9;::selection {&#xA;&#x9;&#x9;color: #fff;&#xA;&#x9;&#x9;background: #666;&#xA;&#x9;}&#xA;&#x9;::-moz-selection {&#xA;&#x9;&#x9;color: #fff;&#xA;&#x9;&#x9;background: #666;&#xA;&#x9;}&#xA;&lt;/style&gt;&#xA;&lt;/head&gt;&#xA;&#xA;&lt;body data-gr-c-s-loaded=&#34;true&#34;&gt;&#xA;&lt;main&gt;&#xA;&#xA;&#x9;&lt;h1&gt;现在几点了？&lt;/h1&gt;&#xA;&#x9;&lt;p&gt;© 2019 Chang Luo &lt;a href=&#34;https://www.weibo.com/selina330&#34; target=&#34;_blank&#34;&gt;Weibo&lt;/a&gt; | &lt;a href=&#34;https://space.bilibili.com/27447758&#34; target=&#34;_blank&#34;&gt;Bilibili&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://luochang212.github.io/gadget/tic-tac-toe/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/gadget/tic-tac-toe/</guid>
      <description>&lt;!doctype html&gt;&lt;html lang=&#34;en&#34;&gt;&lt;head&gt;&lt;meta charset=&#34;utf-8&#34;/&gt;&lt;link rel=&#34;icon&#34; href=&#34;https://luochang212.github.io/gadget/tic-tac-toe/favicon.ico&#34;/&gt;&lt;meta name=&#34;viewport&#34; content=&#34;width=device-width,initial-scale=1&#34;/&gt;&lt;meta name=&#34;theme-color&#34; content=&#34;#000000&#34;/&gt;&lt;meta name=&#34;description&#34; content=&#34;Web site created using create-react-app&#34;/&gt;&lt;link rel=&#34;apple-touch-icon&#34; href=&#34;https://luochang212.github.io/gadget/tic-tac-toe/logo192.png&#34;/&gt;&lt;link rel=&#34;manifest&#34; href=&#34;https://luochang212.github.io/gadget/tic-tac-toe/manifest.json&#34;/&gt;&lt;title&gt;React App&lt;/title&gt;&lt;link href=&#34;https://luochang212.github.io/gadget/tic-tac-toe/static/css/main.0ebde3ef.chunk.css&#34; rel=&#34;stylesheet&#34;&gt;&lt;/head&gt;&lt;body&gt;&lt;noscript&gt;You need to enable JavaScript to run this app.&lt;/noscript&gt;&lt;div id=&#34;root&#34;&gt;&lt;/div&gt;&lt;script&gt;!function(e){function t(t){for(var n,a,p=t[0],l=t[1],i=t[2],c=0,s=[];c&lt;p.length;c++)a=p[c],Object.prototype.hasOwnProperty.call(o,a)&amp;&amp;o[a]&amp;&amp;s.push(o[a][0]),o[a]=0;for(n in l)Object.prototype.hasOwnProperty.call(l,n)&amp;&amp;(e[n]=l[n]);for(f&amp;&amp;f(t);s.length;)s.shift()();return u.push.apply(u,i||[]),r()}function r(){for(var e,t=0;t&lt;u.length;t++){for(var r=u[t],n=!0,p=1;p&lt;r.length;p++){var l=r[p];0!==o[l]&amp;&amp;(n=!1)}n&amp;&amp;(u.splice(t--,1),e=a(a.s=r[0]))}return e}var n={},o={1:0},u=[];function a(t){if(n[t])return n[t].exports;var r=n[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,a),r.l=!0,r.exports}a.m=e,a.c=n,a.d=function(e,t,r){a.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},a.r=function(e){&#34;undefined&#34;!=typeof Symbol&amp;&amp;Symbol.toStringTag&amp;&amp;Object.defineProperty(e,Symbol.toStringTag,{value:&#34;Module&#34;}),Object.defineProperty(e,&#34;__esModule&#34;,{value:!0})},a.t=function(e,t){if(1&amp;t&amp;&amp;(e=a(e)),8&amp;t)return e;if(4&amp;t&amp;&amp;&#34;object&#34;==typeof e&amp;&amp;e&amp;&amp;e.__esModule)return e;var r=Object.create(null);if(a.r(r),Object.defineProperty(r,&#34;default&#34;,{enumerable:!0,value:e}),2&amp;t&amp;&amp;&#34;string&#34;!=typeof e)for(var n in e)a.d(r,n,function(t){return e[t]}.bind(null,n));return r},a.n=function(e){var t=e&amp;&amp;e.__esModule?function(){return e.default}:function(){return e};return a.d(t,&#34;a&#34;,t),t},a.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},a.p=&#34;/gadget/tic-tac-toe/&#34;;var p=this[&#34;webpackJsonpmy-app&#34;]=this[&#34;webpackJsonpmy-app&#34;]||[],l=p.push.bind(p);p.push=t,p=p.slice();for(var i=0;i&lt;p.length;i++)t(p[i]);var f=l;r()}([])&lt;/script&gt;&lt;script src=&#34;https://luochang212.github.io/gadget/tic-tac-toe/static/js/2.718ed629.chunk.js&#34;&gt;&lt;/script&gt;&lt;script src=&#34;https://luochang212.github.io/gadget/tic-tac-toe/static/js/main.73c47c01.chunk.js&#34;&gt;&lt;/script&gt;&lt;/body&gt;&lt;/html&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://luochang212.github.io/gadget/to-do-list/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/gadget/to-do-list/</guid>
      <description>&lt;!DOCTYPE html&gt;&#xA;&lt;html lang=&#34;zh-Hans&#34; dir=&#34;ltr&#34;&gt;&#xA;&lt;head&gt;&#xA;&#xA;&lt;title&gt;计划表生成工具&lt;/title&gt;&#xA;&lt;script&gt;&#xA;&#x9;&#34;use strict&#34;;&#xA;&#xA;&#x9;function escapeHtml(text) {&#xA;&#x9;&#x9;const div = document.createElement(&#39;div&#39;);&#xA;&#x9;&#x9;div.textContent = text;&#xA;&#x9;&#x9;return div.innerHTML;&#xA;&#x9;}&#xA;&#xA;&#x9;var Items = {&#xA;　　　　&#x9;name: &#34;&#34;,&#xA;　　　　&#x9;isCheck: &#34;false&#34;,&#xA;&#x9;&#x9;isDelete: &#34;false&#34;&#xA;&#x9;};&#xA;&#xA;&#x9;var objArray = [];&#xA;&#x9;&#xA;&#x9;var subArray = [];&#xA;&#x9;&#xA;&#x9;var submit_flag = true;&#xA;&#x9;&#xA;&#x9;var delete_flag = true;&#xA;&#x9;&#xA;&#x9;function addElement() {&#xA;&#x9;&#x9;submit_flag = true;&#xA;&#x9;&#x9;var item = Object.create(Items);&#xA;&#x9;&#x9;&#xA;&#x9;&#x9;var v = document.getElementById(&#34;myTextarea&#34;).value;&#xA;&#x9;&#x9;item.name = v&#xA;&#x9;&#x9;objArray.push(item);&#xA;&#x9;&#x9;var body = &#39;&lt;table&gt;&lt;tr&gt;&lt;th&gt;#&lt;/th&gt;&lt;th&gt;Name&lt;/th&gt;&lt;/tr&gt;&#39;&#xA;&#x9;&#x9;&#xA;&#x9;&#x9;for (var i = 0; i &lt; objArray.length; i++) {&#xA;&#x9;&#x9;&#x9;var index = i+1;&#xA;            body += &#39;&lt;tr&gt;&#39;;&#xA;            body += &#39;&lt;td&gt;&#39; + index.toString(10) + &#39;&lt;/td&gt;&#39;;&#xA;&#x9;&#x9;&#x9;//body += &#39;&lt;td&gt;&#39; + &#39;&lt;input type=&#34;checkbox&#34; id=\&#34;cb&#39; + i.toString(10) + &#39;\&#34; onclick=&#34;isChecked(this);&#34;&gt;&#39; + &#39;&lt;/td&gt;&#39;;&#xA;            body += &#39;&lt;td&gt;&#39; + escapeHtml(objArray[i].name) + &#39;&lt;/td&gt;&#39;;&#xA;&#x9;&#x9;&#x9;//body += &#39;&lt;td&gt;&#39; + objArray[i].isDelete + &#39;&lt;/td&gt;&#39;;&#xA;&#x9;&#x9;&#x9;//body += &#39;&lt;td&gt;&#39; + &#39;&lt;input type=&#34;button&#34; id=\&#34;btn&#39; + i.toString(10) + &#39;\&#34; onclick=&#34;isDeleted(this);&#34;&gt;&#39; + &#39;&lt;/td&gt;&#39;;&#xA;            body += &#39;&lt;/tr&gt;&#39;;&#xA;&#x9;&#x9;}&#xA;&#x9;&#x9;&#xA;        body += &#39;&lt;/table&gt;&lt;/body&gt;&lt;/html&gt;&#39;;&#xA;&#x9;&#x9;&#xA;&#x9;&#x9;document.getElementById(&#34;object_list&#34;).innerHTML = body;&#xA;&#x9;&#x9;document.getElementById(&#34;myTextarea&#34;).value = &#39;&#39;;&#xA;&#x9;}&#xA;&#x9;&#xA;&#x9;function submit() {&#xA;&#x9;&#x9;if (submit_flag == true) {&#xA;&#x9;&#x9;submit_flag = false;&#xA;&#x9;&#x9;subArray = objArray;&#xA;&#x9;&#x9;objArray = [];&#xA;&#x9;&#x9;var body = &#39;&lt;table&gt;&lt;tr&gt;&lt;th&gt;#&lt;/th&gt;&lt;th&gt;Check Box&lt;/th&gt;&lt;th&gt;Name&lt;/th&gt;&lt;th&gt;Delete&lt;/th&gt;&lt;/tr&gt;&#39;&#xA;&#x9;&#x9;&#xA;&#x9;&#x9;for (var i = 0; i &lt; subArray.length; i++) {&#xA;&#x9;&#x9;&#x9;var index = i+1;&#xA;            body += &#39;&lt;tr&gt;&#39;;&#xA;            body += &#39;&lt;td&gt;&#39; + index.toString(10) + &#39;&lt;/td&gt;&#39;;&#xA;&#x9;&#x9;&#x9;body += &#39;&lt;td&gt;&#39; + &#39;&lt;input type=\&#34;checkbox\&#34; id=\&#34;cb&#39; + i.toString(10) + &#39;\&#34; onclick=\&#34;isChecked(this);\&#34;&gt;&#39; + &#39;&lt;/td&gt;&#39;;&#xA;            body += &#39;&lt;td&gt;&#39; + escapeHtml(subArray[i].name) + &#39;&lt;/td&gt;&#39;;&#xA;&#x9;&#x9;&#x9;body += &#39;&lt;td&gt;&#39; + &#39;&lt;input type=\&#34;button\&#34; id=\&#34;btn&#39; + i.toString(10) + &#39;\&#34; onclick=\&#34;isDeleted(this);\&#34;&gt;&#39; + &#39;&lt;/td&gt;&#39;;&#xA;            body += &#39;&lt;/tr&gt;&#39;;&#xA;&#x9;&#x9;}&#xA;&#x9;&#x9;&#xA;        body += &#39;&lt;/table&gt;&lt;/body&gt;&lt;/html&gt;&#39;;&#xA;&#x9;&#x9;&#xA;&#x9;&#x9;document.getElementById(&#34;object_list&#34;).innerHTML = body;&#xA;&#x9;&#x9;}&#xA;&#x9;}&#xA;&#x9;&#xA;&#x9;function finalSheet() {&#xA;&#x9;&#x9;var myDate=new Date();&#xA;&#x9;&#x9;var final_sheet = &#39;&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;style&gt;html{background-position:center top;background-repeat:no-repeat;width:800px;margin:auto;}table, th, td {border: 1px solid black;border-collapse: collapse;}th, td {padding: 5px;}th {text-align: center;}&lt;/style&gt;&lt;body&gt;&lt;h1&gt;计划完成统计表&lt;/h1&gt;&lt;h4&gt;&#39; + myDate + &#39;&lt;/h2&gt;&#39;&#xA;&#x9;&#x9;var body = &#39;&lt;table&gt;&lt;tr&gt;&lt;th&gt;#&lt;/th&gt;&lt;th&gt;Name&lt;/th&gt;&lt;th&gt;Done&lt;/th&gt;&lt;/tr&gt;&#39;&#xA;&#x9;&#x9;&#xA;&#x9;&#x9;var i = 0;&#xA;&#x9;&#x9;var index = 1;&#xA;&#x9;&#x9;var showtext = &#34;&#34;;&#xA;&#x9;&#x9;while (i &lt; subArray.length) {&#xA;&#x9;&#x9;&#x9;if (subArray[i].isDelete != &#34;true&#34; ) {&#xA;&#x9;&#x9;&#x9;&#x9;if (subArray[i].isCheck == &#34;true&#34;) {&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;showtext = &#34;√&#34;;&#xA;&#x9;&#x9;&#x9;&#x9;}else {&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;showtext = &#34;×&#34;;&#xA;&#x9;&#x9;&#x9;&#x9;}&#xA;&#x9;&#x9;&#x9;&#x9;body += &#39;&lt;tr&gt;&#39;;&#xA;&#x9;&#x9;&#x9;&#x9;body += &#39;&lt;td&gt;&#39; + index.toString(10) + &#39;&lt;/td&gt;&#39;;&#xA;&#x9;&#x9;&#x9;&#x9;body += &#39;&lt;td&gt;&#39; + escapeHtml(subArray[i].name) + &#39;&lt;/td&gt;&#39;;&#xA;&#x9;&#x9;&#x9;&#x9;body += &#39;&lt;td&gt;&#39; + showtext + &#39;&lt;/td&gt;&#39;;&#xA;&#x9;&#x9;&#x9;&#x9;body += &#39;&lt;/tr&gt;&#39;;&#xA;&#x9;&#x9;&#x9;&#x9;index++;&#xA;&#x9;&#x9;&#x9;}&#xA;&#x9;&#x9;&#x9;i++;&#xA;&#x9;&#x9;}&#xA;&#x9;&#x9;&#xA;        body += &#39;&lt;/table&gt;&lt;/body&gt;&lt;/html&gt;&#39;;&#xA;&#x9;&#x9;document.getElementById(&#34;object_list&#34;).innerHTML = body;&#xA;&#x9;&#x9;&#xA;&#x9;&#x9;final_sheet += body&#xA;&#x9;&#x9;download(&#39;计划完成统计表.html&#39;, final_sheet)&#xA;&#x9;&#x9;&#xA;&#x9;}&#xA;&#x9;&#xA;&#x9;function handleEnter(event) {&#xA;&#x9;&#x9;if (event.keyCode == 13 &amp;&amp; !event.shiftKey) {&#xA;&#x9;&#x9;&#x9;addElement();&#xA;&#x9;&#x9;}&#xA;&#x9;}&#xA;&#x9;&#xA;&#x9;function clearText() {&#xA;&#x9;&#x9;document.getElementById(&#34;myTextarea&#34;).value = &#39;&#39;;&#xA;&#x9;}&#xA;&#x9;&#xA;&#x9;function clearContents(element) {&#xA;&#x9;&#x9;element.value = &#39;&#39;;&#xA;&#x9;}&#xA;&#x9;&#xA;&#x9;function isChecked(element) {&#xA;&#x9;&#x9;var id_str = element.id&#xA;&#x9;&#x9;id_str = id_str.replace(&#34;cb&#34;,&#34;&#34;);&#xA;&#x9;&#x9;var id_num = parseInt(id_str)&#xA;&#x9;&#x9;if (element.checked == true){&#xA;&#x9;&#x9;&#x9;subArray[id_num].isCheck = &#34;true&#34;;&#xA;&#x9;&#x9;} else {&#xA;&#x9;&#x9;&#x9;subArray[id_num].isCheck = &#34;false&#34;;&#xA;&#x9;&#x9;}&#xA;&#x9;}&#xA;&#x9;&#xA;&#x9;function isDeleted(element) {&#xA;&#x9;&#x9;var id_str = element.id&#xA;&#x9;&#x9;id_str = id_str.replace(&#34;btn&#34;,&#34;&#34;);&#xA;&#x9;&#x9;var id_num = parseInt(id_str)&#xA;&#x9;&#x9;&#xA;&#x9;&#x9;if (delete_flag == true) {&#xA;&#x9;&#x9;delete_flag = false;&#xA;&#x9;&#x9;subArray[id_num].isDelete = &#34;true&#34;;&#xA;&#x9;&#x9;element.value=&#34;×&#34;&#xA;&#x9;&#x9;} else {&#xA;&#x9;&#x9;delete_flag = true;&#xA;&#x9;&#x9;subArray[id_num].isDelete = &#34;false&#34;;&#xA;&#x9;&#x9;element.value=&#34;&#34;&#xA;&#x9;&#x9;}&#xA;&#x9;}&#xA;&#x9;&#xA;&#x9;function download(filename, text) {&#xA;&#x9;&#x9;var element = document.createElement(&#39;a&#39;);&#xA;&#x9;&#x9;element.setAttribute(&#39;href&#39;, &#39;data:text/plain;charset=utf-8,&#39; + encodeURIComponent(text));&#xA;&#x9;&#x9;element.setAttribute(&#39;download&#39;, filename);&#xA;&#xA;&#x9;&#x9;element.style.display = &#39;none&#39;;&#xA;&#x9;&#x9;document.body.appendChild(element);&#xA;&#xA;&#x9;&#x9;element.click();&#xA;&#xA;&#x9;&#x9;document.body.removeChild(element);&#xA;&#x9;}&#xA;&lt;/script&gt;&#xA;&#xA;&lt;style type=&#34;text/css&#34;&gt;&#xA;&#x9;body {&#xA;&#x9;&#x9;font-family: &#34;Source Han Sans&#34;, &#34;San Francisco&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Droid Sans Fallback&#34;, &#34;Microsoft YaHei&#34;, sans-serif;&#xA;&#x9;&#x9;font-size: 14px;&#xA;&#x9;&#x9;color: #333;&#xA;&#x9;}&#xA;&#x9;a {&#xA;&#x9;&#x9;text-decoration: none;&#xA;&#x9;&#x9;color: #f66;&#xA;&#x9;&#x9;transition-property: color;&#xA;&#x9;&#x9;transition-duration: .2s;&#xA;&#x9;&#x9;transition-timing-function: ease-in-out;&#xA;&#x9;}&#xA;&#x9;a:hover {&#xA;&#x9;&#x9;color: #333;&#xA;&#x9;}&#xA;&#x9;p {&#xA;&#x9;&#x9;margin: 1em 0;&#xA;&#x9;}&#xA;&#x9;p:empty {&#xA;&#x9;&#x9;height: 1.5em;&#xA;&#x9;}&#xA;&#x9;main {&#xA;&#x9;&#x9;margin: 0 5em;&#xA;&#x9;&#x9;max-width: 60em;&#xA;&#x9;}&#xA;&#x9;h1 {&#xA;&#x9;&#x9;margin: 1em 0;&#xA;&#x9;&#x9;font-size: 24px;&#xA;&#x9;&#x9;font-weight: 300;&#xA;&#x9;}&#xA;&#x9;textarea, article {&#xA;&#x9;&#x9;width: 100%;&#xA;&#x9;&#x9;height: 12em;&#xA;&#x9;&#x9;margin: 2em 0;&#xA;&#x9;&#x9;padding: .5em;&#xA;&#x9;&#x9;overflow-y: scroll;&#xA;&#x9;&#x9;border: 1px solid #999;&#xA;&#x9;&#x9;border-radius: 2px;&#xA;&#x9;&#x9;line-height: 1.5;&#xA;&#x9;&#x9;text-align: justify;&#xA;&#x9;&#x9;text-justify: inter-ideograph;&#xA;&#x9;}&#xA;&#x9;textarea {&#xA;&#x9;&#x9;height: 9em;&#xA;&#x9;&#x9;font-size: 14px;&#xA;&#x9;&#x9;font-family: &#34;Source Han Sans&#34;, &#34;San Francisco&#34;, &#34;PingFang SC&#34;, &#34;Hiragino Sans GB&#34;, &#34;Droid Sans Fallback&#34;, &#34;Microsoft YaHei&#34;, sans-serif;&#xA;&#x9;&#x9;color: #333;&#xA;&#x9;}&#xA;&#x9;article {&#xA;&#x9;&#x9;cursor: pointer;&#xA;&#x9;}&#xA;&#x9;button {&#xA;&#x9;&#x9;background: #fff;&#xA;&#x9;&#x9;border: 1px solid #ccc;&#xA;&#x9;&#x9;border-radius: 2px;&#xA;&#x9;&#x9;line-height: 1;&#xA;&#x9;&#x9;padding: .5em;&#xA;&#x9;&#x9;color: #666;&#xA;&#x9;&#x9;transition-property: color, background, border;&#xA;&#x9;&#x9;transition-duration: .2s;&#xA;&#x9;&#x9;transition-timing-function: ease-in-out;&#xA;&#x9;}&#xA;&#x9;button[id] {&#xA;&#x9;&#x9;border: 1px solid #999;&#xA;&#x9;&#x9;color: #333;&#xA;&#x9;&#x9;cursor: pointer;&#xA;&#x9;}&#xA;&#x9;button[id]:hover {&#xA;&#x9;&#x9;background: #666;&#xA;&#x9;&#x9;border-color: #666;&#xA;&#x9;&#x9;color: #fff;&#xA;&#x9;}&#xA;&#x9;::selection {&#xA;&#x9;&#x9;color: #fff;&#xA;&#x9;&#x9;background: #666;&#xA;&#x9;}&#xA;&#x9;::-moz-selection {&#xA;&#x9;&#x9;color: #fff;&#xA;&#x9;&#x9;background: #666;&#xA;&#x9;}&#xA;&#x9;table, th, td {&#xA;&#x9;&#x9;border: 1px solid black;&#xA;&#x9;&#x9;border-collapse: collapse;&#xA;&#x9;&#x9;text-align: center;&#xA;&#x9;}&#xA;&#x9;th, td {&#xA;&#x9;&#x9;padding: 5px;&#xA;&#x9;}&#xA;&#x9;th {&#xA;&#x9;&#x9;text-align: left;&#xA;&#x9;}&#xA;&lt;/style&gt;&#xA;&lt;/head&gt;&#xA;&#xA;&lt;body data-gr-c-s-loaded=&#34;true&#34;&gt;&#xA;&lt;main&gt;&#xA;&#xA;&#x9;&lt;h1&gt;计划表生成工具&lt;/h1&gt;&#xA;&#x9;&lt;p&gt;© 2019 Chang Luo | &lt;a href=&#34;https://luochang212.github.io/&#34;&gt;Home&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://luochang212.github.io/gadget/unzip/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/gadget/unzip/</guid>
      <description>&lt;!DOCTYPE html&gt;&#xA;&lt;!-- saved from url=(0056)https://gildas-lormeau.github.io/zip.js/demos/demo2.html --&gt;&#xA;&lt;html class=&#34;gr__gildas-lormeau_github_io&#34;&gt;&#xA;&#xA;&lt;head&gt;&#xA;&#x9;&lt;meta http-equiv=&#34;Content-Type&#34; content=&#34;text/html; charset=UTF-8&#34;&gt;&#xA;&#xA;&#x9;&lt;title&gt;Read a zip file demo&lt;/title&gt;&#xA;&#x9;&lt;link rel=&#34;stylesheet&#34; href=&#34;./lib/default.css&#34;&gt;&#xA;&#x9;&lt;link rel=&#34;stylesheet&#34; href=&#34;./lib/demo.css&#34;&gt;&#xA;&#x9;&lt;link href=&#34;./lib/css&#34; rel=&#34;stylesheet&#34; type=&#34;text/css&#34;&gt;&#xA;&lt;/head&gt;&#xA;&#xA;&lt;body data-gr-c-s-loaded=&#34;true&#34;&gt;&#xA;&#x9;&lt;a href=&#34;https://github.com/gildas-lormeau/zip.js&#34;&gt;&lt;img style=&#34;position: absolute; top: 0; right: 0; border: 0;&#34;&#xA;&#x9;&#x9;&#x9;src=&#34;./lib/forkme_right_darkblue_121621.png&#34; alt=&#34;Fork me on GitHub&#34;&gt;&lt;/a&gt;&#xA;&#x9;&lt;div id=&#34;container&#34;&gt;&#xA;&#x9;&#x9;&lt;h1&gt;&#xA;&#x9;&#x9;&#x9;&lt;a href=&#34;https://gildas-lormeau.github.io/zip.js/&#34;&gt;zip.js&lt;/a&gt; &lt;span class=&#34;small&#34;&gt;&lt;/span&gt;&#xA;&#x9;&#x9;&lt;/h1&gt;&#xA;&#xA;&#x9;&#x9;&lt;div class=&#34;description&#34;&gt;&#xA;&#x9;&#x9;&#x9;A JavaScript library to zip and unzip files&#xA;&#x9;&#x9;&#x9;&lt;hr&gt;&#xA;&#x9;&#x9;&lt;/div&gt;&#xA;&#xA;&#x9;&#x9;&lt;h2&gt;Read a zip file demo&lt;/h2&gt;&#xA;&#xA;&#x9;&#x9;&lt;ol id=&#34;demo-container&#34;&gt;&#xA;&#x9;&#x9;&#x9;&lt;li&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;label&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;span class=&#34;form-label&#34;&gt;choose a zip file&lt;/span&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;input type=&#34;file&#34; accept=&#34;application/zip&#34; id=&#34;file-input&#34;&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;/label&gt;&#xA;&#x9;&#x9;&#x9;&lt;/li&gt;&#xA;&#x9;&#x9;&#x9;&lt;li&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;label&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;span class=&#34;form-label&#34;&gt;choose temporary storage&lt;/span&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;select id=&#34;creation-method-input&#34;&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;option value=&#34;Blob&#34;&gt;RAM&lt;/option&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;option value=&#34;File&#34;&gt;HDD&lt;/option&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;/select&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;/label&gt;&#xA;&#x9;&#x9;&#x9;&lt;/li&gt;&#xA;&#x9;&#x9;&#x9;&lt;li&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;span class=&#34;form-label&#34;&gt;download zip content&lt;/span&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;ul id=&#34;file-list&#34;&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;/ul&gt;&#xA;&#x9;&#x9;&#x9;&lt;/li&gt;&#xA;&#x9;&#x9;&lt;/ol&gt;&#xA;&#xA;&#x9;&lt;/div&gt;&#xA;&#x9;&lt;script type=&#34;text/javascript&#34; async=&#34;&#34; src=&#34;./lib/ga.js&#34;&gt;&lt;/script&gt;&#xA;&#x9;&lt;script type=&#34;text/javascript&#34; src=&#34;./lib/zip.js&#34;&gt;&lt;/script&gt;&#xA;&#x9;&lt;script type=&#34;text/javascript&#34; src=&#34;./lib/zip-ext.js&#34;&gt;&lt;/script&gt;&#xA;&#x9;&lt;script type=&#34;text/javascript&#34; src=&#34;./lib/demo2.js&#34;&gt;&lt;/script&gt;&#xA;&#x9;&lt;script type=&#34;text/javascript&#34;&gt;&#xA;&#xA;&#x9;&#x9;var _gaq = _gaq || [];&#xA;&#x9;&#x9;_gaq.push([&#39;_setAccount&#39;, &#39;UA-15560121-15&#39;]);&#xA;&#x9;&#x9;_gaq.push([&#39;_trackPageview&#39;]);&#xA;&#xA;&#x9;&#x9;(function () {&#xA;&#x9;&#x9;&#x9;var ga = document.createElement(&#39;script&#39;); ga.type = &#39;text/javascript&#39;; ga.async = true;&#xA;&#x9;&#x9;&#x9;ga.src = (&#39;https:&#39; == document.location.protocol ? &#39;https://ssl&#39; : &#39;http://www&#39;) + &#39;.google-analytics.com/ga.js&#39;;&#xA;&#x9;&#x9;&#x9;var s = document.getElementsByTagName(&#39;script&#39;)[0]; s.parentNode.insertBefore(ga, s);&#xA;&#x9;&#x9;})();&#xA;&#xA;&#x9;&lt;/script&gt;&#xA;&#xA;&#xA;&#x9;&lt;audio controls=&#34;controls&#34; style=&#34;display: none;&#34;&gt;&lt;/audio&gt;&#xA;&lt;/body&gt;&#xA;&lt;style type=&#34;text/css&#34;&gt;&#xA;&#x9;#yddContainer {&#xA;&#x9;&#x9;display: block;&#xA;&#x9;&#x9;font-family: Microsoft YaHei;&#xA;&#x9;&#x9;position: relative;&#xA;&#x9;&#x9;width: 100%;&#xA;&#x9;&#x9;height: 100%;&#xA;&#x9;&#x9;top: -4px;&#xA;&#x9;&#x9;left: -4px;&#xA;&#x9;&#x9;font-size: 12px;&#xA;&#x9;&#x9;border: 1px solid&#xA;&#x9;}&#xA;&#xA;&#x9;#yddTop {&#xA;&#x9;&#x9;display: block;&#xA;&#x9;&#x9;height: 22px&#xA;&#x9;}&#xA;&#xA;&#x9;#yddTopBorderlr {&#xA;&#x9;&#x9;display: block;&#xA;&#x9;&#x9;position: static;&#xA;&#x9;&#x9;height: 17px;&#xA;&#x9;&#x9;padding: 2px 28px;&#xA;&#x9;&#x9;line-height: 17px;&#xA;&#x9;&#x9;font-size: 12px;&#xA;&#x9;&#x9;color: #5079bb;&#xA;&#x9;&#x9;font-weight: bold;&#xA;&#x9;&#x9;border-style: none solid;&#xA;&#x9;&#x9;border-width: 1px&#xA;&#x9;}&#xA;&#xA;&#x9;#yddTopBorderlr .ydd-sp {&#xA;&#x9;&#x9;position: absolute;&#xA;&#x9;&#x9;top: 2px;&#xA;&#x9;&#x9;height: 0;&#xA;&#x9;&#x9;overflow: hidden&#xA;&#x9;}&#xA;&#xA;&#x9;.ydd-icon {&#xA;&#x9;&#x9;left: 5px;&#xA;&#x9;&#x9;width: 17px;&#xA;&#x9;&#x9;padding: 0px 0px 0px 0px;&#xA;&#x9;&#x9;padding-top: 17px;&#xA;&#x9;&#x9;background-position: -16px -44px&#xA;&#x9;}&#xA;&#xA;&#x9;.ydd-close {&#xA;&#x9;&#x9;right: 5px;&#xA;&#x9;&#x9;width: 16px;&#xA;&#x9;&#x9;padding-top: 16px;&#xA;&#x9;&#x9;background-position: left -44px&#xA;&#x9;}&#xA;&#xA;&#x9;#yddKeyTitle {&#xA;&#x9;&#x9;float: left;&#xA;&#x9;&#x9;text-decoration: none&#xA;&#x9;}&#xA;&#xA;&#x9;#yddMiddle {&#xA;&#x9;&#x9;display: block;&#xA;&#x9;&#x9;margin-bottom: 10px&#xA;&#x9;}&#xA;&#xA;&#x9;.ydd-tabs {&#xA;&#x9;&#x9;display: block;&#xA;&#x9;&#x9;margin: 5px 0;&#xA;&#x9;&#x9;padding: 0 5px;&#xA;&#x9;&#x9;height: 18px;&#xA;&#x9;&#x9;border-bottom: 1px solid&#xA;&#x9;}&#xA;&#xA;&#x9;.ydd-tab {&#xA;&#x9;&#x9;display: block;&#xA;&#x9;&#x9;float: left;&#xA;&#x9;&#x9;height: 18px;&#xA;&#x9;&#x9;margin: 0 5px -1px 0;&#xA;&#x9;&#x9;padding: 0 4px;&#xA;&#x9;&#x9;line-height: 18px;&#xA;&#x9;&#x9;border: 1px solid;&#xA;&#x9;&#x9;border-bottom: none&#xA;&#x9;}&#xA;&#xA;&#x9;.ydd-trans-container {&#xA;&#x9;&#x9;display: block;&#xA;&#x9;&#x9;line-height: 160%&#xA;&#x9;}&#xA;&#xA;&#x9;.ydd-trans-container a {&#xA;&#x9;&#x9;text-decoration: none;&#xA;&#x9;}&#xA;&#xA;&#x9;#yddBottom {&#xA;&#x9;&#x9;position: absolute;&#xA;&#x9;&#x9;bottom: 0;&#xA;&#x9;&#x9;left: 0;&#xA;&#x9;&#x9;width: 100%;&#xA;&#x9;&#x9;height: 22px;&#xA;&#x9;&#x9;line-height: 22px;&#xA;&#x9;&#x9;overflow: hidden;&#xA;&#x9;&#x9;background-position: left -22px&#xA;&#x9;}&#xA;&#xA;&#x9;.ydd-padding010 {&#xA;&#x9;&#x9;padding: 0 10px&#xA;&#x9;}&#xA;&#xA;&#x9;#yddWrapper {&#xA;&#x9;&#x9;color: #252525;&#xA;&#x9;&#x9;z-index: 10001;&#xA;&#x9;&#x9;background: url(chrome-extension://eopjamdnofihpioajgfdikhhbobonhbb/ab20.png);&#xA;&#x9;}&#xA;&#xA;&#x9;#yddContainer {&#xA;&#x9;&#x9;background: #fff;&#xA;&#x9;&#x9;border-color: #4b7598&#xA;&#x9;}&#xA;&#xA;&#x9;#yddTopBorderlr {&#xA;&#x9;&#x9;border-color: #f0f8fc&#xA;&#x9;}&#xA;&#xA;&#x9;#yddWrapper .ydd-sp {&#xA;&#x9;&#x9;background-image: url(chrome-extension://eopjamdnofihpioajgfdikhhbobonhbb/ydd-sprite.png)&#xA;&#x9;}&#xA;&#xA;&#x9;#yddWrapper a,&#xA;&#x9;#yddWrapper a:hover,&#xA;&#x9;#yddWrapper a:visited {&#xA;&#x9;&#x9;color: #50799b&#xA;&#x9;}&#xA;&#xA;&#x9;#yddWrapper .ydd-tabs {&#xA;&#x9;&#x9;color: #959595&#xA;&#x9;}&#xA;&#xA;&#x9;.ydd-tabs,&#xA;&#x9;.ydd-tab {&#xA;&#x9;&#x9;background: #fff;&#xA;&#x9;&#x9;border-color: #d5e7f3&#xA;&#x9;}&#xA;&#xA;&#x9;#yddBottom {&#xA;&#x9;&#x9;color: #363636&#xA;&#x9;}&#xA;&#xA;&#x9;#yddWrapper {&#xA;&#x9;&#x9;min-width: 250px;&#xA;&#x9;&#x9;max-width: 400px;&#xA;&#x9;}&#xA;&lt;/style&gt;&#xA;&#xA;&lt;/html&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://luochang212.github.io/projects/3d_scene/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/projects/3d_scene/</guid>
      <description>&lt;!DOCTYPE html&gt;&#xA;&lt;html lang=&#34;zh-Hans&#34;&gt;&#xA;&#xA;&lt;head&gt;&#xA;&#xA;&lt;title&gt;3D场景建模&lt;/title&gt;&#xA;&#xA;&lt;meta name=&#34;author&#34; content=&#34;luochang&#34;&gt;&#xA;&lt;meta http-equiv=&#34;Content-Type&#34; content=&#34;text/html; charset=UTF-8&#34;&gt;&#xA;&lt;link rel=&#34;shortcut icon&#34; type=&#34;image/png&#34; href=&#34;https://luochang212.github.io/img/favicon.png&#34;&gt;&#xA;&lt;link rel=&#34;stylesheet&#34; href=&#34;https://luochang212.github.io/css/project.css&#34;&gt;&#xA;&lt;/head&gt;&#xA;&#xA;&lt;body data-gr-c-s-loaded=&#34;true&#34;&gt;&#xA;&#xA;&#x9;&lt;div id=&#34;menu&#34;&gt;&#xA;      &lt;a class=&#34;home-link&#34; href=&#34;https://luochang212.github.io/projects/&#34;&gt;更多项目&lt;/a&gt;&#xA;      &lt;!--&lt;a href=&#34;https://zh.learnlayout.com/toc.html&#34;&gt;目录&lt;/a&gt;--&gt;&#xA;    &lt;/div&gt;&#xA;&#x9;&#xA;    &lt;div class=&#34;resources-links&#34;&gt;&#xA;&#x9;&#x9;&lt;div id=&#34;page-title&#34;&gt;&#xA;&#x9;&#x9;&#x9;&lt;h2&gt;3D场景建模&lt;/h2&gt;&#x9;&#xA;        &lt;/div&gt;&#xA;&#xA;&#x9;&#x9;&lt;div id=&#34;page-sub-title&#34;&gt;&#xA;&#x9;&#x9;&#x9;用OpenGL搭建3D室内场景模型&#xA;&#x9;&#x9;&lt;/div&gt;&#xA;&#xA;        &lt;div id=&#34;page-content&#34;&gt;&#xA;&#x9;&#x9;&#x9;&lt;!--&#xA;&#x9;&#x9;&#x9;&lt;p&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;a href=&#34;https://luochang212.github.io/posts/my_weibo/&#34;&gt;博客全文&lt;/a&gt;&#xA;&#x9;&#x9;&#x9;&lt;/p&gt;&#xA;&#x9;&#x9;&#x9;--&gt;&#xA;&#x9;&#x9;&#x9;&lt;p&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;a href=&#34;https://www.bilibili.com/video/av54122818&#34;&gt;效果展示&lt;/a&gt;&#xA;&#x9;&#x9;&#x9;&lt;/p&gt;&#xA;&#x9;&#x9;&lt;/div&gt;        &#xA;&#xA;&#x9;&#x9;&lt;div id=&#34;copy-right&#34;&gt;&#xA;&#x9;&#x9;&#x9;© 2019 Chang Luo&#xA;&#x9;&#x9;&lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;&lt;/body&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://luochang212.github.io/projects/machine_learning/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/projects/machine_learning/</guid>
      <description>&lt;!DOCTYPE html&gt;&#xA;&lt;html lang=&#34;zh-Hans&#34;&gt;&#xA;&#xA;&lt;head&gt;&#xA;&#xA;&lt;title&gt;机器学习&lt;/title&gt;&#xA;&#xA;&lt;meta name=&#34;author&#34; content=&#34;luochang&#34;&gt;&#xA;&lt;meta http-equiv=&#34;Content-Type&#34; content=&#34;text/html; charset=UTF-8&#34;&gt;&#xA;&lt;link rel=&#34;shortcut icon&#34; type=&#34;image/png&#34; href=&#34;https://luochang212.github.io/img/favicon.png&#34;&gt;&#xA;&lt;link rel=&#34;stylesheet&#34; href=&#34;https://luochang212.github.io/css/project.css&#34;&gt;&#xA;&lt;/head&gt;&#xA;&#xA;&lt;body data-gr-c-s-loaded=&#34;true&#34;&gt;&#xA;&#xA;&#x9;&lt;div id=&#34;menu&#34;&gt;&#xA;      &lt;a class=&#34;home-link&#34; href=&#34;https://luochang212.github.io/projects/&#34;&gt;更多项目&lt;/a&gt;&#xA;      &lt;!--&lt;a href=&#34;https://zh.learnlayout.com/toc.html&#34;&gt;目录&lt;/a&gt;--&gt;&#xA;    &lt;/div&gt;&#xA;&#x9;&#xA;    &lt;div class=&#34;resources-links&#34;&gt;&#xA;&#x9;&#x9;&lt;div id=&#34;page-title&#34;&gt;&#xA;&#x9;&#x9;&#x9;&lt;h2&gt;机器学习&lt;/h2&gt;&#x9;&#xA;        &lt;/div&gt;&#xA;&#xA;&#x9;&#x9;&lt;div id=&#34;page-sub-title&#34;&gt;&#xA;&#x9;&#x9;&#x9;用主成分分析法实现MNIST数据集下的图像分类&#xA;&#x9;&#x9;&lt;/div&gt;&#xA;&#xA;        &lt;div id=&#34;page-content&#34;&gt;&#xA;&#x9;&#x9;&#x9;&lt;!--&#xA;&#x9;&#x9;&#x9;&lt;p&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;a href=&#34;https://luochang212.github.io/posts/my_weibo/&#34;&gt;博客全文&lt;/a&gt;&#xA;&#x9;&#x9;&#x9;&lt;/p&gt;&#xA;&#x9;&#x9;&#x9;--&gt;&#xA;&#x9;&#x9;&#x9;&lt;p&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;a href=&#34;https://github.com/luochang212/machine-learning&#34;&gt; GitHub &lt;/a&gt;&#xA;&#x9;&#x9;&#x9;&lt;/p&gt;&#xA;&#x9;&#x9;&lt;/div&gt;        &#xA;&#xA;&#x9;&#x9;&lt;div id=&#34;copy-right&#34;&gt;&#xA;&#x9;&#x9;&#x9;© 2019 Chang Luo&#xA;&#x9;&#x9;&lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;&lt;/body&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://luochang212.github.io/projects/markowitz_model/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/projects/markowitz_model/</guid>
      <description>&lt;!DOCTYPE html&gt;&#xA;&lt;html lang=&#34;zh-Hans&#34;&gt;&#xA;&#xA;&lt;head&gt;&#xA;&#xA;&lt;meta name=&#34;author&#34; content=&#34;luochang&#34;&gt;&#xA;&lt;meta http-equiv=&#34;Content-Type&#34; content=&#34;text/html; charset=UTF-8&#34;&gt;&#xA;&lt;link rel=&#34;shortcut icon&#34; type=&#34;image/png&#34; href=&#34;https://luochang212.github.io/img/favicon.png&#34;&gt;&#xA;&#xA;&lt;title&gt;基于蚁群算法的证券投资组合优化&lt;/title&gt;&#xA;&lt;style type=&#34;text/css&#34;&gt;&#xA;body {&#xA;&#x9;background: #FFF;&#xA;&#x9;font-family: Georgia, Times New Roman, Times, serif;&#xA;&#x9;font-size: 30px;&#xA;&#x9;text-align: center;&#xA;    margin: 0;&#xA;    padding: 0;&#xA;}&#xA;&#xA;h1 {&#xA;&#x9;font-size: 60px;&#xA;&#x9;font-weight: normal;&#xA;&#x9;margin: 0;&#xA;    font-family: &#39;Chelsea Market&#39;, Georgia, serif;&#xA;    color: #000;&#xA;&#x9;line-height: 1;&#xA;}&#xA;&#xA;h2 {&#xA;&#x9;font-size: 70px;&#xA;&#x9;font-weight: normal;&#xA;&#x9;margin: 0;&#xA;&#x9;color: #FFB000;&#xA;    font-family: &#39;Chelsea Market&#39;, Georgia, serif;&#xA;&#x9;text-transform: lowercase;&#xA;}&#xA;&#xA;h3 {&#xA;&#x9;font-size: 40px;&#xA;&#x9;font-weight: normal;&#xA;&#x9;margin: 0;&#xA;    margin-top: 40px;&#xA;&#x9;text-transform: lowercase;&#xA;}&#xA;&#xA;p {&#xA;&#x9;width: 960px;&#xA;&#x9;margin: 40px auto;&#xA;&#x9;color: #000;&#xA;    line-height: 200%;&#xA;}&#xA;&#xA;a, a:visited {&#xA;&#x9;color: #000;&#xA;    font-size: 14px;&#xA;    text-decoration: none;&#xA;}&#xA;&#xA;a:hover {&#xA;    text-decoration: underline;&#xA;}&#xA;&#xA;ul {&#xA;&#x9;list-style: none;&#xA;}&#xA;&#xA;.download {&#xA;&#x9;padding: 10px;&#xA;}&#xA;&#xA;pre {&#xA;&#x9;font-size: 18px;&#xA;}&#xA;&#xA;blockquote {&#xA;&#x9;text-align: left;&#xA;&#x9;width: 720px;&#xA;&#x9;margin: 10px auto;&#xA;&#x9;background: #C5C3DE;&#xA;&#x9;border: solid 2px #69697A;&#xA;&#x9;padding: 0 40px;&#xA;}&#xA;&#xA;code {&#xA;    background-color: #000;&#xA;&#x9;font-style: normal;&#xA;    border-radius: 10px;&#xA;    color: white;&#xA;    padding: 5px 15px;&#xA;    font-family: menlo, monospace;&#xA;}&#xA;&#xA;/*----------------------------------------  BLOCKS */&#xA;&#xA;.scrollblock {&#xA;&#x9;position: relative;&#xA;&#x9;margin: 0;&#xA;&#x9;width: 100%;&#xA;    color: white;&#xA;    padding-top: 80px;&#xA;    padding-bottom: 80px;&#xA;}&#xA;&#xA;.scrollblock h2 {&#xA;&#xA;}&#xA;&#xA;.block-title { background-color: #FFF; padding-bottom: 50px; }&#xA;.block-title h2 { color: #000; font-size: 30px;}&#xA;.block-title .meta { font-size: 18px; color: #999; }&#xA;.block-title .meta a { font-size: 16px; color: #333; }&#xA;.block-setup { background-color: #348fd4; }&#xA;.block-setup p  { text-align: left; }&#xA;.block-setup h2 { color: #06406c;}&#xA;.block-setup h2 a { background: none; padding: 0; font-size: normal; }&#xA;.block-setup a { color: #FFF; font-size: 40px; font-weight: normal;font-style: normal; background-color: #06406c; padding: 10px 15px; border-radius: 10px; text-decoration: none; }&#xA;.block-setup a:hover { text-decoration: underline; }&#xA;.block-create { background-color: #06406c; }&#xA;.block-create h2 { color: #FFF; }&#xA;.block-create p { color: #FFF; text-align: left;}&#xA;.block-create code { background-color: #000; color: #FFF; }&#xA;.block-checkout { background-color: #FFF; }&#xA;.block-checkout h2 { color: #000; }&#xA;.block-checkout p { text-align: left; }&#xA;.block-trees { background-color: #4c0d09; }&#xA;.block-trees h2 { color: #d3b2af; }&#xA;.block-trees p { color: #d3b2af; text-align: left;}&#xA;.block-trees code { color: #000; background-color: white; }&#xA;.block-add { background-color: #cc4037; }&#xA;.block-add h2, .block-add p { color: #4c0d09; }&#xA;.block-add p { text-align: left; }&#xA;.block-remote { background-color: #ffc19f; }&#xA;.block-remote h2 { color: #cc4037; }&#xA;.block-branching { background-color: #000; }&#xA;.block-branching h2 { color: #FFF; }&#xA;.block-branching p { color: #DDD; }&#xA;.block-branching code { color: #000; background-color: white; }&#xA;.block-merging { background-color: #F2F2F2; }&#xA;.block-merging h2 { color: #666; }&#xA;.block-tagging { background-color: #F2F2F2; }&#xA;.block-tagging h2 { color: #FFF; }&#xA;.block-hints { background-color: #F2F2F2; }&#xA;.block-hints h2 { color: #FFF; }&#xA;.block-resources { background-color: #ffc19f; }&#xA;.block-resources h2 { color: #cc4037; }&#xA;.block-resources h3 { color: #7d1f19; }&#xA;.block-resources ul { list-style: disc; margin: 0; padding: 0; }&#xA;.block-resources ul li a { font-size: 24px; color: #cc4037; }&#xA;.block-resources p a { color: #FFF; font-size: 40px; font-weight: normal;font-style: normal; background-color: #06406c; padding: 10px 15px; border-radius: 10px; text-decoration: none; }&#xA;.block-resources p a:hover { text-decoration: underline; }&#xA;.block-tagging { background-color: #348fd4; }&#xA;.block-tagging h2 { color: #06406c; }&#xA;.block-hints { background-color: #06406c; }&#xA;.block-hints h2 { color: #FFF; }&#xA;.block-hints p { color: #FFF; }&#xA;.block-hints code { background-color: #000; color: #FFF; }&#xA;.block-checkout-replace { background-color: #fff8c9; }&#xA;.block-checkout-replace h2 { color: #2d2700; }&#xA;.block-checkout-replace p { color: #615400; }&#xA;.block-comments { background-color: #FFF; padding-bottom: 50px; font-size: 14px; color: #000; }&#xA;.block-comments h2 { color: #000; }&#xA;.block-comments h3 { font-size: 16px; }&#xA;.block-comments #disqus_thread { width: 600px; text-align: left; margin-left: auto; margin-right: auto; }&#xA;&#xA;.tower {&#xA;    display: block;&#xA;    width: 180px;&#xA;    height: 260px;&#xA;    position: absolute;&#xA;    top: 330px;&#xA;    right: 0;&#xA;    background: #FFF url(../img/git-tower.png) no-repeat;&#xA;}&#xA;&#xA;.cheatsheet {&#xA;    display: block;&#xA;    width: 180px;&#xA;    height: 250px;&#xA;    position: absolute;&#xA;    top: 346px;&#xA;    left: 0;&#xA;    background: #FFF url(../img/cheatsheet.png) no-repeat;&#xA;}&#xA;&#xA;.announcement {&#xA;    margin-bottom: 40px;&#xA;}&#xA;&#xA;.announcement img {&#xA;    border-radius: 4px;&#xA;}&#xA;&#xA;#carbonads {&#xA;  display: block;&#xA;  overflow: hidden;&#xA;  padding: 10px;&#xA;  background-color: #dfdfdf;&#xA;&#x9;border-radius: 3px;&#xA;  max-width: 300px;&#xA;  margin: 0 auto;&#xA;  font-family: Verdana, &#34;Helvetica Neue&#34;, Helvetica, sans-serif;&#xA;  line-height: 1.5;&#xA;}&#xA;&#xA;#carbonads a {&#xA;  color: #606060;&#xA;}&#xA;&#xA;#carbonads a:hover {&#xA;  color: hsl(0, 0%, 20%);&#xA;  text-decoration: none;&#xA;}&#xA;&#xA;#carbonads span {&#xA;  position: relative;&#xA;  display: block;&#xA;  overflow: hidden;&#xA;}&#xA;&#xA;.carbon-img {&#xA;  float: left;&#xA;  margin-right: 1em;&#xA;}&#xA;&#xA;.carbon-img img { display: block; }&#xA;&#xA;.carbon-text {&#xA;  display: block;&#xA;  float: left;&#xA;  max-width: calc(100% - 130px - 1em);&#xA;  text-align: left;&#xA;}&#xA;&#xA;.carbon-poweredby {&#xA;  position: absolute;&#xA;  left: 144px;&#xA;  bottom: 0;&#xA;  display: block;&#xA;  text-transform: uppercase;&#xA;  letter-spacing: 1px;&#xA;  font-size: 9px;&#xA;}&#xA;&#xA;#menu {&#xA;  background-color: #FFF;  // whiteSmoke;&#xA;  text-align: center;&#xA;}&#xA;&#xA;#menu a {&#xA;  color: #FFF;  // #8F8F8F;&#xA;  display: inline-block;&#xA;  padding: .5em 1em;&#xA;  text-shadow: 0 1px 0 #EDEDED;&#xA;  text-decoration: none;&#xA;}&#xA;&#xA;#menu a:hover {&#xA;  background: #ffad8b  // rgb(220, 220, 220);&#xA;}&#xA;&#xA;#menu .home-link {&#xA;  margin-right: 1em;&#xA;}&#xA;&#xA;@media screen and (min-width:601px) {&#xA;&#xA;  #menu {&#xA;    position: absolute;&#xA;    top: -16px;&#xA;    left: -20px;&#xA;    width: 250px;&#xA;    padding-top: 1.7em;&#xA;    -webkit-transform-origin: 0 0;&#xA;       -moz-transform-origin: 0 0;&#xA;        -ms-transform-origin: 0 0;&#xA;         -o-transform-origin: 0 0;&#xA;            transform-origin: 0 0;&#xA;    -webkit-transform: rotate(-35deg) translate(-92px, 22px);  /* Safari 3.1+, Chrome */&#xA;       -moz-transform: rotate(-35deg) translate(-92px, 22px);  /* Firefox 3.5-15 */&#xA;        -ms-transform: rotate(-35deg) translate(-92px, 22px);  /* IE9+ */&#xA;         -o-transform: rotate(-35deg) translate(-92px, 22px);  /* Opera 10.5-12.00 */&#xA;            transform: rotate(-35deg) translate(-92px, 22px);  /* Firefox 16+, Opera 12.50+ */&#xA;  }&#xA;&#xA;  .rtl #menu {&#xA;    position: absolute;&#xA;    top: -16px;&#xA;    left: auto;&#xA;    right: -20px;&#xA;    width: 250px;&#xA;    padding-top: 2em;&#xA;    -webkit-transform-origin: 0 0;&#xA;       -moz-transform-origin: 0 0;&#xA;        -ms-transform-origin: 0 0;&#xA;         -o-transform-origin: 0 0;&#xA;            transform-origin: 0 0;&#xA;    -webkit-transform: rotate(35deg) translate(62px, -129px);  /* Safari 3.1+, Chrome */&#xA;       -moz-transform: rotate(35deg) translate(62px, -129px);  /* Firefox 3.5-15 */&#xA;        -ms-transform: rotate(35deg) translate(62px, -129px);  /* IE9+ */&#xA;         -o-transform: rotate(35deg) translate(62px, -129px);  /* Opera 10.5-12.00 */&#xA;            transform: rotate(35deg) translate(62px, -129px);  /* Firefox 16+, Opera 12.50+ */&#xA;  }&#xA;&#xA;  #menu a {&#xA;    display: block;&#xA;    padding: .6em 0;&#xA;  }&#xA;  &#xA;  #menu a:hover {&#xA;&#x9;color: #000000 // #8F8F8F;&#xA;  }&#xA;&#xA;}&#xA;&lt;/style&gt;&#xA;&lt;/head&gt;&#xA;&#xA;&lt;body data-gr-c-s-loaded=&#34;true&#34;&gt;&#xA;    &lt;div class=&#34;scrollblock block-title&#34;&gt;&#xA;&#x9;&lt;div id=&#34;menu&#34;&gt;&#xA;      &lt;a class=&#34;home-link&#34; href=&#34;https://luochang212.github.io/projects/&#34;&gt;更多项目&lt;/a&gt;&#xA;      &lt;!--&lt;a href=&#34;https://zh.learnlayout.com/toc.html&#34;&gt;目录&lt;/a&gt;--&gt;&#xA;    &lt;/div&gt;&#xA;&#x9;&#x9;&lt;br&gt;&#xA;&#x9;&#x9;&lt;h2&gt;基于蚁群算法的证券投资组合优化问题研究&lt;/h2&gt;&#xA;&#x9;&#x9;&lt;br&gt;&#xA;&#x9;&#x9;&lt;br&gt;&#xA;        &lt;p class=&#34;meta&#34;&gt;&#xA;        北京邮电大学本科毕业论文&lt;br&gt;&#xA;        指导老师：赵新超&lt;br&gt;&#xA;        作者：罗畅&#xA;        &lt;/p&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://luochang212.github.io/projects/monaco_speech_editor/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/projects/monaco_speech_editor/</guid>
      <description>&lt;!DOCTYPE html&gt;&#xA;&lt;html lang=&#34;zh-Hans&#34;&gt;&#xA;&#xA;&lt;head&gt;&#xA;&#xA;&lt;title&gt;Monaco Speech Editor&lt;/title&gt;&#xA;&#xA;&lt;meta name=&#34;author&#34; content=&#34;luochang&#34;&gt;&#xA;&lt;meta http-equiv=&#34;Content-Type&#34; content=&#34;text/html; charset=UTF-8&#34;&gt;&#xA;&lt;link rel=&#34;shortcut icon&#34; type=&#34;image/png&#34; href=&#34;https://luochang212.github.io/img/favicon.png&#34;&gt;&#xA;&lt;link rel=&#34;stylesheet&#34; href=&#34;https://luochang212.github.io/css/project.css&#34;&gt;&#xA;&lt;/head&gt;&#xA;&#xA;&lt;body data-gr-c-s-loaded=&#34;true&#34;&gt;&#xA;&#xA;&#x9;&lt;div id=&#34;menu&#34;&gt;&#xA;      &lt;a class=&#34;home-link&#34; href=&#34;https://luochang212.github.io/projects/&#34;&gt;更多项目&lt;/a&gt;&#xA;      &lt;!--&lt;a href=&#34;https://zh.learnlayout.com/toc.html&#34;&gt;目录&lt;/a&gt;--&gt;&#xA;    &lt;/div&gt;&#xA;&#x9;&#xA;    &lt;div class=&#34;resources-links&#34;&gt;&#xA;&#x9;&#x9;&lt;div id=&#34;page-title&#34;&gt;&#xA;&#x9;&#x9;&#x9;&lt;h2&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;!-- 适用于视障人群的代码编辑器 --&gt;&#xA;&#x9;&#x9;&#x9;&#x9;Monaco Speech Editor&#xA;&#x9;&#x9;&#x9;&lt;/h2&gt;&#x9;&#xA;        &lt;/div&gt;&#xA;&#xA;&#x9;&#x9;&lt;div id=&#34;page-sub-title&#34;&gt;&#xA;&#x9;&#x9;&#x9;&lt;!-- 内置语音模块和定制操作界面，使视障人员也能轻松编程 --&gt;&#xA;&#x9;&#x9;&#x9;&lt;!-- 为视障人群提供语音支持的在线代码编辑器 --&gt;&#xA;&#x9;&#x9;&#x9;适用于视障人群的在线代码编辑器&#xA;&#x9;&#x9;&lt;/div&gt;&#xA;&#xA;        &lt;div id=&#34;page-content&#34;&gt;&#xA;&#x9;&#x9;&#x9;&lt;p&gt;&#xA;            &lt;a href=&#34;https://luochang212.github.io/posts/monaco_speech_editor&#34;&gt;博客全文&lt;/a&gt;&#xA;&#x9;&#x9;&#x9;&lt;/p&gt;&#xA;&#x9;&#x9;&#x9;&lt;p&gt;&#xA;            &lt;a href=&#34;https://luochang212.github.io/gadget/monaco-speech-editor&#34;&gt;Demo&lt;/a&gt;&#xA;&#x9;&#x9;&#x9;&lt;/p&gt;&#xA;&#x9;&#x9;&lt;/div&gt;        &#xA;&#xA;&#x9;&#x9;&lt;div id=&#34;copy-right&#34;&gt;&#xA;&#x9;&#x9;&#x9;© 2019 Chang Luo&#xA;&#x9;&#x9;&lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;&lt;/body&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://luochang212.github.io/projects/my_weibo/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/projects/my_weibo/</guid>
      <description>&lt;!DOCTYPE html&gt;&#xA;&lt;html lang=&#34;zh-Hans&#34;&gt;&#xA;&#xA;&lt;head&gt;&#xA;&#xA;&lt;title&gt;微博数据可视化&lt;/title&gt;&#xA;&#xA;&lt;meta name=&#34;author&#34; content=&#34;luochang&#34;&gt;&#xA;&lt;meta http-equiv=&#34;Content-Type&#34; content=&#34;text/html; charset=UTF-8&#34;&gt;&#xA;&lt;link rel=&#34;shortcut icon&#34; type=&#34;image/png&#34; href=&#34;https://luochang212.github.io/img/favicon.png&#34;&gt;&#xA;&lt;link rel=&#34;stylesheet&#34; href=&#34;https://luochang212.github.io/css/project.css&#34;&gt;&#xA;&lt;/head&gt;&#xA;&#xA;&lt;body data-gr-c-s-loaded=&#34;true&#34;&gt;&#xA;&#xA;&#x9;&lt;div id=&#34;menu&#34;&gt;&#xA;      &lt;a class=&#34;home-link&#34; href=&#34;https://luochang212.github.io/projects/&#34;&gt;更多项目&lt;/a&gt;&#xA;      &lt;!--&lt;a href=&#34;https://zh.learnlayout.com/toc.html&#34;&gt;目录&lt;/a&gt;--&gt;&#xA;    &lt;/div&gt;&#xA;&#x9;&#xA;    &lt;div class=&#34;resources-links&#34;&gt;&#xA;&#x9;&#x9;&lt;div id=&#34;page-title&#34;&gt;&#xA;&#x9;&#x9;&#x9;&lt;h2&gt;微博数据可视化&lt;/h2&gt;&#x9;&#xA;        &lt;/div&gt;&#xA;&#xA;&#x9;&#x9;&lt;div id=&#34;page-sub-title&#34;&gt;&#xA;&#x9;&#x9;&#x9;基于Pandas和seaborn实现的新浪微博数据可视化&#xA;&#x9;&#x9;&lt;/div&gt;&#xA;&#xA;        &lt;div id=&#34;page-content&#34;&gt;&#xA;&#x9;&#x9;&#x9;&lt;p&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;a href=&#34;https://luochang212.github.io/posts/my_weibo/&#34;&gt;博客全文&lt;/a&gt;&#xA;&#x9;&#x9;&#x9;&lt;/p&gt;&#xA;&#x9;&#x9;&#x9;&lt;p&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;a href=&#34;https://github.com/luochang212/weibo-analysis&#34;&gt; GitHub &lt;/a&gt;&#xA;&#x9;&#x9;&#x9;&lt;/p&gt;&#xA;&#x9;&#x9;&lt;/div&gt;        &#xA;&#xA;&#x9;&#x9;&lt;div id=&#34;copy-right&#34;&gt;&#xA;&#x9;&#x9;&#x9;© 2019 Chang Luo&#xA;&#x9;&#x9;&lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;&lt;/body&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://luochang212.github.io/projects/nature_system/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/projects/nature_system/</guid>
      <description>&lt;!DOCTYPE html&gt;&#xA;&lt;html lang=&#34;zh-Hans&#34;&gt;&#xA;&#xA;&lt;head&gt;&#xA;&#xA;&lt;title&gt;自然系统的建模与仿真&lt;/title&gt;&#xA;&#xA;&lt;meta name=&#34;author&#34; content=&#34;luochang&#34;&gt;&#xA;&lt;meta http-equiv=&#34;Content-Type&#34; content=&#34;text/html; charset=UTF-8&#34;&gt;&#xA;&lt;link rel=&#34;shortcut icon&#34; type=&#34;image/png&#34; href=&#34;https://luochang212.github.io/img/favicon.png&#34;&gt;&#xA;&lt;link rel=&#34;stylesheet&#34; href=&#34;https://luochang212.github.io/css/project.css&#34;&gt;&#xA;&lt;/head&gt;&#xA;&#xA;&lt;body data-gr-c-s-loaded=&#34;true&#34;&gt;&#xA;&#xA;&#x9;&lt;div id=&#34;menu&#34;&gt;&#xA;      &lt;a class=&#34;home-link&#34; href=&#34;https://luochang212.github.io/projects/&#34;&gt;更多项目&lt;/a&gt;&#xA;      &lt;!--&lt;a href=&#34;https://zh.learnlayout.com/toc.html&#34;&gt;目录&lt;/a&gt;--&gt;&#xA;    &lt;/div&gt;&#xA;&#x9;&#xA;    &lt;div class=&#34;resources-links&#34;&gt;&#xA;&#x9;&#x9;&lt;div id=&#34;page-title&#34;&gt;&#xA;&#x9;&#x9;&#x9;&lt;h2&gt;自然系统的建模与仿真&lt;/h2&gt;&#x9;&#xA;        &lt;/div&gt;&#xA;&#xA;&#x9;&#x9;&lt;div id=&#34;page-sub-title&#34;&gt;&#xA;&#x9;&#x9;&#x9;用MATLAB面向对象编程建立了狼、麋鹿、草生态系统模型&#xA;&#x9;&#x9;&lt;/div&gt;&#xA;&#xA;        &lt;div id=&#34;page-content&#34;&gt;&#xA;&#xA;&#x9;&#x9;&#x9;&lt;p&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;a href=&#34;https://luochang212.github.io/posts/nature_system/&#34;&gt;博客全文&lt;/a&gt;&#xA;&#x9;&#x9;&#x9;&lt;/p&gt;&#xA;&#xA;&#x9;&#x9;&#x9;&lt;p&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;a href=&#34;https://github.com/luochang212/nature-system&#34;&gt; GitHub &lt;/a&gt;&#xA;&#x9;&#x9;&#x9;&lt;/p&gt;&#xA;&#x9;&#x9;&lt;/div&gt;        &#xA;&#xA;&#x9;&#x9;&lt;div id=&#34;copy-right&#34;&gt;&#xA;&#x9;&#x9;&#x9;© 2019 Chang Luo&#xA;&#x9;&#x9;&lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;&lt;/body&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://luochang212.github.io/projects/team_software_project/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/projects/team_software_project/</guid>
      <description>&lt;!DOCTYPE html&gt;&#xA;&lt;html lang=&#34;zh-Hans&#34;&gt;&#xA;&#xA;&lt;head&gt;&#xA;&#xA;&lt;title&gt;团队软件项目&lt;/title&gt;&#xA;&#xA;&lt;meta name=&#34;author&#34; content=&#34;luochang&#34;&gt;&#xA;&lt;meta http-equiv=&#34;Content-Type&#34; content=&#34;text/html; charset=UTF-8&#34;&gt;&#xA;&lt;link rel=&#34;shortcut icon&#34; type=&#34;image/png&#34; href=&#34;https://luochang212.github.io/img/favicon.png&#34;&gt;&#xA;&lt;link rel=&#34;stylesheet&#34; href=&#34;https://luochang212.github.io/css/project.css&#34;&gt;&#xA;&lt;/head&gt;&#xA;&#xA;&lt;body data-gr-c-s-loaded=&#34;true&#34;&gt;&#xA;&#xA;&#x9;&lt;div id=&#34;menu&#34;&gt;&#xA;      &lt;a class=&#34;home-link&#34; href=&#34;https://luochang212.github.io/projects/&#34;&gt;更多项目&lt;/a&gt;&#xA;      &lt;!--&lt;a href=&#34;https://zh.learnlayout.com/toc.html&#34;&gt;目录&lt;/a&gt;--&gt;&#xA;    &lt;/div&gt;&#xA;&#x9;&#xA;    &lt;div class=&#34;resources-links&#34;&gt;&#xA;&#x9;&#x9;&lt;div id=&#34;page-title&#34;&gt;&#xA;&#x9;&#x9;&#x9;&lt;h2&gt;团队软件项目&lt;/h2&gt;&#x9;&#xA;        &lt;/div&gt;&#xA;&#xA;&#x9;&#x9;&lt;div id=&#34;page-sub-title&#34;&gt;&#xA;&#x9;&#x9;&#x9;基于PyQt5编写的课程管理软件&#xA;&#x9;&#x9;&lt;/div&gt;&#xA;&#xA;        &lt;div id=&#34;page-content&#34;&gt;&#xA;&#x9;&#x9;&#x9;&lt;p&gt;&#xA;            &lt;a href=&#34;https://luochang212.github.io/pdf/Team_Project_Report.pdf&#34;&gt;项目报告&lt;/a&gt;&#xA;&#x9;&#x9;&#x9;&lt;/p&gt;&#xA;&#x9;&#x9;&#x9;&lt;p&gt;&#xA;            &lt;a href=&#34;https://luochang212.github.io/pdf/Team_Presentation.pdf&#34;&gt;项目PPT&lt;/a&gt;&#xA;&#x9;&#x9;&#x9;&lt;/p&gt;&#xA;&#x9;&#x9;&lt;/div&gt;        &#xA;&#xA;&#x9;&#x9;&lt;div id=&#34;copy-right&#34;&gt;&#xA;&#x9;&#x9;&#x9;© 2019 Chang Luo&#xA;&#x9;&#x9;&lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;&lt;/body&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://luochang212.github.io/projects/tsp_route/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://luochang212.github.io/projects/tsp_route/</guid>
      <description>&lt;!DOCTYPE html&gt;&#xA;&lt;html lang=&#34;zh-Hans&#34;&gt;&#xA;&#xA;&lt;head&gt;&#xA;&#xA;&lt;title&gt;TSP旅行路线规划&lt;/title&gt;&#xA;&#xA;&lt;meta name=&#34;author&#34; content=&#34;luochang&#34;&gt;&#xA;&lt;meta http-equiv=&#34;Content-Type&#34; content=&#34;text/html; charset=UTF-8&#34;&gt;&#xA;&lt;link rel=&#34;shortcut icon&#34; type=&#34;image/png&#34; href=&#34;https://luochang212.github.io/img/favicon.png&#34;&gt;&#xA;&lt;link rel=&#34;stylesheet&#34; href=&#34;https://luochang212.github.io/css/project.css&#34;&gt;&#xA;&lt;/head&gt;&#xA;&#xA;&lt;body data-gr-c-s-loaded=&#34;true&#34;&gt;&#xA;&#xA;&#x9;&lt;div id=&#34;menu&#34;&gt;&#xA;      &lt;a class=&#34;home-link&#34; href=&#34;https://luochang212.github.io/projects/&#34;&gt;更多项目&lt;/a&gt;&#xA;      &lt;!--&lt;a href=&#34;https://zh.learnlayout.com/toc.html&#34;&gt;目录&lt;/a&gt;--&gt;&#xA;    &lt;/div&gt;&#xA;&#x9;&#xA;    &lt;div class=&#34;resources-links&#34;&gt;&#xA;&#x9;&#x9;&lt;div id=&#34;page-title&#34;&gt;&#xA;&#x9;&#x9;&#x9;&lt;h2&gt;TSP旅行路线规划&lt;/h2&gt;&#x9;&#xA;        &lt;/div&gt;&#xA;&#xA;&#x9;&#x9;&lt;div id=&#34;page-sub-title&#34;&gt;&#xA;&#x9;&#x9;&#x9;用 Google Map Api 在谷歌地图上绘制TSP旅行路线&#xA;&#x9;&#x9;&lt;/div&gt;&#xA;&#xA;        &lt;div id=&#34;page-content&#34;&gt;&#xA;&#x9;&#x9;&#x9;&lt;p&gt;&#xA;            &lt;a href=&#34;https://luochang212.github.io/posts/tsp_route/&#34;&gt;博客全文&lt;/a&gt;&#xA;&#x9;&#x9;&#x9;&lt;/p&gt;&#xA;&#x9;&#x9;&#x9;&lt;p&gt;&#xA;            &lt;a href=&#34;https://github.com/luochang212/tsp-route&#34;&gt; GitHub &lt;/a&gt;&#xA;&#x9;&#x9;&#x9;&lt;/p&gt;&#xA;&#x9;&#x9;&lt;/div&gt;&#xA;&#xA;&#x9;&#x9;&lt;div id=&#34;copy-right&#34;&gt;&#xA;&#x9;&#x9;&#x9;© 2019 Chang Luo&#xA;&#x9;&#x9;&lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;&lt;/body&gt;</description>
    </item>
  </channel>
</rss>
