<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>I&#39;m company</title>
    <link>http://blog.imcompany.cn/</link>
    <description>Recent content on I&#39;m company</description>
    <image>
      <title>I&#39;m company</title>
      <url>http://blog.imcompany.cn/%3Clink%20or%20path%20of%20image%20for%20opengraph,%20twitter-cards%3E</url>
      <link>http://blog.imcompany.cn/%3Clink%20or%20path%20of%20image%20for%20opengraph,%20twitter-cards%3E</link>
    </image>
    <generator>Hugo -- 0.165.0</generator>
    <language>en</language>
    <lastBuildDate>Fri, 04 Sep 2026 17:26:43 +0800</lastBuildDate>
    <atom:link href="http://blog.imcompany.cn/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>那些被推荐的Video</title>
      <link>http://blog.imcompany.cn/post/na-xie-videos/</link>
      <pubDate>Tue, 01 Sep 2026 10:46:20 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/na-xie-videos/</guid>
      <description>&lt;h2 id=&#34;继承之战-第一季--豆瓣&#34;&gt;&lt;a href=&#34;https://movie.douban.com/subject/26813224/&#34;&gt;继承之战 第一季 (豆瓣)&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;燃烧--豆瓣&#34;&gt;&lt;a href=&#34;https://movie.douban.com/subject/26842702/&#34;&gt;燃烧 (豆瓣)&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;第二次世界大战-前线视角--豆瓣&#34;&gt;&lt;a href=&#34;https://movie.douban.com/subject/36529829/&#34;&gt;第二次世界大战：前线视角 (豆瓣)&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;生活多美好--豆瓣&#34;&gt;&lt;a href=&#34;https://movie.douban.com/subject/1293749/&#34;&gt;生活多美好 (豆瓣)&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;大明王朝1566--豆瓣&#34;&gt;&lt;a href=&#34;https://movie.douban.com/subject/2210001/&#34;&gt;大明王朝1566 (豆瓣)&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;流人-第一季--豆瓣&#34;&gt;&lt;a href=&#34;https://movie.douban.com/subject/34890017/&#34;&gt;流人 第一季 (豆瓣)&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;冰血暴-第一季--豆瓣&#34;&gt;&lt;a href=&#34;https://movie.douban.com/subject/24297912/&#34;&gt;冰血暴 第一季 (豆瓣)&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;咒术回战--豆瓣&#34;&gt;&lt;a href=&#34;https://movie.douban.com/subject/34895145/&#34;&gt;咒术回战 (豆瓣)&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;狗神--豆瓣&#34;&gt;&lt;a href=&#34;https://movie.douban.com/subject/35736202/&#34;&gt;狗神 (豆瓣)&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;love-death-plus-robots-love-death-and-robots-wiki-fandom&#34;&gt;&lt;a href=&#34;https://lovedeathrobots.fandom.com/wiki/LOVE_DEATH_%2B_ROBOTS&#34;&gt;LOVE DEATH + ROBOTS | Love, Death &amp;amp; Robots Wiki | Fandom&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;断网假期--豆瓣&#34;&gt;&lt;a href=&#34;https://movie.douban.com/subject/35151492/&#34;&gt;断网假期 (豆瓣)&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;过往人生--豆瓣&#34;&gt;&lt;a href=&#34;https://movie.douban.com/subject/34963356/&#34;&gt;过往人生 (豆瓣)&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;熊家餐馆-第一季--豆瓣&#34;&gt;&lt;a href=&#34;https://movie.douban.com/subject/35900652/&#34;&gt;熊家餐馆 第一季 (豆瓣)&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;大空头--豆瓣&#34;&gt;&lt;a href=&#34;https://movie.douban.com/subject/26303622/&#34;&gt;大空头 (豆瓣)&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;d-dot-p-逃兵追缉令--豆瓣&#34;&gt;&lt;a href=&#34;https://movie.douban.com/subject/35028876/&#34;&gt;D.P：逃兵追缉令 (豆瓣)&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;涉过愤怒的海--豆瓣&#34;&gt;&lt;a href=&#34;https://movie.douban.com/subject/33456512/&#34;&gt;涉过愤怒的海 (豆瓣)&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;青春--豆瓣&#34;&gt;&lt;a href=&#34;https://movie.douban.com/subject/27042464/&#34;&gt;青春 (豆瓣)&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;万箭穿心--豆瓣&#34;&gt;&lt;a href=&#34;https://movie.douban.com/subject/10537853/&#34;&gt;万箭穿心 (豆瓣)&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;首尔之春--豆瓣&#34;&gt;&lt;!-- raw HTML omitted --&gt;DONE&lt;!-- raw HTML omitted --&gt; &lt;a href=&#34;https://movie.douban.com/subject/35712804/&#34;&gt;首尔之春 (豆瓣)&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;河边的错误--豆瓣&#34;&gt;&lt;a href=&#34;https://movie.douban.com/subject/35256092/&#34;&gt;河边的错误 (豆瓣)&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;为全人类-第一季--豆瓣&#34;&gt;&lt;a href=&#34;https://movie.douban.com/subject/27663962/&#34;&gt;为全人类 第一季 (豆瓣)&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;杀手--豆瓣&#34;&gt;&lt;a href=&#34;https://movie.douban.com/subject/2998451/&#34;&gt;杀手 (豆瓣)&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;化学课--豆瓣&#34;&gt;&lt;a href=&#34;https://movie.douban.com/subject/35339377/&#34;&gt;化学课 (豆瓣)&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;午夜亚洲-美食-舞蹈-梦想--豆瓣&#34;&gt;&lt;a href=&#34;https://movie.douban.com/subject/35717235/&#34;&gt;午夜亚洲：美食·舞蹈·梦想 (豆瓣)&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;经济机器是如何运行的--豆瓣&#34;&gt;&lt;a href=&#34;https://movie.douban.com/subject/30458820/&#34;&gt;经济机器是如何运行的 (豆瓣)&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;涉足荒野--豆瓣&#34;&gt;&lt;a href=&#34;https://movie.douban.com/subject/21345845/&#34;&gt;涉足荒野 (豆瓣)&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;tinder诈骗王--豆瓣&#34;&gt;&lt;a href=&#34;https://movie.douban.com/subject/35732660/&#34;&gt;Tinder诈骗王 (豆瓣)&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;羊毛战记-第一季--豆瓣&#34;&gt;&lt;a href=&#34;https://movie.douban.com/subject/35468745/&#34;&gt;羊毛战记 第一季 (豆瓣)&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;劫机七小时--豆瓣&#34;&gt;&lt;a href=&#34;https://movie.douban.com/subject/36137261/&#34;&gt;劫机七小时 (豆瓣)&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;足球教练-第一季--豆瓣&#34;&gt;&lt;a href=&#34;https://movie.douban.com/subject/34843220/&#34;&gt;足球教练 第一季 (豆瓣)&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;华尔街之狼--豆瓣&#34;&gt;&lt;a href=&#34;https://movie.douban.com/subject/2997076/&#34;&gt;华尔街之狼 (豆瓣)&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;黑镜-第一季--豆瓣&#34;&gt;&lt;a href=&#34;https://movie.douban.com/subject/7054120/&#34;&gt;黑镜 第一季 (豆瓣)&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;项塔兰--豆瓣&#34;&gt;&lt;a href=&#34;https://movie.douban.com/subject/1765017/&#34;&gt;项塔兰 (豆瓣)&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;夏威夷特勤组-第一季--豆瓣&#34;&gt;&lt;a href=&#34;https://movie.douban.com/subject/4317594/&#34;&gt;夏威夷特勤组 第一季 (豆瓣)&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;一共有10季&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 2026-W35</title>
      <link>http://blog.imcompany.cn/post/peng-week35/</link>
      <pubDate>Fri, 28 Aug 2026 16:58:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/peng-week35/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;h3 id=&#34;继续读-极端的年代-1914-1991--豆瓣----peng-read-2026-dot-md&#34;&gt;继续读  &lt;a href=&#34;http://blog.imcompany.cn/post/peng-read-2026/#极端的年代19141991-豆瓣&#34;&gt;极端的年代：1914—1991 (豆瓣)&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;读完 极端的年代：1914—1991/第十章 1945—1990年社会革命&lt;/p&gt;
&lt;p&gt;讲述了20世纪下半叶的社会变革，主要有：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;小农经济的死亡，各国的农业人口占比下降显著，无论是发达国家还是落后国家，且落后国家的下降比例更高&lt;/li&gt;
&lt;li&gt;需要受过中高等教育的人从事的职业出现，各国大学生人数比例上升，学生地位显著提升&lt;/li&gt;
&lt;li&gt;进入80年代后，工人阶级成为新科技之下的牺牲品，自动化大行其道&lt;/li&gt;
&lt;li&gt;第三产业的兴起让女性扮演更加重要的角色，半数以上女性进入劳动力市场&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;诺兰的-奥德赛-采取了什么样的改编策略&#34;&gt;&lt;a href=&#34;https://www.geedea.pro/article/odyssey/&#34;&gt;诺兰的《奥德赛》采取了什么样的改编策略？&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;对于近期很火的《奥德赛》电影的解析，影院看的时候被宏大的场面震撼，看了作者的解析，发现这里面还有很多导演对这个故事的理解与改编，作者出了三篇文章来解读，后面的两篇还没看&lt;/p&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;p&gt;无&lt;/p&gt;
&lt;h2 id=&#34;image-️&#34;&gt;Image 🖼️&lt;/h2&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/%E4%B8%AD%E5%9B%BD%E4%BC%A0%E7%BB%9F%E6%B0%B4%E5%A2%A8%E7%94%BB_%E7%AB%96%E5%B9%85%E7%AB%8B%E8%BD%B4%E6%9E%84%E5%9B%BE_%E6%88%90%E8%AF%AD_%E7%9B%B8%E5%BE%97%E7%9B%8A%E5%BD%B0_%E7%9A%84%E6%84%8F%E5%A2%83_%E4%B8%80%E8%BD%AE%E6%B7%A1_2026-09-04T08-43-13.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;&lt;strong&gt;相得益彰&lt;/strong&gt;, 不同部分在关系中互相放大优点&lt;/p&gt;
&lt;h2 id=&#34;speech&#34;&gt;Speech 💬&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;http://blog.imcompany.cn/post/speech/#人只在安全的地方才勇敢&#34;&gt;人只在安全的地方才勇敢&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;wiki一下&#34;&gt;Wiki一下&lt;/h2&gt;
&lt;h3 id=&#34;sotheby-s-wikipedia&#34;&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Sotheby&#39;s?useskin=vector&#34;&gt;Sotheby&amp;rsquo;s - Wikipedia&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;苏富比，是一家总部位于纽约市的英国跨国公司。它是世界上最悠久、规模最大的美术与装饰艺术、珠宝和收藏品经纪商之一。该公司在40个国家设有80个分支机构，并在英国拥有重要业务布局&lt;/p&gt;
&lt;p&gt;苏富比拍卖行于1744年3月11日在伦敦由书商塞缪尔·贝克创立&lt;/p&gt;
&lt;p&gt;这家美国控股公司最初于1983年8月在密歇根州注册成立，名为苏富比控股有限公司。2006年6月，在特拉华州重新注册，并更名为苏富比。2019年6月，法裔以色列商人帕特里克·德拉希以61%的市场溢价收购了苏富比&lt;/p&gt;
&lt;p&gt;苏富比艺术学院（教育机构）、苏富比国际房地产公司和RM苏富比（老爷车经销商）是其子公司或合作伙伴组织&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 2026-W34</title>
      <link>http://blog.imcompany.cn/post/peng-week34/</link>
      <pubDate>Fri, 21 Aug 2026 15:41:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/peng-week34/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;h3 id=&#34;继续读-资治通鉴--豆瓣----peng-read-2026-dot-md&#34;&gt;继续读 &lt;a href=&#34;http://blog.imcompany.cn/post/peng-read-2026/#资治通鉴-豆瓣&#34;&gt;资治通鉴 (豆瓣)&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;读到了 神龙政变部分，女皇在立接班人的问题上犯难，想立武家人，武家人在对外征战上毫无建树，还伤了民心。后又担心死后的香火问题，女皇只能选择还政给李唐，在她执政后期把李显立为太子，继续扶持二张把持朝政，直到恢复李唐的大臣们在使用正规渠道铲除二张无果后，发动神龙政变，最终唐高宗李显即位，大赏政变功臣，然后就是皇权的重新聚拢下的政治博弈&lt;/p&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;h3 id=&#34;abue-ammar-tinycast-tinycast-a-tiny-fully-native-macos-launcher-hotkeys-and-clipboard-history&#34;&gt;&lt;a href=&#34;https://github.com/abue-ammar/tinycast&#34;&gt;abue-ammar/tinycast: Tinycast — a tiny, fully native macOS launcher, hotkeys, and clipboard history&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Mac快捷启动工程Raycast的开源版本，可以安装Raycast的插件&lt;/p&gt;
&lt;h4 id=&#34;d41d8c&#34;&gt;&lt;/h4&gt;
&lt;h3 id=&#34;pls-1q43-dibao-local-first-super-low-cost-ai-powered-personal-rss-reader-dot-0-dot-6b-模型可驱动的低成本-ai-个人-rss-阅读器&#34;&gt;&lt;a href=&#34;https://github.com/Pls-1q43/Dibao#%E5%BF%AB%E9%80%9F%E5%AE%89%E8%A3%85&#34;&gt;Pls-1q43/Dibao: Local first, super low cost AI-powered personal RSS reader. / 0.6B 模型可驱动的低成本 AI 个人 RSS 阅读器。&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;基于本地AI驱动个人可控的RSS阅读器，可以直接配置Ollama使用&lt;/p&gt;
&lt;h4 id=&#34;d41d8c&#34;&gt;&lt;/h4&gt;
&lt;h3 id=&#34;starcat-app-starcat-a-native-macos-app-that-turns-github-stars-into-a-searchable-organized-ai-powered-personal-knowledge-base-dot&#34;&gt;&lt;a href=&#34;https://github.com/starcat-app/Starcat&#34;&gt;starcat-app/Starcat: A native macOS app that turns GitHub Stars into a searchable, organized, AI-powered personal knowledge base.&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Github Star管理APP，集成了AI功能，把gtihub仓库直接变成语料库，不过AI功能需要购买license&lt;/p&gt;
&lt;h4 id=&#34;d41d8c&#34;&gt;&lt;/h4&gt;
&lt;h3 id=&#34;paulsp94-omacosy-pre-1-dot-0-dot-an-omarchy-style-desktop-environment-for-macos-tiling-with-a-real-super-key-dwindle-layout-a-themed-status-bar-written-for-it-focus-follows-mouse-trackpad-workspace-swipes-and-a-live-workspace-overview-157mb-six-self-built-swift-binaries-one-repo-dot-built-and-tested-on-macos-26-apple-silicon-dot&#34;&gt;&lt;a href=&#34;https://github.com/paulsp94/omacosy&#34;&gt;paulsp94/omacosy: Pre-1.0. An omarchy-style desktop environment for macOS: tiling with a real Super key, dwindle layout, a themed status bar written for it, focus-follows-mouse, trackpad workspace swipes and a live workspace overview — ~157MB, six self-built Swift binaries, one repo. Built and tested on macOS 26 / Apple Silicon.&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;为Mac配置类似omachy样式的桌面，带常用APP快速打开，窗口管理和状态栏，占用的空间不大，新电脑可以直接配置使用，MacOS 26最佳&lt;/p&gt;</description>
    </item>
    <item>
      <title>那些日常使用的工具们</title>
      <link>http://blog.imcompany.cn/post/useful-tools/</link>
      <pubDate>Fri, 21 Aug 2026 11:36:37 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/useful-tools/</guid>
      <description>&lt;h2 id=&#34;古籍文献知识图谱网&#34;&gt;&lt;a href=&#34;https://cnkgraph.com/&#34;&gt;古籍文献知识图谱网&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;中国历朝代视频讲解&#34;&gt;&lt;a href=&#34;https://historyline.19921014.xyz/&#34;&gt;中国历朝代视频讲解&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;history-as-context-chronas&#34;&gt;&lt;a href=&#34;https://chronas.org/?year=1000&#34;&gt;🌍 History As Context: chronas&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;让你用上帝视角看人类历史：它把整个人类历史，做成了一张可以随手拖拽的【Google 地图版时间线】&lt;/p&gt;
&lt;h2 id=&#34;读通鉴&#34;&gt;&lt;a href=&#34;https://www.dutongjian.com/&#34;&gt;读通鉴&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;free-public-apis&#34;&gt;&lt;a href=&#34;https://www.freepublicapis.com/&#34;&gt;Free Public APIs&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;免费公共API，实时检测可用性&lt;/p&gt;
&lt;h2 id=&#34;最佳平替-用更低价的搜索词购物&#34;&gt;&lt;a href=&#34;https://pingti.app/&#34;&gt;最佳平替 - 用更低价的搜索词购物&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;searchemoji-支持-30-个语言的-emoji-搜索引擎-一词搜索-️一键复制&#34;&gt;&lt;a href=&#34;https://searchemoji.app/zh-hans&#34;&gt;SearchEmoji - 支持 30 个语言的 Emoji 搜索引擎。🔍一词搜索，🖱️一键复制！&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Emoji搜索&lt;/p&gt;
&lt;h2 id=&#34;subtitle-converter-happyscribe&#34;&gt;&lt;a href=&#34;https://www.happyscribe.com/tools/subtitle-converter&#34;&gt;Subtitle Converter | HappyScribe&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;字幕文件转换&lt;/p&gt;
&lt;h2 id=&#34;puter&#34;&gt;&lt;a href=&#34;https://puter.com/&#34;&gt;Puter&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;一个有趣的开源项目，可撸，开源的webOS，可当图床用&lt;/p&gt;
&lt;h2 id=&#34;breaking-medium-paywall-freedium&#34;&gt;&lt;a href=&#34;https://freedium.cfd/&#34;&gt;Breaking Medium paywall! - Freedium&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;解锁medium&lt;/p&gt;
&lt;h2 id=&#34;即时工具-致力打造即用即走型在线工具箱&#34;&gt;&lt;a href=&#34;https://www.67tool.com/&#34;&gt;即时工具-致力打造即用即走型在线工具箱&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;在线工具集合网站&lt;/p&gt;
&lt;h2 id=&#34;html-to-markdown-转换工具-url-to-markdown-转换器-开发者工具箱&#34;&gt;&lt;a href=&#34;https://devtool.tech/html-md&#34;&gt;HTML To Markdown 转换工具 | URL To Markdown 转换器 | 开发者工具箱&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;pdf-to-markdown&#34;&gt;&lt;a href=&#34;https://pdf2md.morethan.io/&#34;&gt;PDF to Markdown&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;seedr-download-anything-quick-and-easy&#34;&gt;&lt;a href=&#34;https://www.seedr.cc/?r=5575434&#34;&gt;Seedr: Download Anything Quick &amp;amp; Easy&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;离线下载&lt;/p&gt;
&lt;h2 id=&#34;nlab&#34;&gt;&lt;a href=&#34;https://ncatlab.org/nlab/show/HomePage&#34;&gt;nLab&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;nLab 这个 Wiki 网站对数学、物理学、哲学领域有着清晰、深刻的整理&lt;/p&gt;
&lt;h2 id=&#34;首页-明日故乡&#34;&gt;&lt;a href=&#34;https://guxiang.app/&#34;&gt;首页 | 明日故乡&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;中国城市数据查询&lt;/p&gt;</description>
    </item>
    <item>
      <title>那些日常使用的工具们</title>
      <link>http://blog.imcompany.cn/posts/useful-tools/</link>
      <pubDate>Fri, 21 Aug 2026 11:36:19 +0800</pubDate>
      <guid>http://blog.imcompany.cn/posts/useful-tools/</guid>
      <description>&lt;h2 id=&#34;古籍文献知识图谱网&#34;&gt;&lt;a href=&#34;https://cnkgraph.com/&#34;&gt;古籍文献知识图谱网&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;中国历朝代视频讲解&#34;&gt;&lt;a href=&#34;https://historyline.19921014.xyz/&#34;&gt;中国历朝代视频讲解&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;history-as-context-chronas&#34;&gt;&lt;a href=&#34;https://chronas.org/?year=1000&#34;&gt;🌍 History As Context: chronas&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;让你用上帝视角看人类历史：它把整个人类历史，做成了一张可以随手拖拽的【Google 地图版时间线】&lt;/p&gt;
&lt;h2 id=&#34;读通鉴&#34;&gt;&lt;a href=&#34;https://www.dutongjian.com/&#34;&gt;读通鉴&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;free-public-apis&#34;&gt;&lt;a href=&#34;https://www.freepublicapis.com/&#34;&gt;Free Public APIs&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;免费公共API，实时检测可用性&lt;/p&gt;
&lt;h2 id=&#34;最佳平替-用更低价的搜索词购物&#34;&gt;&lt;a href=&#34;https://pingti.app/&#34;&gt;最佳平替 - 用更低价的搜索词购物&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;searchemoji-支持-30-个语言的-emoji-搜索引擎-一词搜索-️一键复制&#34;&gt;&lt;a href=&#34;https://searchemoji.app/zh-hans&#34;&gt;SearchEmoji - 支持 30 个语言的 Emoji 搜索引擎。🔍一词搜索，🖱️一键复制！&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Emoji搜索&lt;/p&gt;
&lt;h2 id=&#34;subtitle-converter-happyscribe&#34;&gt;&lt;a href=&#34;https://www.happyscribe.com/tools/subtitle-converter&#34;&gt;Subtitle Converter | HappyScribe&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;字幕文件转换&lt;/p&gt;
&lt;h2 id=&#34;puter&#34;&gt;&lt;a href=&#34;https://puter.com/&#34;&gt;Puter&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;一个有趣的开源项目，可撸，开源的webOS，可当图床用&lt;/p&gt;
&lt;h2 id=&#34;breaking-medium-paywall-freedium&#34;&gt;&lt;a href=&#34;https://freedium.cfd/&#34;&gt;Breaking Medium paywall! - Freedium&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;解锁medium&lt;/p&gt;
&lt;h2 id=&#34;即时工具-致力打造即用即走型在线工具箱&#34;&gt;&lt;a href=&#34;https://www.67tool.com/&#34;&gt;即时工具-致力打造即用即走型在线工具箱&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;在线工具集合网站&lt;/p&gt;
&lt;h2 id=&#34;html-to-markdown-转换工具-url-to-markdown-转换器-开发者工具箱&#34;&gt;&lt;a href=&#34;https://devtool.tech/html-md&#34;&gt;HTML To Markdown 转换工具 | URL To Markdown 转换器 | 开发者工具箱&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;pdf-to-markdown&#34;&gt;&lt;a href=&#34;https://pdf2md.morethan.io/&#34;&gt;PDF to Markdown&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;seedr-download-anything-quick-and-easy&#34;&gt;&lt;a href=&#34;https://www.seedr.cc/?r=5575434&#34;&gt;Seedr: Download Anything Quick &amp;amp; Easy&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;离线下载&lt;/p&gt;
&lt;h2 id=&#34;nlab&#34;&gt;&lt;a href=&#34;https://ncatlab.org/nlab/show/HomePage&#34;&gt;nLab&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;nLab 这个 Wiki 网站对数学、物理学、哲学领域有着清晰、深刻的整理&lt;/p&gt;
&lt;h2 id=&#34;首页-明日故乡&#34;&gt;&lt;a href=&#34;https://guxiang.app/&#34;&gt;首页 | 明日故乡&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;中国城市数据查询&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 2026-W33</title>
      <link>http://blog.imcompany.cn/post/peng-week33/</link>
      <pubDate>Fri, 14 Aug 2026 15:02:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/peng-week33/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;h3 id=&#34;继续读-极端的年代-1914-1991--豆瓣----peng-read-2026-dot-md&#34;&gt;继续读  &lt;a href=&#34;http://blog.imcompany.cn/post/peng-read-2026/#极端的年代19141991-豆瓣&#34;&gt;极端的年代：1914—1991 (豆瓣)&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;继续读 极端的年代：1914—1991/第九章 黄金年代&lt;/p&gt;
&lt;p&gt;黄金年代跨国公司出现，生产力需求外溢到全球低价劳动力国家，城市小国的崛起，福利国家的形成，一切向好却即将迎来大崩溃&lt;/p&gt;
&lt;h3 id=&#34;理想主义者眼里的光-菠萝油与天光墟&#34;&gt;&lt;a href=&#34;https://ramsayleung.github.io/zh/post/2026/%E7%90%86%E6%83%B3%E4%B8%BB%E4%B9%89%E8%80%85%E7%9C%BC%E9%87%8C%E7%9A%84%E5%85%89/?__readwiseLocation=&#34;&gt;理想主义者眼里的光 | 菠萝油与天光墟&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;最喜欢眼里有光的人，世界需要理想主义者来推动进步，向他们致敬&lt;/p&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;h3 id=&#34;plainhub-plain-app-plainapp-is-an-open-source-app-that-lets-you-securely-manage-your-phone-from-a-web-browser-dot-access-files-media-contacts-sms-calls-and-more-through-a-simple-easy-to-use-interface-on-your-desktop-dot--android-apps-dot-md&#34;&gt;&lt;a href=&#34;http://blog.imcompany.cn/posts/android-apps/#plainhubplain-app-plainapp-is-an-open-source-app-that-lets-you-securely-manage-your-phone-from-a-web-browser-access-files-media-contacts-sms-calls-and-more-through-a-simple-easy-to-use-interface-on-your-desktop&#34;&gt;plainhub/plain-app: 🔥 PlainApp is an open-source app that lets you securely manage your phone from a web browser. Access files, media, contacts, SMS, calls, and more through a simple, easy-to-use interface on your desktop.&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;开源管理手机内容Andoird应用，还带有会话聊天传文件功能&lt;/p&gt;
&lt;h3 id=&#34;deepseek-ai-deepseek-harness-deepseek-harness-everything-is-a-plugin-dot&#34;&gt;&lt;a href=&#34;https://github.com/deepseek-ai/deepseek-harness&#34;&gt;deepseek-ai/deepseek-harness: DeepSeek Harness: Everything is a Plugin.&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Deepseek出品的AI harness，提出一切皆插件，目前还在开发者预览阶段，学习一下&lt;/p&gt;
&lt;h4 id=&#34;d41d8c&#34;&gt;&lt;/h4&gt;
&lt;h2 id=&#34;image-️&#34;&gt;Image 🖼️&lt;/h2&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/Traditional_Chinese_ink_wash_p_2026-08-14T09-18-07.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;&lt;strong&gt;见微知著&lt;/strong&gt; ，在微小的迹象里识别已经开始显形的大结构&lt;/p&gt;
&lt;h2 id=&#34;speech&#34;&gt;Speech 💬&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;http://blog.imcompany.cn/post/speech/#真正有效的知识-通常简单得让你意想不到&#34;&gt;真正有效的知识，通常简单得让你意想不到&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;wiki一下&#34;&gt;Wiki一下&lt;/h2&gt;
&lt;h3 id=&#34;travis-kelce-wikipedia&#34;&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Travis_Kelce?useskin=vector&#34;&gt;Travis Kelce - Wikipedia&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;特拉维斯·迈克尔·凯尔斯，出生于1989年10月5日，是美国职业橄榄球近端锋，效力于NFL堪萨斯城酋长队，被认为是NFL历史上最伟大的近端锋之一&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 2026-W32</title>
      <link>http://blog.imcompany.cn/post/peng-week32/</link>
      <pubDate>Fri, 07 Aug 2026 17:05:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/peng-week32/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;h3 id=&#34;继续读-极端的年代-1914-1991--豆瓣----peng-read-2026-dot-md&#34;&gt;继续读  &lt;a href=&#34;http://blog.imcompany.cn/post/peng-read-2026/#极端的年代19141991-豆瓣&#34;&gt;极端的年代：1914—1991 (豆瓣)&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;开始读-&amp;gt; 极端的年代：1914—1991/第九章 黄金年代&lt;/p&gt;
&lt;p&gt;二战后的30年是资本主义国家的黄金红利期，人口增加，粮食生产过剩，以至于外销的粮食价格比本国的还要便宜。爆炸性增长的背后是人类对地球环境的污染，以及生态系统平衡的破坏，石油、煤碳及天然气的惊人消耗是最大的祸源，但是人们的醒悟总是来的晚很多&lt;/p&gt;
&lt;h3 id=&#34;他来过-也为普通人点过灯-怀念孤勇者张雪峰-林海草原&#34;&gt;&lt;a href=&#34;https://lhcy.org/archives/ta-lai-guo-ye-wei-pu-tong-ren-dian-guo-deng-huai-nian-gu.html&#34;&gt;他来过，也为普通人点过灯——怀念孤勇者张雪峰 - 林海草原&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;怀念一下，为数不多的孤勇者&lt;/p&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;h3 id=&#34;l0ng-ai-tty7-a-terminal-workbench-in-pure-rust-shells-persistent-sessions-ssh-coding-agents-dot-gpu-rendered-on-zed-s-gpui-vt-core-from-alacritty-dot&#34;&gt;&lt;a href=&#34;https://github.com/l0ng-ai/tty7&#34;&gt;l0ng-ai/tty7: A terminal workbench in pure Rust: shells, persistent sessions, SSH, coding agents. GPU-rendered on Zed&amp;rsquo;s gpui, VT core from Alacritty.&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;纯Rust实现的终端工作台，对于远程操作支持很给力&lt;/p&gt;
&lt;h4 id=&#34;d41d8c&#34;&gt;&lt;/h4&gt;
&lt;h3 id=&#34;trycua-cua-scale-computer-use-2-dot-0-with-open-source-drivers-cross-os-fleets-and-benchmarks-for-training-evaluation-and-data-generation-dot&#34;&gt;&lt;a href=&#34;https://github.com/trycua/cua&#34;&gt;trycua/cua: Scale computer-use 2.0 with open-source drivers, cross-OS fleets, and benchmarks for training, evaluation, and data generation.&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id=&#34;d41d8c&#34;&gt;&lt;/h4&gt;
&lt;p&gt;类似ChatGPT Computer Use的自动操作工具，跨平台&lt;/p&gt;
&lt;h2 id=&#34;image-️&#34;&gt;Image 🖼️&lt;/h2&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/Traditional_Chinese_ink_wash_p_2026-08-07T09-34-52.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;&lt;strong&gt;相辅相成&lt;/strong&gt; ，做到1+1&amp;gt;2或者N&lt;/p&gt;
&lt;h2 id=&#34;speech&#34;&gt;Speech 💬&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;http://blog.imcompany.cn/post/speech/#最有效的助眠神器是今日事今日毕&#34;&gt;最有效的助眠神器是今日事今日毕&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;wiki一下&#34;&gt;Wiki一下&lt;/h2&gt;
&lt;h3 id=&#34;serena-williams-wikipedia&#34;&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Serena_Williams?useskin=vector&#34;&gt;Serena Williams - Wikipedia&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;塞雷娜·贾梅卡·威廉姆斯（小威），美国职业网球运动员。在女子网球协会的女子单打排名中连续319周排名世界第一。赢得了73个WTA巡回赛级别的单打冠军，其中包括23个女子单打冠军（公开时代最多，历史第二多）。她是唯一一位在单打和双打中都获得职业生涯大满贯的选手，也是唯一一位同时拥有奥运会金牌和所有四项单打、双打满贯头衔的选手&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 2026-W31</title>
      <link>http://blog.imcompany.cn/post/2026-week31/</link>
      <pubDate>Thu, 30 Jul 2026 10:41:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/2026-week31/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;h3 id=&#34;继续读-资治通鉴--豆瓣----peng-read-2026-dot-md&#34;&gt;继续读 &lt;a href=&#34;http://blog.imcompany.cn/post/peng-read-2026/#资治通鉴-豆瓣&#34;&gt;资治通鉴 (豆瓣)&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;读完了 女皇武则天 部分，武则天抓住了王皇后皇宫争斗被利用的机会(其实也是高宗夺回皇权的一部分)，翻身当上皇后，又一步步的建立起二圣听政的局面，最后彻底掌控皇权登顶权力之巅&lt;/p&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;h3 id=&#34;exelban-stats-macos-system-monitor-in-your-menu-bar&#34;&gt;&lt;a href=&#34;https://github.com/exelban/stats&#34;&gt;exelban/stats: macOS system monitor in your menu bar&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;MAC菜单栏系统信息监控应用，iStat Menus 占用的空间太大了&lt;/p&gt;
&lt;h4 id=&#34;d41d8c&#34;&gt;&lt;/h4&gt;
&lt;h3 id=&#34;twalichiewicz-hnewhere-a-lightweight-userscript-that-adds-hacker-news-discussions-to-any-article-dot&#34;&gt;&lt;a href=&#34;https://github.com/twalichiewicz/HNewhere&#34;&gt;twalichiewicz/HNewhere: A lightweight userscript that adds Hacker News discussions to any article.&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;油猴脚本，在当前页面显示Hacker News上对应的讨论&lt;/p&gt;
&lt;h4 id=&#34;d41d8c&#34;&gt;&lt;/h4&gt;
&lt;h3 id=&#34;iamcorey-birth-一目了然地管理你的电脑启动项-开源-macos-启动项管理器&#34;&gt;&lt;a href=&#34;https://github.com/iAmCorey/birth&#34;&gt;iAmCorey/birth: 一目了然地管理你的电脑启动项 | 开源 macOS 启动项管理器&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;管理电脑启动项的MAC应用，安装后清理一些不必要的启动项，还删除了一些根本不用的应用，系统清爽了许多&lt;/p&gt;
&lt;h4 id=&#34;d41d8c&#34;&gt;&lt;/h4&gt;
&lt;h2 id=&#34;image-️&#34;&gt;Image 🖼️&lt;/h2&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/Traditional_Chinese_ink_wash_p_2026-07-31T09-59-49.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;曲突徙薪，防患于未然，社会倾向赞美救火英雄，而忘记提醒你多关注火灾隐患的人&lt;/p&gt;
&lt;h2 id=&#34;speech&#34;&gt;Speech 💬&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;http://blog.imcompany.cn/post/speech/#好的评论不是给出答案-而是打开问题&#34;&gt;好的评论不是给出答案，而是打开问题&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;wiki一下&#34;&gt;Wiki一下&lt;/h2&gt;
&lt;h3 id=&#34;flamingo-wikipedia&#34;&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Flamingo?useskin=vector&#34;&gt;Flamingo - Wikipedia&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;火烈鸟, 是一种涉禽，属于腓鸟科，是腓鸟科唯一现存的家族。有四种火烈鸟分布在整个美洲，两种原产于非洲-欧亚大陆&lt;/p&gt;
&lt;p&gt;“火烈鸟”这个名字来源于葡萄牙语或西班牙语的“flamengo”，意思是“火红色的”&lt;/p&gt;</description>
    </item>
    <item>
      <title>Anki常用插件集合</title>
      <link>http://blog.imcompany.cn/post/anki-plugins/</link>
      <pubDate>Wed, 22 Jul 2026 19:53:44 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/anki-plugins/</guid>
      <description>&lt;h2 id=&#34;ankiconnect-ankiweb&#34;&gt;&lt;a href=&#34;https://ankiweb.net/shared/info/2055492159&#34;&gt;AnkiConnect - AnkiWeb&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Captured On: &lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;[2023-12-05 Tue 11:20]&lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;
扩展三方应用与Anki进行API操作，目前主要使用在org-anki和loseq-anki&lt;/p&gt;
&lt;h3 id=&#34;code&#34;&gt;code&lt;/h3&gt;
&lt;p&gt;2055492159&lt;/p&gt;
&lt;h2 id=&#34;aglish-youglish-widget-for-anki-ankiweb&#34;&gt;&lt;a href=&#34;https://ankiweb.net/shared/info/38866997&#34;&gt;Aglish - YouGlish Widget for Anki - AnkiWeb&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Captured On: &lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;[2023-12-05 Tue 11:16]&lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;
直接在anki中配合 &lt;strong&gt;YouGlish&lt;/strong&gt; 学习英语单词真实场景发音&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;这位作者还开发了一些其它功能的anki插件&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;code&#34;&gt;code&lt;/h3&gt;
&lt;p&gt;38866997&lt;/p&gt;
&lt;h2 id=&#34;kelciour-movies2anki-convert-movies-with-subtitles-to-watch-them-with-anki-dot-inspired-by-subs2srs&#34;&gt;&lt;a href=&#34;https://github.com/kelciour/movies2anki&#34;&gt;kelciour/movies2anki: Convert movies with subtitles to watch them with Anki. Inspired by subs2srs&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;拆分视频语句为anki卡片&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 2026-W30</title>
      <link>http://blog.imcompany.cn/post/2026-week30/</link>
      <pubDate>Tue, 21 Jul 2026 19:12:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/2026-week30/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;h3 id=&#34;继续读-极端的年代-1914-1991--豆瓣----peng-read-2026-dot-md&#34;&gt;继续读 &lt;a href=&#34;http://blog.imcompany.cn/post/peng-read-2026/#极端的年代19141991-豆瓣&#34;&gt;极端的年代：1914—1991 (豆瓣)&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;读到了 第八章 冷战时代，美苏冷战让全世界都笼罩在核阴影下，当然两国的决策者不会让第核战爆发，因为那将是毁灭性的，他们只是把运用核武器常挂在嘴边&lt;/p&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;h3 id=&#34;nativ-run-ai-locally-on-your-mac&#34;&gt;&lt;a href=&#34;https://blaizzy.github.io/nativ/&#34;&gt;Nativ — Run AI locally on your Mac&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id=&#34;d41d8c&#34;&gt;&lt;/h4&gt;
&lt;p&gt;又一个本地运行AI大模型的工具，mlx-vlm作者出品，需要MacOS 26版本以上，期待后续支持 MacOS低版本安装&lt;/p&gt;
&lt;h3 id=&#34;ostracon-让-marginnote-与-obsidian-双向实时联动-插件与自动化-marginnote-中文社区&#34;&gt;&lt;a href=&#34;https://bbs.marginnote.com.cn/t/topic/68159&#34;&gt;Ostracon——让 MarginNote 与 Obsidian 双向实时联动 - 插件与自动化 - MarginNote 中文社区&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;实现MarginNote与Obsidain联动&lt;/p&gt;
&lt;h4 id=&#34;d41d8c&#34;&gt;&lt;/h4&gt;
&lt;h3 id=&#34;alljavi-material-gruvbox-obsidian-basic-theme-inspired-on-the-material-gruvbox-palette&#34;&gt;&lt;a href=&#34;https://github.com/AllJavi/material_gruvbox_obsidian&#34;&gt;AllJavi/material_gruvbox_obsidian: Basic theme inspired on the Material gruvbox palette&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;找到一款护眼主题Gruvbox，给Logseq和Emacs也都安装上了相应的主题&lt;/p&gt;
&lt;h4 id=&#34;d41d8c&#34;&gt;&lt;/h4&gt;
&lt;h3 id=&#34;kenn-io-agentsview-local-first-session-search-analytics-insights-and-token-use-statistics-for-coding-agents-supporting-claude-code-codex-and-more-than-20-other-agents-dot&#34;&gt;&lt;a href=&#34;https://github.com/kenn-io/agentsview&#34;&gt;kenn-io/agentsview: Local-first session search, analytics, insights, and token use statistics for coding agents, supporting Claude Code, Codex, and more than 20 other agents.&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;大模型对话统一管理、搜索、分析，支持主流大模型工具&lt;/p&gt;
&lt;h4 id=&#34;d41d8c&#34;&gt;&lt;/h4&gt;
&lt;h3 id=&#34;stablyai-orca-orca-is-the-ade-for-working-with-a-fleet-of-parallel-agents-dot-run-any-coding-agent-with-your-own-subscription-dot-available-on-desktop-mobile-and-vps-dot&#34;&gt;&lt;a href=&#34;https://github.com/stablyai/orca&#34;&gt;stablyai/orca: Orca is the ADE for working with a fleet of parallel agents. Run any coding agent with your own subscription. Available on desktop, mobile and VPS.&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Agent执行工具，可替代ChatGPT&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 2026-W29</title>
      <link>http://blog.imcompany.cn/post/2026-week29/</link>
      <pubDate>Fri, 17 Jul 2026 09:43:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/2026-week29/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;h3 id=&#34;继续读-资治通鉴--豆瓣----peng-read-2026-dot-md&#34;&gt;继续读 &lt;a href=&#34;http://blog.imcompany.cn/post/peng-read-2026/#资治通鉴-豆瓣&#34;&gt;资治通鉴 (豆瓣)&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;读完 唐太宗的 贞观之治，整体篇幅很长，占了第五卷的将近一半的内容，一个盛世的造就离不开贤明的君主和一大批实干的大臣&lt;/p&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;h3 id=&#34;cabeen-zen-mode&#34;&gt;&lt;a href=&#34;https://github.com/cabeen/zen-mode&#34;&gt;cabeen/zen-mode&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id=&#34;d41d8c&#34;&gt;&lt;/h4&gt;
&lt;p&gt;Mac上聚焦应用窗口的配置，基于 Hammerspoon，可实现隐藏MAC屏幕上所有内容，只展示一个聚焦的APP，类似付费应用有 HazeOver&lt;/p&gt;
&lt;h3 id=&#34;github-spec-kit-toolkit-to-help-you-get-started-with-spec-driven-development&#34;&gt;&lt;a href=&#34;https://github.com/github/spec-kit#-get-started&#34;&gt;github/spec-kit: 💫 Toolkit to help you get started with Spec-Driven Development&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id=&#34;d41d8c&#34;&gt;&lt;/h4&gt;
&lt;p&gt;Github出品的AI元编程，给AI分阶段，要进行SDD编程了&lt;/p&gt;
&lt;h2 id=&#34;image-️&#34;&gt;Image 🖼️&lt;/h2&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/Traditional_Chinese_ink_wash_p_2026-07-22T11-24-39.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;抛砖引玉，我写上联，下联位置留给高手&lt;/p&gt;
&lt;h2 id=&#34;speech&#34;&gt;Speech 💬&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;http://blog.imcompany.cn/post/speech/#ai-出现以后-教育重点将不再是-教-而是怎样保证学会&#34;&gt;AI 出现以后，教育重点将不再是&amp;quot;教&amp;quot;，而是怎样保证学会&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;wiki一下&#34;&gt;Wiki一下&lt;/h2&gt;
&lt;h3 id=&#34;low-earth-orbit-wikipedia&#34;&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Low_Earth_orbit?useskin=vector&#34;&gt;Low Earth orbit - Wikipedia&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;低地球轨道是指绕地球运行的轨道，周期不超过128分钟（每天至少完成11.25圈），其偏心率小于0.25。外太空中的大多数人造物体都处于LEO轨道上，数量最多的区域高度约为800公里，而处于LEO轨道上最远处的物体，在进入中地球轨道（MEO）之前，其高度可达2000公里，大约相当于地球半径的三分之一，且靠近内范艾伦辐射带的起点。&lt;/p&gt;
&lt;p&gt;截止2026年，人类所有超越近地轨道的太空飞行只有1968年至1972年的阿波罗计划中的登月任务，以及2026年阿尔忒弥斯二号登月飞越任务。到了2026年，所有空间站都在近地轨道内的地心轨道上运行。&lt;/p&gt;
&lt;p&gt;低地球轨道旋转卫星需要的能量最少。它提供很高的带宽和很低的通信延迟。在低地球轨道上的卫星和空间站，对乘员和维修人员来说更容易接近。&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 2026-W28</title>
      <link>http://blog.imcompany.cn/post/2026-week28/</link>
      <pubDate>Fri, 10 Jul 2026 09:42:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/2026-week28/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;h3 id=&#34;继续读-极端的年代-1914-1991--豆瓣----peng-read-2026-dot-md&#34;&gt;继续读 &lt;a href=&#34;http://blog.imcompany.cn/post/peng-read-2026/#极端的年代19141991-豆瓣&#34;&gt;极端的年代：1914—1991 (豆瓣)&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;读完了 第七章 帝国告终，英国的殖民统治土崩瓦解，帝国不是被打败的，而是被战争+大萧条+民族主义+冷战格局变化联合掏空的，战争与大萧条是其统治25年后消失的主要原因&lt;/p&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;h3 id=&#34;pranshuparmar-witr-why-is-this-running&#34;&gt;&lt;a href=&#34;https://github.com/pranshuparmar/witr&#34;&gt;pranshuparmar/witr: Why is this running?&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;可视化系统正在运行的东西的全链路内容，解决系统级命令如ps、top只暴露元数据而需要用户进行推断根源的问题&lt;/p&gt;
&lt;h4 id=&#34;d41d8c&#34;&gt;&lt;/h4&gt;
&lt;h3 id=&#34;local-cpu-friendly-high-quality-tts--text-to-speech--with-kokoro-ariya-dot-io&#34;&gt;&lt;a href=&#34;https://ariya.io/2026/03/local-cpu-friendly-high-quality-tts-text-to-speech-with-kokoro/&#34;&gt;Local, CPU-Friendly, High-Quality TTS (Text-to-Speech) with Kokoro · ariya.io&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;本地运行的文本转语音工具，体积很小，一条Docker命令即可安装&lt;/p&gt;
&lt;h4 id=&#34;d41d8c&#34;&gt;&lt;/h4&gt;
&lt;h2 id=&#34;image-️&#34;&gt;Image 🖼️&lt;/h2&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/Traditional_Chinese_ink_wash_p_2026-07-17T09-23-24.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;朝三暮四，同样的东西换了一种说法，给人的感觉就大不相同&lt;/p&gt;
&lt;h2 id=&#34;speech&#34;&gt;Speech 💬&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;http://blog.imcompany.cn/post/speech/#阅读使人丰富-写作使人精确-讨论使人完备&#34;&gt;阅读使人丰富，写作使人精确，讨论使人完备&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;wiki一下&#34;&gt;Wiki一下&lt;/h2&gt;
&lt;h3 id=&#34;ferrari-wikipedia&#34;&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Ferrari?useskin=vector&#34;&gt;Ferrari - Wikipedia&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;法拉力，意大利豪华跑车制造商，总部位于意大利的马拉内洛。公司由恩佐·法拉利于1939年创立，1940年制造出它的第一辆车，1945年正式使用当前的名称，1947年开始生产跑车系列。&lt;/p&gt;
&lt;p&gt;1960年，法拉利成为一家上市公司，从1963年到2014年，它都是菲亚特的子公司。2016年从中独立出来。&lt;/p&gt;
&lt;p&gt;许多早期的法拉利跑车可以追溯到20世纪50年代和60年代，在拍卖中曾经是世界上最昂贵的汽车之一。&lt;/p&gt;
&lt;p&gt;法拉利在赛车领域十分活跃，获得过多个比赛的大奖。截止2023年5月，它的市值约为855 亿美元。&lt;/p&gt;
&lt;p&gt;2025年10月，法拉利推出了首款全电动汽车。&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 2026-W27</title>
      <link>http://blog.imcompany.cn/post/2026-week27/</link>
      <pubDate>Wed, 01 Jul 2026 18:47:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/2026-week27/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;h3 id=&#34;为什么说-anthropic-是邪恶的-虹线&#34;&gt;&lt;a href=&#34;https://1q43.blog/post/12498/&#34;&gt;为什么说 Anthropic 是邪恶的？ | 虹线&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;关于近期Anthropic追踪中国大陆用户事件的评论，里面的有一些观点值得深思：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Anthropic不是在收集你的数据，而是在定义你的身份&lt;/li&gt;
&lt;li&gt;定义权就是暴力权&lt;/li&gt;
&lt;li&gt;隐藏分类的真正威力: 这里的伤害不在被标记的那一刻，而是发生在被标记之后每一个看似中立的“正常流程”里&lt;/li&gt;
&lt;li&gt;“安全”是目前为止，人类发明出来的最好用、最廉价外衣&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;h3 id=&#34;makerspet-oomwoo-open-source-vacuum-robot-cleaner&#34;&gt;&lt;a href=&#34;https://github.com/makerspet/oomwoo/&#34;&gt;makerspet/oomwoo: Open-source vacuum robot cleaner&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;开源扫地机器人项目，真想哪天自己动手搞一个&lt;/p&gt;
&lt;h4 id=&#34;d41d8c&#34;&gt;&lt;/h4&gt;
&lt;h3 id=&#34;huangchihhungleo-claude-real-video-let-claude--or-any-llm--actually-watch-a-video-scene-aware-deduplicated-frames-plus-transcript-from-a-url-or-local-file-dot-runs-locally-mit-dot&#34;&gt;&lt;a href=&#34;https://github.com/HUANGCHIHHUNGLeo/claude-real-video&#34;&gt;HUANGCHIHHUNGLeo/claude-real-video: Let Claude (or any LLM) actually watch a video — scene-aware, deduplicated frames + transcript, from a URL or local file. Runs locally, MIT.&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;让Claude看视频，输出核心内容，也可以使用其它大模型&lt;/p&gt;
&lt;h4 id=&#34;d41d8c&#34;&gt;&lt;/h4&gt;
&lt;h3 id=&#34;ctxrs-ctx-search-the-coding-agent-history-already-on-your-machine&#34;&gt;&lt;a href=&#34;https://github.com/ctxrs/ctx&#34;&gt;ctxrs/ctx: Search the coding agent history already on your machine&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;本地搜索AI Session历史内容的工具，支持市面上大部分Agent&lt;/p&gt;
&lt;h4 id=&#34;d41d8c&#34;&gt;&lt;/h4&gt;
&lt;h3 id=&#34;xiaoleiy-podpull-download-any-podcast-episode-straight-to-your-shell-apple-podcasts-rss-or-xiaoyuzhou-dot-interactive-picker-live-progress-resumable-dot&#34;&gt;&lt;a href=&#34;https://github.com/xiaoleiy/podpull&#34;&gt;xiaoleiy/podpull: Download any podcast episode straight to your shell — Apple Podcasts, RSS, or xiaoyuzhou. Interactive picker, live progress, resumable.&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;命令下载podcast，还提供了AI Skill&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 2026-W26</title>
      <link>http://blog.imcompany.cn/post/2026-week26/</link>
      <pubDate>Wed, 24 Jun 2026 16:24:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/2026-week26/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;h3 id=&#34;闲鱼-千问-支付宝-平台信任-赋能-诈骗-老冯云数&#34;&gt;&lt;a href=&#34;https://vonng.com/cloud/ali-scam/?__readwiseLocation=&#34;&gt;闲鱼，千问，支付宝：平台信任“赋能”诈骗 · 老冯云数&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;完全符合所有信任流程的新型诈骗，大平台的自己人默认信任机制让骗子给充分利用了，推荐阅读&lt;/p&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;h3 id=&#34;中国历朝代视频讲解--useful-tools-dot-md&#34;&gt;&lt;a href=&#34;http://blog.imcompany.cn/post/useful-tools/#中国历朝代视频讲解&#34;&gt;中国历朝代视频讲解&lt;/a&gt;&lt;/h3&gt;
&lt;h3 id=&#34;chronas-interactive-historical-map&#34;&gt;&lt;a href=&#34;https://chronas.org/?year=1000&#34;&gt;Chronas - Interactive Historical Map&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;站在上帝视角看历史，把世界历史做在了Google Map上，做的很精美，对于历史爱好者是大福利&lt;/p&gt;
&lt;h3 id=&#34;schollz-croc-easily-and-securely-send-things-from-one-computer-to-another-package&#34;&gt;&lt;a href=&#34;https://github.com/schollz/croc&#34;&gt;schollz/croc: Easily and securely send things from one computer to another :package:&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;实现两台电脑简单安全传输文件的命令行工具&lt;/p&gt;
&lt;h4 id=&#34;d41d8c&#34;&gt;&lt;/h4&gt;
&lt;h3 id=&#34;fenng-tech-doc-style-chinese-yet-another-reusable-writing-skill-for-chinese-technical-documentation-and-product-copy-dot&#34;&gt;&lt;a href=&#34;https://github.com/Fenng/tech-doc-style-chinese&#34;&gt;Fenng/Tech-Doc-Style-Chinese: Yet another reusable writing skill for Chinese technical documentation and product copy.&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;检查中文写作规范的Skill，冯大出品&lt;/p&gt;
&lt;h4 id=&#34;d41d8c&#34;&gt;&lt;/h4&gt;
&lt;h3 id=&#34;otty-a-native-beautiful-terminal-app&#34;&gt;&lt;a href=&#34;https://otty.sh/&#34;&gt;Otty — A native, beautiful terminal app&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;一个很好看的终端App，喜欢上它的April主题&lt;/p&gt;
&lt;h4 id=&#34;d41d8c&#34;&gt;&lt;/h4&gt;
&lt;h2 id=&#34;image-️&#34;&gt;Image 🖼️&lt;/h2&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/fm6MyE.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;塞翁失马，焉知非福。福兮祸所伏，祸兮福所依&lt;/p&gt;
&lt;h2 id=&#34;speech&#34;&gt;Speech 💬&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;http://blog.imcompany.cn/post/speech/#最好的-准备-不是源源不断的输入-而是更有质量的输出&#34;&gt;最好的“准备”不是源源不断的输入，而是更有质量的输出&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;wiki一下&#34;&gt;Wiki一下&lt;/h2&gt;
&lt;h3 id=&#34;long-island-rail-road-wikipedia&#34;&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Long_Island_Rail_Road?useskin=vector&#34;&gt;Long Island Rail Road - Wikipedia&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;长岛铁路，美国纽约州东南部的一条铁路。该铁路目前经营公共通勤铁路服务，到2025年，它的平均工作日客流量为33万人次，是北美最繁忙的通勤铁路。它也是世界上为数不多的全年24小时运行的通勤系统(类似还有Metro-North Railroad)&lt;/p&gt;
&lt;p&gt;它有126个车站，超过1200公里的轨道&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 2026-W25</title>
      <link>http://blog.imcompany.cn/post/2026-week25/</link>
      <pubDate>Thu, 18 Jun 2026 16:22:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/2026-week25/</guid>
      <description>&lt;p&gt;&lt;strong&gt;出去浪了，本周皆空&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;h2 id=&#34;image-️&#34;&gt;Image 🖼️&lt;/h2&gt;
&lt;h2 id=&#34;speech&#34;&gt;Speech 💬&lt;/h2&gt;
&lt;h2 id=&#34;wiki一下&#34;&gt;Wiki一下&lt;/h2&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 2026-W24</title>
      <link>http://blog.imcompany.cn/post/2026-week24/</link>
      <pubDate>Mon, 08 Jun 2026 18:16:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/2026-week24/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;h3 id=&#34;纸短情长&#34;&gt;&lt;a href=&#34;https://www.gtdstudy.com/&#34;&gt;纸短情长&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;又发现的一个好Blog，最近的内容以来信的方式进行输出，最新的这篇文章叫 &amp;ldquo;在等待AI的时候，干些什么好？&amp;quot;，里面谈到AI工作的过程中人要做些什么，这也是困扰我很久的问题，文章引用罗素的话给出了答案：技术的进步应该为人类创造闲暇，甚至颁发闲暇，让不同的社会阶层均有享受闲暇的权力。这也应该是创建AI的先知们初心的一部分吧&lt;/p&gt;
&lt;h3 id=&#34;最好的关系是相互滋养-黄杰敏的博客&#34;&gt;&lt;a href=&#34;https://www.jiemin.com/archives/1752.html&#34;&gt;最好的关系是相互滋养 | 黄杰敏的博客&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;又一个非常好的Blog，一篇生活感悟，学到了：被人滋养，是最大的幸福；滋养他人，是顶级的修养！&lt;/p&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;h3 id=&#34;mattpocock-skills-skills-for-real-engineers-dot-straight-from-my-dot-claude-directory-dot&#34;&gt;&lt;a href=&#34;https://github.com/mattpocock/skills&#34;&gt;mattpocock/skills: Skills for Real Engineers. Straight from my .claude directory.&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;号称应对真实开发场景的Skills，此Skill对真正开发场景进行了强力的约束，目前安装了 /codebase-design, /diagnosing-bugs, /tdd ，后续看看效果&lt;/p&gt;
&lt;h4 id=&#34;d41d8c&#34;&gt;&lt;/h4&gt;
&lt;h3 id=&#34;epiral-bb-browser-your-browser-is-the-api-dot-cli-plus-mcp-server-for-ai-agents-to-control-chrome-with-your-login-state-dot&#34;&gt;&lt;a href=&#34;https://github.com/epiral/bb-browser&#34;&gt;epiral/bb-browser: Your browser is the API. CLI + MCP server for AI agents to control Chrome with your login state.&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;坏男孩的浏览器，直接在命令行获取常用网站的数据来给AI使用，需要浏览器进行登录，目前看reddit在工具启动的brave浏览器中不能使用，应该是加了检测&lt;/p&gt;
&lt;h4 id=&#34;d41d8c&#34;&gt;&lt;/h4&gt;
&lt;h3 id=&#34;yuanw-nix-home-my-nix-dotfiles-on-macos-nixos&#34;&gt;&lt;a href=&#34;https://github.com/yuanw/nix-home&#34;&gt;yuanw/nix-home: My Nix dotfiles on MacOS/NixOS&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;又开始收集Nix配置，这个是基于Macos系统的Nix配置，与我当前使用的系统一样&lt;/p&gt;
&lt;h4 id=&#34;d41d8c&#34;&gt;&lt;/h4&gt;
&lt;h3 id=&#34;openkeyring-oak-keyring-a-privacy-first-local-first-password-manager-with-cross-platform-synchronization-dot&#34;&gt;&lt;a href=&#34;https://github.com/OpenKeyring/oak-keyring&#34;&gt;OpenKeyring/oak-keyring: A privacy-first, local-first password manager with cross-platform synchronization.&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Mac上本地优先的密码管理系统，又一个TUI实现&lt;/p&gt;
&lt;h4 id=&#34;d41d8c&#34;&gt;&lt;/h4&gt;
&lt;h3 id=&#34;leaperone-smctl-the-missing-control-knob-for-your-mac-s-smc-fan-curves-battery-charge-limits-power-policy-dot-open-source-cli-first-dot&#34;&gt;&lt;a href=&#34;https://github.com/leaperone/smctl&#34;&gt;leaperone/smctl: The missing control knob for your Mac&amp;rsquo;s SMC — fan curves, battery charge limits, power policy. Open-source, CLI-first.&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;一行命令解锁MAC不开放的控制能力，包括电池充电限制与温度遥测&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 2026-W23</title>
      <link>http://blog.imcompany.cn/post/2026-week23/</link>
      <pubDate>Fri, 05 Jun 2026 16:37:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/2026-week23/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;h3 id=&#34;恶臭的赢学&#34;&gt;&lt;a href=&#34;https://mp.weixin.qq.com/s/fd5q2rJeIq6lqfrqOtrONw&#34;&gt;恶臭的赢学&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;曹大对当前自媒体上过度吹捧近期火热的DeepSeek、张雪机车、华为τ定律赢学现象的一种批判，这些企业在相关的领域方向只是在牌桌上，遥遥领先还是说的有些过早，需要决策者理性看待评论。最后总结：人生不是爽文，征程漫漫，道阻且长。先留在牌桌上，才会有后续的机会&lt;/p&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;h3 id=&#34;charmbracelet-freeze-generate-images-of-code-and-terminal-output&#34;&gt;&lt;a href=&#34;https://github.com/charmbracelet/freeze&#34;&gt;charmbracelet/freeze: Generate images of code and terminal output 📸&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;终端生成代码图片并输出，支持配置字体与主题颜色&lt;/p&gt;
&lt;h3 id=&#34;refining-org-mode-deadlines-wai-hon-s-blog&#34;&gt;&lt;a href=&#34;https://whhone.com/posts/refining-org-mode-deadlines/&#34;&gt;Refining Org-mode Deadlines - Wai Hon&amp;rsquo;s Blog&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Org-mode Deadline 增强，在Org-Agenda 中有更明显的显示，作者还扩展了过期的提醒时间区间到37天&lt;/p&gt;
&lt;h4 id=&#34;d41d8c&#34;&gt;&lt;/h4&gt;
&lt;h2 id=&#34;image-️&#34;&gt;Image 🖼️&lt;/h2&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/3OnQ8B.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h2 id=&#34;speech&#34;&gt;Speech 💬&lt;/h2&gt;
&lt;p&gt;和健身一样，真正的学习是痛苦的&lt;/p&gt;
&lt;h2 id=&#34;wiki一下&#34;&gt;Wiki一下&lt;/h2&gt;
&lt;h3 id=&#34;from-1099&#34;&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Form_1099?useskin=vector&#34;&gt;From 1099&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;1099 表格是美国国税局用来报税的一种表格，用来报告工资、薪水、小费以外的各种收入。Go&lt;/p&gt;
&lt;p&gt;该表格用于向税务专业人员报告向独立承包商的付款、租赁财产收入、利息和股息收入、销售收入及其他杂项收入接收者。&lt;/p&gt;
&lt;p&gt;1917年《战争收入法》要求每个实体报告向另一个实体支付的某些款项，此表格应运而生. 2015年后，1099表格又出现很多变体，如：1099-A，1099-B，1099-C&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 2026-W22</title>
      <link>http://blog.imcompany.cn/post/2026-week22/</link>
      <pubDate>Fri, 29 May 2026 17:52:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/2026-week22/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;h3 id=&#34;继续读-极端的年代-1914-1991--豆瓣----peng-read-2026-dot-md&#34;&gt;继续读 &lt;a href=&#34;http://blog.imcompany.cn/post/peng-read-2026/#极端的年代19141991-豆瓣&#34;&gt;极端的年代：1914—1991 (豆瓣)&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;读到了 第六章　1914—1945年的艺术，还没有读完，了解到了达达主义、超现实主义、芭蕾、电影与爵士音乐的兴起&lt;/p&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;h3 id=&#34;lum1104-understand-anything-graphs-that-teach-graphs-that-impress-dot-turn-any-code-into-an-interactive-knowledge-graph-you-can-explore-search-and-ask-questions-about-dot-works-with-claude-code-codex-cursor-copilot-gemini-cli-and-more-dot&#34;&gt;&lt;a href=&#34;https://github.com/Lum1104/Understand-Anything?__readwiseLocation=&#34;&gt;Lum1104/Understand-Anything: Graphs that teach &amp;gt; graphs that impress. Turn any code into an interactive knowledge graph you can explore, search, and ask questions about. Works with Claude Code, Codex, Cursor, Copilot, Gemini CLI, and more.&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;给陌生代码库做&amp;quot;知识图可视化&amp;quot;的 Claude Code Plugin&lt;/p&gt;
&lt;h4 id=&#34;d41d8c&#34;&gt;&lt;/h4&gt;
&lt;h3 id=&#34;andyyyy64-whichllm-find-the-local-llm-that-actually-runs-and-performs-best-on-your-hardware-dot-ranked-by-real-recency-aware-benchmarks-not-parameter-count-dot-one-command-run-it-instantly-dot&#34;&gt;&lt;a href=&#34;https://github.com/Andyyyy64/whichllm&#34;&gt;Andyyyy64/whichllm: Find the local LLM that actually runs and performs best on your hardware. Ranked by real, recency-aware benchmarks, not parameter count. One command, run it instantly.&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;找出最适合本地机器运行的AI大模型&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 2026-W21</title>
      <link>http://blog.imcompany.cn/post/2026-week21/</link>
      <pubDate>Fri, 22 May 2026 15:38:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/2026-week21/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;h3 id=&#34;继续读-极端的年代-1914-1991--豆瓣----peng-read-2026-dot-md&#34;&gt;继续读 &lt;a href=&#34;http://blog.imcompany.cn/post/peng-read-2026/#极端的年代19141991-豆瓣&#34;&gt;极端的年代：1914—1991 (豆瓣)&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;读到了 第五章　共御强敌，统一战线的形成真的是太多因素才可促成，不到万不得已，没人想打仗&lt;/p&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;h3 id=&#34;aicodemirror官方共享平台-中国用户专属ai编程助手&#34;&gt;&lt;a href=&#34;https://www.aicodemirror.com/&#34;&gt;AICodeMirror官方共享平台 - 中国用户专属AI编程助手&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;国内更顺畅的接入使用国外高级的大模型&lt;/p&gt;
&lt;h3 id=&#34;madeye-mcp-cli-a-prototype-to-save-fork-exec-overhead-of-ai-code-agent&#34;&gt;&lt;a href=&#34;https://github.com/madeye/mcp-cli&#34;&gt;madeye/mcp-cli: a prototype to save fork/exec overhead of ai code agent&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;把 cat / git status / rg 这种被 agent 反复 fork+exec 的小命令，全部劫持到一个常驻 daemon 里，用 mmap + libgit2 + grep-searcher  库直接在进程内完成，省掉每次调用的内核开销。对于AI处理大仓库很有帮助，对Codex的使用优化最大&lt;/p&gt;
&lt;h4 id=&#34;d41d8c&#34;&gt;&lt;/h4&gt;
&lt;h2 id=&#34;image-️&#34;&gt;Image 🖼️&lt;/h2&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/F9oq2j.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h2 id=&#34;speech&#34;&gt;Speech 💬&lt;/h2&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/freeze.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;理解一个东西，就是找到它的最短描述&lt;/p&gt;
&lt;h2 id=&#34;wiki一下&#34;&gt;Wiki一下&lt;/h2&gt;
&lt;h3 id=&#34;hantavirus-infection-wikipedia&#34;&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Hantavirus_infection?useskin=vector&#34;&gt;Hantavirus infection - Wikipedia&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;汉坦病毒感染，是一种由汉坦病毒属的病毒引起的传染病。这种病可能导致出血热肾综合征HFRS（如头痛、腹痛、发烧、恶心、出血和肾衰竭）或者汉坦病毒肺综合征HPS（包括疲劳、发烧、肌肉疼痛、咳嗽和呼吸困难）&lt;/p&gt;
&lt;p&gt;这种病毒通常在人们呼吸被啮齿动物粪便污染的空气时传播，诊断基于血液检测，通常是血清学检测&lt;/p&gt;
&lt;p&gt;治疗主要是支持性护理，包括吸氧治疗、机械通气、透析或血小板输注。如果早期使用，利巴韦林有效，HFRS患者的死亡风险约为12%，而HPS患者的死亡风险约为40%&lt;/p&gt;
&lt;p&gt;HPS在1993年发现以来，已发现约1000例&lt;/p&gt;
&lt;p&gt;2026年4月，在一艘荷兰游轮上发现了由安第斯病毒引起的汉坦病毒感染疫情&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 2026-W20</title>
      <link>http://blog.imcompany.cn/post/2026-week20/</link>
      <pubDate>Fri, 15 May 2026 16:35:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/2026-week20/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;h3 id=&#34;继续读-资质通鉴&#34;&gt;继续读《资质通鉴》&lt;/h3&gt;
&lt;p&gt;终于来到唐朝创业阶段，唐高宗李渊从晋阳起兵，以关中为中心最终一统天下。唐太宗李世民是真的强，为自家的创业真的是卖力，有勇有谋，战事判断精准；识人通达，尉迟敬德的忠心与骁勇为其平定中原奠定基础，也在后来的玄武门事变立下大功劳&lt;/p&gt;
&lt;h3 id=&#34;用agent评测思路管理ai-coding-31万行代码ai重构的实践-美团技术团队&#34;&gt;&lt;a href=&#34;https://tech.meituan.com/2026/05/07/agent-ai-coding.html?__readwiseLocation=&#34;&gt;用Agent评测思路管理AI Coding —— 31万行代码AI重构的实践 - 美团技术团队&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;美团使用AI重构的实践分享，核心观点是先人与人对齐然后才是人与AI对齐，实施时建议PRe-PR让AI自查，然后人工CR主要聚焦业务语义&lt;/p&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;h3 id=&#34;eduwass-tmux-palette-raycast-style-command-palette-for-tmux-fast-scriptable-easy-to-extend&#34;&gt;&lt;a href=&#34;https://github.com/eduwass/tmux-palette/&#34;&gt;eduwass/tmux-palette: Raycast-style command palette for tmux — fast, scriptable, easy to extend&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id=&#34;d41d8c&#34;&gt;&lt;/h4&gt;
&lt;p&gt;给Tmux增加快速命令看板，香&lt;/p&gt;
&lt;h2 id=&#34;image-️&#34;&gt;Image 🖼️&lt;/h2&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/DdmP89.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h2 id=&#34;speech&#34;&gt;Speech 💬&lt;/h2&gt;
&lt;p&gt;编程的本质是思维不是语言&lt;/p&gt;
&lt;h2 id=&#34;wiki一下&#34;&gt;Wiki一下&lt;/h2&gt;
&lt;h3 id=&#34;the-pentagon&#34;&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/The_Pentagon?useskin=vector&#34;&gt;The_Pentagon&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;五角大楼是美国国防部的司令部所在地，位于弗吉尼亚旗舰店的阿灵顿县。该建筑在第二次世界大战期间加速建造而成。作为美国军事的象征，“五角大楼”这一短语常被用来指代国防部及其领导层&lt;/p&gt;
&lt;p&gt;该建筑由美国建筑师George Bergstrom 设计，由承包商John McShain建造。地面于1941年9月11日破土，于1943年1月15日落成&lt;/p&gt;
&lt;p&gt;五角大楼是世界上第二大的办公楼，大约有650万平方英尺（60万平方米）的楼面面积。它有五个边，地上五层，地下两层，每层有五个环形走廊，还有一个中英五英亩（2公顷）的五边形广场&lt;/p&gt;
&lt;p&gt;2001年，五角大楼在9月11日袭击中受损，125名五角大楼人员死亡&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 2026-W19</title>
      <link>http://blog.imcompany.cn/post/2026-week19/</link>
      <pubDate>Sat, 09 May 2026 17:12:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/2026-week19/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;h3 id=&#34;继续读-资质通鉴&#34;&gt;继续读《资质通鉴》&lt;/h3&gt;
&lt;p&gt;读到隋朝创业与结业部分，杨坚9个月快速登上皇位，大表演家杨广上位太子进而当上隋炀帝，开启极限败家模式&lt;/p&gt;
&lt;h3 id=&#34;一个新的-ai-记忆层概念-哈勃半径-虹线&#34;&gt;&lt;a href=&#34;https://1q43.blog/post/12336/&#34;&gt;一个新的 AI 记忆层概念：哈勃半径 | 虹线&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;作者提出的用AI构建自己的三层记忆系统：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;我知道的&lt;/li&gt;
&lt;li&gt;我应该知道的&lt;/li&gt;
&lt;li&gt;我可能知道的&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;对于前两个用卡片与LLM Wiki来解决，对于第3点作者提出了对未知领域的应对方式，哈勃半径，把关注的领域内容都放到一个私有的搜索引擎中来构建一个私人宇宙，对于第3点作者搭建了一个Meilisearch，可以借鉴，再考虑有没有其它轻量的替代方案&lt;/p&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;h3 id=&#34;jerryzliu-dayflow-the-automatic-work-journal-dot-privately-turns-your-screen-into-a-timeline-of-what-you-actually-accomplished-dot-open-source-and-local-first-dot&#34;&gt;&lt;a href=&#34;https://github.com/JerryZLiu/Dayflow&#34;&gt;JerryZLiu/Dayflow: The automatic work journal. Privately turns your screen into a timeline of what you actually accomplished. Open-source and local-first.&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;开源记录本地电脑操作的应用，数据以本地优先，使用AI进行片断总结，使用下来感觉很好，对自己一天做的事有一个清晰的认识&lt;/p&gt;
&lt;h4 id=&#34;d41d8c&#34;&gt;&lt;/h4&gt;
&lt;h3 id=&#34;xdd666t-codex-with-cc-codex穷鬼大救星&#34;&gt;&lt;a href=&#34;https://github.com/xdd666t/codex_with_cc&#34;&gt;xdd666t/codex_with_cc: codex穷鬼大救星&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;缓解token焦虑的方式，Codex当架构师，CC配合DeepSeek来干活&lt;/p&gt;
&lt;h4 id=&#34;d41d8c&#34;&gt;&lt;/h4&gt;
&lt;h3 id=&#34;nowledge-co-con-terminal-the-native-terminal-emulator-with-a-builtin-ai-harness&#34;&gt;&lt;a href=&#34;https://github.com/nowledge-co/con-terminal&#34;&gt;nowledge-co/con-terminal: The Native Terminal Emulator with a builtin AI Harness&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;开源、GPU加速的内部自带AI的终端模拟器&lt;/p&gt;
&lt;h4 id=&#34;d41d8c&#34;&gt;&lt;/h4&gt;
&lt;h3 id=&#34;youssofal-mtplx-native-mtp-speculative-decoding-on-apple-silicon-2x-2-dot-5x-decode-tps-increase-at-temp-0-dot-6-mlx-native-openai-api-anthropic-compatible-serving-no-external-drafter-dot&#34;&gt;&lt;a href=&#34;https://github.com/youssofal/MTPLX&#34;&gt;youssofal/MTPLX: Native MTP Speculative Decoding On Apple Silicon | 2x - 2.5x decode TPS increase at temp 0.6 | MLX-native, OpenAI API/Anthropic-compatible serving, no external drafter.&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;本地MTP解码加速工具，号称输出快2倍以上，使用仓库的Model实测试在M2Max上没有什么大的速度提升，还是20t/s的样子，再使用使用看看&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 2026-W18</title>
      <link>http://blog.imcompany.cn/post/2026-week18/</link>
      <pubDate>Thu, 30 Apr 2026 09:48:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/2026-week18/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;h3 id=&#34;ai-也该有护照了-虹线&#34;&gt;&lt;a href=&#34;https://1q43.blog/post/12323/&#34;&gt;AI 也该有护照了 | 虹线&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;作者对当前Menus收购热议提出的AI所属问题，讨论了AI产生的问题由谁来负责&lt;/p&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;h3 id=&#34;lukilabs-craft-agents-oss&#34;&gt;&lt;a href=&#34;https://github.com/lukilabs/craft-agents-oss&#34;&gt;lukilabs/craft-agents-oss&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;AI工具，以Session组织Agents协同工作，给Agent工具带上了状态，可以细粒度跟踪&lt;/p&gt;
&lt;h4 id=&#34;d41d8c&#34;&gt;&lt;/h4&gt;
&lt;h3 id=&#34;garrytan-gstack-use-garry-tan-s-exact-claude-code-setup-23-opinionated-tools-that-serve-as-ceo-designer-eng-manager-release-manager-doc-engineer-and-qa&#34;&gt;&lt;a href=&#34;https://github.com/garrytan/gstack&#34;&gt;garrytan/gstack: Use Garry Tan&amp;rsquo;s exact Claude Code setup: 23 opinionated tools that serve as CEO, Designer, Eng Manager, Release Manager, Doc Engineer, and QA&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;YC创始人的23个固执己见的AI工具，支持CC、Codex等工具，可以直接在Conductor的Playground中体验使用，默认支持的是Web前端栈&lt;/p&gt;
&lt;h4 id=&#34;d41d8c&#34;&gt;&lt;/h4&gt;
&lt;h3 id=&#34;dohooo-helmor-open-source-local-workbench-for-multi-agent-software-development-dot&#34;&gt;&lt;a href=&#34;https://github.com/dohooo/helmor&#34;&gt;dohooo/helmor: Open-source local workbench for multi-agent software development.&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Conductor开源平替，都是支持组织AI任务状态流转的工具&lt;/p&gt;
&lt;h4 id=&#34;d41d8c&#34;&gt;&lt;/h4&gt;
&lt;h3 id=&#34;graykode-abtop-like-htop-but-for-ai-coding-agents-dot-monitor-claude-code-and-codex-cli-sessions-tokens-context-window-rate-limits-and-ports-in-real-time-dot&#34;&gt;&lt;a href=&#34;https://github.com/graykode/abtop&#34;&gt;graykode/abtop: Like htop, but for AI coding agents. Monitor Claude Code &amp;amp; Codex CLI sessions, tokens, context window, rate limits, and ports in real-time.&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;监控AI Agent的运行信息，包括Session、Tokens和Context Window信息、使用的端口信息&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 2026-W17</title>
      <link>http://blog.imcompany.cn/post/2026-week17/</link>
      <pubDate>Wed, 29 Apr 2026 15:54:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/2026-week17/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;h3 id=&#34;阅读完-工作-消费主义和新穷人&#34;&gt;阅读完 《工作、消费主义和新穷人》&lt;/h3&gt;
&lt;p&gt;我们现在生活一个消费主义时代，在以前的生产主义时代你的价值是你能生产什么，现在的消费主义时代你的价值是你能消费什么。对于穷人在生产主义时代还可以充当预备军，在消费主义时代则完全被抛弃&lt;/p&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;h3 id=&#34;hehehai-voxt-️voice-input-and-translation-app-for-macos-dot-press-to-talk-release-to-paste-dot&#34;&gt;&lt;a href=&#34;https://github.com/hehehai/voxt&#34;&gt;hehehai/voxt: 🎙️Voice input and translation app for macOS. Press to talk, release to paste.&lt;/a&gt; &lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;out&lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;&lt;/h3&gt;
&lt;p&gt;尝试了一下这个语音APP，在权限处理时就卡住了，劝退了。目前同时在测试使用Typeless 和 Type4Me&lt;/p&gt;
&lt;h3 id=&#34;ogulcancelik-herdr-agent-multiplexer-that-lives-in-your-terminal-dot&#34;&gt;&lt;a href=&#34;https://github.com/ogulcancelik/herdr&#34;&gt;ogulcancelik/herdr: agent multiplexer that lives in your terminal.&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;终端内运行多Agent提示工具，类Tmux的操作，主要是AI运行后在左侧有提示。类似的还有一个 &lt;a href=&#34;https://github.com/manaflow-ai/cmux&#34;&gt;cmux&lt;/a&gt; ，目前使用下来感觉UI theme适配有些问题，再关注&lt;/p&gt;
&lt;h2 id=&#34;image-️&#34;&gt;Image 🖼️&lt;/h2&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/SFsPxw.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;物业组织的羽毛球比赛落下帷幕，公司有新突破&lt;/p&gt;
&lt;h2 id=&#34;speech&#34;&gt;Speech 💬&lt;/h2&gt;
&lt;p&gt;AI只有信息，没有立场&lt;/p&gt;
&lt;h2 id=&#34;wiki一下&#34;&gt;Wiki一下&lt;/h2&gt;
&lt;h3 id=&#34;colorado-river-wikipedia&#34;&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Colorado_River?useskin=vector&#34;&gt;Colorado River - Wikipedia&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;科罗拉多河，美国西南部和墨西哥北部主要河流之一。长2330公里，是美国第五长的河，涵盖美国七个洲和墨西哥两个洲。科罗拉多河及其支流以其壮观的峡谷、急流和11个美国国家公园而闻名，是4000万人的重要水源。建立在此的最大的胡佛水坝于1935年竣工&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 2026-W16</title>
      <link>http://blog.imcompany.cn/post/2026-week16/</link>
      <pubDate>Fri, 17 Apr 2026 16:22:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/2026-week16/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;h3 id=&#34;读完-金色梦乡&#34;&gt;读完 《&lt;a href=&#34;https://book.douban.com/subject/26864984/&#34;&gt;金色梦乡&lt;/a&gt;》&lt;/h3&gt;
&lt;p&gt;家人推荐，第一次看这种故事型小说，看的舒服，故事环环相扣，普通人在巨大的国家机器面前很难全身而退&lt;/p&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;h3 id=&#34;getpaseo-paseo-orchestrate-coding-agents-remotely-from-your-phone-desktop-and-cli&#34;&gt;&lt;a href=&#34;https://github.com/getpaseo/paseo&#34;&gt;getpaseo/paseo: Orchestrate coding agents remotely from your phone, desktop and CLI&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;安装了Paseo，可以在手机上操作AI，支持CC、CodeX等&lt;/p&gt;
&lt;h3 id=&#34;farouqaldori-vibe-notch-claude-code-notifications-without-the-context-switch-dot-a-minimal-always-present-session-manager-for-macos-dot&#34;&gt;&lt;a href=&#34;https://github.com/farouqaldori/vibe-notch&#34;&gt;farouqaldori/vibe-notch: Claude Code notifications without the context switch. A minimal, always-present session manager for macOS.&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;终于找到一个可以在灵动岛直接授权AI的工具了，最近还换名了，先前叫 &lt;strong&gt;Claude Island&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;mathiszerbib-clicky-at-enhancement-lmstudio-gemma4&#34;&gt;&lt;a href=&#34;https://github.com/MathisZerbib/clicky&#34;&gt;MathisZerbib/clicky at enhancement/lmstudio-gemma4&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;在鼠标旁增加一个AI，来作为随时相伴的老师，需要自己部署一下，看着介绍挺让人心动的&lt;/p&gt;
&lt;h3 id=&#34;multica-ai-multica-the-open-source-managed-agents-platform-dot-turn-coding-agents-into-real-teammates-assign-tasks-track-progress-compound-skills-dot&#34;&gt;&lt;a href=&#34;https://github.com/multica-ai/multica&#34;&gt;multica-ai/multica: The open-source managed agents platform. Turn coding agents into real teammates — assign tasks, track progress, compound skills.&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;小团队任务管理协作工具，在本地部署跑了一下，可以把项目issue直接分配给AI，实时查看进度&lt;/p&gt;
&lt;h3 id=&#34;bstnxbt-dflash-mlx-lossless-dflash-speculative-decoding-for-mlx-on-apple-silicon&#34;&gt;&lt;a href=&#34;https://github.com/bstnxbt/dflash-mlx&#34;&gt;bstnxbt/dflash-mlx: Lossless DFlash speculative decoding for MLX on Apple Silicon&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Apple Silicon 上 MLX 的无损 DFlash 推测解码，可以有效提高AI响应速度，测试了一下，在我的M2 Max上效果不是很明显，可能在M5 Max上才能发挥出真正的威力&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 2026-W15</title>
      <link>http://blog.imcompany.cn/post/2026-week15/</link>
      <pubDate>Wed, 15 Apr 2026 09:36:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/2026-week15/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;h3 id=&#34;继续读-极端的年代-1914-1991--豆瓣----peng-read-2026-dot-md&#34;&gt;继续读 &lt;a href=&#34;http://blog.imcompany.cn/post/peng-read-2026/#极端的年代19141991-豆瓣&#34;&gt;极端的年代：1914—1991 (豆瓣)&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;最近工作忙，只看了几小段&lt;/p&gt;
&lt;h3 id=&#34;study-claude-code-tips&#34;&gt;Study claude-code-tips&lt;/h3&gt;
&lt;p&gt;认真学习了一下 &lt;a href=&#34;https://github.com/ykdojo/claude-code-tips&#34;&gt;claude-code-tips&lt;/a&gt; ，作者使用CC的心得，其中 Tip5、6、8、9、13、17、33 收获挺大，对于工具作者也提示还是要多用，在用的过程完善与进步&lt;/p&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;h3 id=&#34;安装cctui&#34;&gt;安装cctui&lt;/h3&gt;
&lt;p&gt;安装了 lazycat 大佬开发的 &lt;a href=&#34;https://github.com/manateelazycat/cctui&#34;&gt;cctui&lt;/a&gt; ，用着很舒服，真正做到的Hack操作，先前安装的 cc-client 只能说是命令的 CC UI，操作没有一气呵成的感觉。还Vibe了一下&lt;a href=&#34;https://github.com/manateelazycat/cctui/pull/1&#34;&gt;增加了对OpenCode的支持&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;安装-claude-island&#34;&gt;安装 Claude Island&lt;/h3&gt;
&lt;p&gt;近期这种在Mac刘海屏显示 CC 操作的应用开始多了起来，试着安装了 &lt;a href=&#34;https://github.com/engels74/claude-island&#34;&gt;claude-island&lt;/a&gt; 发现还是没能实现直接在刘海里面来授权CC操作&lt;/p&gt;
&lt;h3 id=&#34;logseq启动变慢&#34;&gt;Logseq启动变慢&lt;/h3&gt;
&lt;p&gt;Logseq提示好几个插件拖慢了启动，先是给禁用了，后来发现被加载的插件的结构被破坏，猜测还是Mac的磁盘问题，重新下载插件后问题解决&lt;/p&gt;
&lt;h2 id=&#34;image-️&#34;&gt;Image 🖼️&lt;/h2&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/POdEMX.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;热锅上的蚂蚁&lt;/p&gt;
&lt;h2 id=&#34;speech&#34;&gt;Speech 💬&lt;/h2&gt;
&lt;p&gt;超越自我，理解他者&lt;/p&gt;
&lt;h2 id=&#34;wiki一下&#34;&gt;Wiki一下&lt;/h2&gt;
&lt;h3 id=&#34;reuters&#34;&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Reuters?useskin=vector&#34;&gt;Reuters&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;路透社，国际知名新闻机构，世界最大的新闻组织，其有2500名新闻工作者遍布200个地区和165个国家，其新闻使用16种语言编写。在1851年由德国人 &lt;strong&gt;保罗路透&lt;/strong&gt; 在伦敦建立，2008年被汤姆森集团收购&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 2026-W14</title>
      <link>http://blog.imcompany.cn/post/2026-week14/</link>
      <pubDate>Thu, 09 Apr 2026 09:44:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/2026-week14/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;h3 id=&#34;继续读-资质通鉴&#34;&gt;继续读 《资质通鉴》&lt;/h3&gt;
&lt;p&gt;补了补中间南北朝的历史，是真的乱&lt;/p&gt;
&lt;h3 id=&#34;working-with-ai&#34;&gt;&lt;a href=&#34;https://working-with-ai.vercel.app/#1&#34;&gt;Working with AI&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;完全由AI生成的Slide，分享作者是如何使用AI及其思考，强烈推荐👍&lt;/p&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;h3 id=&#34;使用-lmstudio-安装了-qwen3-dot-5的动态量化模型&#34;&gt;使用 LmStudio 安装了 &lt;a href=&#34;https://huggingface.co/Brooooooklyn/Qwen3.5-35B-A3B-UD-Q4_K_XL-mlx&#34;&gt;Qwen3.5的动态量化模型&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;刷推看到的，现在MLX Community 上都是非对称量化，影响输出质量，动态量化的模型就可以优化这个问题&lt;/p&gt;
&lt;h3 id=&#34;安装了-type4me&#34;&gt;安装了 Type4Me&lt;/h3&gt;
&lt;p&gt;近期语音输入应用很火，找到&lt;a href=&#34;https://github.com/joewongjc/type4me&#34;&gt;这款&lt;/a&gt;开源的可使用本地的 AI语音模型，很满意&lt;/p&gt;
&lt;h3 id=&#34;brave-search验证失败&#34;&gt;Brave search验证失败&lt;/h3&gt;
&lt;p&gt;用国内Visa卡验证 Brave Search 失败，放弃折腾&lt;/p&gt;
&lt;h3 id=&#34;尝试gemma-4-26b&#34;&gt;尝试Gemma-4-26B&lt;/h3&gt;
&lt;p&gt;使用 Llama.cpp 成功运行 Gemma-4，速度很快，质量有待考证，先用用再评&lt;/p&gt;
&lt;h2 id=&#34;image-️&#34;&gt;Image 🖼️&lt;/h2&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/p0rnta.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;清明时节雨纷纷&lt;/p&gt;
&lt;h2 id=&#34;speech&#34;&gt;Speech 💬&lt;/h2&gt;
&lt;p&gt;故事不能替代现实，只能帮助我们面对现实&lt;/p&gt;
&lt;h2 id=&#34;wiki一下&#34;&gt;Wiki一下&lt;/h2&gt;
&lt;h3 id=&#34;kharg-island&#34;&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Kharg_Island&#34;&gt;Kharg Island&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;哈克岛，也被称为“禁岛”，是伊朗位于波斯湾的一个大陆岛，是伊朗石油出口的重要海上港口，近期的美以伊冲突特朗普宣称要袭击此岛来施压伊朗&lt;/p&gt;</description>
    </item>
    <item>
      <title>2020-ARTS-打卡第十三天</title>
      <link>http://blog.imcompany.cn/post/2020-arts-013/</link>
      <pubDate>Wed, 01 Apr 2026 09:23:48 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/2020-arts-013/</guid>
      <description>&lt;h2 id=&#34;algorithm&#34;&gt;Algorithm&lt;/h2&gt;
&lt;h3 id=&#34;题目&#34;&gt;题目&lt;/h3&gt;
&lt;h4 id=&#34;题目描述&#34;&gt;题目描述&lt;/h4&gt;
&lt;p&gt;给你一个包含 n 个整数的数组 nums，判断 nums 中是否存在三个元素 a，b，c ，使得 a + b + c = 0 ？请你找出所有满足条件且不重复的三元组。答案中不可以包含重复的三元组。&lt;/p&gt;
&lt;h4 id=&#34;题目解答&#34;&gt;题目解答&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;java.util.ArrayList&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;java.util.Arrays&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;java.util.List&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Solution&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;List&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;List&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Integer&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;threeSum&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;List&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;List&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Integer&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;result&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ArrayList&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;||&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;length&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;result&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Arrays&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;sort&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;length&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;continue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;L&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;R&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;length&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;while&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;L&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;R&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;target&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;L&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;R&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;target&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;result&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Arrays&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;asList&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;L&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;R&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;while&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;L&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;R&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;L&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;L&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;L&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;while&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;L&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;R&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;R&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;R&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;R&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;L&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;R&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;target&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;L&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;R&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;result&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一共有三种解法，一是三层for循环，时间复杂度为O(n3)；二是二层for循环外加Hash表，时间复杂度为O(n2)，增加了空间复杂度O(n);第三种就是上面的解法，排序后从两侧开始匹配，时间复杂度为O(n2)，空间复杂度为O(1)&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 2026-W13</title>
      <link>http://blog.imcompany.cn/post/2026-week13/</link>
      <pubDate>Tue, 31 Mar 2026 09:50:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/2026-week13/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;h3 id=&#34;读完-我在北京送快递--豆瓣&#34;&gt;读完 &lt;a href=&#34;https://book.douban.com/subject/36150423/&#34;&gt;我在北京送快递 (豆瓣)&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;给了4星，前半部分与标题对应，后面就是罗列了作者的所有工作以及感想，可以换一个角度看不同的人生&lt;/p&gt;
&lt;h3 id=&#34;继续读-资质通鉴&#34;&gt;继续读 《资质通鉴》&lt;/h3&gt;
&lt;p&gt;搭配着视频看起了安州牧的 &lt;a href=&#34;https://www.bilibili.com/video/BV1w3411v7jd/?p=3&#34;&gt;风云南北朝&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;h3 id=&#34;nowledge-mem-think-remember-connect&#34;&gt;&lt;a href=&#34;https://mem.nowledge.co/&#34;&gt;Nowledge Mem - Think, Remember, Connect&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;AI记忆层软件，整合文件、聊天笔记，准备试试&lt;/p&gt;
&lt;h3 id=&#34;chaoswork-appine-appine-app-in-emacs-which-allows-you-to-open-native-macos-browser-pdf-viewer-and-video-player-directly-within-emacs-dot&#34;&gt;&lt;a href=&#34;https://github.com/chaoswork/appine&#34;&gt;chaoswork/appine: Appine = App in Emacs, which allows you to open native macOS browser, PDF viewer and video player directly within Emacs.&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;在Emacs中通过动态模块使用其可以直接打开原生的浏览器和文件&lt;/p&gt;
&lt;h3 id=&#34;cc本地模型接入慢&#34;&gt;CC本地模型接入慢&lt;/h3&gt;
&lt;p&gt;刷 X 发现有人也遇到了LM Studio 接入 CC慢的问题；对于Copilot 接入CC慢的问题，建议接入OpenCode&lt;/p&gt;
&lt;h3 id=&#34;mole-调教&#34;&gt;Mole 调教&lt;/h3&gt;
&lt;p&gt;清理完后 antidote 加载的插件就没有了，清理完后还是要重新再source和install，于是尝试重新用 git 方式安装 antidote，清理后还是一样的结果，查了文档发现其实是没有把 antidote 的插件地址加到whitelist，mole对于配置中的whitelist路径会跳过&lt;/p&gt;
&lt;h3 id=&#34;jundot-omlx-llm-inference-server-with-continuous-batching-and-ssd-caching-for-apple-silicon-managed-from-the-macos-menu-bar&#34;&gt;&lt;a href=&#34;https://github.com/jundot/omlx&#34;&gt;jundot/omlx: LLM inference server with continuous batching &amp;amp; SSD caching for Apple Silicon — managed from the macOS menu bar&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;终于打到心仪的本地大模型工具了，可以识别MLX格式的模型，直接指定LM Studio的模型地址就可以；最好的是和CC搭配不错，能在界面直接操作 Context-Length&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 2026-W12</title>
      <link>http://blog.imcompany.cn/post/2026-week12/</link>
      <pubDate>Tue, 24 Mar 2026 09:38:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/2026-week12/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;h3 id=&#34;autoresearching-apple-s-llm-in-a-flash-to-run-qwen-397b-locally&#34;&gt;&lt;a href=&#34;https://simonwillison.net/2026/Mar/18/llm-in-a-flash/?__readwiseLocation=#atom-everything&#34;&gt;Autoresearching Apple&amp;rsquo;s &amp;ldquo;LLM in a Flash&amp;rdquo; to run Qwen 397B locally&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;有人在48GB MacBook Pro M3 Max通过Falsh运行了Qwen397B，目前只针对Qwen3.5-397B-A17B这一个模型，对于本地想使用超大模型提供了方向&lt;/p&gt;
&lt;h3 id=&#34;继续读-资质通鉴&#34;&gt;继续读 《资质通鉴》&lt;/h3&gt;
&lt;p&gt;看到了 &lt;strong&gt;两晋十六国&lt;/strong&gt; 部分，那个时期是真的乱，还好又找到了 B站的&lt;a href=&#34;https://www.bilibili.com/video/BV1N7411M7wA/&#34;&gt;相关解说&lt;/a&gt;，配合着看舒服多了&lt;/p&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;h3 id=&#34;安装了-cc-switch-的-命令行版本&#34;&gt;安装了 cc-switch 的&lt;a href=&#34;https://github.com/SaladDay/cc-switch-cli&#34;&gt;命令行版本&lt;/a&gt;&lt;/h3&gt;
&lt;h3 id=&#34;安装其它本地模型工具&#34;&gt;安装其它本地模型工具&lt;/h3&gt;
&lt;p&gt;先后安装了 &lt;a href=&#34;https://github.com/waybarrios/vllm-mlx&#34;&gt;vllm-ml&lt;/a&gt;、 mlx 和 &lt;a href=&#34;https://github.com/madroidmaq/mlx-omni-server&#34;&gt;mlx-omni-server&lt;/a&gt;、&lt;a href=&#34;https://github.com/BerriAI/litellm&#34;&gt;litellm&lt;/a&gt; 来跑 &lt;a href=&#34;https://huggingface.co/mlx-community/Qwen3.5-27B-Claude-4.6-Opus-Distilled-MLX-4bit&#34;&gt;mlx-community/Qwen3.5-27B-Claude-4.6-Opus-Distilled-MLX-4bit&lt;/a&gt;给CC用，尝试下来发现速度都不快，可能是我配置的不对。还尝试了安装了一下 &lt;a href=&#34;https://github.com/unslothai/unsloth&#34;&gt;unsloth&lt;/a&gt;，下载模型速度有点慢，准备后续再尝试。最后还是使用 LM Studio 成功实现，这个工具原生就支持了 MLX 格式的文件。目前看还可能会折腾一下 &lt;a href=&#34;https://github.com/ggml-org/llama.cpp&#34;&gt;llama.cpp&lt;/a&gt; 然后就圆满了&lt;/p&gt;
&lt;h3 id=&#34;使用-x-cmd&#34;&gt;使用 x-cmd&lt;/h3&gt;
&lt;p&gt;使用 &lt;a href=&#34;https://github.com/x-cmd/x-cmd&#34;&gt;X-cmd&lt;/a&gt; 来集中管理cli命令，官方建议直接使用 curl 方式进行安装，使用brew方式更新后文件丢失，一看这工具还支持 x brew 方式来安装应用&lt;/p&gt;
&lt;h2 id=&#34;image-️&#34;&gt;Image 🖼️&lt;/h2&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/Z8dy5p.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;本周完美的AI周，AI跑CC，AI改需求代码&lt;/p&gt;
&lt;h2 id=&#34;speech&#34;&gt;Speech 💬&lt;/h2&gt;
&lt;p&gt;不要把时间浪费在纠结问题上，而是应该放在解决问题上&lt;/p&gt;
&lt;h2 id=&#34;wiki一下&#34;&gt;Wiki一下&lt;/h2&gt;
&lt;h3 id=&#34;academy-awards&#34;&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Academy_Awards?useskin=vector&#34;&gt;Academy Awards&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;学院奖，更为人所知的是奥斯卡，是电影业艺术与技术成就的奖项。此奖项每年由美国电影与艺术科学学院颁发。奥斯卡被认为是电影行业最具声望的奖项，第一次奖项颁发于1929年5月16日在好莱坞罗斯福酒店举行&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 2026-W11</title>
      <link>http://blog.imcompany.cn/post/2026-week11/</link>
      <pubDate>Mon, 16 Mar 2026 09:38:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/2026-week11/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;h3 id=&#34;继续读-我在北京送快递--豆瓣&#34;&gt;继续读 &lt;a href=&#34;https://book.douban.com/subject/36150423/&#34;&gt;我在北京送快递 (豆瓣)&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;读了有一半了，深切感受一下不同劳动者的生活&lt;/p&gt;
&lt;h3 id=&#34;tmux-2--豆瓣&#34;&gt;&lt;a href=&#34;https://book.douban.com/subject/26959790/&#34;&gt;tmux 2 (豆瓣)&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;一天系统的学习了一下前四章，对于日常的使用完全够用了。&lt;a href=&#34;https://github.com/gpakosz/.tmux&#34;&gt;https://github.com/gpakosz/.tmux&lt;/a&gt; 这个配置完美践行了书中的理念&lt;/p&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;h3 id=&#34;tw93-mole-deep-clean-and-optimize-your-mac-dot&#34;&gt;&lt;a href=&#34;https://github.com/tw93/Mole&#34;&gt;tw93/Mole: 🐹 Deep clean and optimize your Mac.&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;开始使用 Mole，命令行操作就是舒服，使用后决定与腾讯的柠檬 说再见&lt;/p&gt;
&lt;h3 id=&#34;给-obsidian-装了-claudian&#34;&gt;给 Obsidian 装了 Claudian&lt;/h3&gt;
&lt;p&gt;可以在 Obsidian 愉快的使用 CC 了&lt;/p&gt;
&lt;h2 id=&#34;image-️&#34;&gt;Image 🖼️&lt;/h2&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/WeChatWorkScreenshot_dca03837-3989-499f-99de-01755505344b.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;全民养虾，要对此保持冷静与克制，保持持续关注&lt;/p&gt;
&lt;h2 id=&#34;speech&#34;&gt;Speech 💬&lt;/h2&gt;
&lt;h3 id=&#34;家长的虚心态度-是让孩子拥有松弛自信的必然条件&#34;&gt;家长的虚心态度，是让孩子拥有松弛自信的必然条件&lt;/h3&gt;
&lt;p&gt;坦诚承认自己的不足，与孩子一起进步&lt;/p&gt;
&lt;h2 id=&#34;wiki一下&#34;&gt;Wiki一下&lt;/h2&gt;
&lt;h3 id=&#34;strait-of-hormuz&#34;&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Strait_of_Hormuz?useskin=vector&#34;&gt;Strait_of_Hormuz&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;霍耳莫兹海峡，是波斯湾通往公海的唯一海上通道，承载着全球20%的天然气和25%的海运石油的贸易，近期因美伊冲突而被伊朗关闭，全球油价开始上涨&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 2026-W10</title>
      <link>http://blog.imcompany.cn/post/2026-week10/</link>
      <pubDate>Fri, 06 Mar 2026 19:44:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/2026-week10/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;h3 id=&#34;开始读-我在北京送快递--豆瓣&#34;&gt;开始读 &lt;a href=&#34;https://book.douban.com/subject/36150423/&#34;&gt;我在北京送快递 (豆瓣)&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;主要是等公车时读&lt;/p&gt;
&lt;h3 id=&#34;马年快乐-读者朋友们-余晟以为&#34;&gt;&lt;a href=&#34;https://quaily.com/yurii-says/p/happy-year-of-the-horse-readers-friends&#34;&gt;马年快乐，读者朋友们 | 余晟以为&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;像作者文章所说的：努力过好自己的生活，同时保持着对他人的理解和同情&lt;/p&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;h3 id=&#34;开始使用claude-code&#34;&gt;开始使用Claude Code&lt;/h3&gt;
&lt;p&gt;使用 &lt;a href=&#34;https://github.com/farion1231/cc-switch&#34;&gt;cc-switch&lt;/a&gt; 配置使用本地的Ollama模型，免费保障隐私&lt;/p&gt;
&lt;h3 id=&#34;obsidian-升级到最新版本-有了-obsidian-cli&#34;&gt;Obsidian 升级到最新版本，有了 &lt;a href=&#34;https://help.obsidian.md/cli&#34;&gt;Obsidian Cli&lt;/a&gt;&lt;/h3&gt;
&lt;h3 id=&#34;自从ide加了ai窗口后-发现屏幕宽度不够了&#34;&gt;自从IDE加了AI窗口后，发现屏幕宽度不够了&lt;/h3&gt;
&lt;p&gt;感觉40寸的屏幕会非常的爽&lt;/p&gt;
&lt;h2 id=&#34;image-️&#34;&gt;Image 🖼️&lt;/h2&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/pw1aXT.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;我的编程小助手们&lt;/p&gt;
&lt;h2 id=&#34;speech&#34;&gt;Speech 💬&lt;/h2&gt;
&lt;p&gt;AI时代代码免费了，但判断力没有&lt;/p&gt;
&lt;h2 id=&#34;wiki一下&#34;&gt;Wiki一下&lt;/h2&gt;
&lt;h3 id=&#34;bayer-wikipedia&#34;&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Bayer?useskin=vector&#34;&gt;Bayer - Wikipedia&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;拜耳，德国跨国制药公司和生物技术公司，总部位于勒沃库森，业务竟然还有农用化学品，近期因为除草剂Roundup产品引发淋巴瘤而支付30亿美元的法律和解费用&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 2026-W09</title>
      <link>http://blog.imcompany.cn/post/2026-week9/</link>
      <pubDate>Sat, 28 Feb 2026 18:19:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/2026-week9/</guid>
      <description>&lt;p&gt;春节三周休整，直接到第9周了&lt;/p&gt;
&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;h3 id=&#34;开始阅读-极端的年代-1914-1991--豆瓣----peng-read-2026-dot-md&#34;&gt;开始阅读 &lt;a href=&#34;http://blog.imcompany.cn/post/peng-read-2026/#极端的年代19141991-豆瓣&#34;&gt;极端的年代：1914—1991 (豆瓣)&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;一部大作&lt;/p&gt;
&lt;h3 id=&#34;new-talk-learning-dns-in-10-years&#34;&gt;&lt;a href=&#34;https://jvns.ca/blog/2023/05/08/new-talk-learning-dns-in-10-years/&#34;&gt;New talk: Learning DNS in 10 years&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;通过学习DNS协议来讨论如何学习技术&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;监视&lt;/li&gt;
&lt;li&gt;阅读官方文档&lt;/li&gt;
&lt;li&gt;做实验验证&lt;/li&gt;
&lt;li&gt;动手实现一个terrible版本&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;h3 id=&#34;altserver签名报错了-找了几个替换品都比较麻烦-想了一下使用频率也不高-不折腾了&#34;&gt;AltServer签名报错了，找了几个替换品都比较麻烦，想了一下使用频率也不高，不折腾了&lt;/h3&gt;
&lt;h3 id=&#34;尝试了一下-supercmd&#34;&gt;尝试了一下&lt;a href=&#34;https://github.com/SuperCmdLabs/SuperCmd&#34;&gt;SuperCmd&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;说是Raycast的开源平替，支持语音，使用下来发现不能连接Ollama，后续看看有没有迭代&lt;/p&gt;
&lt;h3 id=&#34;org-logseq-命令时好时坏&#34;&gt;&lt;a href=&#34;https://github.com/llcc/org-logseq&#34;&gt;org-logseq&lt;/a&gt;命令时好时坏&lt;/h3&gt;
&lt;p&gt;底层使用grep命令行实现的&lt;/p&gt;
&lt;h3 id=&#34;在本机通过docker安装了openclaw&#34;&gt;在本机通过Docker安装了OpenClaw&lt;/h3&gt;
&lt;p&gt;参考的 &lt;a href=&#34;https://til.simonwillison.net/llms/openclaw-docker&#34;&gt;Simon Willison&amp;rsquo;s Blog&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;snippetslab从setapp版切到applestore版本&#34;&gt;SnippetsLab从Setapp版切到AppleStore版本&lt;/h3&gt;
&lt;p&gt;SnippetsLab 竟然在2024年底就免费了，切换比较顺畅，Setapp版本导出库，AppleStore版本导入即可&lt;/p&gt;
&lt;h2 id=&#34;image-️&#34;&gt;Image 🖼️&lt;/h2&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/ZD7oUS.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;人生就是一场马拉松，使用Google的 Nano Banana 2 模型&lt;/p&gt;
&lt;h2 id=&#34;speech&#34;&gt;Speech 💬&lt;/h2&gt;
&lt;p&gt;交易就是做对时要敢于多拿一会儿，做错时要能迅速止损，而不是死扛或频繁反悔&lt;/p&gt;
&lt;h2 id=&#34;wiki一下&#34;&gt;Wiki一下&lt;/h2&gt;
&lt;h3 id=&#34;hunter-hess&#34;&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Hunter_Hess?useskin=vector&#34;&gt;Hunter_Hess&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;一位美国滑雪运动员，在2026年的米兰冬运会上的发言引来川普的反击&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 2026-W05</title>
      <link>http://blog.imcompany.cn/post/2026-week5/</link>
      <pubDate>Fri, 06 Feb 2026 18:55:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/2026-week5/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;h3 id=&#34;读完-丝绸之路-一部全新的世界史&#34;&gt;读完 丝绸之路_一部全新的世界史&lt;/h3&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;h3 id=&#34;timemachine备份空间不足-使用-diskdrill-来扫描配合着删除一些占用大的空间-brew和idea相关的cache是清理大户&#34;&gt;TimeMachine备份空间不足，使用 &lt;a href=&#34;https://www.cleverfiles.com/&#34;&gt;DiskDrill&lt;/a&gt; 来扫描配合着删除一些占用大的空间，brew和idea相关的cache是清理大户&lt;/h3&gt;
&lt;h3 id=&#34;重新全量备份电脑-给tm设置了密码保证安全&#34;&gt;重新全量备份电脑，给TM设置了密码保证安全&lt;/h3&gt;
&lt;h3 id=&#34;参考-我如何使用-apple-notes-做笔记-开始实践para方法论&#34;&gt;参考 &lt;a href=&#34;https://lutaonan.com/blog/apple-notes-and-para/&#34;&gt;我如何使用 Apple Notes 做笔记&lt;/a&gt; 开始实践PARA方法论&lt;/h3&gt;
&lt;h3 id=&#34;mac鼠标滑到右下角可以直接quick-note-感觉不错&#34;&gt;mac鼠标滑到右下角可以直接quick note，感觉不错&lt;/h3&gt;
&lt;h3 id=&#34;给-blog-增加了-updatetime&#34;&gt;给 blog 增加了 updatetime&lt;/h3&gt;
&lt;h3 id=&#34;我如何使用-apple-notes-做笔记--org82f05ee&#34;&gt;&lt;a href=&#34;#%E5%8F%82%E8%80%83-%E6%88%91%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8-apple-notes-%E5%81%9A%E7%AC%94%E8%AE%B0-%E5%BC%80%E5%A7%8B%E5%AE%9E%E8%B7%B5para%E6%96%B9%E6%B3%95%E8%AE%BA&#34;&gt;我如何使用 Apple Notes 做笔记&lt;/a&gt;&lt;/h3&gt;
&lt;h2 id=&#34;image-️&#34;&gt;Image 🖼️&lt;/h2&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/EeAoTr.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h2 id=&#34;speech&#34;&gt;Speech 💬&lt;/h2&gt;
&lt;p&gt;知识教的来，见识教不来&lt;/p&gt;
&lt;h2 id=&#34;wiki一下&#34;&gt;Wiki一下&lt;/h2&gt;
&lt;h3 id=&#34;kevin-warsh-wikipedia&#34;&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Kevin_Warsh?useskin=vector&#34;&gt;Kevin Warsh - Wikipedia&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;凯文·麦克斯韦尔·沃什，美国金融家和银行高管，2016年1月30日，被特朗普正式提名为下一任美联储主席来接替 鲍威尔&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 2026-W04</title>
      <link>http://blog.imcompany.cn/post/2026-week4/</link>
      <pubDate>Mon, 02 Feb 2026 09:49:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/2026-week4/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;h3 id=&#34;我如何使用-apple-notes-做笔记-randy-s-blog&#34;&gt;&lt;a href=&#34;https://lutaonan.com/blog/apple-notes-and-para/&#34;&gt;我如何使用 Apple Notes 做笔记 | Randy&amp;rsquo;s Blog&lt;/a&gt;&lt;/h3&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/lsaFdG.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;受启发的是作者提到的笔记的优先级: 快速打开、快速记录，美观是次要的&lt;/p&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;博客主题切换到 &lt;a href=&#34;https://github.com/adityatelange/hugo-PaperMod&#34;&gt;hugo-PaperMod&lt;/a&gt;，因为兼容问题把hugo也升级到最新版本0.154.5，又把相关配置统一管理起来&lt;/li&gt;
&lt;li&gt;Anki中包含了最新的算法 &lt;a href=&#34;https://github.com/open-spaced-repetition/fsrs4anki&#34;&gt;FSRS&lt;/a&gt; ，需要手动开启&lt;/li&gt;
&lt;li&gt;听说最近typeless很火，下载试试&lt;/li&gt;
&lt;li&gt;Mac 的TimeMachine 的备份是滚动的，不用担心满的问题，它会在满时自动进行判断来删除老的备份&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;image-️&#34;&gt;Image 🖼️&lt;/h2&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/dZV3Aq.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;记录一下常用的Setapp软件&lt;/p&gt;
&lt;h2 id=&#34;speech&#34;&gt;Speech 💬&lt;/h2&gt;
&lt;p&gt;耐心就是放弃完美主义&lt;/p&gt;
&lt;h2 id=&#34;wiki一下&#34;&gt;Wiki一下&lt;/h2&gt;
&lt;h3 id=&#34;minneapolis-wikipedia&#34;&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Minneapolis?useskin=vector&#34;&gt;Minneapolis - Wikipedia&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;明尼阿波里斯市，隶属于明尼苏达州，与首府圣保罗相邻，有湖泊之城的美誉。近期因与特朗普的移民执法行动而备受关注&lt;/p&gt;</description>
    </item>
    <item>
      <title>SpringMVC实践之集成Sentinel限流功能</title>
      <link>http://blog.imcompany.cn/post/spring-webmvc-interceptor-sentinel/</link>
      <pubDate>Fri, 30 Jan 2026 10:48:47 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/spring-webmvc-interceptor-sentinel/</guid>
      <description>&lt;h2 id=&#34;背景&#34;&gt;背景&lt;/h2&gt;
&lt;p&gt;近期收到线上报警，发现个别新接口在同1s内被请求了接近上百次，对系统的稳定造成了一些影响，近期调研了一下通用的限流框架，打算将Sentinel的限流功能集成进新服务&lt;/p&gt;
&lt;h2 id=&#34;sentinel前置知识&#34;&gt;Sentinel前置知识&lt;/h2&gt;
&lt;p&gt;Sentinel 限流主要涉及以下几方面&lt;/p&gt;
&lt;h3 id=&#34;resource&#34;&gt;Resource&lt;/h3&gt;
&lt;p&gt;限流的资源，资源支持动态加载，核心类为： &lt;code&gt;AbstractDataSource&lt;/code&gt; ，Sentinel 默认提供了市面常见的资源管理服务的实现，也可以自定义实现
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/bMQyLZ.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;rule&#34;&gt;Rule&lt;/h3&gt;
&lt;p&gt;对定义的 Resouce 应用的限流规则，基于QPS、响应时间与系统负载。Sentinel 是通过一系列的功能Slot来实现不同的统计/控制功能，对于限流功能对应的就是 &lt;code&gt;FlowSlot&lt;/code&gt;&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/DSNjeo.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;&lt;code&gt;FlowSlot&lt;/code&gt; 的功能实现需要依赖前面的 &lt;code&gt;NodeSelectorSlot&lt;/code&gt; 和 &lt;code&gt;ClusterBuilderSlot&lt;/code&gt; 等统计Slot，有了统计信息才可以针对配置进行限流操作，这里面借用一张官方的实现图
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/3TQkqg.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;各Slot默认的顺序也可以在代码中找到
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/hZyabG.png&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;核心处理逻辑&#34;&gt;核心处理逻辑&lt;/h4&gt;
&lt;p&gt;核心逻辑是在执行调用chain的捕获Blockexcption然后执行后续操作&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/514k2Q.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h2 id=&#34;集成步骤&#34;&gt;集成步骤&lt;/h2&gt;
&lt;p&gt;借助SpringMVC中提供的 &lt;code&gt;HandlerInterceptor&lt;/code&gt; 拦截器功能 与 Sentinel 提供的SpringMVC框架集成类库可以方便快速的实现限流功能&lt;/p&gt;
&lt;h3 id=&#34;引入sentinel-springmvc-adapter&#34;&gt;引入Sentinel SpringMVC Adapter&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;com.alibaba.csp&lt;span class=&#34;nt&#34;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;sentinel-spring-webmvc-adapter&lt;span class=&#34;nt&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;1.8.8&lt;span class=&#34;nt&#34;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;配置sentinelwebinterceptor&#34;&gt;配置SentinelWebInterceptor&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/alibaba/Sentinel/tree/1.8/sentinel-adapter/sentinel-spring-webmvc-adapter&#34;&gt;Sentinel  SpringMVC Adapter&lt;/a&gt;中提供了 &lt;code&gt;SentinelWebInterceptor&lt;/code&gt; 来实现限流功能，这个 Interceptor 支持一些自定义的行为，主要通过 SentinelWebMvcConfig 来实现&lt;/p&gt;
&lt;h4 id=&#34;sentinelwebmvcconfig-常用配置说明&#34;&gt;SentinelWebMvcConfig 常用配置说明&lt;/h4&gt;
&lt;p&gt;SentinelWebMvcConfig 支持以下配置能力&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;urlCleaner&lt;/p&gt;
&lt;figure&gt;
        &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/8I1bRn.png&#34;/&gt; 
    &lt;/figure&gt;

&lt;p&gt;自定义对请求url的处理，比如厂商此次需要通过请求的设备id维度进行限流，对于其它的请求参数都进行忽略，最终可定义效果为: &lt;code&gt;/api/v1/test/ping?did=6308103f1026acf274bbcc1b10001291551xxX&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;httpMethodSpecify&lt;/p&gt;
&lt;p&gt;是否指定特定的Http请求方法，此设置是对资源的请求方法进行了细粒度的配置，默认为false不开启，配置为true后，会在设定好的资源名前加上请求的方法，类似效果:  &lt;code&gt;GET: /api/v1/test/ping?did=6308103f1026acf274bbcc1b10001291551xxX&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;blockExceptionHandler&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/XluwAf.png&#34;&gt;
被Block的请求异常处理器，对Block的请求进行自定义处理，可以设置返回的值，如果未配置则需要服务自己捕获 BlockException，可以通过配置 &lt;code&gt;ExceptionHandler&lt;/code&gt; 进行统一处理&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;originParser&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/njPqHL.png&#34;&gt;
请求来源处理器，针对请求的来源进行处理，在配置资源的规则的可以使用此解析的origin细粒度控制，例如可以解析ip、用户做为请求 origin&lt;/p&gt;</description>
    </item>
    <item>
      <title>那些值得消费内容们</title>
      <link>http://blog.imcompany.cn/post/worth-consume-resource/</link>
      <pubDate>Tue, 27 Jan 2026 11:38:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/worth-consume-resource/</guid>
      <description>&lt;h2 id=&#34;article&#34;&gt;Article&lt;/h2&gt;
&lt;h3 id=&#34;云风的-blog-编程的门槛&#34;&gt;&lt;a href=&#34;https://blog.codingnow.com/2006/08/aiaea.html&#34;&gt;云风的 BLOG: 编程的门槛&lt;/a&gt;&lt;/h3&gt;
&lt;h3 id=&#34;断网-当代人的生活解药&#34;&gt;&lt;a href=&#34;https://mp.weixin.qq.com/s?__biz=MjEwMzA5NTcyMQ==&amp;amp;mid=2653184028&amp;amp;idx=1&amp;amp;sn=0b31236f270bad50d3fe21dbc79c1cb1&amp;amp;chksm=4eb586da79c20fccb80d48fe570384162d862b02e7475539ee6359e004ea384392273d0f6eea#rd&#34;&gt;断网，当代人的生活解药&lt;/a&gt;&lt;/h3&gt;
&lt;h3 id=&#34;基本医疗保险-普惠健康险与百万医疗-邹扒皮实验室&#34;&gt;&lt;a href=&#34;https://zou.cool/2024/10/17/health-insurance/&#34;&gt;基本医疗保险，普惠健康险与百万医疗 | 邹扒皮实验室&lt;/a&gt;&lt;/h3&gt;
&lt;h3 id=&#34;how-i-write-http-services-in-go-after-13-years-grafana-labs&#34;&gt;&lt;a href=&#34;https://grafana.com/blog/how-i-write-http-services-in-go-after-13-years/&#34;&gt;How I write HTTP services in Go after 13 years | Grafana Labs&lt;/a&gt;&lt;/h3&gt;
&lt;h3 id=&#34;程序员阅读清单-我喜欢的-100-篇技术文章-1-20-piglei&#34;&gt;&lt;a href=&#34;https://www.piglei.com/articles/programmer-reading-list-1/&#34;&gt;程序员阅读清单：我喜欢的 100 篇技术文章（1-20） | Piglei&lt;/a&gt;&lt;/h3&gt;
&lt;h2 id=&#34;video&#34;&gt;Video&lt;/h2&gt;
&lt;h3 id=&#34;i-was-an-mit-educated-neurosurgeon-now-i-m-unemployed-and-alone-in-the-mountains-how-did-i-get-here-youtube&#34;&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=25LUF8GmbFU&#34;&gt;I Was An MIT Educated Neurosurgeon Now I&amp;rsquo;m Unemployed And Alone In The Mountains How Did I Get Here? - YouTube&lt;/a&gt;&lt;/h3&gt;
&lt;h3 id=&#34;投资第-1-课-投资-dot-dot-dot-孟岩-的视频-视频-微博&#34;&gt;&lt;a href=&#34;https://weibo.com/tv/show/1034:4943412357693480?from=old_pc_videoshow&#34;&gt;投资第 1 课：投资&amp;hellip; - @孟岩 的视频 - 视频 - 微博&lt;/a&gt;&lt;/h3&gt;
&lt;h3 id=&#34;富人的思维vs-dot-穷人思维-rich-mindset-vs-dot-poor-mindset-youtube&#34;&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=zcXLZlEZvkA&#34;&gt;富人的思维Vs.穷人思维 | Rich Mindset Vs. Poor Mindset - YouTube&lt;/a&gt;&lt;/h3&gt;
&lt;h3 id=&#34;40分钟看懂1929大萧条-plus-80通胀-plus-08次贷-plus-23硅谷四次金融危机-youtube&#34;&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=TDtVL1db5PI&#34;&gt;40分钟看懂1929大萧条+80通胀+08次贷+23硅谷四次金融危机 - YouTube&lt;/a&gt;&lt;/h3&gt;
&lt;h3 id=&#34;morty-普通人改变命运的秘密-我的观点可能会颠覆你的认知-哔哩哔哩&#34;&gt;&lt;a href=&#34;https://www.bilibili.com/opus/664942460238037013&#34;&gt;【Morty】普通人改变命运的秘密！我的观点可能会颠覆你的认知 - 哔哩哔哩&lt;/a&gt;&lt;/h3&gt;
&lt;h3 id=&#34;jerry-seinfeld-duke-s-2024-commencement-address-youtube&#34;&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=76QV2SrSqgo&#34;&gt;Jerry Seinfeld | Duke&amp;rsquo;s 2024 Commencement Address - YouTube&lt;/a&gt;&lt;/h3&gt;
&lt;h3 id=&#34;经济机器是怎样运行的--时长30分钟--ray-dalio-youtube&#34;&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=rFV7wdEX-Mo&#34;&gt;经济机器是怎样运行的 (时长30分钟) Ray Dalio - YouTube&lt;/a&gt;&lt;/h3&gt;
&lt;h3 id=&#34;演讲-罗永浩15堂演讲私教课-老罗-哔哩哔哩-bilibili&#34;&gt;&lt;a href=&#34;https://www.bilibili.com/video/BV1PP411T7fv/&#34;&gt;【演讲】罗永浩15堂演讲私教课（老罗）_哔哩哔哩_bilibili&lt;/a&gt;&lt;/h3&gt;
&lt;h3 id=&#34;how-i-use-llms-youtube&#34;&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=EWvNQjAaOHw&#34;&gt;How I use LLMs - YouTube&lt;/a&gt;&lt;/h3&gt;
&lt;h3 id=&#34;controlling-your-dopamine-for-motivation-focus-and-satisfaction-youtube&#34;&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=QmOF0crdyRU&#34;&gt;Controlling Your Dopamine For Motivation, Focus &amp;amp; Satisfaction - YouTube&lt;/a&gt;&lt;/h3&gt;
&lt;h3 id=&#34;how-to-remember-everything-you-read-youtube&#34;&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=okHkUIW46ks&#34;&gt;How to Remember Everything You Read - YouTube&lt;/a&gt;&lt;/h3&gt;
&lt;h3 id=&#34;98--capcut-video-editing-tutorial-full-course-for-beginners-youtube&#34;&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=qfHX2cNA4MY&#34;&gt;(98) CapCut Video Editing Tutorial – Full Course for Beginners - YouTube&lt;/a&gt;&lt;/h3&gt;
&lt;h3 id=&#34;tech&#34;&gt;Tech&lt;/h3&gt;
&lt;h4 id=&#34;wait-but-who-s-debugging-the-debugger-youtube&#34;&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=ux3s1IIvNdg&#34;&gt;Wait, but Who&amp;rsquo;s Debugging the Debugger?! - YouTube&lt;/a&gt;&lt;/h4&gt;
&lt;h4 id=&#34;programming-w-o-language-youtube&#34;&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=rzXEsactdT4&#34;&gt;Programming w/o Language - YouTube&lt;/a&gt;&lt;/h4&gt;
&lt;h4 id=&#34;10-things-software-developers-should-learn-about-learning-communications-of-the-acm&#34;&gt;&lt;a href=&#34;https://cacm.acm.org/research/10-things-software-developers-should-learn-about-learning/&#34;&gt;10 Things Software Developers Should Learn about Learning – Communications of the ACM&lt;/a&gt;&lt;/h4&gt;
&lt;h4 id=&#34;being-glue-no-idea-blog&#34;&gt;&lt;a href=&#34;https://www.noidea.dog/glue&#34;&gt;Being Glue — No Idea Blog&lt;/a&gt;&lt;/h4&gt;
&lt;h4 id=&#34;上集-向量数据库技术鉴赏-哔哩哔哩-bilibili&#34;&gt;&lt;a href=&#34;https://www.bilibili.com/video/BV11a4y1c7SW/&#34;&gt;【上集】向量数据库技术鉴赏_哔哩哔哩_bilibili&lt;/a&gt;&lt;/h4&gt;
&lt;h4 id=&#34;下集-向量数据库技术鉴赏-哔哩哔哩-bilibili&#34;&gt;&lt;a href=&#34;https://www.bilibili.com/video/BV1BM4y177Dk/&#34;&gt;【下集】向量数据库技术鉴赏_哔哩哔哩_bilibili&lt;/a&gt;&lt;/h4&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 2026-W03</title>
      <link>http://blog.imcompany.cn/post/2026-week3/</link>
      <pubDate>Fri, 23 Jan 2026 19:12:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/2026-week3/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;看 丝绸之路_一部全新的世界史 接触到新多新的地方词语，有点晕&lt;/li&gt;
&lt;li&gt;看 资治通鉴 光看白话文对人物关系和事件还是拿不准，搭配 &lt;a href=&#34;https://space.bilibili.com/479010993/lists/4804976?type=season&#34;&gt;地图中的大汉史&lt;/a&gt;  这个解说就好很多&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;想导出hugo时把优先级也导出，查了一下发现hugo和org的优先级规则还不一样，暂时不动了&lt;/li&gt;
&lt;li&gt;买了胜利GR50的缓震膜，看能不能解决一下球拍手柄握着感觉小的问题&lt;/li&gt;
&lt;li&gt;VMware Fusion提示更新，但是需要登录后才能下载&lt;/li&gt;
&lt;li&gt;平头耳机如何佩戴也是很有讲究的：挂在下耳窝，耳柄一定要贴脸颊&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;image-️&#34;&gt;Image 🖼️&lt;/h2&gt;
&lt;h2 id=&#34;speech&#34;&gt;Speech 💬&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;要从 AI 中获益，关键是学会用高质量的提问与它协作&lt;/li&gt;
&lt;li&gt;重点投资放在学习 Prompt、上下文工程和构建能力上&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;wiki一下&#34;&gt;Wiki一下&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/He_Zuoxiu?useskin=vector&#34;&gt;https://en.wikipedia.org/wiki/He_Zuoxiu?useskin=vector&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;何祚庥，中国科学院院士，伪科学打假人士，有意思的他还批评过钱学森气功言论&lt;/p&gt;</description>
    </item>
    <item>
      <title>收藏的blog</title>
      <link>http://blog.imcompany.cn/post/favorite-blog/</link>
      <pubDate>Mon, 19 Jan 2026 18:15:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/favorite-blog/</guid>
      <description>&lt;h2 id=&#34;酷壳-coolshell-dot-cn&#34;&gt;&lt;a href=&#34;https://coolshell.cn/&#34;&gt;酷壳 – CoolShell.cn&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;plantegg&#34;&gt;&lt;a href=&#34;https://plantegg.github.io/&#34;&gt;plantegg&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;manateelazycat&#34;&gt;&lt;a href=&#34;https://manateelazycat.github.io/&#34;&gt;ManateeLazyCat&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;julia-evans&#34;&gt;&lt;a href=&#34;https://jvns.ca/&#34;&gt;Julia Evans&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;作者的编程杂志非常好看&lt;/p&gt;
&lt;h2 id=&#34;happy-xiao-substack&#34;&gt;&lt;a href=&#34;https://substack.com/@happyxiao&#34;&gt;happy xiao | Substack&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;lazycat推荐，以前已经关注过&lt;/p&gt;
&lt;h2 id=&#34;yihong0618-gitblog-people-die-but-long-live-github&#34;&gt;&lt;a href=&#34;https://github.com/yihong0618/gitblog&#34;&gt;yihong0618/gitblog: People Die, but Long Live GitHub&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;亦宏大佬，还推荐了一大堆好的博客&lt;/p&gt;
&lt;h2 id=&#34;ooh-dot-directory-a-place-to-find-good-blogs-that-interest-you&#34;&gt;&lt;a href=&#34;https://ooh.directory/&#34;&gt;ooh.directory: a place to find good blogs that interest you&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;happy xiao推荐&lt;/p&gt;
&lt;h2 id=&#34;netflix-techblog&#34;&gt;&lt;a href=&#34;https://netflixtechblog.com/&#34;&gt;Netflix TechBlog&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;青衣十三楼&#34;&gt;&lt;a href=&#34;https://scz.617.cn/&#34;&gt;青衣十三楼&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;一个坚持用txt写blog的人&lt;/p&gt;
&lt;h2 id=&#34;个人主页-微博-本恰恰&#34;&gt;&lt;a href=&#34;https://www.weibo.com/u/2166767661&#34;&gt;个人主页 - 微博-本恰恰&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;kk-blog-通用基础&#34;&gt;&lt;a href=&#34;https://abcdxyzk.github.io/&#34;&gt;kk Blog —— 通用基础&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;dog250-csdn博客&#34;&gt;&lt;a href=&#34;https://blog.csdn.net/dog250?type=blog&#34;&gt;dog250-CSDN博客&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;cfc4n的博客-榫卯江湖-编码人生&#34;&gt;&lt;a href=&#34;https://www.cnxct.com/&#34;&gt;CFC4N的博客 – 榫卯江湖，编码人生。&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;memozine-es-muss-sein-es-muss-sein&#34;&gt;&lt;a href=&#34;https://memozine.me/&#34;&gt;Memozine - Es muss sein? Es muss sein!&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;婉兮清扬&#34;&gt;&lt;a href=&#34;https://www.qyjohn.net/&#34;&gt;婉兮清扬&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;云风的-blog&#34;&gt;&lt;a href=&#34;https://blog.codingnow.com/&#34;&gt;云风的 BLOG&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;essays-gwern-dot-net&#34;&gt;&lt;a href=&#34;https://gwern.net/&#34;&gt;Essays · Gwern.net&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;ginobefun-bestblogs-bestblogs-dot-dev-汇集顶级编程-人工智能-产品-科技文章-大语言模型摘要评分辅助阅读-探索编程和技术未来&#34;&gt;&lt;a href=&#34;https://github.com/ginobefun/BestBlogs&#34;&gt;ginobefun/BestBlogs: bestblogs.dev - 汇集顶级编程、人工智能、产品、科技文章，大语言模型摘要评分辅助阅读，探索编程和技术未来&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;engineering-blogs&#34;&gt;&lt;a href=&#34;https://engineeringblogs.xyz/&#34;&gt;Engineering Blogs&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;将 506 个工程师的博客的 RSS 给订阅起来，将每天有更新的自动同步到网站上，甚至你可以汇集的方式来订阅。&lt;/p&gt;</description>
    </item>
    <item>
      <title>收藏的blog</title>
      <link>http://blog.imcompany.cn/posts/favorite-blog/</link>
      <pubDate>Mon, 19 Jan 2026 18:15:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/posts/favorite-blog/</guid>
      <description>&lt;h2 id=&#34;酷壳-coolshell-dot-cn&#34;&gt;&lt;a href=&#34;https://coolshell.cn/&#34;&gt;酷壳 – CoolShell.cn&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;plantegg&#34;&gt;&lt;a href=&#34;https://plantegg.github.io/&#34;&gt;plantegg&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;manateelazycat&#34;&gt;&lt;a href=&#34;https://manateelazycat.github.io/&#34;&gt;ManateeLazyCat&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;julia-evans&#34;&gt;&lt;a href=&#34;https://jvns.ca/&#34;&gt;Julia Evans&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;作者的编程杂志非常好看&lt;/p&gt;
&lt;h2 id=&#34;happy-xiao-substack&#34;&gt;&lt;a href=&#34;https://substack.com/@happyxiao&#34;&gt;happy xiao | Substack&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;lazycat推荐，以前已经关注过&lt;/p&gt;
&lt;h2 id=&#34;yihong0618-gitblog-people-die-but-long-live-github&#34;&gt;&lt;a href=&#34;https://github.com/yihong0618/gitblog&#34;&gt;yihong0618/gitblog: People Die, but Long Live GitHub&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;亦宏大佬，还推荐了一大堆好的博客&lt;/p&gt;
&lt;h2 id=&#34;ooh-dot-directory-a-place-to-find-good-blogs-that-interest-you&#34;&gt;&lt;a href=&#34;https://ooh.directory/&#34;&gt;ooh.directory: a place to find good blogs that interest you&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;happy xiao推荐&lt;/p&gt;
&lt;h2 id=&#34;netflix-techblog&#34;&gt;&lt;a href=&#34;https://netflixtechblog.com/&#34;&gt;Netflix TechBlog&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;青衣十三楼&#34;&gt;&lt;a href=&#34;https://scz.617.cn/&#34;&gt;青衣十三楼&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;一个坚持用txt写blog的人&lt;/p&gt;
&lt;h2 id=&#34;个人主页-微博-本恰恰&#34;&gt;&lt;a href=&#34;https://www.weibo.com/u/2166767661&#34;&gt;个人主页 - 微博-本恰恰&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;kk-blog-通用基础&#34;&gt;&lt;a href=&#34;https://abcdxyzk.github.io/&#34;&gt;kk Blog —— 通用基础&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;dog250-csdn博客&#34;&gt;&lt;a href=&#34;https://blog.csdn.net/dog250?type=blog&#34;&gt;dog250-CSDN博客&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;cfc4n的博客-榫卯江湖-编码人生&#34;&gt;&lt;a href=&#34;https://www.cnxct.com/&#34;&gt;CFC4N的博客 – 榫卯江湖，编码人生。&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;memozine-es-muss-sein-es-muss-sein&#34;&gt;&lt;a href=&#34;https://memozine.me/&#34;&gt;Memozine - Es muss sein? Es muss sein!&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;婉兮清扬&#34;&gt;&lt;a href=&#34;https://www.qyjohn.net/&#34;&gt;婉兮清扬&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;云风的-blog&#34;&gt;&lt;a href=&#34;https://blog.codingnow.com/&#34;&gt;云风的 BLOG&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;essays-gwern-dot-net&#34;&gt;&lt;a href=&#34;https://gwern.net/&#34;&gt;Essays · Gwern.net&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;ginobefun-bestblogs-bestblogs-dot-dev-汇集顶级编程-人工智能-产品-科技文章-大语言模型摘要评分辅助阅读-探索编程和技术未来&#34;&gt;&lt;a href=&#34;https://github.com/ginobefun/BestBlogs&#34;&gt;ginobefun/BestBlogs: bestblogs.dev - 汇集顶级编程、人工智能、产品、科技文章，大语言模型摘要评分辅助阅读，探索编程和技术未来&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;engineering-blogs&#34;&gt;&lt;a href=&#34;https://engineeringblogs.xyz/&#34;&gt;Engineering Blogs&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;将 506 个工程师的博客的 RSS 给订阅起来，将每天有更新的自动同步到网站上，甚至你可以汇集的方式来订阅。&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 2026-W02</title>
      <link>http://blog.imcompany.cn/post/2026-week2/</link>
      <pubDate>Fri, 16 Jan 2026 19:01:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/2026-week2/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;读完 《世界简史》&lt;/li&gt;
&lt;li&gt;开始读 《丝绸之路：一部全新的世界史》&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;买的胜利碳音max球到了，试了一下冬天打不错&lt;/li&gt;
&lt;li&gt;新增chrome插件 &lt;a href=&#34;https://chromewebstore.google.com/detail/peeklink/hdaniddaeomoofbnoagkncfofebaablc&#34;&gt;PeekLink - Chrome Web Store&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;尝试使用obsidian的 media-extended 插件来看视频并记日记，logseq这方面不太给力&lt;/li&gt;
&lt;li&gt;在弄obsidian的在线播放youtube视频时，学会了使用script为proxyman增加request header的方法&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;image-️&#34;&gt;Image 🖼️&lt;/h2&gt;
&lt;p&gt;麦当劳桌子上都有无线充了&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/DlYSFw.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h2 id=&#34;speech&#34;&gt;Speech 💬&lt;/h2&gt;
&lt;p&gt;阅读使人丰富，写作使人精确，讨论使人完备 &amp;ndash; 培根&lt;/p&gt;
&lt;h2 id=&#34;wiki一下&#34;&gt;Wiki一下&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Reuters?useskin=vector&#34;&gt;https://en.wikipedia.org/wiki/Reuters?useskin=vector&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;路透社，英国报社，2008年被汤姆森公司收购&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 2026-W01</title>
      <link>http://blog.imcompany.cn/post/2026-week1/</link>
      <pubDate>Mon, 12 Jan 2026 10:55:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/2026-week1/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;继续读《20世纪简史》，预计下周就可以读完&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;升级完Idea，好多按键都不好使了，尤其是AI相关&lt;/li&gt;
&lt;li&gt;尝试了一下Obsidian，还是更喜欢Logseq，两者各有千秋：Logseq 是“思考的空间”，Obsidian 是“输出的空间&lt;/li&gt;
&lt;li&gt;给每日回顾模板增加每天和每周的review任务&lt;/li&gt;
&lt;li&gt;pdd上买的电脑立式支架到了，试了一下，感觉一般，直接退了&lt;/li&gt;
&lt;li&gt;开始使用Dropzone&lt;/li&gt;
&lt;li&gt;AI的辅助编程还是用云端的模型更准确&lt;/li&gt;
&lt;li&gt;NotebookLLM最终推荐的人挺多，准备深入研究一下&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;image-️&#34;&gt;Image 🖼️&lt;/h2&gt;
&lt;h2 id=&#34;speech&#34;&gt;Speech 💬&lt;/h2&gt;
&lt;p&gt;好的评论不是给出答案，而是打开问题&lt;/p&gt;
&lt;h2 id=&#34;wiki一下&#34;&gt;Wiki一下&lt;/h2&gt;</description>
    </item>
    <item>
      <title>大鹏慢读-tomyli的读书2026</title>
      <link>http://blog.imcompany.cn/post/peng-read-2026/</link>
      <pubDate>Tue, 06 Jan 2026 11:30:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/peng-read-2026/</guid>
      <description>&lt;h2 id=&#34;20世纪简史--豆瓣&#34;&gt;&lt;!-- raw HTML omitted --&gt;DONE&lt;!-- raw HTML omitted --&gt; &lt;a href=&#34;https://book.douban.com/subject/30262204/&#34;&gt;20世纪简史 (豆瓣)&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;丝绸之路--豆瓣&#34;&gt;&lt;!-- raw HTML omitted --&gt;DONE&lt;!-- raw HTML omitted --&gt; &lt;a href=&#34;https://book.douban.com/subject/26853835/&#34;&gt;丝绸之路 (豆瓣)&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;极端的年代19141991-豆瓣&#34;&gt;&lt;!-- raw HTML omitted --&gt;STARTED&lt;!-- raw HTML omitted --&gt; &lt;a href=&#34;https://book.douban.com/subject/27031979/&#34;&gt;极端的年代：1914—1991 (豆瓣)&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;资治通鉴--豆瓣&#34;&gt;&lt;!-- raw HTML omitted --&gt;STARTED&lt;!-- raw HTML omitted --&gt; &lt;a href=&#34;https://book.douban.com/subject/6790302/&#34;&gt;资治通鉴 (豆瓣)&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;别闹了-费曼先生&#34;&gt;&lt;!-- raw HTML omitted --&gt;TODO&lt;!-- raw HTML omitted --&gt; 别闹了，费曼先生！&lt;/h2&gt;
&lt;h2 id=&#34;超越感觉&#34;&gt;&lt;!-- raw HTML omitted --&gt;TODO&lt;!-- raw HTML omitted --&gt; 超越感觉&lt;/h2&gt;
&lt;h2 id=&#34;练习的心态&#34;&gt;&lt;!-- raw HTML omitted --&gt;TODO&lt;!-- raw HTML omitted --&gt; 练习的心态&lt;/h2&gt;</description>
    </item>
    <item>
      <title>大鹏慢读-tomyli的读书2026</title>
      <link>http://blog.imcompany.cn/posts/peng-read-2026/</link>
      <pubDate>Tue, 06 Jan 2026 11:30:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/posts/peng-read-2026/</guid>
      <description>&lt;h2 id=&#34;20世纪简史--豆瓣&#34;&gt;&lt;!-- raw HTML omitted --&gt;DONE&lt;!-- raw HTML omitted --&gt; &lt;a href=&#34;https://book.douban.com/subject/30262204/&#34;&gt;20世纪简史 (豆瓣)&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;丝绸之路--豆瓣&#34;&gt;&lt;!-- raw HTML omitted --&gt;DONE&lt;!-- raw HTML omitted --&gt; &lt;a href=&#34;https://book.douban.com/subject/26853835/&#34;&gt;丝绸之路 (豆瓣)&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;极端的年代19141991-豆瓣&#34;&gt;&lt;!-- raw HTML omitted --&gt;STARTED&lt;!-- raw HTML omitted --&gt; &lt;a href=&#34;https://book.douban.com/subject/27031979/&#34;&gt;极端的年代：1914—1991 (豆瓣)&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;资治通鉴-豆瓣&#34;&gt;&lt;!-- raw HTML omitted --&gt;STARTED&lt;!-- raw HTML omitted --&gt; &lt;a href=&#34;https://book.douban.com/subject/6790302/&#34;&gt;资治通鉴 (豆瓣)&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;别闹了-费曼先生&#34;&gt;&lt;!-- raw HTML omitted --&gt;TODO&lt;!-- raw HTML omitted --&gt; 别闹了，费曼先生！&lt;/h2&gt;
&lt;h2 id=&#34;超越感觉&#34;&gt;&lt;!-- raw HTML omitted --&gt;TODO&lt;!-- raw HTML omitted --&gt; 超越感觉&lt;/h2&gt;
&lt;h2 id=&#34;练习的心态&#34;&gt;&lt;!-- raw HTML omitted --&gt;TODO&lt;!-- raw HTML omitted --&gt; 练习的心态&lt;/h2&gt;</description>
    </item>
    <item>
      <title>收集的命令行工具</title>
      <link>http://blog.imcompany.cn/post/cmd-tools/</link>
      <pubDate>Wed, 31 Dec 2025 17:16:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/cmd-tools/</guid>
      <description>&lt;h2 id=&#34;atuin-shell-history-and-executable-runbooks&#34;&gt;&lt;a href=&#34;https://atuin.sh/&#34;&gt;Atuin - Shell History &amp;amp; Executable Runbooks&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;一个命令行工具, 可以在你的所有机器上同步/搜索/备份shell命令历史&lt;/p&gt;
&lt;h2 id=&#34;watchman-a-file-watching-service-watchman&#34;&gt;&lt;a href=&#34;https://facebook.github.io/watchman/&#34;&gt;Watchman - A file watching service | Watchman&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;监控文件变化并及时通知&lt;/p&gt;
&lt;h2 id=&#34;bensadeh-tailspin-a-log-file-highlighter&#34;&gt;&lt;a href=&#34;https://github.com/bensadeh/tailspin/&#34;&gt;bensadeh/tailspin: 🌀 A log file highlighter&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;日志文件高亮&lt;/p&gt;
&lt;h2 id=&#34;yihong0618-epubhv-make-your-epub-books-vertical-or-horizontal-dot&#34;&gt;&lt;a href=&#34;https://github.com/yihong0618/epubhv&#34;&gt;yihong0618/epubhv: Make your epub books vertical or horizontal.&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;任意转换 epub 书的横竖排。(可批量）&lt;/p&gt;
&lt;h2 id=&#34;os-health-ssar-site-reliability-engineering-system-activity-reporter&#34;&gt;&lt;a href=&#34;https://github.com/os-health/ssar&#34;&gt;os-health/ssar: Site Reliability Engineering System Activity Reporter&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;磁盘 io 监控，作者开发的其它工具也很好用&lt;/p&gt;
&lt;h2 id=&#34;curl-by-example-interactive-guide&#34;&gt;&lt;a href=&#34;https://antonz.org/curl-by-example/&#34;&gt;Curl by example: Interactive guide&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;curl命令指南，还有互动的示例&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 2025-W52</title>
      <link>http://blog.imcompany.cn/post/2025-week52/</link>
      <pubDate>Fri, 26 Dec 2025 17:24:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/2025-week52/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;开始读 &lt;a href=&#34;https://book.douban.com/subject/30262204/&#34;&gt;20世纪简史&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;新买的耳机到了，测试了一下不错，随后又买了中空耳塞和耳机转typec转接器，这样手机电脑就都可以用了&lt;/li&gt;
&lt;li&gt;准备看 坠落的审判&lt;/li&gt;
&lt;li&gt;ReaderWise 播客内容解析功能显示真的是一塌糊涂，全都连在了一起&lt;/li&gt;
&lt;li&gt;帮朋友弄一个双旦的海报，试了几个工具效果都不好，用豆包和comet的效果也不好，最好还是同事帮弄了一下&lt;/li&gt;
&lt;li&gt;网盘filen续费&lt;/li&gt;
&lt;li&gt;在网上看到一个三角支架，可以手机电脑使用，有点心动&lt;/li&gt;
&lt;li&gt;Amazing AI需要高版本的15.2才能安装，准备升级&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;speech&#34;&gt;Speech 💬&lt;/h2&gt;
&lt;p&gt;拥有资源并不意味着就能找到方向&lt;/p&gt;
&lt;h2 id=&#34;wiki一下&#34;&gt;Wiki一下&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Mira_Murati?useskin=vector&#34;&gt;Mira Murati&lt;/a&gt;，她创立了一家名为Thinking Machines Lab的人工智能初创公司，之前在OpenAI和Tesla任职。&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 2025-W51</title>
      <link>http://blog.imcompany.cn/post/2025-week51/</link>
      <pubDate>Fri, 19 Dec 2025 18:54:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/2025-week51/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;在读《简读中国史》，作为科普读物，这本书写的很多，给人一个中国历史发展的大地图。&lt;/li&gt;
&lt;li&gt;受 &lt;a href=&#34;https://ciceroxiao.github.io/hong525/2025/12/16/2025-W50.html&#34;&gt;https://ciceroxiao.github.io/hong525/2025/12/16/2025-W50.html&lt;/a&gt; 启发，在2025年末开启周报模式&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;最近在深度使用Logseq，有点感觉了，还是得尊重人是视觉动物的原则&lt;/li&gt;
&lt;li&gt;使用Logseq整理以前收藏的内容，发现自己是严重的收集狂，于是又开始进行归类、删除&lt;/li&gt;
&lt;li&gt;更新完Emacs和陈大神的配置后，搜索不能记录历史了&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;speech&#34;&gt;Speech 💬&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;故事不能替代现实，只能帮助我们面对现实&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;wiki一下&#34;&gt;Wiki一下&lt;/h2&gt;</description>
    </item>
    <item>
      <title>重拾Android的快乐-Handler</title>
      <link>http://blog.imcompany.cn/post/android-handler/</link>
      <pubDate>Fri, 01 Aug 2025 19:00:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/android-handler/</guid>
      <description>&lt;h2 id=&#34;说明&#34;&gt;说明&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://developer.android.com/reference/android/os/Handler&#34;&gt;Handler&lt;/a&gt; 是Android提供的一个用于处理消息与可运行对象的组件，它有两个功能：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;将消息与可运行对象在安排在未来某个时间点运行&lt;/li&gt;
&lt;li&gt;在其它线程上操作队列&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;为什么提供handler机制&#34;&gt;为什么提供Handler机制&lt;/h2&gt;
&lt;p&gt;Android在启动后会有一个主线程，它不允许子线程去改变主UI线程的内容，为了防止一些耗时操作导致主UI线程无响应而闪退，是Android提供的一种保护机制。在现实中确实有一些耗时长的需求使用异步线程，比如调用三方接口，加载完后来刷新UI，这种需要就可以用Android提供的 &lt;code&gt;Handler&lt;/code&gt; 机制来实现，可以认为 &lt;code&gt;Handler&lt;/code&gt; 是一个与Android主进程的通道&lt;/p&gt;
&lt;h2 id=&#34;常用方法&#34;&gt;常用方法&lt;/h2&gt;
&lt;h3 id=&#34;sendmessage&#34;&gt;sendMessage&lt;/h3&gt;
&lt;p&gt;发送消息&lt;/p&gt;
&lt;h3 id=&#34;handlemessage&#34;&gt;handleMessage&lt;/h3&gt;
&lt;p&gt;接收消息&lt;/p&gt;
&lt;h3 id=&#34;obtainmessage&#34;&gt;obtainMessage&lt;/h3&gt;
&lt;p&gt;从全局消息pool获取一个Message对象&lt;/p&gt;
&lt;h3 id=&#34;post&#34;&gt;post&lt;/h3&gt;
&lt;p&gt;提交可运行对象，后缀带AtTime表示在指定时间提交，后续带Delayed表示提交延迟运行&lt;/p&gt;
&lt;h3 id=&#34;removemessages&#34;&gt;removeMessages&lt;/h3&gt;
&lt;p&gt;移除消息队列中等待中的消息&lt;/p&gt;
&lt;h3 id=&#34;hasmessages&#34;&gt;hasMessages&lt;/h3&gt;
&lt;p&gt;判断消息队列中是否有某个指定消息&lt;/p&gt;
&lt;h2 id=&#34;实战&#34;&gt;实战&lt;/h2&gt;
&lt;p&gt;实现一个指定时间切换图片的功能，最终效果如下&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/handler_image.gif&#34;/&gt; 
&lt;/figure&gt;

&lt;h3 id=&#34;页面&#34;&gt;页面&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;utf-8&amp;#34;?&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;RelativeLayout&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;xmlns:android=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;http://schemas.android.com/apk/res/android&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;na&#34;&gt;android:layout_width=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;match_parent&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;na&#34;&gt;android:layout_height=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;match_parent&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;na&#34;&gt;android:id=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;@+id/RelativeLayout1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;na&#34;&gt;android:gravity=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;center&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;ImageView&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:layout_width=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;wrap_content&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:layout_height=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;wrap_content&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:id=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;@+id/imgAnimation&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:layout_alignParentLeft=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:layout_alignParentTop=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/RelativeLayout&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;代码比较简单，就是一个图片，居中显示&lt;/p&gt;
&lt;h3 id=&#34;代码逻辑&#34;&gt;代码逻辑&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-kotlin&#34; data-lang=&#34;kotlin&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;py&#34;&gt;imgAnimation&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ImageView&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;?&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;null&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;py&#34;&gt;imgstart&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;py&#34;&gt;imgids&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;arrayOf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nc&#34;&gt;R&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;drawable&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pic1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nc&#34;&gt;R&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;drawable&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pic2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nc&#34;&gt;R&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;drawable&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pic3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nc&#34;&gt;R&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;drawable&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pic4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nc&#34;&gt;R&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;drawable&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pic5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;private&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;fun&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;testHandler&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;setContentView&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;R&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;layout&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;handler_sample&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;imgAnimation&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;findViewById&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;R&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;imgAnimation&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;py&#34;&gt;handler&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ImgAnimationHandler&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;Timer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;schedule&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;object&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;: &lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;TimerTask&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;override&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;fun&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;run&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;n&#34;&gt;handler&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sendEmptyMessage&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;101&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;500&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;ImgAnimationHandler&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Handler&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;override&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;fun&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;handleMessage&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;msg&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Message&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;msg&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;what&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;101&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;imgAnimation&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;?.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;setImageResource&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;imgids&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;imgstart&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;%&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;imgids&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol&gt;
&lt;li&gt;消息处理：主要是新建了一个 &lt;code&gt;ImgAnimationHandler&lt;/code&gt; ，它覆写了 handleMessage 方法来处理信息，当消息what值=101 时，从 imgids 中顺序选择一个 sourceId 来达到图片切换的效果&lt;/li&gt;
&lt;li&gt;发送消息：主线程中创建一个Timer的schedule线程每隔 500ms 通过 &lt;code&gt;ImgAnimationHandler&lt;/code&gt; 发送消息 (what=101)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;在子线程中调用handler&#34;&gt;在子线程中调用Handler&lt;/h2&gt;
&lt;p&gt;在子线程中调用Handler，需要设置指定 &lt;a href=&#34;https://developer.android.com/reference/android/os/Looper?hl=en&#34;&gt;Looper&lt;/a&gt; 的Handler（在创建 Handler 时，官方不再建议使用默认的构造函数创建 Handler，而是推荐 传入 Looper 实例作为构建参数的构造函数）&lt;/p&gt;</description>
    </item>
    <item>
      <title>重拾Android的快乐-Service</title>
      <link>http://blog.imcompany.cn/post/android-service/</link>
      <pubDate>Tue, 29 Jul 2025 14:00:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/android-service/</guid>
      <description>&lt;h2 id=&#34;说明&#34;&gt;说明&lt;/h2&gt;
&lt;h2 id=&#34;ref&#34;&gt;REF&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://developer.android.com/develop/background-work/services&#34;&gt;https://developer.android.com/develop/background-work/services&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>重拾Android的快乐-ListView组件</title>
      <link>http://blog.imcompany.cn/post/android-listview/</link>
      <pubDate>Fri, 25 Jul 2025 14:00:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/android-listview/</guid>
      <description>&lt;h2 id=&#34;说明&#34;&gt;说明&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://developer.android.com/reference/android/widget/ListView&#34;&gt;ListView&lt;/a&gt; 组件用来以垂直滚动的显示View集合，配置方式如下:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;ListView&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;na&#34;&gt;android:id=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;@+id/list_view&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;na&#34;&gt;android:layout_width=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;match_parent&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;na&#34;&gt;android:layout_height=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;match_parent&amp;#34;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;listview-实现动态数据展示&#34;&gt;ListView 实现动态数据展示&lt;/h2&gt;
&lt;p&gt;ListView 是一个 &lt;a href=&#34;https://developer.android.com/reference/android/widget/AdapterView?hl=en&#34;&gt;AdapterView&lt;/a&gt;，它不关心要显示的数据，只负责展示&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/hyWpCO.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;ListView 显示的数据是交由 &lt;a href=&#34;https://developer.android.com/reference/android/widget/ListAdapter?hl=en&#34;&gt;ListAdapter&lt;/a&gt; 进行处理，ListAdapter 本质是一个 Adapter，它是ListView和展示数据的桥，这样就可以实现内容与数据的分离&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/fPIQ7c.png&#34;/&gt; 
&lt;/figure&gt;

&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;BaseAdapter 抽象基类，自定义扩展都会继承这个类&lt;/li&gt;
&lt;li&gt;ArrayAdapter 支持泛型操作，实现最简单的展示一行文字&lt;/li&gt;
&lt;li&gt;SimpleAdapter 具有良好扩展性的Adapter，支持Map类型的List数据(List&amp;lt;Map&amp;gt;)，支持自定义多种效果&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;重点关注一下 &lt;a href=&#34;https://developer.android.com/reference/android/widget/Adapter?hl=en&#34;&gt;Adapter&lt;/a&gt; 的 &lt;code&gt;getView&lt;/code&gt; 方法，它提供获取显示数据的View，这个View可以直接创建或者从XML layout中创建&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/AxzvUr.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h2 id=&#34;实战&#34;&gt;实战&lt;/h2&gt;
&lt;p&gt;实现一个最简单的列表&lt;/p&gt;
&lt;h3 id=&#34;最终效果&#34;&gt;最终效果&lt;/h3&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/vHSw6s.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h3 id=&#34;核心代码&#34;&gt;核心代码&lt;/h3&gt;
&lt;h4 id=&#34;listview-容器layout&#34;&gt;ListView 容器layout&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;utf-8&amp;#34;?&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;LinearLayout&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;xmlns:android=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;http://schemas.android.com/apk/res/android&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;na&#34;&gt;android:orientation=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;vertical&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;na&#34;&gt;android:layout_width=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;match_parent&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;na&#34;&gt;android:layout_height=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;match_parent&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;ListView&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:layout_width=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;match_parent&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:layout_height=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;match_parent&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:id=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;@+id/listView&amp;#34;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/LinearLayout&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;文件名为: list_item1&lt;/p&gt;
&lt;p&gt;在线性布局下定义一个 &lt;code&gt;ListView&lt;/code&gt; , 设置id为 &lt;code&gt;listView&lt;/code&gt;&lt;/p&gt;
&lt;h4 id=&#34;mainactivity-代码&#34;&gt;MainActivity 代码&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fun&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;testListView1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;setContentView&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;R&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;layout&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;list_item1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;val&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;list&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;listOf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;111&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;222&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;333&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;444&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;555&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;val&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;adapter&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ArrayAdapter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;android&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;R&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;layout&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;simple_list_item_1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;list&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;val&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;listView&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;findViewById&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ListView&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;R&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;listView&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;listView&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;adapter&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;adapter&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;主要关注创建 ArrayAdapter 的代码，创建时需要的参数：&lt;/p&gt;</description>
    </item>
    <item>
      <title>收集的Android Apps</title>
      <link>http://blog.imcompany.cn/posts/android-apps/</link>
      <pubDate>Thu, 24 Jul 2025 08:12:23 +0800</pubDate>
      <guid>http://blog.imcompany.cn/posts/android-apps/</guid>
      <description>&lt;h2 id=&#34;orgzly-orgzly-android-outliner-for-taking-notes-and-managing-to-do-lists&#34;&gt;&lt;a href=&#34;https://github.com/orgzly/orgzly-android?__readwiseLocation=&#34;&gt;orgzly/orgzly-android: Outliner for taking notes and managing to-do lists&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Android上日记与TODO应用，基于Org mode&lt;/p&gt;
&lt;h2 id=&#34;xlucn-oh-my-foss-android-个人收集的实用-良心开源安卓软件&#34;&gt;&lt;a href=&#34;https://github.com/xlucn/oh-my-foss-android&#34;&gt;xlucn/oh-my-foss-android: 个人收集的实用、良心开源安卓软件&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Android软件集&lt;/p&gt;
&lt;h2 id=&#34;lihenggui-blocker-utilize-an-integrated-firewall-to-manage-application-components-dot&#34;&gt;&lt;a href=&#34;https://github.com/lihenggui/blocker/tree/main&#34;&gt;lihenggui/blocker: Utilize an integrated firewall to manage application components.&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Blocker 是一款操作Android应用程序四大组件的程序, 禁用无用功能(禁用一些广告 SDK 组件)，节约应用运行资源的功能&lt;/p&gt;
&lt;h2 id=&#34;gkd-kit-gkd-基于无障碍-高级选择器-订阅规则的自定义屏幕点击-android-应用-an-android-app-with-custom-screen-tapping-based-on-accessibility-advanced-selectors-and-subscription-rules&#34;&gt;&lt;a href=&#34;https://github.com/gkd-kit/gkd&#34;&gt;gkd-kit/gkd: 基于无障碍，高级选择器，订阅规则的自定义屏幕点击 Android 应用 | An Android APP with custom screen tapping based on Accessibility, Advanced Selectors, and Subscription Rules&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;跳过开屏广告&lt;/p&gt;
&lt;h2 id=&#34;adaway-adaway-adaway-is-a-free-and-open-source-ad-blocker-for-android-dot&#34;&gt;&lt;a href=&#34;https://github.com/AdAway/AdAway&#34;&gt;AdAway/AdAway: AdAway is a free and open source ad blocker for Android.&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;广告拦截APP，通过 hosts 或者 vpn 模式阻止广告请求&lt;/p&gt;
&lt;h2 id=&#34;yuliskov-smarttube-browse-media-content-with-your-own-rules-on-android-tv&#34;&gt;&lt;a href=&#34;https://github.com/yuliskov/SmartTube&#34;&gt;yuliskov/SmartTube: Browse media content with your own rules on Android TV&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Android上无广告看Youtube&lt;/p&gt;</description>
    </item>
    <item>
      <title>重拾Android的快乐-TableLayout布局</title>
      <link>http://blog.imcompany.cn/post/android-tablelayout/</link>
      <pubDate>Thu, 17 Jul 2025 14:00:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/android-tablelayout/</guid>
      <description>&lt;h2 id=&#34;说明&#34;&gt;说明&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://developer.android.com/guide/topics/ui/layout/grid&#34;&gt;TableLayout&lt;/a&gt; 是一个用来以行或者列方式来显示子View的视图组。TableLayout不显示行、列或者单元格的边框线。一个表可以留空多个单元格，也可以跨越多列，这个与html类似&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/Rt289C.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h3 id=&#34;tablerow&#34;&gt;TableRow&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://developer.android.com/reference/android/widget/TableRow&#34;&gt;TabRow&lt;/a&gt;是 &lt;code&gt;TableLayout&lt;/code&gt; 的子View，用来表示一行，此元素下可以定义多个单元格来包含其它元素，单元格又可以嵌套 &lt;code&gt;TableLayout&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&#34;约束&#34;&gt;约束&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;列的宽度由该列中最宽单元格的行定义&lt;/li&gt;
&lt;li&gt;&lt;code&gt;TableLayout&lt;/code&gt; 子类不能指定 &lt;code&gt;layout_width&lt;/code&gt; 属性，宽度值一直为 &lt;code&gt;MATCH_PARENT&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;layout_height&lt;/code&gt; 属性可以由子类进行设置，默认值为 &lt;code&gt;WRAP_CONTENT&lt;/code&gt; ；如果子类是 &lt;code&gt;TableRow&lt;/code&gt; ，则其高度值一直为 &lt;code&gt;WRAP_CONTENT&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;常用属性&#34;&gt;常用属性&lt;/h2&gt;
&lt;h3 id=&#34;android-collapsecolumns&#34;&gt;android:collapseColumns&lt;/h3&gt;
&lt;p&gt;基于索引0来隐藏列，多个值用英文逗号分隔，例如配置为1，则隐藏第2列&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;table中的列索引从0开始计数，如果不指定，则自动增加&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;android-shrinkcolumns&#34;&gt;android:shrinkColumns&lt;/h3&gt;
&lt;p&gt;基于索引0来收缩列&lt;/p&gt;
&lt;h3 id=&#34;android-stretchcolumns&#34;&gt;android:stretchColumns&lt;/h3&gt;
&lt;p&gt;基于索引0来拉升列&lt;/p&gt;
&lt;h2 id=&#34;示例&#34;&gt;示例&lt;/h2&gt;
&lt;h3 id=&#34;效果图&#34;&gt;效果图&lt;/h3&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/RcG1CM.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h3 id=&#34;代码&#34;&gt;代码&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;utf-8&amp;#34;?&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;TableLayout&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;xmlns:android=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;http://schemas.android.com/apk/res/android&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;na&#34;&gt;android:layout_width=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;match_parent&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;na&#34;&gt;android:layout_height=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;match_parent&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;na&#34;&gt;android:stretchColumns=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;TableRow&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;lt;TextView&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:layout_column=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:text=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Open...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:padding=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;3dip&amp;#34;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;lt;TextView&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:text=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Ctrl-O&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:gravity=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;right&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:padding=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;3dip&amp;#34;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;/TableRow&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;TableRow&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;lt;TextView&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:layout_column=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:text=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Save...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:padding=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;3dip&amp;#34;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;lt;TextView&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:text=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Ctrl-S&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:gravity=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;right&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:padding=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;3dip&amp;#34;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;/TableRow&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;TableRow&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;lt;TextView&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:layout_column=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:text=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Save As...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:padding=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;3dip&amp;#34;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;lt;TextView&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:text=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Ctrl-Shift-S&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:gravity=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;right&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:padding=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;3dip&amp;#34;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;/TableRow&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;View&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;na&#34;&gt;android:layout_height=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;2dip&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;na&#34;&gt;android:background=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;#FF909090&amp;#34;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;TableRow&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;lt;TextView&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:text=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;X&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:padding=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;3dip&amp;#34;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;lt;TextView&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:text=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Import...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:padding=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;3dip&amp;#34;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;/TableRow&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;TableRow&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;lt;TextView&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:text=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;X&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:padding=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;3dip&amp;#34;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;lt;TextView&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:text=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Export...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:padding=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;3dip&amp;#34;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;lt;TextView&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:text=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Ctrl-E&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:gravity=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;right&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:padding=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;3dip&amp;#34;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;/TableRow&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;View&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;na&#34;&gt;android:layout_height=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;2dip&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;na&#34;&gt;android:background=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;#FF909090&amp;#34;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;TableRow&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;lt;TextView&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:layout_column=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:text=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Quit&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:padding=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;3dip&amp;#34;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;/TableRow&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/TableLayout&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;因为在 TableLayout 中设置了 &lt;code&gt;android:stretchColumns=&amp;quot;1&amp;quot;&lt;/code&gt; 属性来拉升第一列，可以看到第一列的宽度最宽&lt;/p&gt;</description>
    </item>
    <item>
      <title>重拾Android的快乐-RelativeLayout布局</title>
      <link>http://blog.imcompany.cn/post/android-relativelayout/</link>
      <pubDate>Thu, 10 Jul 2025 16:00:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/android-relativelayout/</guid>
      <description>&lt;h2 id=&#34;说明&#34;&gt;说明&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://developer.android.com/develop/ui/views/layout/relative#Example&#34;&gt;RelativeLayout&lt;/a&gt; 是一个提供子View相对位置的View组，可以指定相邻同级节点的位置（上下左右）或相对于父区域的位置。RelativeLayout主要是用来消除嵌套布局来保持布局层级扁平来提升性能。&lt;/p&gt;
&lt;h2 id=&#34;布局方向&#34;&gt;布局方向&lt;/h2&gt;
&lt;p&gt;Android中的布局方向有两种:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;LTR 从左到右&lt;/li&gt;
&lt;li&gt;RTL 从右到左&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;可以通过  &lt;code&gt;android:layoutDirection&lt;/code&gt; 进行设置&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/m3tDBi.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h2 id=&#34;常用属性配置&#34;&gt;常用属性配置&lt;/h2&gt;
&lt;h3 id=&#34;对齐相关&#34;&gt;对齐相关&lt;/h3&gt;
&lt;h4 id=&#34;android-layout-alignparenttop&#34;&gt;android:layout_alignParentTop&lt;/h4&gt;
&lt;p&gt;此视图顶部边缘与父视图顶部边缘对齐，忽略布局方向，对应的有 android:layout_alignParentBottom&lt;/p&gt;
&lt;h4 id=&#34;android-layout-alignparentleft&#34;&gt;android:layout_alignParentLeft&lt;/h4&gt;
&lt;p&gt;此视图顶部边缘与父视图左侧对齐，只支持LTR，对应的有 android:layout_alignParentRight&lt;/p&gt;
&lt;h4 id=&#34;android-layout-alignparentstart&#34;&gt;android:layout_alignParentStart&lt;/h4&gt;
&lt;p&gt;此视图顶部边缘与父视图左侧对齐，支持LTR与RTL，对应的有 android:layout_alignParentEnd&lt;/p&gt;
&lt;h4 id=&#34;android-layout-aligntop&#34;&gt;android:layout_alignTop&lt;/h4&gt;
&lt;p&gt;此视图顶部边缘与给定视图顶部边缘对齐，忽略布局方向，对应的有 android:layout_alignParentBottom&lt;/p&gt;
&lt;h4 id=&#34;android-layout-alignleft&#34;&gt;android:layout_alignLeft&lt;/h4&gt;
&lt;p&gt;此视图顶部边缘与给定视图左侧对齐，只支持LTR，对应的有 android:layout_alignRight&lt;/p&gt;
&lt;h4 id=&#34;android-layout-alignstart&#34;&gt;android:layout_alignStart&lt;/h4&gt;
&lt;p&gt;此视图顶部边缘与给定视图左侧对齐，支持LTR与RTL，对应的有 android:layout_alignEnd&lt;/p&gt;
&lt;h4 id=&#34;android-layout-alignwithparentifmissing&#34;&gt;android:layout_alignWithParentIfMissing&lt;/h4&gt;
&lt;p&gt;如果没有设置 layout_toLeftOf 或者 layout_toRightOf 属性则使用父view做为锚点&lt;/p&gt;
&lt;h3 id=&#34;居中相关&#34;&gt;居中相关&lt;/h3&gt;
&lt;h4 id=&#34;android-layout-centerhorizontal&#34;&gt;android:layout_centerHorizontal&lt;/h4&gt;
&lt;p&gt;子视图在父视图中垂直居中&lt;/p&gt;
&lt;h4 id=&#34;android-layout-centervertical&#34;&gt;android:layout_centerVertical&lt;/h4&gt;
&lt;p&gt;子视图在父视图中水平居中&lt;/p&gt;
&lt;h4 id=&#34;android-layout-centerinparent&#34;&gt;android:layout_centerInParent&lt;/h4&gt;
&lt;p&gt;子视图在父视图中水平和垂直居中&lt;/p&gt;
&lt;h3 id=&#34;android-layout-below&#34;&gt;android:layout_below&lt;/h3&gt;
&lt;p&gt;用于控制垂直方向，此视图定位于指定资源id的下方，对应的还有 android:layout_above&lt;/p&gt;
&lt;h3 id=&#34;android-layout-torightof&#34;&gt;android:layout_toRightOf&lt;/h3&gt;
&lt;p&gt;用于左右(LTR)布局并忽略右左布局，此视图的左边缘定位于指定资源的右方，其它的还有 android:layout_toLeftOf&lt;/p&gt;
&lt;h3 id=&#34;android-layout-toendof&#34;&gt;android:layout_toEndOf&lt;/h3&gt;
&lt;p&gt;支持LTR与RTL两种布局，对于LTR表示位于指定资源id的右侧，对于RTL则相反&lt;/p&gt;
&lt;h2 id=&#34;示例&#34;&gt;示例&lt;/h2&gt;
&lt;p&gt;这里引用一个官方提供的样例&lt;/p&gt;
&lt;h3 id=&#34;效果图&#34;&gt;效果图&lt;/h3&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/uQdOKd.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h3 id=&#34;代码&#34;&gt;代码&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;utf-8&amp;#34;?&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;RelativeLayout&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;xmlns:android=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;http://schemas.android.com/apk/res/android&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;na&#34;&gt;android:layout_width=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;match_parent&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;na&#34;&gt;android:layout_height=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;match_parent&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;na&#34;&gt;android:paddingLeft=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;16dp&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;na&#34;&gt;android:paddingRight=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;16dp&amp;#34;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;EditText&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:id=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;@+id/name&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:layout_width=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;match_parent&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:layout_height=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;wrap_content&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:hint=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;@string/reminder&amp;#34;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;Spinner&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:id=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;@+id/dates&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:layout_width=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;0dp&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:layout_height=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;wrap_content&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:layout_below=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;@id/name&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:layout_alignParentLeft=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:layout_toLeftOf=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;@+id/times&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;Spinner&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:id=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;@id/times&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:layout_width=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;96dp&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:layout_height=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;wrap_content&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:layout_below=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;@id/name&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:layout_alignParentRight=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;Button&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:layout_width=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;96dp&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:layout_height=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;wrap_content&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:layout_below=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;@id/times&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:layout_alignParentRight=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:text=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;@string/done&amp;#34;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/RelativeLayout&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里主要关注中间两个Spinner和Button&lt;/p&gt;</description>
    </item>
    <item>
      <title>重拾Android的快乐-LinearLayout布局</title>
      <link>http://blog.imcompany.cn/post/android-linearlayout/</link>
      <pubDate>Tue, 01 Jul 2025 16:00:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/android-linearlayout/</guid>
      <description>&lt;h2 id=&#34;说明&#34;&gt;说明&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://developer.android.com/develop/ui/views/layout/linear&#34;&gt;LinearLayout&lt;/a&gt; 是一个视图组件，它可以将所有子视图按一个方向进行 &lt;code&gt;垂直/水平&lt;/code&gt; 对齐&lt;/p&gt;
&lt;h3 id=&#34;垂直方向--vertical&#34;&gt;垂直方向(Vertical)&lt;/h3&gt;
&lt;p&gt;垂直方向会按每行一个元素排列，而不管设置的宽度&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/bIMjZV.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h3 id=&#34;水平方向--horizontal&#34;&gt;水平方向(Horizontal)&lt;/h3&gt;
&lt;p&gt;水平方向只有一行高，它的高度为最高的子元素+Padding值&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/XkHPYo.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h2 id=&#34;常用属性配置&#34;&gt;常用属性配置&lt;/h2&gt;
&lt;h3 id=&#34;android-orientation&#34;&gt;android:orientation&lt;/h3&gt;
&lt;p&gt;布局方向，可配置值:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;horizontal 水平&lt;/li&gt;
&lt;li&gt;vertical 垂直&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;android-layout-width&#34;&gt;android:layout_width&lt;/h3&gt;
&lt;p&gt;元素宽度&lt;/p&gt;
&lt;h3 id=&#34;android-layout-height&#34;&gt;android:layout_height&lt;/h3&gt;
&lt;p&gt;元素高度，可配置具体的数值，还支持常用的值如下:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;match_parent  与父元素同尺寸&lt;/li&gt;
&lt;li&gt;wrap_content 只包含内容大小（+padding）&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;android-layout-weight&#34;&gt;android:layout_weight&lt;/h3&gt;
&lt;p&gt;布局权重，用于设置元素占据的空间值，值越大占的空间越大，默认值为0(匹配内容)&lt;/p&gt;
&lt;h3 id=&#34;android-gravity&#34;&gt;android:gravity&lt;/h3&gt;
&lt;p&gt;指定视图内容在其自身边界内的对齐方式&lt;/p&gt;
&lt;h2 id=&#34;实战案例&#34;&gt;实战案例&lt;/h2&gt;
&lt;p&gt;实现一个简单的邮件发送功能&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;utf-8&amp;#34;?&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;LinearLayout&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;xmlns:android=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;http://schemas.android.com/apk/res/android&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;na&#34;&gt;android:layout_width=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;match_parent&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;na&#34;&gt;android:layout_height=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;match_parent&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;na&#34;&gt;android:paddingLeft=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;16dp&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;na&#34;&gt;android:paddingRight=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;16dp&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;na&#34;&gt;android:orientation=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;vertical&amp;#34;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;EditText&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:layout_width=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;match_parent&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:layout_height=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;wrap_content&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:autofillHints=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:hint=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;@string/to&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:inputType=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;EditText&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:layout_width=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;match_parent&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:layout_height=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;wrap_content&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:autofillHints=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:hint=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;@string/subject&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:inputType=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;EditText&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:layout_width=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;match_parent&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:layout_height=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;0dp&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:layout_weight=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:autofillHints=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:gravity=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;top&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:hint=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;@string/message&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:inputType=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;Button&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:layout_width=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;100dp&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:layout_height=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;wrap_content&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:layout_gravity=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;end&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;android:text=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;@string/send&amp;#34;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/LinearLayout&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;效果图&#34;&gt;效果图&lt;/h3&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/HvXVvn.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h2 id=&#34;jetpack-compose组件实现同样效果&#34;&gt;Jetpack Compose组件实现同样效果&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://developer.android.com/compose&#34;&gt;Jetpack Compose&lt;/a&gt; 是google新推出并推荐使用的基于kotlin声明式UI组件库，可以用更少的代码来加速开发&lt;/p&gt;</description>
    </item>
    <item>
      <title>Spring学习之@Conditional</title>
      <link>http://blog.imcompany.cn/post/spring-@conditional/</link>
      <pubDate>Wed, 18 Jun 2025 15:00:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/spring-@conditional/</guid>
      <description>&lt;h2 id=&#34;注解说明&#34;&gt;注解说明&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.spring.io/spring-framework/docs/6.2.0/javadoc-api/org/springframework/context/annotation/Conditional.html&#34;&gt;@Conditional&lt;/a&gt; 是 Spring 提供的用于判断是否对 Bean 注入的条件注解(在4.0后版本引入)，只有满足了所有的条件，一个 bean 才会被注册成功并使用。此注解可标注在类上、元注解上、@Bean方法上，通常与 @Configuration 注解配合使用，标识在 @Configuration 注解上的 @Conditional 会影响此配置类的所有 @Bean 注解方法、@Import 注解和@ComponentScan 注解。另需注意 @Conditional 注解不支持继承&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;对于标注在元注解上的样例，可查看 SpringBoot 项目下的 &lt;code&gt;org.springframework.boot.autoconfigure.condition&lt;/code&gt; 包以 ConditionalOn 开头的类&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;注解属性&#34;&gt;注解属性&lt;/h2&gt;
&lt;p&gt;此注解只有一个属性 &lt;code&gt;value&lt;/code&gt; ，返回类型为 Class 数组，它用来配置所有的 &lt;a href=&#34;https://docs.spring.io/spring-framework/docs/6.2.0/javadoc-api/org/springframework/context/annotation/Condition.html&#34;&gt;Condition&lt;/a&gt; 类信息&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/Ndm3ZA.png&#34;/&gt; 
&lt;/figure&gt;

&lt;blockquote&gt;
&lt;p&gt;Condition 是 Spring 提供的一个接口，它提供了 matches 方法来提供判断的依据逻辑，对于其参数 &lt;a href=&#34;https://docs.spring.io/spring-framework/docs/6.2.0/javadoc-api/org/springframework/context/annotation/ConditionContext.html&#34;&gt;ConditionContext&lt;/a&gt; 提供了丰富的上下文信息&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;测试代码&#34;&gt;测试代码&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@Configuration&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@ComponentScan&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;basePackages&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;cn.imcompany.bean.condition&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;MyConfiguration&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Bean&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@ConditionalOnDate&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MyBean&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;myBean&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MyBean&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Bean&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MyBean2&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;myBean2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MyBean2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Bean&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Conditional&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ConfigPropertyCondition&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MyBean5&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;myBean5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MyBean5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@Configuration&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@Conditional&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ConfigPropertyCondition&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;MyConfigConfiguration&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Bean&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MyBean3&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;myBean3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MyBean3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Bean&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MyBean4&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;myBean4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MyBean4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;MyDateCondition&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;implements&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Condition&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Override&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;boolean&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;matches&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ConditionContext&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;context&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AnnotatedTypeMetadata&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;metadata&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;LocalDateTime&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;now&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;LocalDateTime&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;now&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;minute&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;now&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getMinute&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;minute&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 每隔两分钟满足条件&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@Retention&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;lang&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;annotation&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;RetentionPolicy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;RUNTIME&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@Target&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;({&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;lang&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;annotation&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;ElementType&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;TYPE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;lang&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;annotation&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;ElementType&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;METHOD&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;})&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@Documented&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@Conditional&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MyDateCondition&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@interface&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ConditionalOnDate&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;ConfigPropertyCondition&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;implements&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Condition&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Override&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;boolean&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;matches&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ConditionContext&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;context&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AnnotatedTypeMetadata&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;metadata&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;equals&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getProperty&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;my.config.property&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Main&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;setProperty&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;my.config.property&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AnnotationConfigApplicationContext&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;context&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AnnotationConfigApplicationContext&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MyConfiguration&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;beanDefinitionName&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;context&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getBeanDefinitionNames&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;out&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;beanDefinitionName = &amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;beanDefinitionName&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;源码阅读&#34;&gt;源码阅读&lt;/h2&gt;
&lt;p&gt;对于 Configuration 类条件处理分为两个阶段：&lt;/p&gt;</description>
    </item>
    <item>
      <title>Spring学习之@Bean</title>
      <link>http://blog.imcompany.cn/post/spring-@bean/</link>
      <pubDate>Tue, 17 Jun 2025 17:56:39 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/spring-@bean/</guid>
      <description>&lt;h2 id=&#34;注解说明&#34;&gt;注解说明&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.spring.io/spring-framework/docs/6.2.0/javadoc-api/org/springframework/context/annotation/Bean.html&#34;&gt;@Bean&lt;/a&gt; 是Spring的一个核心注解，通常与 &lt;a href=&#34;https://blog.imcompany.cn/post/spring-configuration/&#34;&gt;@Configuration&lt;/a&gt; 注解一起使用，用于标记一个方法，方法返回的实体做为Spring管理的一个Bean，通过此注解可以使用JAVA的特性配置对象。默认情况下Bean名字为方法名，也支持通过属性进行配置&lt;/p&gt;
&lt;h2 id=&#34;属性说明&#34;&gt;属性说明&lt;/h2&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/k4Kb1n.png&#34;/&gt; 
&lt;/figure&gt;

&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/xhsjVe.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h3 id=&#34;name&#34;&gt;name&lt;/h3&gt;
&lt;p&gt;自定义Bean的名称，支持配置多个名称，不配置默认为方法名称&lt;/p&gt;
&lt;h3 id=&#34;initmethod&#34;&gt;initMethod&lt;/h3&gt;
&lt;p&gt;配置实例初始化方法，在Bean实例化被调用，默认为空&lt;/p&gt;
&lt;h3 id=&#34;destroymethod&#34;&gt;destroyMethod&lt;/h3&gt;
&lt;p&gt;配置实例销毁方法，默认值为 &lt;code&gt;(inferred)&lt;/code&gt; 即会根据返回的Bean尝试查找识别对象的销毁方法 close 或者 shutdown(限制只查找public无参方法)，如返回一个 &lt;code&gt;BasicDataSource&lt;/code&gt; 实例，会默认查找 &lt;code&gt;close()&lt;/code&gt; 方法进行注册，如果不想Spring进行此操作，需要将此值设置为: &lt;code&gt;destroyMethod=&amp;quot;&amp;quot;&lt;/code&gt; (此配置对 &lt;a href=&#34;https://docs.spring.io/spring-framework/docs/6.2.0/javadoc-api/org/springframework/beans/factory/DisposableBean.html&#34;&gt;DisposableBean&lt;/a&gt; 回调不生效)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;核心逻辑在 DisposableBeanAdapter#inferDestroyMethodsIfNecessary() 方法中&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;与其它注解的关联&#34;&gt;与其它注解的关联&lt;/h2&gt;
&lt;p&gt;@Bean 与XML配置方式中的 &amp;lt;bean&amp;gt; 标签不同，它使用与其它注解组合的方式来实现类型 Scope 或者懒加载的功能，具体可组合注解如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;@Profile&lt;/li&gt;
&lt;li&gt;@Scope&lt;/li&gt;
&lt;li&gt;@Lazy&lt;/li&gt;
&lt;li&gt;@DepednsOn&lt;/li&gt;
&lt;li&gt;@Primary&lt;/li&gt;
&lt;li&gt;@Order&lt;/li&gt;
&lt;li&gt;@Description(给注解bean详细描述，此注解的值会保存在 &lt;code&gt;BeanDefinition&lt;/code&gt; 实例上)&lt;/li&gt;
&lt;li&gt;@Conditional&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;接口默认方法定义bean&#34;&gt;接口默认方法定义Bean&lt;/h2&gt;
&lt;p&gt;Spring 支持在接口中使用默认方法的方式进行bean的定义，方便子类配置类直接复用，示例代码:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;interface&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;BaseConfig&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Bean&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;default&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MyBean3&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;myBean3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MyBean3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@Configuration&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;AppConfig&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;implements&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;BaseConfig&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;源码阅读&#34;&gt;源码阅读&lt;/h2&gt;
&lt;h3 id=&#34;bean注解配置实例化&#34;&gt;Bean注解配置实例化&lt;/h3&gt;
&lt;p&gt;由于@Bean通常与@Configuration 一起使用，核心逻辑在 refresh 阶段，定位代码发现在 ConfigurationClassParser#doProcessConfigurationClass() 方法进行对 @Bean 标识方法的解析&lt;/p&gt;</description>
    </item>
    <item>
      <title>Spring学习之@Import</title>
      <link>http://blog.imcompany.cn/post/spring-@import/</link>
      <pubDate>Tue, 17 Jun 2025 17:32:55 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/spring-@import/</guid>
      <description>&lt;h2 id=&#34;注解说明&#34;&gt;注解说明&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.spring.io/spring-framework/docs/6.2.0/javadoc-api/org/springframework/context/annotation/Import.html&#34;&gt;@Import&lt;/a&gt; 注解用于标识多个需要导入的 Component 类，支持导入 @Configuration 类， &lt;a href=&#34;https://docs.spring.io/spring-framework/docs/6.2.0/javadoc-api/org/springframework/context/annotation/ImportSelector.html&#34;&gt;ImportSelector&lt;/a&gt;
与 &lt;a href=&#34;https://docs.spring.io/spring-framework/docs/6.2.0/javadoc-api/org/springframework/context/annotation/ImportBeanDefinitionRegistrar.html&#34;&gt;ImportBeanDefinitionRegistrar&lt;/a&gt; 实现，与 &lt;code&gt;AnnotationConfigApplicationContext.register()&lt;/code&gt; 方法实现的功能类似。此注解常见的实践方式是标注在 EnableXXXX 注解上，用于开启某些功能，在开启功能时就需要通过 @Import 注解来选择导入哪些类的定义&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/Q3KggE.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h2 id=&#34;属性说明&#34;&gt;属性说明&lt;/h2&gt;
&lt;p&gt;此注解只有一个属性 value，返回 &lt;code&gt;Class[]&lt;/code&gt; ，用于标识导入的类&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/jZeILk.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h3 id=&#34;class类型&#34;&gt;Class类型&lt;/h3&gt;
&lt;h4 id=&#34;configuration标识的类&#34;&gt;@Configuration标识的类&lt;/h4&gt;
&lt;p&gt;对于不同功能的配置使用多个 @Configuration 标识，由一个类来 Import 另一个 类的配置，来达到复用的效果&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@Configuration&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;MyConfig2&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Bean&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MyBeanD&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;myBeanD&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MyBeanD&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@Configuration&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@Import&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;({&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MyConfig2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;})&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;MyConfig&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;importselector实现类&#34;&gt;ImportSelector实现类&lt;/h4&gt;
&lt;p&gt;所有的 &lt;code&gt;ImportSelector&lt;/code&gt; 实现都需要实现它的 selectImports 方法，来返回要导入的bean类名称集合
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/tnwVTo.png&#34;&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;MyImportSelector&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;implements&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ImportSelector&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Override&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;selectImports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AnnotationMetadata&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;importingClassMetadata&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MyBeanA&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getName&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()};&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在 ImportSelector 可以通过Aware或者构造器注入的方式使用 Spring中的容器组件：&lt;/p&gt;</description>
    </item>
    <item>
      <title>Spring学习之@Value</title>
      <link>http://blog.imcompany.cn/post/spring-@value/</link>
      <pubDate>Tue, 10 Jun 2025 16:00:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/spring-@value/</guid>
      <description>&lt;h2 id=&#34;注解说明&#34;&gt;注解说明&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.spring.io/spring-framework/docs/6.2.0/javadoc-api/org/springframework/beans/factory/annotation/Value.html&#34;&gt;@Value&lt;/a&gt; 是Spring提供用于处理属性与表达式注入的注解，可标注在字段、方法或构造器的参数上，并且支持动态解析SpringMVC中的方法参数。支持注入方式：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;直接注入如: @Value(&amp;ldquo;test&amp;rdquo;)&lt;/li&gt;
&lt;li&gt;${my.app.myProp} 属性注入&lt;/li&gt;
&lt;li&gt;#{systemProperties.myProp} SpEL表达式&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;它提供了不同的配置源(属性文件、系统属性)的注入&lt;/p&gt;
&lt;h2 id=&#34;注解属性&#34;&gt;注解属性&lt;/h2&gt;
&lt;p&gt;@Value 注解只有一个属性 &lt;code&gt;value&lt;/code&gt; ，表示要注入的实际值的表达式，支持属性与SpEL表达式两种方式
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/RXfWhd.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;测试代码&#34;&gt;测试代码&lt;/h2&gt;
&lt;p&gt;以下测试代码MyController的username的注入值为: tomyli，而不是配置文件中的admin&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@Controller&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;MyController&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;${USER}&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Getter&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;username&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@Configuration&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@ComponentScan&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;basePackages&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;cn.imcompany.bean.autowired&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@PropertySource&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;classpath:application.properties&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;MyConfiguration&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Main&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AnnotationConfigApplicationContext&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;context&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AnnotationConfigApplicationContext&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MyConfiguration&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MyController&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;myController&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;context&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getBean&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MyController&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;out&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;myController&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getUsername&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;());&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// tomyi&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;application-dot-properties配置文件&#34;&gt;application.properties配置文件&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;USER&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;admin
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;源码阅读&#34;&gt;源码阅读&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;@Value&lt;/code&gt; 注解的处理由 &lt;code&gt;AutowiredAnnotationBeanPostProcessor&lt;/code&gt; 类负责，与处理 @Autowired 注解的类为同一个PostProcessor。主要的处理逻辑实现在   &lt;code&gt;DefaultListableBeanFactory#doResolveDependency&lt;/code&gt; 方法，对于 @Value注解的处理主要集中在第2步，解析@Value的操作主要分为3步
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/kviZlX.png&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Spring学习之@Autowireid</title>
      <link>http://blog.imcompany.cn/post/spring-@autowired/</link>
      <pubDate>Fri, 06 Jun 2025 16:00:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/spring-@autowired/</guid>
      <description>&lt;h2 id=&#34;注解说明&#34;&gt;注解说明&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.spring.io/spring-framework/docs/6.2.0/javadoc-api/org/springframework/beans/factory/annotation/Autowired.html&#34;&gt;@Autowired&lt;/a&gt; 是Spring框架的核心注解，用于自动装载构造器、字段、set方法、配置方法上的依赖，它是 &lt;a href=&#34;https://javax-inject.github.io/javax-inject/&#34;&gt;JSR-330 @Inject&lt;/a&gt; 注解的替代，支持配置 &lt;code&gt;依赖是否必须&lt;/code&gt; 选项&lt;/p&gt;
&lt;h2 id=&#34;属性说明&#34;&gt;属性说明&lt;/h2&gt;
&lt;p&gt;此注解只有一个属性 &lt;code&gt;required&lt;/code&gt; ，默认为 true 表示待注入组件必须存在&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/vvxKeV.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h2 id=&#34;注解注入规则说明&#34;&gt;注解注入规则说明&lt;/h2&gt;
&lt;h3 id=&#34;构造器注入&#34;&gt;构造器注入&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;如果一个类声明了多个构造器且没有一个显式标注 @Autowired，则Spring会使用默认的构造方法进行装载&lt;/li&gt;
&lt;li&gt;如果一个类只声明了一个构造器，不管有没有标注 @Autowired 注解它都会被直接使用&lt;/li&gt;
&lt;li&gt;多参数可以配置多个required属性，对于可选注入，可以声明为 Java8 的 &lt;a href=&#34;https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html&#34;&gt;Optional&lt;/a&gt; 类型&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;对于可选注入也可以使用 JSR-305 的 &lt;code&gt;javax.annotation.Nullable&lt;/code&gt; 注解&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;字段注入&#34;&gt;字段注入&lt;/h3&gt;
&lt;p&gt;字段在构造器之后，配置方法注入之前进行自动注入&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;字段注入支持组件自引用(self references)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;方法注入&#34;&gt;方法注入&lt;/h3&gt;
&lt;p&gt;方法注入不限制方法名与参数个数，所有参数会被Spring进行匹配注入&lt;/p&gt;
&lt;h3 id=&#34;参数注入&#34;&gt;参数注入&lt;/h3&gt;
&lt;p&gt;目前只在 &lt;a href=&#34;https://docs.spring.io/spring-framework/reference/testing.html&#34;&gt;spring-test&lt;/a&gt; 模块中有效，其它地方使用会被忽略&lt;/p&gt;
&lt;h3 id=&#34;数组-集合注入&#34;&gt;数组/集合注入&lt;/h3&gt;
&lt;p&gt;Spring通过匹配数组/集合的值进行注入，Map的key必须为String类型，支持集合中元素的Order配置&lt;/p&gt;
&lt;h3 id=&#34;不支持-beanpostprocessor-或者-beanfactorypostprocessor&#34;&gt;不支持 BeanPostProcessor 或者 BeanFactoryPostProcessor&lt;/h3&gt;
&lt;p&gt;因为真实的注入动作发生在 &lt;code&gt;BeanPostProcessor&lt;/code&gt; 阶段，所以不能在 &lt;code&gt;BeanPostProcessor&lt;/code&gt; 或者 &lt;code&gt;BeanFactoryPostProcessor&lt;/code&gt; 中使用此注解&lt;/p&gt;
&lt;h2 id=&#34;源码阅读&#34;&gt;源码阅读&lt;/h2&gt;
&lt;p&gt;在Spring中，处理 @Autowired 注解对应的类为 &lt;a href=&#34;https://docs.spring.io/spring-framework/docs/6.2.0/javadoc-api/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessor.html&#34;&gt;AutowiredAnnotationBeanPostProcessor&lt;/a&gt; ，又是一个Bean后置处理器&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/3DVo64.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;对于此类，需要关注其实现的两个接口类 &lt;code&gt;MergedBeanDefinitionPostProcessor&lt;/code&gt; (运行时合并Bean的定义回调接口)和 &lt;code&gt;InstantiationAwareBeanPostProcessor&lt;/code&gt; (在Bean实例化前后进行处理后置处理器)&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;MergedBeanDefinitionPostProcessor 主要是为了在真正bean实例化前准备缓存的bean元数据&lt;/li&gt;
&lt;li&gt;InstantiationAwareBeanPostProcessor Bean实例化回调接口，通常用于为bean创建代理&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;测试代码&#34;&gt;测试代码&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@Service&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;MyService&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@Controller&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;MyController&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Autowired&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MyService&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;myService&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;showService&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;out&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;myService = &amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;myService&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@Configuration&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@ComponentScan&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;basePackages&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;cn.imcompany.bean.autowired&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;MyConfiguration&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Main&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AnnotationConfigApplicationContext&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;context&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AnnotationConfigApplicationContext&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MyConfiguration&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MyController&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;myController&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;context&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getBean&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MyController&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;myController&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;showService&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;元数据收集&#34;&gt;元数据收集&lt;/h3&gt;
&lt;p&gt;调用栈信息如下：&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Key To Accelerating Your Coding Skills（收藏）</title>
      <link>http://blog.imcompany.cn/post/the-key-to-accelerating-your-coding-skills/</link>
      <pubDate>Fri, 30 May 2025 15:34:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/the-key-to-accelerating-your-coding-skills/</guid>
      <description>&lt;p&gt;加速你编程技能的关键 &lt;a href=&#34;http://blog.thefirehoseproject.com/posts/learn-to-code-and-be-self-reliant/&#34;&gt;http://blog.thefirehoseproject.com/posts/learn-to-code-and-be-self-reliant/&lt;/a&gt; 文章收藏防丢&lt;/p&gt;
&lt;h2 id=&#34;when-you-learn-to-code-there-is-a-moment-when-everything-begins-to-change-dot-at-firehose-we-like-to-call-this-the-inflection-point-of-coding-dot-after-this-phase-the-way-you-operate-as-a-developer-will-be-dramatically-different-dot-building-up-to-the-inflection-point-is-the-process-of-becoming-self-sufficient-in-programming-to-the-point-where-you-no-longer-need-any-hand-holding-dot-it-can-be-a-frustrating-experience-but-once-it-s-behind-you-it-is-incredibly-empowering-dot&#34;&gt;When you learn to code, there is a moment when everything begins to change. At Firehose, we like to call this the inflection point of coding. After this phase, the way you operate as a developer will be dramatically different. &lt;code&gt;Building up to the inflection point is the process of becoming self-sufficient in programming, to the point where you no longer need any hand-holding.&lt;/code&gt; It can be a frustrating experience, but once it’s behind you, it is incredibly empowering.&lt;/h2&gt;
&lt;h2 id=&#34;at-firehose-our-goal-isn-t-just-to-teach-you-ruby-how-to-build-web-applications-or-how-to-write-tests-dot-although-we-do-teach-these-skills-and-more-our-primary-goal-is-to-accelerate-students-past-the-inflection-point-so-they-gain-the-ability-to-solve-any-problem-they-encounter-dot-we-believe-that-being-able-to-problem-solve-on-your-own-is-an-invaluable-skill-and-this-method-of-teaching-will-take-you-much-further-than-simply-learning-how-to-build-a-set-of-apps-dot&#34;&gt;At Firehose, our goal isn’t just to teach you Ruby, how to build web applications, or how to write tests. Although we do teach these skills and more, &lt;code&gt;our primary goal is to accelerate students past the inflection point so they gain the ability to solve any problem they encounter&lt;/code&gt;. We believe that being able to problem solve on your own is an invaluable skill, and this method of teaching will take you much further than simply learning how to build a set of apps.&lt;/h2&gt;
&lt;h2 id=&#34;the-first-step-to-becoming-a-self-sufficient-developer-is-learning-how-to-do-specific-tasks-dot-once-you-master-certain-tasks-the-broad-strokes-of-how-the-pieces-fit-together-will-start-to-become-apparent-dot-over-time-you-ll-begin-to-recognize-patterns-and-eventually-the-things-that-initially-seemed-confusing-and-foreign-will-become-second-nature-dot&#34;&gt;The first step to becoming a self-sufficient developer is learning how to do specific tasks. Once you master certain tasks, the broad strokes of how the pieces fit together will start to become apparent. Over time, you’ll begin to recognize patterns and eventually, the things that initially seemed confusing and foreign will become second nature.&lt;/h2&gt;
&lt;h2 id=&#34;for-students-starting-out-the-most-important-skill-to-acquire-is-attention-to-detail-dot&#34;&gt;For students starting out, the most important skill to acquire is attention to detail.&lt;/h2&gt;
&lt;h3 id=&#34;paying-close-attention-to-detail-is-important-when-going-through-materials-like-documentation-or-tutorials-dot-even-the-most-minor-typos-and-misspellings-will-result-in-error-messages-or-bugs-dot-seeing-error-messages-is-a-frustrating-experience-at-first-but-it-s-a-crucial-step-in-the-learning-process-dot-dealing-with-error-messages-and-problems-in-this-phase-teaches-you-one-of-the-most-important-skills-of-programming-within-a-safe-environment-being-detail-oriented-dot&#34;&gt;&lt;code&gt;Paying close attention to detail is important when going through materials like documentation or tutorials.&lt;/code&gt; Even the most minor typos and misspellings will result in error messages or bugs. Seeing error messages is a frustrating experience at first, but it’s a crucial step in the learning process. Dealing with error messages and problems in this phase teaches you one of the most important skills of programming within a safe environment: being detail-oriented.&lt;/h3&gt;
&lt;h3 id=&#34;debugging-error-messages-is-incredibly-important-dot-the-fact-of-the-matter-is-error-messages-are-just-a-part-of-programming-they-are-seen-by-inexperienced-and-very-experienced-developers-alike-dot-the-only-difference-is-the-more-experience-you-have-dealing-with-error-messages-the-less-time-you-ll-need-to-spend-trying-to-fix-them-dot-here-s-why&#34;&gt;&lt;code&gt;Debugging error messages is incredibly important.&lt;/code&gt; The fact of the matter is, error messages are just a part of programming: they are seen by inexperienced and very experienced developers alike. The only difference is, the more experience you have dealing with error messages, the less time you’ll need to spend trying to fix them. Here’s why:&lt;/h3&gt;
&lt;h3 id=&#34;over-time-you-will-learn-how-to-read-error-messages-and-extract-the-relevant-details-of-the-problem-quickly-dot-the-first-time-you-see-an-error-message-it-will-take-you-a-while-to-decode-what-it-actually-means-dot-but-after-you-ve-seen-hundreds-of-error-messages--and-you-will-see-hundreds--you-will-be-able-to-pinpoint-the-problem-s-location-and-the-relevant-details-you-need-in-order-to-fix-it-dot&#34;&gt;Over time, you will learn how to read error messages and extract the relevant details of the problem quickly. The first time you see an error message, it will take you a while to decode what it actually means. But after you’ve seen hundreds of error messages (and you will see hundreds!), you will be able to pinpoint the problem’s location and the relevant details you need in order to fix it.&lt;/h3&gt;
&lt;h3 id=&#34;you-should-learn-from-each-error-message-that-you-resolve-dot-don-t-just-fix-the-error-and-be-done-with-it-understand-what-is-wrong-with-the-code-you-re-fixing-dot-by-learning-from-each-of-your-errors-the-next-time-you-make-the-same-mistake-you-ll-be-able-to-fix-it-much-faster-dot&#34;&gt;You should learn from each error message that you resolve. Don’t just fix the error and be done with it; understand what is wrong with the code you’re fixing. By learning from each of your errors, the next time you make the same mistake, you’ll be able to fix it much faster.&lt;/h3&gt;
&lt;h3 id=&#34;initially-you-will-probably-ask-for-help-on-each-error-message-you-see-dot-over-time-you-ll-learn-to-ask-for-help-less-frequently-by-double-checking-your-code-and-conducting-smart-google-searches-dot&#34;&gt;Initially, you will probably ask for help on each error message you see. Over time, you’ll learn to ask for help less frequently by double-checking your code and conducting smart Google searches.&lt;/h3&gt;
&lt;h3 id=&#34;in-the-tutorial-phase-you-will-follow-instruction-dot-at-first-you-ll-find-it-challenging-to-follow-instructions-and-error-messages-will-happen-frequently-dot-over-time-you-ll-develop-the-skill-to-debug-errors-and-pay-better-attention-to-small-details-and-you-ll-be-able-to-make-progress-much-quicker-dot-as-you-re-wrapping-up-the-tutorial-phase-you-ll-notice-you-re-able-to-write-code-at-a-much-more-rapid-pace-dot&#34;&gt;In the tutorial phase, you will follow instruction. At first, you’ll find it challenging to follow instructions and error messages will happen frequently. Over time, you’ll develop the skill to debug errors and pay better attention to small details, and you’ll be able to make progress much quicker. As you’re wrapping up the tutorial phase, you’ll notice you’re able to write code at a much more rapid pace.&lt;/h3&gt;
&lt;h3 id=&#34;at-this-point-some-people-feel-confident-like-they-re-ready-to-ditch-the-training-wheels-and-start-building-things-without-structured-guidance-and-will-happily-dive-into-the-deep-end-dot-other-students-will-reach-for-more-tutorials-trying-to-obtain-more-domain-specific-knowledge-in-search-of-a-full-understanding-dot-unfortunately-tutorials-will-only-take-you-so-far-and-true-confidence-isn-t-found-in-tutorials-or-guides-dot-true-confidence-comes-from-struggling-through-a-problem-you-have-no-idea-how-to-solve-and-discovering-a-solution-on-your-own-dot&#34;&gt;At this point, some people feel confident– like they’re ready to ditch the training wheels and start building things without structured guidance– and will happily dive into the deep end. Other students will reach for more tutorials, trying to obtain more domain-specific knowledge in search of a “full understanding.” Unfortunately, tutorials will only take you so far, and true confidence isn’t found in tutorials or guides. &lt;code&gt;True confidence comes from struggling through a problem you have no idea how to solve, and discovering a solution on your own.&lt;/code&gt;&lt;/h3&gt;
&lt;h2 id=&#34;the-dirty-little-secret-of-programming-is&#34;&gt;The dirty little secret of programming is…&lt;/h2&gt;
&lt;h3 id=&#34;you-will-never-know-everything-you-need-to-know-to-solve-all-your-problems-dot-going-into-the-journey-you-probably-envisioned-yourself-eventually-learning-everything-you-need-to-learn-and-then-being-squared-away-dot-this-moment-will-never-happen-dot&#34;&gt;&lt;code&gt;You will never know everything you need to know to solve all your problems.&lt;/code&gt; Going into the journey, you probably envisioned yourself eventually learning everything you need to learn, and then being squared away. This moment will never happen.&lt;/h3&gt;
&lt;h3 id=&#34;programming-is-a-life-long-learning-experience-dot-experienced-software-engineers-seek-to-find-solutions-to-problems-they-haven-t-solved-yet-because-it-gives-them-the-opportunity-to-learn-more-dot-if-you-find-yourself-waiting-for-the-moment-when-you-finally-feel-like-you-know-everything-there-is-to-know-about-coding-know-this-the-day-you-re-waiting-for-will-never-come-dot-and-that-is-a-wonderful-thing-dot&#34;&gt;&lt;code&gt;Programming is a life-long learning experience.&lt;/code&gt; Experienced software engineers seek to find solutions to problems they haven’t solved yet because it gives them the opportunity to learn more. If you find yourself waiting for the moment when you finally feel like you know everything there is to know about coding, know this: the day you’re waiting for will never come. And that is a wonderful thing.&lt;/h3&gt;
&lt;h2 id=&#34;you-will-be-ready-to-jump-into-the-next-phase-of-your-journey-when&#34;&gt;You will be ready to jump into the next phase of your journey when:&lt;/h2&gt;
&lt;h3 id=&#34;you-ve-seen-enough-error-messages-that-they-no-longer-startle-you-dot-instead-you-know-how-to-decipher-what-they-mean-and-where-to-look-for-the-problems-in-your-code-dot&#34;&gt;You’ve seen enough error messages that they no longer startle you. Instead, you know how to decipher what they mean and where to look for the problems in your code.&lt;/h3&gt;
&lt;h3 id=&#34;you-re-a-pro-at-googling-for-solutions-dot-when-you-re-working-to-add-a-feature-or-see-a-confusing-error-message-you-know-what-to-search-for-to-find-the-information-you-need-dot&#34;&gt;You’re a pro at Googling for solutions. When you’re working to add a feature or see a confusing error message, you know what to search for to find the information you need.&lt;/h3&gt;
&lt;h3 id=&#34;you-re-able-to-reference-code-you-ve-written-in-other-parts-of-your-application-and-follow-patterns-within-them-rather-than-always-seeking-out-step-by-step-instructions-dot&#34;&gt;You’re able to reference code you’ve written in other parts of your application and follow patterns within them, rather than always seeking out step-by-step instructions.&lt;/h3&gt;
&lt;h2 id=&#34;the-inflection-point--2-4-weeks-with-the-right-mentality&#34;&gt;The Inflection Point (2-4 weeks with the right mentality)&lt;/h2&gt;
&lt;h3 id=&#34;the-inflection-point-stage-is-one-of-the-most-frustrating-stages-of-learning-to-code-but-in-many-ways-it-s-the-only-stage-that-matters-dot-it-s-the-point-when-you-phase-out-of-using-tutorials-and-begin-solving-problems-for-which-no-one-has-lined-up-a-solution-for-you&#34;&gt;The inflection point stage is one of the most frustrating stages of learning to code, but in many ways, it’s the only stage that matters. It’s the point when you phase out of using tutorials and begin solving problems for which no one has lined up a solution for you&lt;/h3&gt;
&lt;h3 id=&#34;at-some-points-you-will-feel-like-you-aren-t-ready-to-tackle-this-phase-and-like-you-want-to-return-to-building-something-with-an-outline-of-exactly-what-to-do-dot-don-t-fall-prey-to-this-mentality-dot-the-reason-you-ll-feel-frustrated-is&#34;&gt;At some points, you will feel like you aren’t ready to tackle this phase and like you want to return to building something with an outline of exactly what to do. Don’t fall prey to this mentality. The reason you’ll feel frustrated is:&lt;/h3&gt;
&lt;h2 id=&#34;during-the-inflection-phase-you-will-be-coding-10-20-times-slower-than-in-the-previous-phase-dot&#34;&gt;During the inflection phase, you will be coding 10-20 times SLOWER than in the previous phase.&lt;/h2&gt;
&lt;h3 id=&#34;you-may-start-questioning-yourself-and-wondering-if-you-are-actually-capable-of-becoming-a-programmer-dot-feelings-of-insecurity-and-doubt-are-common-in-this-stage-dot&#34;&gt;You may start questioning yourself and wondering if you are actually capable of becoming a programmer. Feelings of insecurity and doubt are common in this stage.&lt;/h3&gt;
&lt;h3 id=&#34;despite-the-fact-that-you-ll-feel-like-you-re-learning-and-accomplishing-things-at-a-much-slower-rate-in-reality-you-are-achieving-the-things-that-matter-the-most-dot-while-your-domain-specific-knowledge-is-screeching-to-a-putter-everything-you-re-learning-will-be-about-procedural-knowledge-dot&#34;&gt;Despite the fact that you’ll feel like you’re learning and accomplishing things at a much slower rate, in reality, you are achieving the things that matter the most. While your domain-specific knowledge is screeching to a putter, everything you’re learning will be about procedural knowledge.&lt;/h3&gt;
&lt;h3 id=&#34;procedural-knowledge-is-the-ability-to-teach-yourself-what-you-don-t-know-along-the-way-dot-when-you-need-to-implement-a-new-feature-what-type-of-google-search-should-you-do-at-this-point-in-time-you-ll-feel-like-you-re-in-the-dark-when-it-comes-to-many-of-the-things-you-want-to-accomplish-dot-learning-how-to-find-the-light-on-your-own-is-critical-because-you-can-never-know-everything-there-is-to-know-so-you-need-to-be-able-to-teach-yourself-how-to-solve-the-problem-at-hand-dot&#34;&gt;Procedural knowledge is the ability to teach yourself what you don’t know along the way. When you need to implement a new feature, what type of Google search should you do? At this point in time, you’ll feel like you’re “in the dark” when it comes to many of the things you want to accomplish. Learning how to find the light on your own is critical because you can never know everything there is to know, so you need to be able to teach yourself how to solve the problem at hand.&lt;/h3&gt;
&lt;h2 id=&#34;most-people-do-not-realize-that-in-order-to-learn-to-code-you-need-to-learn-both-domain-specific-and-procedural-knowledge-dot&#34;&gt;Most people do not realize that in order to learn to code, you need to learn both domain-specific and procedural knowledge.&lt;/h2&gt;
&lt;h2 id=&#34;for-the-rest-of-your-life-go-outside-your-limits-every-single-day&#34;&gt;For the rest of your life, go outside your limits every single day&lt;/h2&gt;
&lt;h3 id=&#34;some-software-engineers-stay-inside-their-comfort-zone-once-they-find-their-footing-dot-these-types-of-programmers-are-known-as-maintenance-programmers-not-something-you-should-strive-to-be-dot-instead-you-should-strive-to-go-outside-your-limits-every-single-day-dot-the-most-common-reason-programmers-quit-their-jobs-is-because-it-s-not-challenging-anymore-since-i-ve-solved-all-the-interesting-problems-dot&#34;&gt;Some software engineers stay inside their comfort zone once they find their footing. These types of programmers are known as maintenance programmers– not something you should strive to be. Instead, you should strive to go outside your limits every single day. The most common reason programmers quit their jobs is because “it’s not challenging anymore since I’ve solved all the interesting problems.”&lt;/h3&gt;
&lt;h3 id=&#34;rather-than-trying-to-pull-coding-projects-into-your-comfort-zone-you-should-be-seeking-out-problems-that-are-outside-your-current-skill-set-dot-this-is-the-only-way-to-build-on-and-expand-your-skills-dot&#34;&gt;Rather than trying to pull coding projects into your comfort zone, you should be seeking out problems that are outside your current skill set. This is the only way to build on and expand your skills.&lt;/h3&gt;
&lt;h2 id=&#34;in-the-words-of-a-firehose-student-upon-passing-his-inflection-point&#34;&gt;In the words of a Firehose student upon passing his inflection point:&lt;/h2&gt;
&lt;h3 id=&#34;i-still-feel-like-i-m-in-the-deep-end-i-m-just-getting-more-comfortable-knowing-that-s-where-i-ve-got-to-be&#34;&gt;I still feel like I’m in the deep end! I’m just getting more comfortable knowing that’s where I’ve got to be!&lt;/h3&gt;
&lt;h2 id=&#34;strategies-for-passing-the-inflection-point-as-efficiently-as-possible&#34;&gt;Strategies for Passing the Inflection Point as Efficiently as Possible&lt;/h2&gt;
&lt;h3 id=&#34;because-passing-the-inflection-point-is-the-most-important-part-of-learning-to-code-you-should-set-yourself-up-to-make-the-process-as-smooth-as-possible-dot-this-means-you-should-start-preparing-while-you-re-in-the-tutorial-phase-and-maintain-the-right-mindset-during-this-period-of-time-dot&#34;&gt;Because passing the inflection point is the most important part of learning to code, you should set yourself up to make the process as smooth as possible. This means you should start preparing while you’re in the tutorial phase and maintain the right mindset during this period of time.&lt;/h3&gt;
&lt;h3 id=&#34;during-the-tutorial-phase-take-breaks-from-going-over-structured-material-and-give-yourself-challenge-problems-along-the-way-dot&#34;&gt;During the tutorial phase, take breaks from going over structured material and give yourself challenge problems along the way.&lt;/h3&gt;
&lt;h3 id=&#34;for-every-handful-of-lessons-try-to-do-something-that-is-outside-the-scope-of-the-tutorial-you-re-following-dot-if-the-tutorials-you-re-going-through-provide-challenges-or-self-directed-pieces-do-all-of-them-dot-solving-unguided-challenges-will-give-you-the-important-experience-of-doing-things-without-structured-guidance-dot&#34;&gt;For every handful of lessons, try to do something that is outside the scope of the tutorial you’re following. If the tutorials you’re going through provide “challenges” or “self-directed” pieces, do all of them. &lt;code&gt;Solving unguided challenges will give you the important experience of doing things without structured guidance.&lt;/code&gt;&lt;/h3&gt;
&lt;h3 id=&#34;try-to-use-tutorials-as-little-as-possible-dot-at-firehose-we-often-walk-students-through-how-to-integrate-certain-gems-or-do-things-using-the-provided-documentation-dot-rather-than-simply-following-the-instructions-explained-in-tutorials-that-are-geared-towards-people-who-are-just-starting-out-many-students-will-follow-the-documentation-and-use-the-tutorials-as-a-back-up-dot-note-that-documentation-will-treat-you-like-a-developer-who-has-passed-the-inflection-point-dot-getting-comfortable-reading-and-following-documentation-on-github-will-give-you-a-leg-up-when-you-re-on-your-own-dot&#34;&gt;Try to use tutorials as little as possible. At Firehose, we often walk students through how to integrate certain gems or do things using the provided documentation. Rather than simply following the instructions explained in tutorials that are geared towards people who are just starting out, many students will follow the documentation and use the tutorials as a back-up. Note that documentation will treat you like a developer who has passed the inflection point. Getting comfortable reading and following documentation on GitHub will give you a leg up when you’re on your own.&lt;/h3&gt;
&lt;h3 id=&#34;focus-on-the-essentials-and-use-repetition-dot-learn-how-to-do-common-things-like-spinning-up-an-application-from-scratch-pushing-a-new-app-to-github-and-heroku-and-building-a-database-migration-early-on&#34;&gt;Focus on the essentials and use repetition. Learn how to do common things like spinning-up an application from scratch, pushing a new app to GitHub and Heroku, and building a database migration early on&lt;/h3&gt;
&lt;h2 id=&#34;pushing-through-the-inflection-point-can-be-challenging-dot-here-are-some-pointers-to-get-you-through-it&#34;&gt;Pushing through the inflection point can be challenging. Here are some pointers to get you through it:&lt;/h2&gt;
&lt;h3 id=&#34;understand-that-this-is-a-difficult-process-and-go-easy-on-yourself-dot-also-set-realistic-expectations-dot-you-can-t-compare-your-superman-level-speed-of-going-through-tutorials-to-your-snail-speed-of-learning-things-on-your-own-dot-keep-in-mind-that-you-re-learning-plenty-but-at-this-phase-you-re-learning-a-brand-new-skill-of-figuring-new-things-out-on-your-own-dot&#34;&gt;Understand that this is a difficult process and go easy on yourself. Also, set realistic expectations. You can’t compare your “superman”-level speed of going through tutorials to your “snail”-speed of learning things on your own. Keep in mind that you’re learning plenty, but at this phase, you’re learning a brand new skill of figuring new things out on your own.&lt;/h3&gt;
&lt;h3 id=&#34;if-you-re-struggling-with-self-confidence-know-that-what-you-re-feeling-is-completely-normal-dot-keep-working-dot-if-you-continue-to-struggle-try-talking-to-someone-who-has-recently-passed-the-inflection-point-dot-they-will-be-able-to-relate-to-the-position-you-re-in-and-will-assure-you-that-what-you-re-experiencing-is-only-temporary-dot-work-consistently-but-don-t-overwork-yourself-dot-at-this-phase-of-the-game-know-that-you-can-only-be-productive-for-around-6-hours-a-day-at-the-most-dot-working-in-an-exhausted-state-will-only-prolong-the-time-you-spend-building-up-to-the-inflection-point-dot&#34;&gt;If you’re struggling with self-confidence, know that what you’re feeling is completely normal. Keep working. If you continue to struggle, try talking to someone who has recently passed the inflection point. They will be able to relate to the position you’re in and will assure you that what you’re experiencing is only temporary. Work consistently, but don’t overwork yourself. At this phase of the game, know that you can only be productive for around 6 hours a day at the most. Working in an exhausted state will only prolong the time you spend building up to the inflection point.&lt;/h3&gt;
&lt;h3 id=&#34;the-best-way-to-gain-confidence-at-this-stage-is-to-power-through-any-doubts-you-have-dot-your-emotions-may-start-to-feel-like-a-roller-coaster-dot-at-times-you-ll-feel-like-you-re-on-fire-but-after-15-hours-of-struggling-on-the-same-problem-it-s-very-common-to-feel-the-polar-opposite-dot&#34;&gt;The best way to gain confidence at this stage is to power through any doubts you have. Your emotions may start to feel like a roller coaster. At times, you’ll feel like you’re on fire, but after 15 hours of struggling on the same problem, it’s very common to feel the polar opposite.&lt;/h3&gt;
&lt;h3 id=&#34;it-can-be-frustrating-to-have-no-idea-if-something-will-take-you-5-minutes-or-5-hours-but-every-time-you-power-through-and-successfully-implement-a-new-feature-the-rush-of-confidence-will-be-everything-you-need-dot-after-solving-a-handful-of-hard-problems-without-any-help-you-ll-be-addicted-to-the-feeling-of-building-things-outside-your-comfort-zone-dot&#34;&gt;It can be frustrating to have no idea if something will take you 5 minutes or 5 hours, but every time you power through and successfully implement a new feature, the rush of confidence will be everything you need. After solving a handful of hard problems without any help, you’ll be addicted to the feeling of building things outside your comfort zone.&lt;/h3&gt;
&lt;h2 id=&#34;how-to-know-when-you-ve-passed-the-inflection-point&#34;&gt;How to know when you’ve passed the inflection point&lt;/h2&gt;
&lt;h3 id=&#34;the-final-stage-of-the-inflection-point-process-is-acceptance-dot-acceptance-that-software-development-is-a-process-of-continuous-learning-dot-acceptance-that-the-feeling-that-you-ve-successfully-learned-everything-just-means-you-should-start-thinking-about-solving-more-complicated-problems-dot&#34;&gt;&lt;code&gt;The final stage of the inflection point process is acceptance.&lt;/code&gt; Acceptance that software development is a process of continuous learning. Acceptance that the feeling that you’ve successfully learned everything just means you should start thinking about solving more complicated problems.&lt;/h3&gt;
&lt;h2 id=&#34;ref&#34;&gt;REF&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://www.cnblogs.com/yxiaodao/p/10674891.html&#34;&gt;https://www.cnblogs.com/yxiaodao/p/10674891.html&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 第17期</title>
      <link>http://blog.imcompany.cn/post/peng-week17/</link>
      <pubDate>Fri, 16 May 2025 10:19:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/peng-week17/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;h3 id=&#34;programming-on-34-keys-oppi-dot-li&#34;&gt;&lt;a href=&#34;https://oppi.li/posts/programming_on_34_keys/&#34;&gt;Programming On 34 Keys · oppi.li&lt;/a&gt;&lt;/h3&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/EKszUu.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;作者自己构建了一个分离式的34键的键盘用来日常编程，由于只有34个键，包含26个字母+4个常用符号+4个功能键(Tab，Space, Enter，Backspace)，对于其它的功能键就需要使用不同的layter来完成，作者就定义了三种模式来实现不能的功能&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;NAV层，导航模式，实现上下左右的移动，通过按住左侧的 &lt;code&gt;Space&lt;/code&gt; 触发&lt;/li&gt;
&lt;li&gt;SYM层，符号模式，包含所有常用的符号，主要集中在左侧键盘，通过按住右侧的 &lt;code&gt;Enter&lt;/code&gt; 触发&lt;/li&gt;
&lt;li&gt;NUM层，数字模式，包含所有数字，主要集中在右侧键盘 ，通过按住左侧的 &lt;code&gt;Tab&lt;/code&gt; 触发&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;对于常用的 Esc 键盘，作者通过组合按键的方式来实现，分别按住左右两侧的键&lt;/p&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;h3 id=&#34;trycua-cua-c-ua-is-the-docker-container-for-computer-use-ai-agents-dot&#34;&gt;&lt;a href=&#34;https://github.com/trycua/cua&#34;&gt;trycua/cua: c/ua is the Docker Container for Computer-Use AI Agents.&lt;/a&gt;&lt;/h3&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/vVs9sS.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;运行AI Agents的Docker容器，这下可以大胆的尝试AI Agents了&lt;/p&gt;
&lt;h3 id=&#34;crhuber-kelp-a-simple-alternative-to-homebrew-for-installing-binary-packages-on-macos-written-in-go-dot&#34;&gt;&lt;a href=&#34;https://github.com/crhuber/kelp&#34;&gt;crhuber/kelp: A simple alternative to homebrew for installing binary packages on MacOS written in Go.&lt;/a&gt;&lt;/h3&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/kDs1wO.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;Mac上软件安装管理的工具，homebrew的简易替代品&lt;/p&gt;
&lt;h3 id=&#34;zen-browser-desktop-welcome-to-a-calmer-internet&#34;&gt;&lt;a href=&#34;https://github.com/zen-browser/desktop&#34;&gt;zen-browser/desktop: Welcome to a calmer internet&lt;/a&gt;&lt;/h3&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/vlXebD.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;Firefox浏览器的替代，号称最大限度平衡速度、隐私与效率，试了一下挺不错的，颜值也能打&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Our mission is to give you a balance between speed, privacy and productivity!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Spring学习之@CompnentScan</title>
      <link>http://blog.imcompany.cn/post/spring-componentscan/</link>
      <pubDate>Thu, 15 May 2025 16:29:33 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/spring-componentscan/</guid>
      <description>&lt;h2 id=&#34;注解说明&#34;&gt;注解说明&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.spring.io/spring-framework/docs/6.2.0/javadoc-api/org/springframework/context/annotation/ComponentScan.html&#34;&gt;@ComponentScan&lt;/a&gt; 注解是Spring 提供的对组件进行扫描的注解指令，通常与 &lt;a href=&#34;https://blog.imcompany.cn/post/spring-configuration/&#34;&gt;@Configuration&lt;/a&gt; 注解一起使用，支持在类上重复标注&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/1Gfqcy.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h2 id=&#34;注解能做什么&#34;&gt;注解能做什么？&lt;/h2&gt;
&lt;p&gt;此注解支持以下重要特性:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;自定义扫描的包范围&lt;/li&gt;
&lt;li&gt;配置包含扫描组件的过滤器&lt;/li&gt;
&lt;li&gt;配置排除组件的过滤器&lt;/li&gt;
&lt;li&gt;是否使用默认过滤器&lt;/li&gt;
&lt;li&gt;是否配置懒加载&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;源码分析&#34;&gt;源码分析&lt;/h2&gt;
&lt;p&gt;由于此注解通常与 @Configuration 注解一起使用，其解析的主要逻辑都是在 refresh 阶段的 invokeBeanFactoryPostProcessors 方法中，最终会定位到   &lt;code&gt;ConfigurationClassParser#doProcessConfigurationClass()&lt;/code&gt; 方法中，在方法中可以看到对 ComponentScan 注解的操作逻辑了&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/nLgM3W.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h3 id=&#34;对注解属性的解析&#34;&gt;对注解属性的解析&lt;/h3&gt;
&lt;p&gt;所有对属性的解析都在 &lt;code&gt;ComponentScanAnnotationParser#parse()&lt;/code&gt; 方法中进行，此方法中会创建一个 &lt;a href=&#34;https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/annotation/ClassPathBeanDefinitionScanner.html&#34;&gt;ClassPathBeanDefinitionScanner&lt;/a&gt; 实例scanner，此实例初始化过程中会对默认的Filter进行加载&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/vRkGfu.png&#34;/&gt; 
&lt;/figure&gt;

&lt;blockquote&gt;
&lt;p&gt;处理默认Filter主要是 &lt;a href=&#34;https://www.ibm.com/docs/en/wasdtfe?topic=reference-jax-ws-common-annotations-jsr-250&#34;&gt;JSR-250&lt;/a&gt; 与 &lt;a href=&#34;https://jcp.org/en/jsr/detail?id=330&#34;&gt;JSR-330&lt;/a&gt; API 增加的注解&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;然后会把配置的 &lt;code&gt;includeFilter&lt;/code&gt; 和 &lt;code&gt;excludeFilter&lt;/code&gt; 设置到 scanner 中，接着会对 &lt;code&gt;basePackage&lt;/code&gt; 扫描包属性进行解析配置，如果配置了就添加，没有配置，默认就使用 &lt;code&gt;@ComponentScan&lt;/code&gt; 注解标注类所在的包路径。解析完注解属性后，就开始了真正的扫描操作&lt;/p&gt;
&lt;h3 id=&#34;扫描操作&#34;&gt;扫描操作&lt;/h3&gt;
&lt;p&gt;扫描操作由  &lt;code&gt;ClassPathBeanDefinitionScanner#doScan()&lt;/code&gt; 方法进行处理，此方法会调用 &lt;code&gt;findCandidateComponents()&lt;/code&gt; 方法在给定的包下查找符合条件的组件，查找的任务由 &lt;code&gt;scanCandidateComponents()&lt;/code&gt; 进行，该方法调用 &lt;code&gt;isCandidateComponent()&lt;/code&gt; 方法，根据解析的includeFilter和excludeFilter 来选择满足条件的组件&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/V9WgPz.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;这样扫描到所有满足条件的Bean后，会接着对这些Bean进行parse操作，直到注解再无其它依赖&lt;/p&gt;
&lt;h3 id=&#34;注册bean&#34;&gt;注册Bean&lt;/h3&gt;
&lt;p&gt;扫描完所有Bean后，会调用 &lt;code&gt;checkCandidate()&lt;/code&gt; 方法进行检查，检查当前要注册的Bean是否与已经注册过的Bean的定义是否兼容，如果冲突会报 &lt;code&gt;ConflictingBeanDefinitionException&lt;/code&gt; 。检查没问题后，会调用 &lt;code&gt;registerBeanDefinition()&lt;/code&gt; 方法对Bean进行注册，这个过程就涉及到Spring其它的生命周期了（这个后续专门学习总结），对于@ComponentScan 组件来说已经完成了它的使命&lt;/p&gt;
&lt;h2 id=&#34;总结&#34;&gt;总结&lt;/h2&gt;
&lt;p&gt;最后以注解解析过程中的涉及的核心类做一下总结&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/At29IK.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h2 id=&#34;常见问题&#34;&gt;常见问题&lt;/h2&gt;
&lt;h3 id=&#34;调整包结构后一些-bean配置扫描不到了&#34;&gt;调整包结构后一些@Bean配置扫描不到了&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;调用启动类的包路径为最外层，这样可以扫描当前包及子包的配置&lt;/li&gt;
&lt;li&gt;默认只扫描当前标注注解的包，可以通过配置 &lt;code&gt;basePackage&lt;/code&gt; 属性指定扫描路径，配置后默认的扫描路径就不生效了&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;如何将未配置spring相关组件注解的bean纳入spring管理&#34;&gt;如何将未配置Spring相关组件注解的Bean纳入Spring管理?&lt;/h3&gt;
&lt;p&gt;可以通过配置 ComponentScan的includeFilter 来实现&lt;/p&gt;</description>
    </item>
    <item>
      <title>Spring学习之@Configuration</title>
      <link>http://blog.imcompany.cn/post/spring-configuration/</link>
      <pubDate>Fri, 09 May 2025 11:40:11 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/spring-configuration/</guid>
      <description>&lt;h2 id=&#34;configuration是什么&#34;&gt;@Configuration是什么？&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.spring.io/spring-framework/docs/6.2.0/javadoc-api/org/springframework/context/annotation/Configuration.html&#34;&gt;@Configuration&lt;/a&gt; 是 Spring提供的一个用于配置与声明Bean与相应Bean之间依赖的注解，根据文档描述，此注解通常由 &lt;a href=&#34;https://docs.spring.io/spring-framework/docs/6.2.0/javadoc-api/org/springframework/web/context/support/AnnotationConfigWebApplicationContext.html&#34;&gt;AnnotationConfigApplicationContext&lt;/a&gt; 上下文进行启动加载&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/PRtMuy.png&#34;/&gt; 
&lt;/figure&gt;

&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/fYfwMj.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h2 id=&#34;configuration能做什么&#34;&gt;@Configuration能做什么？&lt;/h2&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/5R7RVf.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;先看一下此注解的声明，在此注解上标识了 &lt;a href=&#34;https://docs.spring.io/spring-framework/docs/6.2.0/javadoc-api/org/springframework/stereotype/Component.html&#34;&gt;@Component&lt;/a&gt; ，则证明此注解是一个 Component，拥有 &lt;code&gt;@Component&lt;/code&gt; 注解的基础能力(可以被Spring容器自动扫描与加载)&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/61UMNj.png&#34;&gt;
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/XHjgyf.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;上图标识了注解常用的配置方式，分类为以下几种&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;属性资源导入&lt;/li&gt;
&lt;li&gt;引入其它配置类的配置&lt;/li&gt;
&lt;li&gt;Value注入&lt;/li&gt;
&lt;li&gt;Spring容器组件注入&lt;/li&gt;
&lt;li&gt;支持Profile配置&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;注解属性&#34;&gt;注解属性&lt;/h2&gt;
&lt;p&gt;在Spring5.x版本中，只支持两个属性配置&lt;/p&gt;
&lt;h3 id=&#34;value&#34;&gt;value&lt;/h3&gt;
&lt;p&gt;配置注解的名称&lt;/p&gt;
&lt;h3 id=&#34;proxybeanmethods&#34;&gt;proxyBeanMethods&lt;/h3&gt;
&lt;p&gt;是否代理增强(基于CGLIB)标识 @Bean 的方法，默认为true，保证声明的bean是单例共享的，而不是每一次通过方法调用都生成一个新的&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/2hAi0n.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;此属性的两个值被定义为两种模式&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;full 模式(值为true)&lt;/li&gt;
&lt;li&gt;lite 模式(值为false)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;源码分析&#34;&gt;源码分析&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;@Configuration&lt;/code&gt; 注解的解析类为 &lt;a href=&#34;https://docs.spring.io/spring-framework/docs/6.2.0/javadoc-api/org/springframework/context/annotation/ConfigurationClassPostProcessor.html&#34;&gt;ConfigurationClassPostProcessor&lt;/a&gt; ，本次主要关注从  &lt;code&gt;AnnotationConfigApplicationContext&lt;/code&gt; 启动后的整个处理过程， &lt;code&gt;AnnotationConfigApplicationContext&lt;/code&gt; 启动分为三个阶段&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/CjzEJ4.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;先上一张三个阶段的涉及的主要类与调用关系图
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/khv7Ac.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;初始化&#34;&gt;初始化&lt;/h3&gt;
&lt;h4 id=&#34;初始化reader&#34;&gt;初始化reader&lt;/h4&gt;
&lt;p&gt;此过程会实例化 &lt;code&gt;AnnotatedBeanDefinitionReader&lt;/code&gt; 类，此类在实例化时会调用 &lt;code&gt;AnnotationConfigUtils.registerAnnotationConfigProcessors&lt;/code&gt; 来注册解析配置的Processor，如果registry中没有包含 &lt;code&gt;ConfigurationClassPostProcessor&lt;/code&gt; 类的定义，则会新new一个 &lt;code&gt;ConfigurationClassPostProcessor&lt;/code&gt; 的Bean定义类&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/Hc0pp8.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;整体调用链路如下：&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/mkddrx.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h4 id=&#34;初始化scanner&#34;&gt;初始化scanner&lt;/h4&gt;
&lt;p&gt;此过程会实例化Bean定义扫描器 &lt;code&gt;ClassPathBeanDefinitionScanner&lt;/code&gt; , 在此过程中主要会设置 Environment 和 ResourceLoader 相关信息&lt;/p&gt;
&lt;h3 id=&#34;注册&#34;&gt;注册&lt;/h3&gt;
&lt;p&gt;注册阶段主要是对标注了 &lt;code&gt;@Configuration&lt;/code&gt; 类(MyConfig)进行注册，以便Spring可以正常识别，主要逻辑在 &lt;code&gt;AnnotatedBeanDefinitionReader#doRegisterBean&lt;/code&gt; 中，此方法会调用 &lt;code&gt;BeanDefinitionReaderUtils.registerBeanDefinition&lt;/code&gt; 对此Bean进行注册&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/xbi8aV.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/XNcLXU.png&#34;&gt;
至此， &lt;code&gt;@Configuration&lt;/code&gt; 类信息就注册到了 Spring 容器中&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 第16期</title>
      <link>http://blog.imcompany.cn/post/peng-week16/</link>
      <pubDate>Thu, 08 May 2025 10:46:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/peng-week16/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;h3 id=&#34;clion-is-now-free-for-non-commercial-use-the-clion-blog&#34;&gt;&lt;a href=&#34;https://blog.jetbrains.com/clion/2025/05/clion-is-now-free-for-non-commercial-use/&#34;&gt;CLion Is Now Free for Non-Commercial Use | The CLion Blog&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;C编辑器CLion对非商业使用免费了&lt;/p&gt;
&lt;h3 id=&#34;voideditor-void&#34;&gt;&lt;a href=&#34;https://github.com/voideditor/void&#34;&gt;voideditor/void&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;开源的Cursor编辑器，基于VSCode开发&lt;/p&gt;
&lt;h3 id=&#34;brokkai-brokk-brokk-brings-code-intelligence-to-ai&#34;&gt;&lt;a href=&#34;https://github.com/BrokkAi/brokk&#34;&gt;BrokkAi/brokk: Brokk brings code intelligence to AI&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;号称理解代码语法，对于大型项目支持更好的AI工具&lt;/p&gt;
&lt;h3 id=&#34;奇客solidot-食用超加工食品或有害健康&#34;&gt;&lt;a href=&#34;https://www.solidot.org/story?sid=81242&amp;amp;__readwiseLocation=&#34;&gt;奇客Solidot | 食用超加工食品或有害健康&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;目前超加工食品越来越多，我们被困在了里面&lt;/p&gt;
&lt;h3 id=&#34;bhznjns-motioneasetune-a-simple-application-that-can-prevent-you-from-motion-sickness-via-100hz-sound-dot&#34;&gt;&lt;a href=&#34;https://github.com/BHznJNs/MotionEaseTune&#34;&gt;BHznJNs/MotionEaseTune: A simple application that can prevent you from motion sickness via 100Hz sound.&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;播放100Hz声音来预防晕车的Android应用&lt;/p&gt;
&lt;h3 id=&#34;ebrizzzz-youtube-playlist-to-formatted-text-a-desktop-application-that-extracts-youtube-playlist-transcripts-and-enhances-them-using-google-s-gemini-ai-models-dot-the-output-is-a-book-in-any-language-you-want-dot&#34;&gt;&lt;a href=&#34;https://github.com/Ebrizzzz/Youtube-playlist-to-formatted-text&#34;&gt;Ebrizzzz/Youtube-playlist-to-formatted-text: A desktop application that extracts YouTube playlist transcripts and enhances them using Google&amp;rsquo;s Gemini AI models. The output is a book in any language you want.&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;将Youtube列表通过AI转成电子书&lt;/p&gt;</description>
    </item>
    <item>
      <title>Windows相关软件或工具</title>
      <link>http://blog.imcompany.cn/post/windows-backup/</link>
      <pubDate>Sun, 27 Apr 2025 15:40:22 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/windows-backup/</guid>
      <description>&lt;h2 id=&#34;背景&#34;&gt;背景&lt;/h2&gt;
&lt;p&gt;平常只使用MAC，但是架不Windows的占用率，有一些感兴趣的东西想要记录一下&lt;/p&gt;
&lt;h2 id=&#34;win11-23h2-22631-dot-3155-办公版-装机版-2024-dot-02-dot-28-twm000&#34;&gt;&lt;a href=&#34;https://twm000.top/2024/02/29/win11-23h2-22631-2506_%e8%a3%85%e6%9c%ba%e7%89%88_%e3%80%902023-11-07%e3%80%91/&#34;&gt;Win11-23H2-22631.3155_办公版-装机版_【2024.02.28】 – TWM000&lt;/a&gt;&lt;/h2&gt;</description>
    </item>
    <item>
      <title>SpringMVC实践之集成Sentinel限流功能</title>
      <link>http://blog.imcompany.cn/post/spring-webmvc-interceptor/</link>
      <pubDate>Fri, 25 Apr 2025 17:53:54 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/spring-webmvc-interceptor/</guid>
      <description>&lt;h2 id=&#34;背景&#34;&gt;背景&lt;/h2&gt;
&lt;p&gt;近期收到线上报警，发现个别新接口在同1s内被请求了接近上百次，对系统的稳定造成了一些影响，近期调研了一下通用的限流框架，打算将Sentinel的限流功能集成进新服务&lt;/p&gt;
&lt;h2 id=&#34;sentinel前置知识&#34;&gt;Sentinel前置知识&lt;/h2&gt;
&lt;p&gt;Sentinel 限流主要涉及以下几方面&lt;/p&gt;
&lt;h3 id=&#34;resource&#34;&gt;Resource&lt;/h3&gt;
&lt;p&gt;限流的资源，资源支持动态加载，核心类为： &lt;code&gt;AbstractDataSource&lt;/code&gt; ，Sentinel 默认提供了市面常见的资源管理服务的实现，也可以自定义实现
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/bMQyLZ.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;rule&#34;&gt;Rule&lt;/h3&gt;
&lt;p&gt;对定义的 Resouce 应用的限流规则，基于QPS、响应时间与系统负载。Sentinel 是通过一系列的功能Slot来实现不同的统计/控制功能，对于限流功能对应的就是 &lt;code&gt;FlowSlot&lt;/code&gt;&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/DSNjeo.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;&lt;code&gt;FlowSlot&lt;/code&gt; 的功能实现需要依赖前面的 &lt;code&gt;NodeSelectorSlot&lt;/code&gt; 和 &lt;code&gt;ClusterBuilderSlot&lt;/code&gt; 等统计Slot，有了统计信息才可以针对配置进行限流操作，这里面借用一张官方的实现图
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/3TQkqg.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;各Slot默认的顺序也可以在代码中找到
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/hZyabG.png&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;核心处理逻辑&#34;&gt;核心处理逻辑&lt;/h4&gt;
&lt;p&gt;核心逻辑是在执行调用chain的捕获Blockexcption然后执行后续操作&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/514k2Q.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h2 id=&#34;集成步骤&#34;&gt;集成步骤&lt;/h2&gt;
&lt;p&gt;借助SpringMVC中提供的 &lt;code&gt;HandlerInterceptor&lt;/code&gt; 拦截器功能 与 Sentinel 提供的SpringMVC框架集成类库可以方便快速的实现限流功能&lt;/p&gt;
&lt;h3 id=&#34;引入sentinel-springmvc-adapter&#34;&gt;引入Sentinel SpringMVC Adapter&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;com.alibaba.csp&lt;span class=&#34;nt&#34;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;sentinel-spring-webmvc-adapter&lt;span class=&#34;nt&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;1.8.8&lt;span class=&#34;nt&#34;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;配置sentinelwebinterceptor&#34;&gt;配置SentinelWebInterceptor&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/alibaba/Sentinel/tree/1.8/sentinel-adapter/sentinel-spring-webmvc-adapter&#34;&gt;Sentinel  SpringMVC Adapter&lt;/a&gt;中提供了 &lt;code&gt;SentinelWebInterceptor&lt;/code&gt; 来实现限流功能，这个 Interceptor 支持一些自定义的行为，主要通过 SentinelWebMvcConfig 来实现&lt;/p&gt;
&lt;h4 id=&#34;sentinelwebmvcconfig-常用配置说明&#34;&gt;SentinelWebMvcConfig 常用配置说明&lt;/h4&gt;
&lt;p&gt;SentinelWebMvcConfig 支持以下配置能力&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;urlCleaner&lt;/p&gt;
&lt;figure&gt;
        &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/8I1bRn.png&#34;/&gt; 
    &lt;/figure&gt;

&lt;p&gt;自定义对请求url的处理，比如厂商此次需要通过请求的设备id维度进行限流，对于其它的请求参数都进行忽略，最终可定义效果为: &lt;code&gt;/api/v1/test/ping?did=6308103f1026acf274bbcc1b10001291551xxX&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;httpMethodSpecify&lt;/p&gt;
&lt;p&gt;是否指定特定的Http请求方法，此设置是对资源的请求方法进行了细粒度的配置，默认为false不开启，配置为true后，会在设定好的资源名前加上请求的方法，类似效果:  &lt;code&gt;GET: /api/v1/test/ping?did=6308103f1026acf274bbcc1b10001291551xxX&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;blockExceptionHandler&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/XluwAf.png&#34;&gt;
被Block的请求异常处理器，对Block的请求进行自定义处理，可以设置返回的值，如果未配置则需要服务自己捕获 BlockException，可以通过配置 &lt;code&gt;ExceptionHandler&lt;/code&gt; 进行统一处理&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;originParser&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/njPqHL.png&#34;&gt;
请求来源处理器，针对请求的来源进行处理，在配置资源的规则的可以使用此解析的origin细粒度控制，例如可以解析ip、用户做为请求 origin&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 第15期</title>
      <link>http://blog.imcompany.cn/post/peng-week15/</link>
      <pubDate>Tue, 22 Apr 2025 11:42:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/peng-week15/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;h3 id=&#34;cherry-studio-网络搜索与知识库最佳实践&#34;&gt;&lt;a href=&#34;https://chentao0717.cn/posts/cherry-rag-websearch&#34;&gt;Cherry Studio 网络搜索与知识库最佳实践&lt;/a&gt;&lt;/h3&gt;
&lt;h3 id=&#34;奇客solidot-youtube-用户上传了-20-万亿则视频&#34;&gt;&lt;a href=&#34;https://www.solidot.org/story?sid=81130&amp;amp;__readwiseLocation=&#34;&gt;奇客Solidot | YouTube 用户上传了 20 万亿则视频&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;20年，20万亿的视频，惊到了&lt;/p&gt;
&lt;h3 id=&#34;如何避免在-ai-时代技能退化-宝玉的分享&#34;&gt;&lt;a href=&#34;https://baoyu.io/translations/avoiding-skill-atrophy-in-the-age?__readwiseLocation=&#34;&gt;如何避免在 AI 时代技能退化 | 宝玉的分享&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;把AI当做协作者，而不是拐杖，做了一个完整独立的人&lt;/p&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;h3 id=&#34;the-via-app&#34;&gt;&lt;a href=&#34;https://github.com/the-via/app&#34;&gt;the-via/app&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;改键神器，如果使用中老是卡在查找设备的页面，可以在设置中改成3D模式&lt;/p&gt;
&lt;h2 id=&#34;image-️&#34;&gt;Image 🖼️&lt;/h2&gt;
&lt;h2 id=&#34;speech&#34;&gt;Speech 💬&lt;/h2&gt;
&lt;h3 id=&#34;天不生人上之人-也不生人下之人&#34;&gt;天不生人上之人，也不生人下之人&lt;/h3&gt;
&lt;h3 id=&#34;规则就像汽车上的安全带-一开始可能会有点不舒服-但一段时间后-使用规则就会成为习惯-不使用规则就变得不可想象&#34;&gt;规则就像汽车上的安全带：一开始可能会有点不舒服，但一段时间后，使用规则就会成为习惯，不使用规则就变得不可想象。&lt;/h3&gt;
&lt;h2 id=&#34;idea&#34;&gt;Idea 💡&lt;/h2&gt;</description>
    </item>
    <item>
      <title>SpringMVC学习之HandlerMapping</title>
      <link>http://blog.imcompany.cn/post/spring-webmvc-handler/</link>
      <pubDate>Fri, 18 Apr 2025 11:27:45 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/spring-webmvc-handler/</guid>
      <description>&lt;h2 id=&#34;起因&#34;&gt;起因&lt;/h2&gt;
&lt;p&gt;新服务在处理不存在的url请求时，上报日志报错，具体错误信息：
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/6yGXgJ.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;根据报错信息找到相关代码
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/3q8RWR.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;代码处做了对参数hanler的强制转换，但是真正传入的参数类型为 ResourceHttpRequestHandler 导致转换失败而报错，梳理一下，handler是在 自定义的日志Interceptor 的afterCompletion方法中由框架传入的
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/h8fQR5.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;resourcehttprequesthandler-是什么&#34;&gt;ResourceHttpRequestHandler 是什么?&lt;/h2&gt;
&lt;p&gt;查阅类文档，ResourceHttpRequestHandler是SpringMVC提供的处理静态资源的Handler，比如常见的js或者css文件。在当前前后端分离的分工下，对于REST服务开发，不会再使用这种方式提供对静态资源的访问，为什么请求了一个不存在的url，会使用静态资源的Hanlder来处理?&lt;/p&gt;
&lt;h2 id=&#34;springmvc提供了哪些handlermapping&#34;&gt;SpringMVC提供了哪些HandlerMapping?&lt;/h2&gt;
&lt;p&gt;SpringMVC提供的HanlderMapping位于 org.springframework.web.servlet.handler 包下，主要包含&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Mapping&lt;/th&gt;
					&lt;th&gt;Desc&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;RequestMappingHandlerMapping&lt;/td&gt;
					&lt;td&gt;处理@RequestMapping 注解映射关系&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;SimpleUrlHandlerMapping&lt;/td&gt;
					&lt;td&gt;使用URL模式匹配映射关系&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;BeanNameUrlHandlerMapping&lt;/td&gt;
					&lt;td&gt;基于Bean名匹配映射关系&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/CeRZGp.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h3 id=&#34;springmvc-路径映射流程回顾&#34;&gt;SpringMVC 路径映射流程回顾&lt;/h3&gt;
&lt;p&gt;回顾一下SpringMVC的路径映射流程，通常的url请求的编码方式为:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@RequestMapping&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;/ping&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Response&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;ping&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Response&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;success&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;pong&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;标识了 @RequestMapping 注解的方法会被 SpringMVC 框架的 RequestMappingHandlerMapping 类在启动时进行扫描并根据映射信息来创建 RequestMappingInfo(RequestMappingInfo 类维护请求的映射信息)，扫描后的所有Mapping信息在 MappingRegistry(AbstractHandlerMethodMapping内部类) 类进行维护&lt;/p&gt;
&lt;figure&gt;&lt;a href=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/D0VzNH.png&#34;&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/D0VzNH.png&#34;/&gt; &lt;/a&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;springmvc如何处理request与handlermethod的映射关系&#34;&gt;SpringMVC如何处理request与HandlerMethod的映射关系&lt;/h2&gt;
&lt;p&gt;AbstractHandlerMethodMapping的getHandler 方法用来通过给定的request来找到一个合适的handler进行处理
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/RobS4l.png&#34;&gt;
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/RqkBp1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;getHandler会先调用抽象方法 getHandlerInternal 由子类实现查找逻辑，如果找不到，则查找默认配置的Hanlder，默认Hanlder找不到则返回null&lt;/p&gt;
&lt;h2 id=&#34;springmvc默认使用了哪些handlermapping&#34;&gt;SpringMVC默认使用了哪些HandlerMapping&lt;/h2&gt;
&lt;p&gt;如何查询Handler是在 DispacherServlet的getHandler方法操作的，它会在所有的handlerMappings(有序handlerMapping)中查找出一个可用的handler进行request的处理
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/fR6ezN.png&#34;&gt;&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/kYtDXf.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;如图可知会在7个handlerMapping中依次进行查询，这些handlerMapping是在 &lt;code&gt;DispatcherServlet#initHandlerMappings()&lt;/code&gt;  设置的&lt;/p&gt;
&lt;h2 id=&#34;定位到问题原因&#34;&gt;定位到问题原因&lt;/h2&gt;
&lt;p&gt;跟踪请求代码发现对于不存在的url会在 SimpleUrlHanlderMapping中找到可用的handler，因为最终请求url匹配上了 /**，而 /** 模式对应的handler就是 ResourceHttpRequestHandler，此时getHandler的结果就是ResourceHttpRequestHandler 了，但是在上报时使用的是 HandlerMethod，执行到此时报了转换异常&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/FNSevN.png&#34;/&gt; 
&lt;/figure&gt;

&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/pBVyIz.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h2 id=&#34;webmvcautoconfiguration中的sourcehandler在哪注册的&#34;&gt;WebMvcAutoConfiguration中的SourceHandler在哪注册的？&lt;/h2&gt;
&lt;p&gt;在启用MVC功能时，会增加注解 @EnableWebMvc，而对应的MVC配置类为 WebMvcConfigurationSupport，在这个类中进行SourceHandler的注册。跟踪代码发现两个ResourceHandler是在 WebMvcAutoConfigurationAdapter中添加的&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 第14期</title>
      <link>http://blog.imcompany.cn/post/peng-week14/</link>
      <pubDate>Mon, 14 Apr 2025 18:06:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/peng-week14/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;h3 id=&#34;中国民航局颁发首批飞行出租车运营合格证&#34;&gt;&lt;a href=&#34;https://www.ehang.com/cn/&#34;&gt;中国民航局颁发首批飞行出租车运营合格证&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;看了一下宣传片，有机会要体验一下，空间上感觉坐两个人有些拥挤&lt;/p&gt;
&lt;h3 id=&#34;jetbrains-ides-go-ai-coding-agent-smarter-assistance-free-tier-the-jetbrains-blog&#34;&gt;&lt;a href=&#34;https://blog.jetbrains.com/blog/2025/04/16/jetbrains-ides-go-ai/&#34;&gt;JetBrains IDEs Go AI: Coding Agent, Smarter Assistance, Free Tier | The JetBrains Blog&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;JetBrains在最新的版本提供了可以免费使用的AI，目前看只有一个模型：Qwen Max&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/l8gMAQ.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;h3 id=&#34;vivaldi-browser-powerful-personal-and-private-web-browser&#34;&gt;&lt;a href=&#34;https://vivaldi.com/&#34;&gt;Vivaldi Browser | Powerful, Personal and Private web browser&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;由于近期的 FireFox 事件，要多装几个注重隐私的浏览器&lt;/p&gt;
&lt;h3 id=&#34;windsurf-editor-windsurf--formerly-codeium&#34;&gt;&lt;a href=&#34;https://windsurf.com/editor&#34;&gt;Windsurf Editor | Windsurf (formerly Codeium)&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;AI编辑器，大量使用价格具有性价比&lt;/p&gt;
&lt;h3 id=&#34;pypa-pipx-install-and-run-python-applications-in-isolated-environments&#34;&gt;&lt;a href=&#34;https://github.com/pypa/pipx&#34;&gt;pypa/pipx: Install and Run Python Applications in Isolated Environments&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;更方便的在隔离环境运行Python应用&lt;/p&gt;
&lt;h3 id=&#34;nomic-ai-gpt4all-gpt4all-run-local-llms-on-any-device-dot-open-source-and-available-for-commercial-use-dot&#34;&gt;&lt;a href=&#34;https://github.com/nomic-ai/gpt4all&#34;&gt;nomic-ai/gpt4all: GPT4All: Run Local LLMs on Any Device. Open-source and available for commercial use.&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;在命令行运行本地大模型，跨平台支持&lt;/p&gt;
&lt;h3 id=&#34;pronotes&#34;&gt;&lt;a href=&#34;https://www.pronotes.app/&#34;&gt;ProNotes&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;对Mac 的Notebook进行样式增强的APP，Pro版本带AI功能&lt;/p&gt;
&lt;h2 id=&#34;image-️&#34;&gt;Image 🖼️&lt;/h2&gt;
&lt;h2 id=&#34;speech&#34;&gt;Speech 💬&lt;/h2&gt;
&lt;p&gt;任何时候，都不要放弃自己的思考&lt;/p&gt;</description>
    </item>
    <item>
      <title>SpringMVC学习之Exception处理</title>
      <link>http://blog.imcompany.cn/post/spring-webmvc-exception/</link>
      <pubDate>Mon, 14 Apr 2025 11:04:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/spring-webmvc-exception/</guid>
      <description>&lt;h2 id=&#34;背景&#34;&gt;背景&lt;/h2&gt;
&lt;p&gt;开发过程中，会出现很多异常情况，比如RPC调用异常、请求参数异常，SpringMVC是如何处理异常信息的?&lt;/p&gt;
&lt;h2 id=&#34;spring处理异常的方式&#34;&gt;Spring处理异常的方式&lt;/h2&gt;
&lt;p&gt;Spring采用了全局的异常捕获统一处理的方式，虽然JAVA的异常机制一直有争议，但是Spring还是选择基于实际开发需要使用抛异常后捕获统一处理的方式&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/yZjYzc.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h2 id=&#34;handlerexceptionresolver登场&#34;&gt;HandlerExceptionResolver登场&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;HandlerExceptionResolver&lt;/code&gt; 是SpringMVC提供的解析Handler调用过程抛出异常的解析器，只提供了一个解析异常的方法 &lt;code&gt;resovleException&lt;/code&gt;&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/VTJMf6.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h3 id=&#34;spring提供了哪些exceptionresolver&#34;&gt;Spring提供了哪些ExceptionResolver?&lt;/h3&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/ndAxqw.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h4 id=&#34;经典的interface-abstract方式的实现类&#34;&gt;经典的Interface-Abstract方式的实现类&lt;/h4&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Resolver&lt;/th&gt;
					&lt;th&gt;Desc&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;SimpleMappingExceptionResolver&lt;/td&gt;
					&lt;td&gt;提供exception class name到view的映射&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;DefaultHandlerExceptionResolver&lt;/td&gt;
					&lt;td&gt;默认Resolver实现，用于解析标准的SpringMVC异常并转换成对应的Http状态码&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;ResponseStatusExceptionResolver&lt;/td&gt;
					&lt;td&gt;基于 @ResponseStatus 注解来映射异常与Http状态码&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;ExceptionHandlerExceptionResolver&lt;/td&gt;
					&lt;td&gt;基于 @ExceptionHalder 注解来解析处理异常信息&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&#34;直接实现handlerexceptionresolver的类&#34;&gt;直接实现HandlerExceptionResolver的类&lt;/h4&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Resolver&lt;/th&gt;
					&lt;th&gt;Desc&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;DefaultErrorAttributes&lt;/td&gt;
					&lt;td&gt;默认错误属性实现&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;HandlerExceptionResolverComposite&lt;/td&gt;
					&lt;td&gt;代理其它Resolver集合的ExceptionResolver&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;code&gt;HandlerExceptionResolverComposite&lt;/code&gt; 中包含了一个解析列表，可以判断是会排序后顺序调用，以找到第一个可以处理的Resolver&lt;/p&gt;
&lt;h2 id=&#34;具体异常处理流程&#34;&gt;具体异常处理流程&lt;/h2&gt;
&lt;p&gt;异常处理的核心逻辑都在 &lt;code&gt;processHandlerException&lt;/code&gt; 方法中，Spring处理完请求后，如果有异常抛出，则会把异常信息传给 &lt;code&gt;processHandlerException&lt;/code&gt; 方法， &lt;code&gt;processHandlerException&lt;/code&gt; 遍历持有的 handlerExceptionResolvers 进行对异常的解析，如果解析成功则直接返回对应的 ModelAndView(此返回与正常的handler处理返回保持了一致)&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/oQdSdj.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h3 id=&#34;handlerexceptionresolvers-有哪些&#34;&gt;handlerExceptionResolvers 有哪些？&lt;/h3&gt;
&lt;p&gt;在 SpringMVC启动时会调用 &lt;code&gt;initHandlerExceptionResolvers&lt;/code&gt; 方法来查找所有可用的 handlerExceptionResolver 并保存到 &lt;code&gt;handlerExceptionResolvers&lt;/code&gt; 变量中。SpringMVC配置了两个 resolver 来提供异常解析&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/ZkaEcp.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h4 id=&#34;errorattributes&#34;&gt;errorAttributes&lt;/h4&gt;
&lt;p&gt;此Resolver是在 &lt;code&gt;ErrorMvcAutoConfiguration&lt;/code&gt; 进行实例化的
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/lkrPBk.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;此实现的 resolverExcption 方法逻辑简单，直接返回了null，不是关注重点&lt;/p&gt;
&lt;h4 id=&#34;handlerexceptionresolver&#34;&gt;handlerExceptionResolver&lt;/h4&gt;
&lt;p&gt;此Resolver真正的实现类为 &lt;code&gt;HandlerExceptionResolverComposite&lt;/code&gt; ，也就是持有多个ExceptionResolver列表的 Resolver，它是在 &lt;code&gt;WebMvcConfigurationSupport&lt;/code&gt; 实例化的&lt;/p&gt;</description>
    </item>
    <item>
      <title>SpringMVC统一配置接口WebMvcConfigurer功能</title>
      <link>http://blog.imcompany.cn/post/spring-webmvcconfigurer/</link>
      <pubDate>Fri, 28 Mar 2025 18:18:10 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/spring-webmvcconfigurer/</guid>
      <description>&lt;h2 id=&#34;接口说明&#34;&gt;接口说明&lt;/h2&gt;
&lt;p&gt;WebMvcConfigurer是Spring提供的统一配置接口，用于自定义Spring MVC的配置，全局更改服务的行为，提供的可配置项：
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/NGXzbc.png&#34;&gt;&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;方法名称&lt;/th&gt;
					&lt;th&gt;参数&lt;/th&gt;
					&lt;th&gt;用途&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;addArgumentResolvers(List&amp;lt;HandlerMethodArgumentResolver&amp;gt; argumentResolvers)&lt;/td&gt;
					&lt;td&gt;List&amp;lt;HandlerMethodArgumentResolver&amp;gt; argumentResolvers&lt;/td&gt;
					&lt;td&gt;添加自定义的 HandlerMethodArgumentResolver 用于解析方法参数。&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;addCorsMappings(CorsRegistry registry)&lt;/td&gt;
					&lt;td&gt;CorsRegistry registry&lt;/td&gt;
					&lt;td&gt;配置跨域资源共享 (CORS)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;addFormatters(FormatterRegistry registry)&lt;/td&gt;
					&lt;td&gt;FormatterRegistry registry&lt;/td&gt;
					&lt;td&gt;添加自定义的格式化程序和转换器&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;addInterceptors(InterceptorRegistry registry)&lt;/td&gt;
					&lt;td&gt;InterceptorRegistry registry&lt;/td&gt;
					&lt;td&gt;添加自定义的拦截器&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;addRequestMappings(RequestMappingInfo customization, Class&amp;lt;Controller&amp;gt; controllerClass)&lt;/td&gt;
					&lt;td&gt;RequestMappingInfo customization, Class&amp;lt;Controller&amp;gt; controllerClass&lt;/td&gt;
					&lt;td&gt;关联自定义请求映射到具控制器类&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;addResourceHandlers(ResourceHandlerRegistry registry)&lt;/td&gt;
					&lt;td&gt;ResourceHandlerRegistry registry&lt;/td&gt;
					&lt;td&gt;配置资源处理，如静态资源路径&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;addReturnValueHandlers(List&amp;lt;HandlerMethodReturnValueHandler&amp;gt; returnValueHandlers)&lt;/td&gt;
					&lt;td&gt;List&amp;lt;HandlerMethodReturnValueHandler&amp;gt; returnValueHandlers&lt;/td&gt;
					&lt;td&gt;添加自定义的 HandlerMethodReturnValueHandler 用于处理方法返回值&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;addViewControllers(ViewControllerRegistry registry)&lt;/td&gt;
					&lt;td&gt;ViewControllerRegistry registry&lt;/td&gt;
					&lt;td&gt;注册视图控制器&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;configureAsyncSupport(AsyncSupportConfigurer configurer)&lt;/td&gt;
					&lt;td&gt;AsyncSupportConfigurer configurer&lt;/td&gt;
					&lt;td&gt;配置异步支持&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;configureContentNegotiation(ContentNegotiationConfigurer configurer)&lt;/td&gt;
					&lt;td&gt;ContentNegotiationConfigurer configurer&lt;/td&gt;
					&lt;td&gt;配置内容协商策略&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer)&lt;/td&gt;
					&lt;td&gt;DefaultServletHandlerConfigurer configurer&lt;/td&gt;
					&lt;td&gt;启用默认 Servlet 处理&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;configureHandlerExceptionResolvers(List&amp;lt;HandlerExceptionResolver&amp;gt; exceptionResolvers)&lt;/td&gt;
					&lt;td&gt;List&amp;lt;HandlerExceptionResolver&amp;gt; exceptionResolvers&lt;/td&gt;
					&lt;td&gt;配置异常处理程序&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;configureMessageConverters(List&amp;lt;HttpMessageConverter&amp;lt;?&amp;gt;&amp;gt; converters)&lt;/td&gt;
					&lt;td&gt;List&amp;lt;HttpMessageConverter&amp;lt;?&amp;gt;&amp;gt; converters&lt;/td&gt;
					&lt;td&gt;配置自定义的 HttpMessageConverter&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;configurePathMatch(PathMatchConfigurer configurer)&lt;/td&gt;
					&lt;td&gt;PathMatchConfigurer configurer&lt;/td&gt;
					&lt;td&gt;配置路径匹配规则&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;configureViewResolvers(ViewResolverRegistry registry)&lt;/td&gt;
					&lt;td&gt;ViewResolverRegistry registry&lt;/td&gt;
					&lt;td&gt;配置视图解析器&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;extendHandlerExceptionResolvers(List&amp;lt;HandlerExceptionResolver&amp;gt; exceptionResolvers)&lt;/td&gt;
					&lt;td&gt;List&amp;lt;HandlerExceptionResolver&amp;gt; exceptionResolvers&lt;/td&gt;
					&lt;td&gt;扩展异常处理程序&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;extendMessageConverters(List&amp;lt;HttpMessageConverter&amp;lt;?&amp;gt;&amp;gt; converters)&lt;/td&gt;
					&lt;td&gt;List&amp;lt;HttpMessageConverter&amp;lt;?&amp;gt;&amp;gt; converters&lt;/td&gt;
					&lt;td&gt;扩展自定义的 HttpMessageConverter&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;extendInterceptors(List&amp;lt;HandlerInterceptor&amp;gt; interceptors)&lt;/td&gt;
					&lt;td&gt;List&amp;lt;HandlerInterceptor&amp;gt; interceptors&lt;/td&gt;
					&lt;td&gt;扩展拦截器&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;extendArgumentResolvers(List&amp;lt;HandlerMethodArgumentResolver&amp;gt; argumentResolvers)&lt;/td&gt;
					&lt;td&gt;List&amp;lt;HandlerMethodArgumentResolver&amp;gt; argumentResolvers&lt;/td&gt;
					&lt;td&gt;扩展自定义的 HandlerMethodArgumentResolver 用于解析方法参数。&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;extendReturnValueHandlers(List&amp;lt;HandlerMethodReturnValueHandler&amp;gt; returnValueHandlers)&lt;/td&gt;
					&lt;td&gt;List&amp;lt;HandlerMethodReturnValueHandler&amp;gt; returnValueHandlers&lt;/td&gt;
					&lt;td&gt;扩展自定义的 HandlerMethodReturnValueHandler 用于处理方法返回值。&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;extendViewResolvers(List&amp;lt;ViewResolver&amp;gt; viewResolvers)&lt;/td&gt;
					&lt;td&gt;List&amp;lt;ViewResolver&amp;gt; viewResolvers&lt;/td&gt;
					&lt;td&gt;扩展视图解析器&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;关联类&#34;&gt;关联类&lt;/h2&gt;
&lt;h3 id=&#34;webmvcconfigurationsupport&#34;&gt;WebMvcConfigurationSupport&lt;/h3&gt;
&lt;h3 id=&#34;enablewebmvc&#34;&gt;EnableWebMvc&lt;/h3&gt;
&lt;h2 id=&#34;接口常用方法&#34;&gt;接口常用方法&lt;/h2&gt;
&lt;p&gt;接口提供了将近20个方法对Spring的配置进行调整，本次只针对常用的Rest接口开发相关内容进行展开学习研究&lt;/p&gt;</description>
    </item>
    <item>
      <title>收集的Cursor信息</title>
      <link>http://blog.imcompany.cn/post/ai-cursor/</link>
      <pubDate>Tue, 25 Feb 2025 18:55:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/ai-cursor/</guid>
      <description>&lt;p&gt;整理收集的关于Cursor编辑器的信息&lt;/p&gt;
&lt;h2 id=&#34;features-cursor-the-ai-code-editor&#34;&gt;&lt;a href=&#34;https://www.cursor.com/features&#34;&gt;Features | Cursor - The AI Code Editor&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;cursor-directory-cursor-rules-and-mcp-servers&#34;&gt;&lt;a href=&#34;https://cursor.directory/&#34;&gt;Cursor Directory - Cursor Rules &amp;amp; MCP Servers&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;eastlondoner-cursor-tools-give-cursor-agent-an-ai-team-and-advanced-skills&#34;&gt;&lt;a href=&#34;https://github.com/eastlondoner/cursor-tools&#34;&gt;eastlondoner/cursor-tools: Give Cursor Agent an AI Team and Advanced Skills&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;学习-cursor-拥抱-ai-编程-cursor-101&#34;&gt;&lt;a href=&#34;https://cursor101.com/zh&#34;&gt;学习 Cursor ，拥抱 AI 编程 | Cursor 101&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;patrickjs-awesome-cursorrules-a-curated-list-of-awesome-dot-cursorrules-files&#34;&gt;&lt;a href=&#34;https://github.com/PatrickJS/awesome-cursorrules&#34;&gt;PatrickJS/awesome-cursorrules: 📄 A curated list of awesome .cursorrules files&lt;/a&gt;&lt;/h2&gt;</description>
    </item>
    <item>
      <title>大鹏慢读-tomyli的读书2025</title>
      <link>http://blog.imcompany.cn/post/peng-read-2025/</link>
      <pubDate>Fri, 17 Jan 2025 15:55:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/peng-read-2025/</guid>
      <description>&lt;h2 id=&#34;非暴力沟通&#34;&gt;&lt;!-- raw HTML omitted --&gt;DONE&lt;!-- raw HTML omitted --&gt; 非暴力沟通&lt;/h2&gt;
&lt;h2 id=&#34;金榜题名之后&#34;&gt;&lt;!-- raw HTML omitted --&gt;DONE&lt;!-- raw HTML omitted --&gt; 金榜题名之后&lt;/h2&gt;
&lt;h2 id=&#34;我的二本学生&#34;&gt;&lt;!-- raw HTML omitted --&gt;DONE&lt;!-- raw HTML omitted --&gt; 我的二本学生&lt;/h2&gt;
&lt;h2 id=&#34;芯片战争&#34;&gt;&lt;!-- raw HTML omitted --&gt;DONE&lt;!-- raw HTML omitted --&gt; 芯片战争&lt;/h2&gt;
&lt;h2 id=&#34;万历十五年&#34;&gt;&lt;!-- raw HTML omitted --&gt;DONE&lt;!-- raw HTML omitted --&gt; 万历十五年&lt;/h2&gt;
&lt;h2 id=&#34;万历十五年欧洲那些事儿&#34;&gt;&lt;!-- raw HTML omitted --&gt;DONE&lt;!-- raw HTML omitted --&gt; 万历十五年欧洲那些事儿&lt;/h2&gt;
&lt;h2 id=&#34;我看见的世界&#34;&gt;&lt;!-- raw HTML omitted --&gt;DONE&lt;!-- raw HTML omitted --&gt; 我看见的世界&lt;/h2&gt;
&lt;h2 id=&#34;英伟达之道&#34;&gt;&lt;!-- raw HTML omitted --&gt;DONE&lt;!-- raw HTML omitted --&gt; 英伟达之道&lt;/h2&gt;
&lt;h2 id=&#34;可能性的艺术&#34;&gt;&lt;!-- raw HTML omitted --&gt;DONE&lt;!-- raw HTML omitted --&gt; 可能性的艺术&lt;/h2&gt;
&lt;h2 id=&#34;邓小平时代&#34;&gt;&lt;!-- raw HTML omitted --&gt;DONE&lt;!-- raw HTML omitted --&gt; 邓小平时代&lt;/h2&gt;
&lt;h2 id=&#34;他影响了中国-陈云&#34;&gt;&lt;!-- raw HTML omitted --&gt;DONE&lt;!-- raw HTML omitted --&gt; 《他影响了中国：陈云》&lt;/h2&gt;
&lt;h2 id=&#34;伟大的道路&#34;&gt;&lt;!-- raw HTML omitted --&gt;CANCELLED&lt;!-- raw HTML omitted --&gt; 伟大的道路 &lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;CANCELLED&lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;&lt;/h2&gt;
&lt;h2 id=&#34;简读中国史&#34;&gt;&lt;!-- raw HTML omitted --&gt;DONE&lt;!-- raw HTML omitted --&gt; 简读中国史&lt;/h2&gt;
&lt;h2 id=&#34;20世纪简史&#34;&gt;&lt;!-- raw HTML omitted --&gt;STARTED&lt;!-- raw HTML omitted --&gt; 20世纪简史&lt;/h2&gt;
&lt;h2 id=&#34;超越感觉&#34;&gt;&lt;!-- raw HTML omitted --&gt;TODO&lt;!-- raw HTML omitted --&gt; 超越感觉&lt;/h2&gt;
&lt;h2 id=&#34;练习的心态&#34;&gt;&lt;!-- raw HTML omitted --&gt;TODO&lt;!-- raw HTML omitted --&gt; 练习的心态&lt;/h2&gt;</description>
    </item>
    <item>
      <title>收集的羽毛球技巧</title>
      <link>http://blog.imcompany.cn/post/badminton/</link>
      <pubDate>Thu, 12 Dec 2024 09:55:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/badminton/</guid>
      <description>&lt;h2 id=&#34;说明&#34;&gt;说明&lt;/h2&gt;
&lt;p&gt;最近痴迷于羽毛球，记录一下自己学习过程中的个人认为有用的，可实践提升能力的内容&lt;/p&gt;
&lt;h2 id=&#34;资源&#34;&gt;资源&lt;/h2&gt;
&lt;h3 id=&#34;杨晨大神视频专辑-杨晨大神视频合集-哔哩哔哩视频&#34;&gt;&lt;a href=&#34;https://space.bilibili.com/244425266/lists&#34;&gt;杨晨大神视频专辑-杨晨大神视频合集-哔哩哔哩视频&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;目前主要看了训练笔记系列&lt;/p&gt;
&lt;h3 id=&#34;郑思维-哔哩哔哩-bilibili&#34;&gt;&lt;a href=&#34;https://search.bilibili.com/all?keyword=%E9%83%91%E6%80%9D%E7%BB%B4&amp;amp;search_source=5&#34;&gt;郑思维-哔哩哔哩_bilibili&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;所有的羽球思维视频都看了&lt;/p&gt;
&lt;h3 id=&#34;羽毛球汤老师的个人空间-羽毛球汤老师个人主页-哔哩哔哩视频&#34;&gt;&lt;a href=&#34;https://space.bilibili.com/149538127&#34;&gt;羽毛球汤老师的个人空间-羽毛球汤老师个人主页-哔哩哔哩视频&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;羽毛球教练&lt;/p&gt;
&lt;h3 id=&#34;黄广益羽球的个人空间-黄广益羽球个人主页-哔哩哔哩视频&#34;&gt;&lt;a href=&#34;https://space.bilibili.com/1005566164?spm_id_from=333.1387.follow.user_card.click&#34;&gt;黄广益羽球的个人空间-黄广益羽球个人主页-哔哩哔哩视频&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;B站上关注与播放都不多，但是有些视频给我的实战解惑了&lt;/p&gt;
&lt;h3 id=&#34;羽毛球技巧-youtube&#34;&gt;&lt;a href=&#34;https://www.youtube.com/playlist?list=PL81pOstN1JRADSpPznuup7vt0Ps7bi0-y&#34;&gt;羽毛球技巧 - YouTube&lt;/a&gt;&lt;/h3&gt;
&lt;h3 id=&#34;刘辉羽毛球视频专辑-刘辉羽毛球视频合集-哔哩哔哩视频&#34;&gt;&lt;a href=&#34;https://space.bilibili.com/695650470/lists&#34;&gt;刘辉羽毛球视频专辑-刘辉羽毛球视频合集-哔哩哔哩视频&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;最近一直在看的，讲技术还讲原理&lt;/p&gt;
&lt;h2 id=&#34;招式&#34;&gt;招式&lt;/h2&gt;
&lt;h3 id=&#34;杀球&#34;&gt;杀球&lt;/h3&gt;
&lt;h4 id=&#34;杀斜线身体最好朝向对角线方向&#34;&gt;杀斜线身体最好朝向对角线方向&lt;/h4&gt;
&lt;h4 id=&#34;跳杀时是略向前跳&#34;&gt;跳杀时是略向前跳&lt;/h4&gt;
&lt;h4 id=&#34;杀球时要想象在是比赛&#34;&gt;杀球时要想象在是比赛&lt;/h4&gt;
&lt;h4 id=&#34;右脚的势能转移到左脚上--并步运动&#34;&gt;右脚的势能转移到左脚上(并步运动)&lt;/h4&gt;
&lt;h3 id=&#34;高远&#34;&gt;高远&lt;/h3&gt;
&lt;h4 id=&#34;向上将球推出的感觉&#34;&gt;向上将球推出的感觉&lt;/h4&gt;
&lt;h4 id=&#34;击球点头顶正上方&#34;&gt;击球点头顶正上方&lt;/h4&gt;
&lt;h4 id=&#34;球拍接触球前所积蓄的力量-是打远距离和高强度的重要因素&#34;&gt;球拍接触球前所积蓄的力量，是打远距离和高强度的重要因素&lt;/h4&gt;
&lt;h4 id=&#34;反手&#34;&gt;反手&lt;/h4&gt;
&lt;p&gt;运动同时加入扭转，一边蓄力一边移动&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;练习&lt;/p&gt;
&lt;p&gt;反手最大限度扔羽毛球&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;平高球&#34;&gt;平高球&lt;/h3&gt;
&lt;p&gt;在对方已经站好接杀位置时压对方到后场&lt;/p&gt;
&lt;h3 id=&#34;吊球&#34;&gt;吊球&lt;/h3&gt;
&lt;p&gt;摆好准备姿势比杀球和高远球更重要&lt;/p&gt;
&lt;h3 id=&#34;劈吊&#34;&gt;劈吊&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;动作和打杀球一样&lt;/li&gt;
&lt;li&gt;在学好吊对角线后再来学&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;挑球&#34;&gt;挑球&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;脚尖对准来球方向&lt;/li&gt;
&lt;li&gt;躯干与跨步的稳定性更重要
&lt;ol&gt;
&lt;li&gt;挺胸直背&lt;/li&gt;
&lt;li&gt;迈步时躯干的强度及骨盆的灵活性&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;正手&#34;&gt;正手&lt;/h4&gt;
&lt;p&gt;球拍由下向上挥非常重要&lt;/p&gt;
&lt;h4 id=&#34;反手&#34;&gt;反手&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;握拍时，拇指一定要坚起来，挥拍感觉由下向上扫&lt;/li&gt;
&lt;li&gt;击球时，感觉是拇指将球推出&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;放网前球&#34;&gt;放网前球&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;球拍向身体正前方抬起&lt;/li&gt;
&lt;li&gt;球拍高度与网上面的白布条一致&lt;/li&gt;
&lt;li&gt;球拍向上托的感觉&lt;/li&gt;
&lt;li&gt;反手放网前球比正手击球时要略低，击球前最好左脚后蹬来提高击球高度&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;网前平搓&#34;&gt;&lt;!-- raw HTML omitted --&gt;TODO&lt;!-- raw HTML omitted --&gt; 网前平搓&lt;/h3&gt;
&lt;h4 id=&#34;要点&#34;&gt;要点&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;搓击幅度要小&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;推球&#34;&gt;推球&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;球拍向上举起，向网前移动&lt;/li&gt;
&lt;li&gt;击球时蹬地起跳，出拍迎球&lt;/li&gt;
&lt;li&gt;只靠手腕力量击球的感觉&lt;/li&gt;
&lt;li&gt;击球后身体不要过渡前倾，为下一拍做准备&lt;/li&gt;
&lt;li&gt;双打比赛前场推球不能直接得分要做好多拍准备&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;扣杀&#34;&gt;扣杀&lt;/h3&gt;
&lt;h3 id=&#34;吊球&#34;&gt;吊球&lt;/h3&gt;
&lt;h4 id=&#34;轻吊&#34;&gt;轻吊&lt;/h4&gt;
&lt;h4 id=&#34;收吊&#34;&gt;收吊&lt;/h4&gt;
&lt;h4 id=&#34;滑拍吊&#34;&gt;滑拍吊&lt;/h4&gt;
&lt;h4 id=&#34;劈吊&#34;&gt;劈吊&lt;/h4&gt;
&lt;h4 id=&#34;拦吊&#34;&gt;拦吊&lt;/h4&gt;
&lt;h3 id=&#34;接发球&#34;&gt;接发球&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;应对对方强杀&lt;/li&gt;
&lt;li&gt;重点：拍面与来球方向一致&lt;/li&gt;
&lt;li&gt;接发球前骨盆前屈，是强有力接球的主要原因&lt;/li&gt;
&lt;li&gt;从身体发力&lt;/li&gt;
&lt;li&gt;小指的练习非常重要&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;正手&#34;&gt;正手&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;重心在左脚拇指上，不要抬脚后跟&lt;/li&gt;
&lt;li&gt;借力打力&lt;/li&gt;
&lt;li&gt;在拍面与球网平行的位置击球&lt;/li&gt;
&lt;li&gt;身体重心迅速跟进&lt;/li&gt;
&lt;li&gt;在身体的正面击球&lt;/li&gt;
&lt;li&gt;利用膝盖的屈伸力量&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;反手&#34;&gt;反手&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;向后撤拍&lt;/li&gt;
&lt;li&gt;球和身体的距离不长于一个球拍的长度就用反手&lt;/li&gt;
&lt;li&gt;在拍面与球网平行的位置击球&lt;/li&gt;
&lt;li&gt;身体重心迅速跟进&lt;/li&gt;
&lt;li&gt;要大幅度挥拍，尽可能往远打&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;建议&#34;&gt;建议&lt;/h4&gt;
&lt;p&gt;接发球不能形成对打，则可以放慢球速&lt;/p&gt;</description>
    </item>
    <item>
      <title>收集的羽毛球技巧</title>
      <link>http://blog.imcompany.cn/posts/badminton/</link>
      <pubDate>Thu, 12 Dec 2024 09:55:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/posts/badminton/</guid>
      <description>&lt;h2 id=&#34;说明&#34;&gt;说明&lt;/h2&gt;
&lt;p&gt;最近痴迷于羽毛球，记录一下自己学习过程中的个人认为有用的，可实践提升能力的内容&lt;/p&gt;
&lt;h2 id=&#34;资源&#34;&gt;资源&lt;/h2&gt;
&lt;h3 id=&#34;杨晨大神视频专辑-杨晨大神视频合集-哔哩哔哩视频&#34;&gt;&lt;a href=&#34;https://space.bilibili.com/244425266/lists&#34;&gt;杨晨大神视频专辑-杨晨大神视频合集-哔哩哔哩视频&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;目前主要看了训练笔记系列&lt;/p&gt;
&lt;h3 id=&#34;郑思维-哔哩哔哩-bilibili&#34;&gt;&lt;a href=&#34;https://search.bilibili.com/all?keyword=%E9%83%91%E6%80%9D%E7%BB%B4&amp;amp;search_source=5&#34;&gt;郑思维-哔哩哔哩_bilibili&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;所有的羽球思维视频都看了&lt;/p&gt;
&lt;h3 id=&#34;羽毛球汤老师的个人空间-羽毛球汤老师个人主页-哔哩哔哩视频&#34;&gt;&lt;a href=&#34;https://space.bilibili.com/149538127&#34;&gt;羽毛球汤老师的个人空间-羽毛球汤老师个人主页-哔哩哔哩视频&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;羽毛球教练&lt;/p&gt;
&lt;h3 id=&#34;黄广益羽球的个人空间-黄广益羽球个人主页-哔哩哔哩视频&#34;&gt;&lt;a href=&#34;https://space.bilibili.com/1005566164?spm_id_from=333.1387.follow.user_card.click&#34;&gt;黄广益羽球的个人空间-黄广益羽球个人主页-哔哩哔哩视频&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;B站上关注与播放都不多，但是有些视频给我的实战解惑了&lt;/p&gt;
&lt;h3 id=&#34;羽毛球技巧-youtube&#34;&gt;&lt;a href=&#34;https://www.youtube.com/playlist?list=PL81pOstN1JRADSpPznuup7vt0Ps7bi0-y&#34;&gt;羽毛球技巧 - YouTube&lt;/a&gt;&lt;/h3&gt;
&lt;h3 id=&#34;刘辉羽毛球视频专辑-刘辉羽毛球视频合集-哔哩哔哩视频&#34;&gt;&lt;a href=&#34;https://space.bilibili.com/695650470/lists&#34;&gt;刘辉羽毛球视频专辑-刘辉羽毛球视频合集-哔哩哔哩视频&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;最近一直在看的，讲技术还讲原理&lt;/p&gt;
&lt;h2 id=&#34;招式&#34;&gt;招式&lt;/h2&gt;
&lt;h3 id=&#34;杀球&#34;&gt;杀球&lt;/h3&gt;
&lt;h4 id=&#34;杀斜线身体最好朝向对角线方向&#34;&gt;杀斜线身体最好朝向对角线方向&lt;/h4&gt;
&lt;h4 id=&#34;跳杀时是略向前跳&#34;&gt;跳杀时是略向前跳&lt;/h4&gt;
&lt;h4 id=&#34;杀球时要想象在是比赛&#34;&gt;杀球时要想象在是比赛&lt;/h4&gt;
&lt;h4 id=&#34;右脚的势能转移到左脚上--并步运动&#34;&gt;右脚的势能转移到左脚上(并步运动)&lt;/h4&gt;
&lt;h3 id=&#34;高远&#34;&gt;高远&lt;/h3&gt;
&lt;h4 id=&#34;向上将球推出的感觉&#34;&gt;向上将球推出的感觉&lt;/h4&gt;
&lt;h4 id=&#34;击球点头顶正上方&#34;&gt;击球点头顶正上方&lt;/h4&gt;
&lt;h4 id=&#34;球拍接触球前所积蓄的力量-是打远距离和高强度的重要因素&#34;&gt;球拍接触球前所积蓄的力量，是打远距离和高强度的重要因素&lt;/h4&gt;
&lt;h4 id=&#34;反手&#34;&gt;反手&lt;/h4&gt;
&lt;p&gt;运动同时加入扭转，一边蓄力一边移动&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;练习&lt;/p&gt;
&lt;p&gt;反手最大限度扔羽毛球&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;平高球&#34;&gt;平高球&lt;/h3&gt;
&lt;p&gt;在对方已经站好接杀位置时压对方到后场&lt;/p&gt;
&lt;h3 id=&#34;吊球&#34;&gt;吊球&lt;/h3&gt;
&lt;p&gt;摆好准备姿势比杀球和高远球更重要&lt;/p&gt;
&lt;h3 id=&#34;劈吊&#34;&gt;劈吊&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;动作和打杀球一样&lt;/li&gt;
&lt;li&gt;在学好吊对角线后再来学&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;挑球&#34;&gt;挑球&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;脚尖对准来球方向&lt;/li&gt;
&lt;li&gt;躯干与跨步的稳定性更重要
&lt;ol&gt;
&lt;li&gt;挺胸直背&lt;/li&gt;
&lt;li&gt;迈步时躯干的强度及骨盆的灵活性&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;正手&#34;&gt;正手&lt;/h4&gt;
&lt;p&gt;球拍由下向上挥非常重要&lt;/p&gt;
&lt;h4 id=&#34;反手&#34;&gt;反手&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;握拍时，拇指一定要坚起来，挥拍感觉由下向上扫&lt;/li&gt;
&lt;li&gt;击球时，感觉是拇指将球推出&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;放网前球&#34;&gt;放网前球&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;球拍向身体正前方抬起&lt;/li&gt;
&lt;li&gt;球拍高度与网上面的白布条一致&lt;/li&gt;
&lt;li&gt;球拍向上托的感觉&lt;/li&gt;
&lt;li&gt;反手放网前球比正手击球时要略低，击球前最好左脚后蹬来提高击球高度&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;网前平搓&#34;&gt;&lt;!-- raw HTML omitted --&gt;TODO&lt;!-- raw HTML omitted --&gt; 网前平搓&lt;/h3&gt;
&lt;h4 id=&#34;要点&#34;&gt;要点&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;搓击幅度要小&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;推球&#34;&gt;推球&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;球拍向上举起，向网前移动&lt;/li&gt;
&lt;li&gt;击球时蹬地起跳，出拍迎球&lt;/li&gt;
&lt;li&gt;只靠手腕力量击球的感觉&lt;/li&gt;
&lt;li&gt;击球后身体不要过渡前倾，为下一拍做准备&lt;/li&gt;
&lt;li&gt;双打比赛前场推球不能直接得分要做好多拍准备&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;扣杀&#34;&gt;扣杀&lt;/h3&gt;
&lt;h3 id=&#34;吊球&#34;&gt;吊球&lt;/h3&gt;
&lt;h4 id=&#34;轻吊&#34;&gt;轻吊&lt;/h4&gt;
&lt;h4 id=&#34;收吊&#34;&gt;收吊&lt;/h4&gt;
&lt;h4 id=&#34;滑拍吊&#34;&gt;滑拍吊&lt;/h4&gt;
&lt;h4 id=&#34;劈吊&#34;&gt;劈吊&lt;/h4&gt;
&lt;h4 id=&#34;拦吊&#34;&gt;拦吊&lt;/h4&gt;
&lt;h3 id=&#34;接发球&#34;&gt;接发球&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;应对对方强杀&lt;/li&gt;
&lt;li&gt;重点：拍面与来球方向一致&lt;/li&gt;
&lt;li&gt;接发球前骨盆前屈，是强有力接球的主要原因&lt;/li&gt;
&lt;li&gt;从身体发力&lt;/li&gt;
&lt;li&gt;小指的练习非常重要&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;正手&#34;&gt;正手&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;重心在左脚拇指上，不要抬脚后跟&lt;/li&gt;
&lt;li&gt;借力打力&lt;/li&gt;
&lt;li&gt;在拍面与球网平行的位置击球&lt;/li&gt;
&lt;li&gt;身体重心迅速跟进&lt;/li&gt;
&lt;li&gt;在身体的正面击球&lt;/li&gt;
&lt;li&gt;利用膝盖的屈伸力量&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;反手&#34;&gt;反手&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;向后撤拍&lt;/li&gt;
&lt;li&gt;球和身体的距离不长于一个球拍的长度就用反手&lt;/li&gt;
&lt;li&gt;在拍面与球网平行的位置击球&lt;/li&gt;
&lt;li&gt;身体重心迅速跟进&lt;/li&gt;
&lt;li&gt;要大幅度挥拍，尽可能往远打&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;建议&#34;&gt;建议&lt;/h4&gt;
&lt;p&gt;接发球不能形成对打，则可以放慢球速&lt;/p&gt;</description>
    </item>
    <item>
      <title>近期收集的关于健康的知识与好物品</title>
      <link>http://blog.imcompany.cn/post/health/</link>
      <pubDate>Mon, 09 Dec 2024 10:55:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/health/</guid>
      <description>&lt;h2 id=&#34;ansonznl-rehabilitationguide-颈椎病腰突康复指南-为程序员群体提供简单可靠的康复指南&#34;&gt;&lt;a href=&#34;https://github.com/AnsonZnl/RehabilitationGuide&#34;&gt;AnsonZnl/RehabilitationGuide: 颈椎病腰突康复指南，为程序员群体提供简单可靠的康复指南。&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;zijie0-humansystemoptimization-健康学习到150岁-人体系统调优不完全指南&#34;&gt;&lt;a href=&#34;https://github.com/zijie0/HumanSystemOptimization&#34;&gt;zijie0/HumanSystemOptimization: 健康学习到150岁 - 人体系统调优不完全指南&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;京东京造即食型益生菌粉&#34;&gt;京东京造即食型益生菌粉&lt;/h2&gt;
&lt;h2 id=&#34;每两年更换一次枕头-床单每周至少清洗一次&#34;&gt;每两年更换一次枕头，床单每周至少清洗一次&lt;/h2&gt;
&lt;h2 id=&#34;中餐烹饪中-实际上橄榄油没有精炼芥菜籽油-市面上绝大多数芥菜籽油-耐高温和稳定&#34;&gt;中餐烹饪中，实际上橄榄油没有精炼芥菜籽油（市面上绝大多数芥菜籽油）耐高温和稳定。&lt;/h2&gt;
&lt;h2 id=&#34;健身app首推-训记-详细的动作教程与训练记录-书籍优选-肌力训练图解圣经-京东外文书店有售-彩色印刷-图解每一个动作训练到的肌肉和拉伸教程&#34;&gt;健身APP首推：训记&amp;ndash;详细的动作教程与训练记录；书籍优选：肌力训练图解圣经-京东外文书店有售&amp;ndash;彩色印刷，图解每一个动作训练到的肌肉和拉伸教程&lt;/h2&gt;
&lt;p&gt;健身有以上两项既可，有钱还可以请一个月的私教指导一下动作细节既可。&lt;/p&gt;
&lt;h2 id=&#34;早起不要刷牙-先咽口水补充肠道菌群&#34;&gt;早起不要刷牙，先咽口水补充肠道菌群&lt;/h2&gt;
&lt;p&gt;因为晚上细菌会在口腔内为繁殖，吞入后可以补充菌群。&lt;/p&gt;
&lt;h2 id=&#34;血糖平衡&#34;&gt;血糖平衡&lt;/h2&gt;
&lt;p&gt;餐前喝兑水的醋(苹果醋)或者柠檬水，来减缓食物分解速度&lt;/p&gt;
&lt;h2 id=&#34;定时轮换站着和坐着-最好坐着工作每20到30分钟-就站起来运动1-2分钟&#34;&gt;定时轮换站着和坐着。最好坐着工作每20到30分钟，就站起来运动1-2分钟&lt;/h2&gt;</description>
    </item>
    <item>
      <title>这些年收集的好物</title>
      <link>http://blog.imcompany.cn/post/tomy-goods/</link>
      <pubDate>Thu, 05 Dec 2024 09:55:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/tomy-goods/</guid>
      <description>&lt;h2 id=&#34;nuphy-air75&#34;&gt;NuPhy Air75&lt;/h2&gt;
&lt;p&gt;已入，用着舒服&lt;/p&gt;
&lt;h2 id=&#34;拓竹-3d-打印机&#34;&gt;拓竹 3D 打印机&lt;/h2&gt;
&lt;h2 id=&#34;iherb-vitamins-supplements-natural-health-products&#34;&gt;&lt;a href=&#34;https://hk.iherb.com/&#34;&gt;iHerb | Vitamins, Supplements, Natural Health Products&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;亚朵深睡枕-pro-2-dot-0&#34;&gt;亚朵深睡枕 pro 2.0&lt;/h2&gt;
&lt;h2 id=&#34;神秘农场-2-day-assault-背包&#34;&gt;神秘农场 2 Day Assault 背包&lt;/h2&gt;
&lt;h2 id=&#34;液体创可贴&#34;&gt;液体创可贴&lt;/h2&gt;
&lt;h2 id=&#34;无印良品搓澡泥-植萃去角质磨砂膏&#34;&gt;无印良品搓澡泥: 植萃去角质磨砂膏&lt;/h2&gt;
&lt;h2 id=&#34;dawn-power-wash清洁&#34;&gt;Dawn Power Wash清洁&lt;/h2&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/m11bZx.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h2 id=&#34;纳米布&#34;&gt;纳米布&lt;/h2&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/wD5Jir.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h2 id=&#34;迪卡龙速干短袖&#34;&gt;迪卡龙速干短袖&lt;/h2&gt;
&lt;h2 id=&#34;地平线8号旅行箱&#34;&gt;地平线8号旅行箱&lt;/h2&gt;
&lt;h2 id=&#34;优衣库平替袜子&#34;&gt;优衣库平替袜子&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://detail.1688.com/offer/737558590589.html&#34;&gt;https://detail.1688.com/offer/737558590589.html&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;上海博友指甲刀&#34;&gt;上海博友指甲刀&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://s.click.taobao.com/JF8rn3u&#34;&gt;https://s.click.taobao.com/JF8rn3u&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;ubnt-的-er-x千兆路由&#34;&gt;Ubnt 的 ER-X千兆路由&lt;/h2&gt;
&lt;h2 id=&#34;aoc-am400p-显示器支架&#34;&gt;AOC AM400P 显示器支架&lt;/h2&gt;
&lt;h2 id=&#34;迪卡侬浴巾&#34;&gt;迪卡侬浴巾&lt;/h2&gt;
&lt;h2 id=&#34;stanley-折叠推车&#34;&gt;stanley 折叠推车&lt;/h2&gt;
&lt;h2 id=&#34;鞋&#34;&gt;鞋&lt;/h2&gt;
&lt;p&gt;lululemon blissfell2&lt;/p&gt;
&lt;h2 id=&#34;手机壳&#34;&gt;手机壳&lt;/h2&gt;
&lt;p&gt;tb启歌旗舰店的无边框手机壳，手感是真的好，媳妇和我各一个&lt;/p&gt;
&lt;h2 id=&#34;蔚来交流慢充充电器&#34;&gt;蔚来交流慢充充电器&lt;/h2&gt;
&lt;h2 id=&#34;话说国内能用的智能监控摄像头-有啥推荐的品牌吗-不泄漏隐私的那种-除了小米&#34;&gt;话说国内能用的智能监控摄像头，有啥推荐的品牌吗？不泄漏隐私的那种。除了小米。&lt;/h2&gt;
&lt;p&gt;随便找个支持rtsp的，在路由器把公网出口禁止了就行了&lt;/p&gt;
&lt;h2 id=&#34;神秘农场-2-day-assault-包&#34;&gt;神秘农场 2 Day Assault 包&lt;/h2&gt;
&lt;h2 id=&#34;wmf-的不粘锅-淘宝有官方店铺&#34;&gt;WMF 的不粘锅，淘宝有官方店铺&lt;/h2&gt;
&lt;h2 id=&#34;ohto-minimo-迷你圆珠笔&#34;&gt;OHTO minimo 迷你圆珠笔&lt;/h2&gt;
&lt;h2 id=&#34;kaweco-liliput-ballpoint-pen-with-cap-black&#34;&gt;Kaweco Liliput Ballpoint Pen with Cap Black&lt;/h2&gt;
&lt;h2 id=&#34;海备思usb4数据线&#34;&gt;海备思usb4数据线&lt;/h2&gt;
&lt;p&gt;在拥有最高规格的同时，线身依然保持了柔软，也比常规全功能线细，不是傻大粗。非常适合旅行时连接相机、移动硬盘、无人机等设备使用&lt;/p&gt;</description>
    </item>
    <item>
      <title>收集有用的Prompts</title>
      <link>http://blog.imcompany.cn/post/prompts/</link>
      <pubDate>Fri, 01 Nov 2024 11:29:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/prompts/</guid>
      <description>&lt;h2 id=&#34;can-you-visualize-this&#34;&gt;can you visualize this?&lt;/h2&gt;
&lt;p&gt;如果对一个概念不是很拿的准。想让它画图，又不知道能画什么图，直接给他个最模糊的指令，visualize视觉化&lt;/p&gt;
&lt;h2 id=&#34;explain-the-answers-in-narration&#34;&gt;explain the answers in narration&lt;/h2&gt;
&lt;p&gt;将答案用段落写出来&lt;/p&gt;
&lt;h2 id=&#34;用逐渐增加复杂度的方式解释-xxx&#34;&gt;用逐渐增加复杂度的方式解释 XXX&lt;/h2&gt;
&lt;h2 id=&#34;先别写代码-先跟我讨论一下方案&#34;&gt;先别写代码，先跟我讨论一下方案&lt;/h2&gt;
&lt;p&gt;适合只讨论方案&lt;/p&gt;
&lt;h2 id=&#34;在输出的时候遵循-业界最佳实践&#34;&gt;在输出的时候遵循“业界最佳实践”&lt;/h2&gt;
&lt;h2 id=&#34;书面表达&#34;&gt;书面表达&lt;/h2&gt;
&lt;p&gt;Your role is to be an English guru, an expert in authentic American English, who assists users in expressing their thoughts clearly and fluently. You are not just translating words; you are delving into the essence of the user&amp;rsquo;s message and reconstructing it in a way that maintains logical clarity and coherence. You&amp;rsquo;ll prioritize the use of plain English, short phrasal verbs, and common idioms. It&amp;rsquo;s important to craft sentences with varied lengths to create a natural rhythm and flow, making the language sound smooth and engaging. Avoid regional expressions or idioms that are too unique or restricted to specific areas. Your goal is to make American English accessible and appealing to a broad audience, helping users communicate effectively in a style that resonates with a wide range of English speakers.&lt;/p&gt;</description>
    </item>
    <item>
      <title>基于Spring initializr实现自己的项目模板</title>
      <link>http://blog.imcompany.cn/post/spring-initializr/</link>
      <pubDate>Tue, 15 Oct 2024 17:44:29 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/spring-initializr/</guid>
      <description>&lt;h2 id=&#34;介绍&#34;&gt;介绍&lt;/h2&gt;
&lt;p&gt;先前通过 Apache Maven Archetype 生成了一个项目脚手架1.0版本，模板比较固定，无法根据需要进行灵活定制，经过调研后，发现可基于&lt;a href=&#34;https://github.com/spring-io/start.spring.io&#34;&gt;Spring Starter&lt;/a&gt;项目进行定制，脚手架2.0版本也就应运而生。&lt;/p&gt;
&lt;h3 id=&#34;目标&#34;&gt;目标&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;快速创建最小可运行工程&lt;/li&gt;
&lt;li&gt;基础组件依赖管理
&lt;ol&gt;
&lt;li&gt;版本管理&lt;/li&gt;
&lt;li&gt;帮助信息&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;按需生成项目结构&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;最终效果&#34;&gt;最终效果&lt;/h3&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/M1kRNC.png&#34;/&gt; 
&lt;/figure&gt;

&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/eFelCJ.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h2 id=&#34;实现&#34;&gt;实现&lt;/h2&gt;
&lt;h3 id=&#34;主流程&#34;&gt;主流程&lt;/h3&gt;
&lt;h4 id=&#34;获取配置&#34;&gt;获取配置&lt;/h4&gt;
&lt;p&gt;通过请求服务根路径获取脚手架信息，对应接口代码&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/hGib0q.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;如请求: &lt;a href=&#34;http://localhost:8080&#34;&gt;http://localhost:8080&lt;/a&gt; 会返回以下内容信息&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/uzQ6UA.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;接口返回了服务支持配置的元数据信息&lt;/p&gt;
&lt;h4 id=&#34;生成工程代码&#34;&gt;生成工程代码&lt;/h4&gt;
&lt;p&gt;用户选择配置相应功能后，点击生成按钮，会调用 &lt;a href=&#34;http://localhost:8080/start.zip&#34;&gt;http://localhost:8080/start.zip&lt;/a&gt; 接口将配置信息传给服务，服务根据信息生成代码&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/GAn0ja.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h3 id=&#34;核心功能实现&#34;&gt;核心功能实现&lt;/h3&gt;
&lt;p&gt;项目工程由以下几方面组成:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;application.yml文件&lt;/li&gt;
&lt;li&gt;工程目录(controller, servier&amp;hellip;)&lt;/li&gt;
&lt;li&gt;auto_publish相关目录&lt;/li&gt;
&lt;li&gt;trpc_java.yaml文件&lt;/li&gt;
&lt;li&gt;配置相关
&lt;ol&gt;
&lt;li&gt;日志配置文件&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;web服务相关
&lt;ol&gt;
&lt;li&gt;httpApi接口&lt;/li&gt;
&lt;li&gt;httpApi实现类StartController&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Maven依赖管理&lt;/li&gt;
&lt;li&gt;主启动程序自定义&lt;/li&gt;
&lt;li&gt;测试辅助开发相关自定义
&lt;ol&gt;
&lt;li&gt;applicationTest&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/p5s2VW.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h3 id=&#34;依赖管理&#34;&gt;依赖管理&lt;/h3&gt;
&lt;p&gt;根据现有常用的 &lt;strong&gt;Peacock&lt;/strong&gt; 框架功能包，依赖管理配置以下模块:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Starter&lt;/li&gt;
&lt;li&gt;Integration&lt;/li&gt;
&lt;li&gt;Provider&lt;/li&gt;
&lt;li&gt;Data&lt;/li&gt;
&lt;li&gt;Testing&lt;/li&gt;
&lt;li&gt;MQ&lt;/li&gt;
&lt;li&gt;Job&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;实践&#34;&gt;实践&lt;/h2&gt;
&lt;p&gt;生成一个最小可运行Web应用&lt;/p&gt;
&lt;h3 id=&#34;命令行快速生成&#34;&gt;命令行快速生成&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -L &lt;span class=&#34;s1&#34;&gt;&amp;#39;http://localhost:8080/start.zip?type=peacock-project&amp;amp;bootVersion=1.5.7.RELEASE&amp;amp;groupId=com.yuewen.bookcoop&amp;amp;artifactId=solution_demo&amp;amp;name=solution_demo101&amp;amp;version=1.0.0-SNAPSHOT&amp;amp;language=java&amp;amp;packageName=com.yuewen.bookcoop.solution_demo&amp;amp;javaVersion=1.8&amp;amp;packaging=jar&amp;amp;description=solution_demo101&amp;amp;dependencies=integration-web&amp;amp;dependencies=peacock-test&amp;amp;dependencies=integration-common&amp;amp;dependencies=starter&amp;#39;&lt;/span&gt; -o solution_demo.zip
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;具体的依赖库元信息可以在根路径下请求获得，具体依赖信息为dependencies值对应id的值&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;idea中生成&#34;&gt;IDEA中生成&lt;/h3&gt;
&lt;h4 id=&#34;idea配置脚手架地址&#34;&gt;Idea配置脚手架地址&lt;/h4&gt;
&lt;p&gt;使用本地地址如: &lt;a href=&#34;http://localhost:8080&#34;&gt;http://localhost:8080&lt;/a&gt;&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/H1TIwb.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h4 id=&#34;配置工程信息&#34;&gt;配置工程信息&lt;/h4&gt;
&lt;p&gt;填写好相关的业务信息与版本信息&lt;/p&gt;
&lt;h4 id=&#34;选择依赖模块&#34;&gt;选择依赖模块&lt;/h4&gt;
&lt;p&gt;Web应用需选择以下模块:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Peacock Trpc Starter&lt;/li&gt;
&lt;li&gt;Integration Web&lt;/li&gt;
&lt;li&gt;Integration Common&lt;/li&gt;
&lt;li&gt;Peacock Test&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/9eAIUh.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;选择完成后点击 &lt;strong&gt;生成&lt;/strong&gt; 按钮生成代码&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 第13期</title>
      <link>http://blog.imcompany.cn/post/peng-week13/</link>
      <pubDate>Fri, 27 Sep 2024 10:19:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/peng-week13/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;h3 id=&#34;michael-tsai-blog-iphone-80-charging-limit&#34;&gt;&lt;a href=&#34;https://mjtsai.com/blog/2024/09/26/iphone-80-charging-limit/&#34;&gt;Michael Tsai - Blog - iPhone 80% Charging Limit&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Iphone 80%充电控制与Iphone算法自带的充电调整对比，短期内80%的充电限制没有什么优势体验&lt;/p&gt;
&lt;h3 id=&#34;poll-trust-in-firefox-and-mozilla-is-gone-let-s-talk-alternatives&#34;&gt;&lt;a href=&#34;https://boilingsteam.com/poll-trust-in-firefox-mozilla-is-gone/&#34;&gt;POLL: Trust in Firefox and Mozilla is Gone - Let&amp;rsquo;s Talk Alternatives&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;注重用户隐私的浏览器Firefox开始收集用户数据, 文章提出了对Firefox的担忧并提供了替换浏览器选项&lt;/p&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;h3 id=&#34;通义效率-你的工作学习助手-通义tongyi-dot-ai-通义千问&#34;&gt;&lt;a href=&#34;https://tongyi.aliyun.com/efficiency/&#34;&gt;通义效率_你的工作学习助手_通义tongyi.ai-通义千问&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;阿里通义效率 的语音速读功能 对快速了解一个播客需不需要深入听很有帮助，速度还挺快的&lt;/p&gt;
&lt;h3 id=&#34;subframe7536-maple-font-maple-mono-open-source-monospace-font-with-round-corner-ligatures-and-nerd-font-for-ide-and-terminal-fine-grained-customization-options-dot-带连字和控制台图标的圆角等宽字体-中英文宽度完美2-1-细粒度的自定义选项&#34;&gt;&lt;a href=&#34;https://github.com/subframe7536/maple-font&#34;&gt;subframe7536/maple-font: Maple Mono: Open source monospace font with round corner, ligatures and Nerd-Font for IDE and terminal, fine-grained customization options. 带连字和控制台图标的圆角等宽字体，中英文宽度完美2:1，细粒度的自定义选项&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;为了让终端显示图标，新安装了 font-maple-mono-nf 字体&lt;/p&gt;
&lt;h3 id=&#34;raycast-your-shortcut-to-everything&#34;&gt;&lt;a href=&#34;https://www.raycast.com/&#34;&gt;Raycast - Your shortcut to everything&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;又把 raycast装回来了，主要是AI集成吸引人&lt;/p&gt;
&lt;h3 id=&#34;trae-ship-faster-with-trae&#34;&gt;&lt;a href=&#34;https://www.trae.ai/&#34;&gt;Trae - Ship Faster with Trae&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;国内的AI编辑器，主打一个免费&lt;/p&gt;</description>
    </item>
    <item>
      <title>使用AI生成 git commit message</title>
      <link>http://blog.imcompany.cn/post/ai-git-commits/</link>
      <pubDate>Fri, 02 Aug 2024 11:34:59 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/ai-git-commits/</guid>
      <description>&lt;h2 id=&#34;背景&#34;&gt;背景&lt;/h2&gt;
&lt;p&gt;Github上支持对PR生成AI摘要信息，&lt;a href=&#34;https://docs.github.com/en/enterprise-cloud@latest/copilot/using-github-copilot/creating-a-pull-request-summary-with-github-copilot&#34;&gt;具体说明&lt;/a&gt;&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/uDEDV8.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;有没有应用支持生成提交内容的摘要信息呢？
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/WfS9Yg.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;ai-commits&#34;&gt;AI Commits&lt;/h2&gt;
&lt;p&gt;经过一番搜索，找到了IDEA插件 &lt;a href=&#34;https://plugins.jetbrains.com/plugin/21335-ai-commits&#34;&gt;AI Commits&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;功能&#34;&gt;功能&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;支持多个AI服务&lt;/li&gt;
&lt;li&gt;支持多语言&lt;/li&gt;
&lt;li&gt;支持自定义Prompt&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;支持的服务&#34;&gt;支持的服务&lt;/h3&gt;
&lt;h4 id=&#34;openai&#34;&gt;OpenAI&lt;/h4&gt;
&lt;p&gt;不支持国内访问，可使用国内转发进行访问，但需要有token，免费的token对token长度有限制，最大4098&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;国内转发&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/chatanywhere/GPT_API_free&#34;&gt;https://github.com/chatanywhere/GPT_API_free&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;可申请免费API Key，限制200请求/天/IP&amp;amp;Key调用频率，常规使用足够了&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;ollama&#34;&gt;👍Ollama&lt;/h4&gt;
&lt;p&gt;&lt;a href=&#34;https://ollama.com/&#34;&gt;官网&lt;/a&gt;，功能完全免费，多种开源模型可用，无使用限制，但需要本地部署，对机器内存有要求&lt;/p&gt;
&lt;p&gt;推荐的开源模型如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://ollama.com/library/codeqwen&#34;&gt;codeqwen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://ollama.com/library/deepseek-coder-v2&#34;&gt;deepseek-coder-v2&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;qianfan&#34;&gt;Qianfan&lt;/h4&gt;
&lt;p&gt;百度的AI模型千帆，&lt;a href=&#34;https://qianfan.cloud.baidu.com/&#34;&gt;https://qianfan.cloud.baidu.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;需要以下操作方可正常使用&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;登录百度账号&lt;/li&gt;
&lt;li&gt;创建应用id&lt;/li&gt;
&lt;li&gt;开通模型计费且需要进行实名(银行卡/人脸)&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/i6xBDy.png&#34;/&gt; 
&lt;/figure&gt;

&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/XQ7tpX.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;开通后在AI Commits的Qianfan模型中设置API key和Secret key
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/I4xch9.png&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;gemini&#34;&gt;Gemini&lt;/h4&gt;
&lt;p&gt;不支持国内访问，有用量限额&lt;/p&gt;
&lt;h3 id=&#34;插件使用&#34;&gt;插件使用&lt;/h3&gt;
&lt;h4 id=&#34;选择llm-client和prompt&#34;&gt;选择LLM Client和Prompt&lt;/h4&gt;
&lt;p&gt;在AI Commits中配置好使用的LLM Client 和 Prompt，如选择 OpenAI 和名为 Basic 的Prompt&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/CEzbZI.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h4 id=&#34;修改git项目代码&#34;&gt;修改git项目代码&lt;/h4&gt;
&lt;p&gt;修改项目文件代码，比如加一行日志打印&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/UnxQfn.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h4 id=&#34;提交代码&#34;&gt;提交代码&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;进行提交代码界面，在提交信息栏多出一个 AI Commits 的图标，点击图标&lt;/p&gt;
&lt;figure&gt;
        &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/pxaei0.png&#34;/&gt; 
    &lt;/figure&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;点击后生成的提交信息&lt;/p&gt;
&lt;figure&gt;
        &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/EyCDCf.png&#34;/&gt; 
    &lt;/figure&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;使用Ollama的gemma2:9b生成的提交信息&lt;/p&gt;
&lt;figure&gt;
        &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/6Adzvw.png&#34;/&gt; 
    &lt;/figure&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;关于prompt&#34;&gt;关于Prompt&lt;/h3&gt;
&lt;p&gt;插件默认自带了3个Prompt，插件的仓库提供更多的Prompt使用，点击插件配置页面的 &lt;a href=&#34;https://github.com/Blarc/ai-commits-intellij-plugin/discussions/18&#34;&gt;More prompts&lt;/a&gt; 即可跳转&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/1scKaT.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h4 id=&#34;其它有意思的prompt&#34;&gt;其它有意思的Prompt&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;特朗普风格&lt;/p&gt;
&lt;p&gt;懂王风格&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Write an insightful but concise Git commit message in Donald Trump style in present tense for
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;the following diff without prefacing it with anything, the response must be in the language {locale}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;and must not be longer than 74 characters. The sent text will be the differences between files,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;where deleted lines are prefixed with a single minus sign and added lines are prefixed with a
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;single plus sign.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;{diff}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figure&gt;
        &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/drNKtu.png&#34;/&gt; 
    &lt;/figure&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;增强版本的emoji风格&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 第12期</title>
      <link>http://blog.imcompany.cn/post/peng-week12/</link>
      <pubDate>Tue, 16 Apr 2024 16:20:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/peng-week12/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;h3 id=&#34;on-the-origins-of-ds-store&#34;&gt;&lt;a href=&#34;https://www.arno.org/on-the-origins-of-ds-store&#34;&gt;On the origins of DS_store&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;MAC电脑上那可恶的.DS_store文件是如何来的，文章中说在重写Finder系统时，对系统进行了抽象分了前后两端，后续开发过程中认为后端可能会被多个地方使用到，就将它做公共API使用，这时就涉及起名问题，此时作者就给这个未来的API起了名字.DS_store，意为Desktop Service Store，名字前的 &lt;strong&gt;.&lt;/strong&gt; 用来表示隐藏文件。本来此API设计被用在特定的地方，但是从目前表现看只要访问Finder就会被创建，些坑一直示被修复。问题来了，如何解决这个问题，可以从以下两方面入手&lt;/p&gt;
&lt;h4 id=&#34;如何禁止创建-dot-ds-store文件&#34;&gt;如何禁止创建.DS_Store文件&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 禁止网络设备上生成&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;defaults write com.apple.desktopservices DSDontWriteNetworkStores &lt;span class=&#34;nb&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 禁止移动设备上生成&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;defaults write com.apple.desktopservices DSDontWriteUSBStores -bool &lt;span class=&#34;nb&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;删除已生成的-dot-ds-store文件&#34;&gt;删除已生成的.DS_store文件&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;find / -iname &lt;span class=&#34;s1&#34;&gt;&amp;#39;*.DS_Store*&amp;#39;&lt;/span&gt; -delete 2&amp;gt;/dev/null
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;h3 id=&#34;ahrm-sioyek-sioyek-is-a-pdf-viewer-with-a-focus-on-textbooks-and-research-papers&#34;&gt;&lt;a href=&#34;https://github.com/ahrm/sioyek&#34;&gt;ahrm/sioyek: Sioyek is a PDF viewer with a focus on textbooks and research papers&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;聚焦于文本书与论文阅读的PDF阅读器，类VI操作，非常适合键盘党，标志性功能如下:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;快速搜索&lt;/li&gt;
&lt;li&gt;智能跳转&lt;/li&gt;
&lt;li&gt;命令板&lt;/li&gt;
&lt;li&gt;标记&lt;/li&gt;
&lt;li&gt;书签&lt;/li&gt;
&lt;li&gt;高亮&lt;/li&gt;
&lt;li&gt;搜索&lt;/li&gt;
&lt;li&gt;支持Latex实时编辑预览&lt;/li&gt;
&lt;li&gt;可配置&lt;/li&gt;
&lt;li&gt;可扩展&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;常用命令&#34;&gt;常用命令&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;:&lt;/li&gt;
&lt;li&gt;O&lt;/li&gt;
&lt;li&gt;t&lt;/li&gt;
&lt;li&gt;gc&lt;/li&gt;
&lt;li&gt;/&lt;/li&gt;
&lt;li&gt;m&lt;/li&gt;
&lt;li&gt;b&lt;/li&gt;
&lt;li&gt;h&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;image-️&#34;&gt;Image 🖼️&lt;/h2&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/8FMBD6.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;帅帅的CyberTruck新伙伴&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 第12期</title>
      <link>http://blog.imcompany.cn/post/week12/</link>
      <pubDate>Tue, 16 Apr 2024 16:20:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/week12/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;h3 id=&#34;on-the-origins-of-ds-store&#34;&gt;&lt;a href=&#34;https://www.arno.org/on-the-origins-of-ds-store&#34;&gt;On the origins of DS_store&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;MAC电脑上那可恶的.DS_store文件是如何来的，文章中说在重写Finder系统时，对系统进行了抽象分了前后两端，后续开发过程中认为后端可能会被多个地方使用到，就将它做公共API使用，这时就涉及起名问题，此时作者就给这个未来的API起了名字.DS_store，意为Desktop Service Store，名字前的 &lt;strong&gt;.&lt;/strong&gt; 用来表示隐藏文件。本来此API设计被用在特定的地方，但是从目前表现看只要访问Finder就会被创建，些坑一直示被修复。问题来了，如何解决这个问题，可以从以下两方面入手&lt;/p&gt;
&lt;h4 id=&#34;如何禁止创建-dot-ds-store文件&#34;&gt;如何禁止创建.DS_Store文件&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 禁止网络设备上生成&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;defaults write com.apple.desktopservices DSDontWriteNetworkStores &lt;span class=&#34;nb&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 禁止移动设备上生成&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;defaults write com.apple.desktopservices DSDontWriteUSBStores -bool &lt;span class=&#34;nb&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;删除已生成的-dot-ds-store文件&#34;&gt;删除已生成的.DS_store文件&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;find / -iname &lt;span class=&#34;s1&#34;&gt;&amp;#39;*.DS_Store*&amp;#39;&lt;/span&gt; -delete 2&amp;gt;/dev/null
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;h3 id=&#34;ahrm-sioyek-sioyek-is-a-pdf-viewer-with-a-focus-on-textbooks-and-research-papers&#34;&gt;&lt;a href=&#34;https://github.com/ahrm/sioyek&#34;&gt;ahrm/sioyek: Sioyek is a PDF viewer with a focus on textbooks and research papers&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;聚焦于文本书与论文阅读的PDF阅读器，类VI操作，非常适合键盘党，标志性功能如下:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;快速搜索&lt;/li&gt;
&lt;li&gt;智能跳转&lt;/li&gt;
&lt;li&gt;命令板&lt;/li&gt;
&lt;li&gt;标记&lt;/li&gt;
&lt;li&gt;书签&lt;/li&gt;
&lt;li&gt;高亮&lt;/li&gt;
&lt;li&gt;搜索&lt;/li&gt;
&lt;li&gt;支持Latex实时编辑预览&lt;/li&gt;
&lt;li&gt;可配置&lt;/li&gt;
&lt;li&gt;可扩展&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;常用命令&#34;&gt;常用命令&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;:&lt;/li&gt;
&lt;li&gt;O&lt;/li&gt;
&lt;li&gt;t&lt;/li&gt;
&lt;li&gt;gc&lt;/li&gt;
&lt;li&gt;/&lt;/li&gt;
&lt;li&gt;m&lt;/li&gt;
&lt;li&gt;b&lt;/li&gt;
&lt;li&gt;h&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;image-️&#34;&gt;Image 🖼️&lt;/h2&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/8FMBD6.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;帅帅的CyberTruck新伙伴&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 第11期</title>
      <link>http://blog.imcompany.cn/post/peng-week11/</link>
      <pubDate>Mon, 01 Apr 2024 14:42:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/peng-week11/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;h3 id=&#34;the-best-places-to-get-the-same-text-written-for-different-levels-larry-ferlazzo-s-websites-of-the-day-dot-dot-dot&#34;&gt;&lt;a href=&#34;https://larryferlazzo.edublogs.org/2014/11/16/the-best-places-to-get-the-same-text-written-for-different-levels/&#34;&gt;The Best Places To Get The “Same” Text Written For Different “Levels” | Larry Ferlazzo&amp;rsquo;s Websites of the Day&amp;hellip;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;用不同等级的语言表达相同的内容，作者在文章中推荐了练习使用不同级别的词汇句子来表达相同内容的资源，摘抄了以下两个感觉还不错的资源记录一下：&lt;/p&gt;
&lt;h4 id=&#34;news-in-levels&#34;&gt;&lt;a href=&#34;https://www.newsinlevels.com/&#34;&gt;News In Levels&lt;/a&gt;&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;免费资源&lt;/li&gt;
&lt;li&gt;网站提供三个级别的内容表达，根据内容生成了音频&lt;/li&gt;
&lt;li&gt;提供视频学习&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;breaking-news-english-lessons-easy-english-world-news-materials-esl&#34;&gt;&lt;a href=&#34;https://breakingnewsenglish.com/&#34;&gt;Breaking News English Lessons: Easy English World News Materials - ESL&lt;/a&gt;&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;提供7个级别的表达&lt;/li&gt;
&lt;li&gt;支持5种速度音频播放&lt;/li&gt;
&lt;li&gt;带课后测试&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;h3 id=&#34;sfsam-itsycal-itsycal-is-a-tiny-calendar-for-your-mac-s-menu-bar-dot-http-www-dot-mowglii-dot-com-itsycal&#34;&gt;&lt;a href=&#34;https://github.com/sfsam/Itsycal&#34;&gt;sfsam/Itsycal: Itsycal is a tiny calendar for your Mac&amp;rsquo;s menu bar. http://www.mowglii.com/itsycal&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;MAC上menu bar上的显示日历&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/20Jyho.png&#34;/&gt; 
&lt;/figure&gt;

&lt;ol&gt;
&lt;li&gt;精美UI，菜单栏的日期图标好看&lt;/li&gt;
&lt;li&gt;支持显示周信息&lt;/li&gt;
&lt;li&gt;快捷键操作&lt;/li&gt;
&lt;li&gt;支持设置一周的第一天&lt;/li&gt;
&lt;li&gt;支持日历事件&lt;/li&gt;
&lt;li&gt;日期显示大小控制&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;目前itsycal不支持显示中国的农历，可以在打开itsycal时按 &lt;strong&gt;cmd+o&lt;/strong&gt; 打开系统的日历，在系统的日历中可以配置显示农历信息&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;image-️&#34;&gt;Image 🖼️&lt;/h2&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/plnqXM.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;在Tw上看到的，国外有人用船拖着房子，以后真是要空间自由了，查了一下，这东西叫&lt;a href=&#34;https://en.wikipedia.org/w/index.php?title=Houseboat&amp;amp;useskin=vector&#34;&gt;浮动房屋&lt;/a&gt;，酷!&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 第11期</title>
      <link>http://blog.imcompany.cn/post/week11/</link>
      <pubDate>Mon, 01 Apr 2024 14:42:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/week11/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;h3 id=&#34;the-best-places-to-get-the-same-text-written-for-different-levels-larry-ferlazzo-s-websites-of-the-day-dot-dot-dot&#34;&gt;&lt;a href=&#34;https://larryferlazzo.edublogs.org/2014/11/16/the-best-places-to-get-the-same-text-written-for-different-levels/&#34;&gt;The Best Places To Get The “Same” Text Written For Different “Levels” | Larry Ferlazzo&amp;rsquo;s Websites of the Day&amp;hellip;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;用不同等级的语言表达相同的内容，作者在文章中推荐了练习使用不同级别的词汇句子来表达相同内容的资源，摘抄了以下两个感觉还不错的资源记录一下：&lt;/p&gt;
&lt;h4 id=&#34;news-in-levels&#34;&gt;&lt;a href=&#34;https://www.newsinlevels.com/&#34;&gt;News In Levels&lt;/a&gt;&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;免费资源&lt;/li&gt;
&lt;li&gt;网站提供三个级别的内容表达，根据内容生成了音频&lt;/li&gt;
&lt;li&gt;提供视频学习&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;breaking-news-english-lessons-easy-english-world-news-materials-esl&#34;&gt;&lt;a href=&#34;https://breakingnewsenglish.com/&#34;&gt;Breaking News English Lessons: Easy English World News Materials - ESL&lt;/a&gt;&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;提供7个级别的表达&lt;/li&gt;
&lt;li&gt;支持5种速度音频播放&lt;/li&gt;
&lt;li&gt;带课后测试&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;h3 id=&#34;sfsam-itsycal-itsycal-is-a-tiny-calendar-for-your-mac-s-menu-bar-dot-http-www-dot-mowglii-dot-com-itsycal&#34;&gt;&lt;a href=&#34;https://github.com/sfsam/Itsycal&#34;&gt;sfsam/Itsycal: Itsycal is a tiny calendar for your Mac&amp;rsquo;s menu bar. http://www.mowglii.com/itsycal&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;MAC上menu bar上的显示日历&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/20Jyho.png&#34;/&gt; 
&lt;/figure&gt;

&lt;ol&gt;
&lt;li&gt;精美UI，菜单栏的日期图标好看&lt;/li&gt;
&lt;li&gt;支持显示周信息&lt;/li&gt;
&lt;li&gt;快捷键操作&lt;/li&gt;
&lt;li&gt;支持设置一周的第一天&lt;/li&gt;
&lt;li&gt;支持日历事件&lt;/li&gt;
&lt;li&gt;日期显示大小控制&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;目前itsycal不支持显示中国的农历，可以在打开itsycal时按 &lt;strong&gt;cmd+o&lt;/strong&gt; 打开系统的日历，在系统的日历中可以配置显示农历信息&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;image-️&#34;&gt;Image 🖼️&lt;/h2&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/plnqXM.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;在Tw上看到的，国外有人用船拖着房子，以后真是要空间自由了，查了一下，这东西叫&lt;a href=&#34;https://en.wikipedia.org/w/index.php?title=Houseboat&amp;amp;useskin=vector&#34;&gt;浮动房屋&lt;/a&gt;，酷!&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 第10期</title>
      <link>http://blog.imcompany.cn/post/peng-week10/</link>
      <pubDate>Wed, 27 Mar 2024 15:49:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/peng-week10/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;h3 id=&#34;how-is-computer-programming-different-today-than-20-years-ago-by-sedat-kapanoglu-medium&#34;&gt;&lt;a href=&#34;https://ssg.dev/how-is-computer-programming-different-today-than-20-years-ago-9d0154d1b6ce&#34;&gt;How is computer programming different today than 20 years ago? | by Sedat Kapanoglu | Medium&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;现在的计算机编程与20年前有什么不同？&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;20年前的理论性概念成为主流，如尾递归，模式匹配&lt;/li&gt;
&lt;li&gt;现在的桌面软件=浏览器+页面&lt;/li&gt;
&lt;li&gt;面向对象编程正在失去风头，基于特征的语言开始流行，组合比继承更可取&lt;/li&gt;
&lt;li&gt;不参加一个高端会议并拍照不会被认为是一个正式程序员&lt;/li&gt;
&lt;li&gt;由于并行计算的发展，响应式编程更流行&lt;/li&gt;
&lt;li&gt;像素不再是相关的测量单位&lt;/li&gt;
&lt;li&gt;垃圾回收已经成为安全编程的常用方式，Rust中更新的安全模型正在出现&lt;/li&gt;
&lt;li&gt;302亿台设备运行在JAVA上，近10年没怎么变化&lt;/li&gt;
&lt;li&gt;包管理系统现在是编程语言的重要基础，20年前要经过访问页面-&amp;gt;下载-&amp;gt;复制-&amp;gt;添加的方式&lt;/li&gt;
&lt;li&gt;现在的软件开发团队早上要举行15分钟站会&lt;/li&gt;
&lt;li&gt;如今语言工具更丰富，如代码格式化，模板创建&lt;/li&gt;
&lt;li&gt;编程语言的tab与空格争论不休&lt;/li&gt;
&lt;li&gt;现在Adobe Flash不存在了，现在要在三个平台上提供相同交互的产品&lt;/li&gt;
&lt;li&gt;IDE与编程语言距离越来起远，以前IDE支持特定的语言，现在VSCode支持所有语言&lt;/li&gt;
&lt;li&gt;如今跨平台开发成为主流，20年只有PC&lt;/li&gt;
&lt;li&gt;在本地运行代码的行为变少了？&lt;/li&gt;
&lt;li&gt;文档始终在线，离线文档名存实亡&lt;/li&gt;
&lt;li&gt;如今视频教程成为学习的方式&lt;/li&gt;
&lt;li&gt;现在有SO，以前有问题只能与同事交流&lt;/li&gt;
&lt;li&gt;现在人们在MAC上进行软件开发&lt;/li&gt;
&lt;li&gt;互联网连接是常态，以前正好相反&lt;/li&gt;
&lt;li&gt;现今更注重安全性&lt;/li&gt;
&lt;li&gt;现在移动设备可以显示常规网页，不再需要WAP页面&lt;/li&gt;
&lt;li&gt;我们默认开源了所有代码，除了那些让人尴尬的&lt;/li&gt;
&lt;li&gt;现在的女程序员更多了，这个行业在平等方面好很多&lt;/li&gt;
&lt;li&gt;被黑客入侵现在是常见的事，丢失用户数据不需要道歉&lt;/li&gt;
&lt;li&gt;现在进行运程工作更容易&lt;/li&gt;
&lt;li&gt;现在都不使用那种需要输入服务器地址的IRC软件，而是使用庸肿的Slack&lt;/li&gt;
&lt;li&gt;现在在图形卡上运行程序&lt;/li&gt;
&lt;li&gt;1G存储空间在某种情况下不够了&lt;/li&gt;
&lt;li&gt;物理处理器现在也不可信了（由于侧道攻击）&lt;/li&gt;
&lt;li&gt;现在的编程很多是在足球桌上完成的（在国内是吗）？&lt;/li&gt;
&lt;li&gt;现在的python数值计算与20年使用Fortran一样，因为现代CPU快了很多（也就是说Python做数值计算慢的很）&lt;/li&gt;
&lt;li&gt;创建编程语言甚至硬件成为一种通用爱好&lt;/li&gt;
&lt;li&gt;单元测试的好处被过分炒作，以至于变成了一种信仰&lt;/li&gt;
&lt;li&gt;现在明文密码已经不赞成使用了，但是我们仍在使用&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;总结一句话: &lt;strong&gt;一切都好但是又感觉不那么好了&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;h3 id=&#34;jasonjmcghee-rem-an-open-source-approach-to-locally-record-and-enable-searching-everything-you-view-on-your-mac-dot&#34;&gt;&lt;a href=&#34;https://github.com/jasonjmcghee/rem&#34;&gt;jasonjmcghee/rem: An open source approach to locally record and enable searching everything you view on your Mac.&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;开源本地记录用户行为的APP，Rewind开源替代，方便了解自己一天都做了什么，它有以下功能：&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 第10期</title>
      <link>http://blog.imcompany.cn/post/week10/</link>
      <pubDate>Wed, 27 Mar 2024 15:49:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/week10/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;h3 id=&#34;how-is-computer-programming-different-today-than-20-years-ago-by-sedat-kapanoglu-medium&#34;&gt;&lt;a href=&#34;https://ssg.dev/how-is-computer-programming-different-today-than-20-years-ago-9d0154d1b6ce&#34;&gt;How is computer programming different today than 20 years ago? | by Sedat Kapanoglu | Medium&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;现在的计算机编程与20年前有什么不同？&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;20年前的理论性概念成为主流，如尾递归，模式匹配&lt;/li&gt;
&lt;li&gt;现在的桌面软件=浏览器+页面&lt;/li&gt;
&lt;li&gt;面向对象编程正在失去风头，基于特征的语言开始流行，组合比继承更可取&lt;/li&gt;
&lt;li&gt;不参加一个高端会议并拍照不会被认为是一个正式程序员&lt;/li&gt;
&lt;li&gt;由于并行计算的发展，响应式编程更流行&lt;/li&gt;
&lt;li&gt;像素不再是相关的测量单位&lt;/li&gt;
&lt;li&gt;垃圾回收已经成为安全编程的常用方式，Rust中更新的安全模型正在出现&lt;/li&gt;
&lt;li&gt;302亿台设备运行在JAVA上，近10年没怎么变化&lt;/li&gt;
&lt;li&gt;包管理系统现在是编程语言的重要基础，20年前要经过访问页面-&amp;gt;下载-&amp;gt;复制-&amp;gt;添加的方式&lt;/li&gt;
&lt;li&gt;现在的软件开发团队早上要举行15分钟站会&lt;/li&gt;
&lt;li&gt;如今语言工具更丰富，如代码格式化，模板创建&lt;/li&gt;
&lt;li&gt;编程语言的tab与空格争论不休&lt;/li&gt;
&lt;li&gt;现在Adobe Flash不存在了，现在要在三个平台上提供相同交互的产品&lt;/li&gt;
&lt;li&gt;IDE与编程语言距离越来起远，以前IDE支持特定的语言，现在VSCode支持所有语言&lt;/li&gt;
&lt;li&gt;如今跨平台开发成为主流，20年只有PC&lt;/li&gt;
&lt;li&gt;在本地运行代码的行为变少了？&lt;/li&gt;
&lt;li&gt;文档始终在线，离线文档名存实亡&lt;/li&gt;
&lt;li&gt;如今视频教程成为学习的方式&lt;/li&gt;
&lt;li&gt;现在有SO，以前有问题只能与同事交流&lt;/li&gt;
&lt;li&gt;现在人们在MAC上进行软件开发&lt;/li&gt;
&lt;li&gt;互联网连接是常态，以前正好相反&lt;/li&gt;
&lt;li&gt;现今更注重安全性&lt;/li&gt;
&lt;li&gt;现在移动设备可以显示常规网页，不再需要WAP页面&lt;/li&gt;
&lt;li&gt;我们默认开源了所有代码，除了那些让人尴尬的&lt;/li&gt;
&lt;li&gt;现在的女程序员更多了，这个行业在平等方面好很多&lt;/li&gt;
&lt;li&gt;被黑客入侵现在是常见的事，丢失用户数据不需要道歉&lt;/li&gt;
&lt;li&gt;现在进行运程工作更容易&lt;/li&gt;
&lt;li&gt;现在都不使用那种需要输入服务器地址的IRC软件，而是使用庸肿的Slack&lt;/li&gt;
&lt;li&gt;现在在图形卡上运行程序&lt;/li&gt;
&lt;li&gt;1G存储空间在某种情况下不够了&lt;/li&gt;
&lt;li&gt;物理处理器现在也不可信了（由于侧道攻击）&lt;/li&gt;
&lt;li&gt;现在的编程很多是在足球桌上完成的（在国内是吗）？&lt;/li&gt;
&lt;li&gt;现在的python数值计算与20年使用Fortran一样，因为现代CPU快了很多（也就是说Python做数值计算慢的很）&lt;/li&gt;
&lt;li&gt;创建编程语言甚至硬件成为一种通用爱好&lt;/li&gt;
&lt;li&gt;单元测试的好处被过分炒作，以至于变成了一种信仰&lt;/li&gt;
&lt;li&gt;现在明文密码已经不赞成使用了，但是我们仍在使用&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;总结一句话: &lt;strong&gt;一切都好但是又感觉不那么好了&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;h3 id=&#34;jasonjmcghee-rem-an-open-source-approach-to-locally-record-and-enable-searching-everything-you-view-on-your-mac-dot&#34;&gt;&lt;a href=&#34;https://github.com/jasonjmcghee/rem&#34;&gt;jasonjmcghee/rem: An open source approach to locally record and enable searching everything you view on your Mac.&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;开源本地记录用户行为的APP，Rewind开源替代，方便了解自己一天都做了什么，它有以下功能：&lt;/p&gt;</description>
    </item>
    <item>
      <title>Emacs问题之为什么org-mode中的imenu不好使了</title>
      <link>http://blog.imcompany.cn/post/emacs-imenu-issue/</link>
      <pubDate>Thu, 21 Mar 2024 17:48:07 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/emacs-imenu-issue/</guid>
      <description>&lt;h2 id=&#34;问题&#34;&gt;问题&lt;/h2&gt;
&lt;p&gt;在Emacs的org file中，调用imenu命令不显示结果了，这个imenu菜单我是严重依赖的，没有结果后非常难受，于是开始找问题所在，因为我也是小白，使用了陈斌大神的Emacs配置，还配置了懒猫的eaf-framework&lt;/p&gt;
&lt;h2 id=&#34;排查&#34;&gt;排查&lt;/h2&gt;
&lt;p&gt;在没配置eaf-framework时，imenu是可以正常使用的，配置后就不好使了，所以一度怀疑是配置eaf的问题，但是eaf的功能我还要使用，所以陷入的两难的境地，一直就这么先忍着不依赖这个imenu，而是使用ivy进行搜索。先前也调用了 toggle-debug-on-error 命令进行调试，但是也没看出来个所以然。今天想着再试试，还是不行，在结果页面显示了一句提示信息&amp;quot;No items suitable for an index found in this buffer&amp;quot;，于是按这个信息google了一下，找到的结果比较少，但是 &lt;a href=&#34;https://github.com/bmag/imenu-list/issues/51&#34;&gt;bmag/imenu-list的这个issue&lt;/a&gt; 讨论的过程给了我新的解决步骤，关键的步骤就是要查看一下当前buffer使用的imenu索引方法 &lt;strong&gt;imenu-default-create-index-function&lt;/strong&gt; ，在有问题的org file中查看了这个变量的值为 &lt;strong&gt;my-imenu-create-index-function-no-org-link&lt;/strong&gt; , 很明显这个hack过的，根据提示找到了源码，先注释掉验证一下，发现可以了，真是高兴极了。&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/B1RvZP.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h2 id=&#34;结论&#34;&gt;结论&lt;/h2&gt;
&lt;p&gt;问题解决不了先放一放，万一哪天有灵感了呢&lt;/p&gt;</description>
    </item>
    <item>
      <title>解决下载后的TED视频与字幕时间对不上的问题</title>
      <link>http://blog.imcompany.cn/post/ted-srt-video-not-match/</link>
      <pubDate>Wed, 20 Mar 2024 09:59:04 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/ted-srt-video-not-match/</guid>
      <description>&lt;h2 id=&#34;问题&#34;&gt;问题&lt;/h2&gt;
&lt;p&gt;准备使用TED上的视频进行英语学习，使用Downie下载下来视频与字幕后，播放发现字幕比声音快了几秒中，类似下面这样&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/kyLMx7.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/vMjSRG.png&#34;&gt;
此时说话人刚讲到第7秒钟，但是字幕已经显示到了11秒钟的内容，很奇怪，所有的视频文件与字幕文件都是从官网下载来的，用了其它的工具也试了，确保下载的文件都是正确的&lt;/p&gt;
&lt;h2 id=&#34;定位&#34;&gt;定位&lt;/h2&gt;
&lt;p&gt;换了个浏览器重新查看TED上的对应视频，发现视频开头播放了5s钟的TED广告，其实就是TED的开场内容&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/ARJVmy.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;在下载工具进行下载时，会把这5s的开场也给下载下来，而TED官方字幕是从正片开始计算的时间，这就导致了字幕与声音对应不上的问题&lt;/p&gt;
&lt;h2 id=&#34;解决&#34;&gt;解决&lt;/h2&gt;
&lt;p&gt;找到问题就好办了，只需要把下载下来的视频的前5s截取下来或者从第5s开始进行转换视频就可以了，这时候就要祭出 ffmpeg 大法，命令如下：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ffmpeg -ss &lt;span class=&#34;s2&#34;&gt;&amp;#34;00:00:05&amp;#34;&lt;/span&gt; -i ted.mp4 -i ted.srt -vcodec copy -acodec copy ted.mkv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;再播放截取的视频，正常了，又可以愉快的学英语了&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 第9期</title>
      <link>http://blog.imcompany.cn/post/peng-week9/</link>
      <pubDate>Wed, 28 Feb 2024 11:12:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/peng-week9/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;h3 id=&#34;reading-strategy-guessing-unknown-words-i-think-so&#34;&gt;&lt;a href=&#34;https://itsme76109913.wordpress.com/2018/06/07/reading-strategy-guessing-unknown-words/&#34;&gt;Reading Strategy: Guessing Unknown Words – I THINK SO&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;实用的阅读策略，根据上下文猜测陌生的词。文章中还提到了多种关于英语阅读的方式&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;阅读不只是解码文本，还要理解作者要表达的深层次想法&lt;/li&gt;
&lt;li&gt;阅读时有两个重要的问题：作者的观点是什么(论点)，针对主要观点作者说了哪些(论据)&lt;/li&gt;
&lt;li&gt;好的阅读者的习惯
&lt;ol&gt;
&lt;li&gt;以短语为单位进行阅读&lt;/li&gt;
&lt;li&gt;根据已有的知识进行内容预测&lt;/li&gt;
&lt;li&gt;字里行间阅读，理解信息&lt;/li&gt;
&lt;li&gt;通过下上文猜测新单词&lt;/li&gt;
&lt;li&gt;可以区分事实与观点&lt;/li&gt;
&lt;li&gt;识别特定转折信号，如however来理解较早段落的含义&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;SQ3R阅读
&lt;ol&gt;
&lt;li&gt;Survey 阅读之前了解大意，查看标题、副标题、图表等信息&lt;/li&gt;
&lt;li&gt;Question 提出问题，针对特定目的提出问题&lt;/li&gt;
&lt;li&gt;Read 尽可能快的不间断的阅读，母语阅读要达到350词每分钟&lt;/li&gt;
&lt;li&gt;Recall 回想，阅读后是否解决了先前提出的问题，没有的话，快速扫描找到特定信息&lt;/li&gt;
&lt;li&gt;Review 回顾，频繁回顾文章的内容有利于长期记忆&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;关于单词量
&lt;ol&gt;
&lt;li&gt;多读&lt;/li&gt;
&lt;li&gt;利用上下文线索
&lt;ol&gt;
&lt;li&gt;同义词&lt;/li&gt;
&lt;li&gt;反义词&lt;/li&gt;
&lt;li&gt;例句说明&lt;/li&gt;
&lt;li&gt;语调&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;h3 id=&#34;nikitabobko-aerospace-aerospace-is-an-i3-like-tiling-window-manager-for-macos&#34;&gt;&lt;a href=&#34;https://github.com/nikitabobko/AeroSpace&#34;&gt;nikitabobko/AeroSpace: AeroSpace is an i3-like tiling window manager for macOS&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Mac上的窗口布局管理器，类似于Linux上的i3，功能如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;支持配置文件&lt;/li&gt;
&lt;li&gt;不需要关闭SIP&lt;/li&gt;
&lt;li&gt;支持命令行脚本&lt;/li&gt;
&lt;li&gt;多显示器支持&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/RUFyn6.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;用下来感觉还是我的KeyboardMaestro窗口配置简单一点，再观察看看&lt;/p&gt;
&lt;h2 id=&#34;image-️&#34;&gt;Image 🖼️&lt;/h2&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/vjC4aq.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;&lt;a href=&#34;https://interestingengineering.com/culture/circular-bridge-built-to-slow-down-drivers&#34;&gt;为什么要构建一座环形的桥？&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;该桥位于乌拉圭加尔松，建立此桥是为了降低车速使人们可以欣赏窗外美景，在减少当地人通勤时间的同时还带动了当地的旅游业发展。&lt;/p&gt;
&lt;h2 id=&#34;speech&#34;&gt;Speech 💬&lt;/h2&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/TTlNw3.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;我们的问题不是无知，而是缺少行动。&amp;ndash; 戴尔卡耐基&lt;/p&gt;
&lt;h2 id=&#34;idea&#34;&gt;Idea 💡&lt;/h2&gt;</description>
    </item>
    <item>
      <title>收集的一些Podcast</title>
      <link>http://blog.imcompany.cn/post/podcasts/</link>
      <pubDate>Wed, 28 Feb 2024 09:55:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/podcasts/</guid>
      <description>&lt;h2 id=&#34;42章经-小宇宙-听播客-上小宇宙&#34;&gt;&lt;a href=&#34;https://www.xiaoyuzhoufm.com/podcast/648b0b641c48983391a63f98&#34;&gt;42章经 | 小宇宙 - 听播客，上小宇宙&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&#34;cursor-刷屏背后-复盘-ai-coding-的现状与发展-对谈-gru-dot-ai-创始人张海龙-42章经-小宇宙-听播客-上小宇宙&#34;&gt;&lt;a href=&#34;https://www.xiaoyuzhoufm.com/episode/671c9a42eb46cd6655da1e6f&#34;&gt;Cursor 刷屏背后，复盘 AI Coding 的现状与发展｜对谈 Gru.ai 创始人张海龙 - 42章经 | 小宇宙 - 听播客，上小宇宙&lt;/a&gt;&lt;/h3&gt;
&lt;h3 id=&#34;世界好像变难了-我们该如何应对-对谈绿洲资本张津剑之-ai-人-与-生命力-42章经-小宇宙-听播客-上小宇宙&#34;&gt;&lt;a href=&#34;https://www.xiaoyuzhoufm.com/episode/6651b7a4c59d1e575797a520&#34;&gt;世界好像变难了，我们该如何应对？| 对谈绿洲资本张津剑之 AI、人 与 生命力 - 42章经 | 小宇宙 - 听播客，上小宇宙&lt;/a&gt;&lt;/h3&gt;
&lt;h2 id=&#34;代表作-小宇宙-听播客-上小宇宙&#34;&gt;&lt;a href=&#34;https://www.xiaoyuzhoufm.com/podcast/657993952db47db3599a38ca&#34;&gt;代表作 | 小宇宙 - 听播客，上小宇宙&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&#34;vol-dot-026-时代红利消失-这届年轻人的赚钱出路在哪-代表作-小宇宙-听播客-上小宇宙&#34;&gt;&lt;a href=&#34;https://www.xiaoyuzhoufm.com/episode/67090a5a81cdab3a935216ff&#34;&gt;Vol.026：时代红利消失，这届年轻人的赚钱出路在哪？ - 代表作 | 小宇宙 - 听播客，上小宇宙&lt;/a&gt;&lt;/h3&gt;
&lt;h2 id=&#34;枫言枫语-小宇宙-听播客-上小宇宙&#34;&gt;&lt;a href=&#34;https://www.xiaoyuzhoufm.com/podcast/5e2864f5418a84a04628e249&#34;&gt;枫言枫语 | 小宇宙 - 听播客，上小宇宙&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;科技类播客&lt;/p&gt;
&lt;h2 id=&#34;忽左忽右-小宇宙-听播客-上小宇宙&#34;&gt;&lt;a href=&#34;https://www.xiaoyuzhoufm.com/podcast/5e4ee557418a84a0466737b7&#34;&gt;忽左忽右 | 小宇宙 - 听播客，上小宇宙&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;知行小酒馆-小宇宙-听播客-上小宇宙&#34;&gt;&lt;a href=&#34;https://www.xiaoyuzhoufm.com/podcast/6013f9f58e2f7ee375cf4216&#34;&gt;知行小酒馆 | 小宇宙 - 听播客，上小宇宙&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&#34;对话曹丰泽-只要不饿死-人生没有必修课-google-search&#34;&gt;&lt;a href=&#34;https://www.google.com/search?q=%E5%AF%B9%E8%AF%9D%E6%9B%B9%E4%B8%B0%E6%B3%BD%EF%BC%9A%E5%8F%AA%E8%A6%81%E4%B8%8D%E9%A5%BF%E6%AD%BB%EF%BC%8C%E4%BA%BA%E7%94%9F%E6%B2%A1%E6%9C%89%E5%BF%85%E4%BF%AE%E8%AF%BE&#34;&gt;对话曹丰泽：只要不饿死，人生没有必修课 - Google Search&lt;/a&gt;&lt;/h3&gt;
&lt;h3 id=&#34;117--e227-疲惫经济学-为什么技术进步了-我们却更累了-youtube&#34;&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=B0vgnWmJRdU&#34;&gt;(117) E227 疲惫经济学：为什么技术进步了，我们却更累了？ - YouTube&lt;/a&gt;&lt;/h3&gt;
&lt;h2 id=&#34;半拿铁-商业沉浮录-小宇宙-听播客-上小宇宙&#34;&gt;&lt;a href=&#34;https://www.xiaoyuzhoufm.com/podcast/62382c1103bea1ebfffa1c00&#34;&gt;半拿铁 | 商业沉浮录 | 小宇宙 - 听播客，上小宇宙&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;talk三联-小宇宙-听播客-上小宇宙&#34;&gt;&lt;a href=&#34;https://www.xiaoyuzhoufm.com/podcast/61e7b5314675a08411f51319&#34;&gt;Talk三联 | 小宇宙 - 听播客，上小宇宙&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;硅谷101-小宇宙-听播客-上小宇宙&#34;&gt;&lt;a href=&#34;https://www.xiaoyuzhoufm.com/podcast/5e5c52c9418a84a04625e6cc&#34;&gt;硅谷101 | 小宇宙 - 听播客，上小宇宙&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&#34;146--e236-99-的作业都是ai写的-当代名校生眼里-大学还剩下什么-youtube&#34;&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=sFfMyVm6dOg&#34;&gt;(146) E236｜99%的作业都是AI写的：当代名校生眼里，大学还剩下什么？ - YouTube&lt;/a&gt;&lt;/h3&gt;
&lt;h2 id=&#34;e106-真正造星舰的人来了-与spacex前高管聊聊马斯克的火星计划-硅谷101-小宇宙-听播客-上小宇宙&#34;&gt;&lt;a href=&#34;https://www.xiaoyuzhoufm.com/episode/643f8096a2fb59c2a1adaa8b&#34;&gt;E106｜真正造星舰的人来了，与SpaceX前高管聊聊马斯克的火星计划 - 硅谷101 | 小宇宙 - 听播客，上小宇宙&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;科技乱炖-小宇宙-听播客-上小宇宙&#34;&gt;&lt;a href=&#34;https://www.xiaoyuzhoufm.com/podcast/5e4243cd418a84a0469573fb&#34;&gt;科技乱炖 | 小宇宙 - 听播客，上小宇宙&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;晚点聊-latetalk-小宇宙-听播客-上小宇宙&#34;&gt;&lt;a href=&#34;https://www.xiaoyuzhoufm.com/podcast/61933ace1b4320461e91fd55&#34;&gt;晚点聊 LateTalk | 小宇宙 - 听播客，上小宇宙&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;张小珺jùn-商业访谈录-小宇宙-听播客-上小宇宙&#34;&gt;&lt;a href=&#34;https://www.xiaoyuzhoufm.com/podcast/626b46ea9cbbf0451cf5a962&#34;&gt;张小珺Jùn｜商业访谈录 | 小宇宙 - 听播客，上小宇宙&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&#34;95-dot-对manus创始人肖弘的3小时访谈-世界不是线性外推-做博弈中的重要变量-张小珺jùn-商业访谈录-小宇宙-听播客-上小宇宙&#34;&gt;&lt;a href=&#34;https://www.xiaoyuzhoufm.com/episode/67c3d80fb0167b8db9e3ec0f&#34;&gt;95. 对Manus创始人肖弘的3小时访谈：世界不是线性外推，做博弈中的重要变量 - 张小珺Jùn｜商业访谈录 | 小宇宙 - 听播客，上小宇宙&lt;/a&gt;&lt;/h3&gt;
&lt;h2 id=&#34;clearerthinking-dot-org-podcast-home&#34;&gt;&lt;a href=&#34;https://podcast.clearerthinking.org/&#34;&gt;ClearerThinking.org Podcast | Home&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;异见房间-小宇宙-听播客-上小宇宙&#34;&gt;&lt;a href=&#34;https://www.xiaoyuzhoufm.com/podcast/6628e91c67c973e1383b968a&#34;&gt;异见房间 | 小宇宙 - 听播客，上小宇宙&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;由三位总发出异见的女性媒体人发起的播客.&lt;/p&gt;</description>
    </item>
    <item>
      <title>收集的一些Podcast</title>
      <link>http://blog.imcompany.cn/posts/podcasts/</link>
      <pubDate>Wed, 28 Feb 2024 09:55:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/posts/podcasts/</guid>
      <description>&lt;h2 id=&#34;42章经-小宇宙-听播客-上小宇宙&#34;&gt;&lt;a href=&#34;https://www.xiaoyuzhoufm.com/podcast/648b0b641c48983391a63f98&#34;&gt;42章经 | 小宇宙 - 听播客，上小宇宙&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&#34;cursor-刷屏背后-复盘-ai-coding-的现状与发展-对谈-gru-dot-ai-创始人张海龙-42章经-小宇宙-听播客-上小宇宙&#34;&gt;&lt;a href=&#34;https://www.xiaoyuzhoufm.com/episode/671c9a42eb46cd6655da1e6f&#34;&gt;Cursor 刷屏背后，复盘 AI Coding 的现状与发展｜对谈 Gru.ai 创始人张海龙 - 42章经 | 小宇宙 - 听播客，上小宇宙&lt;/a&gt;&lt;/h3&gt;
&lt;h3 id=&#34;世界好像变难了-我们该如何应对-对谈绿洲资本张津剑之-ai-人-与-生命力-42章经-小宇宙-听播客-上小宇宙&#34;&gt;&lt;a href=&#34;https://www.xiaoyuzhoufm.com/episode/6651b7a4c59d1e575797a520&#34;&gt;世界好像变难了，我们该如何应对？| 对谈绿洲资本张津剑之 AI、人 与 生命力 - 42章经 | 小宇宙 - 听播客，上小宇宙&lt;/a&gt;&lt;/h3&gt;
&lt;h2 id=&#34;代表作-小宇宙-听播客-上小宇宙&#34;&gt;&lt;a href=&#34;https://www.xiaoyuzhoufm.com/podcast/657993952db47db3599a38ca&#34;&gt;代表作 | 小宇宙 - 听播客，上小宇宙&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&#34;vol-dot-026-时代红利消失-这届年轻人的赚钱出路在哪-代表作-小宇宙-听播客-上小宇宙&#34;&gt;&lt;a href=&#34;https://www.xiaoyuzhoufm.com/episode/67090a5a81cdab3a935216ff&#34;&gt;Vol.026：时代红利消失，这届年轻人的赚钱出路在哪？ - 代表作 | 小宇宙 - 听播客，上小宇宙&lt;/a&gt;&lt;/h3&gt;
&lt;h2 id=&#34;枫言枫语-小宇宙-听播客-上小宇宙&#34;&gt;&lt;a href=&#34;https://www.xiaoyuzhoufm.com/podcast/5e2864f5418a84a04628e249&#34;&gt;枫言枫语 | 小宇宙 - 听播客，上小宇宙&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;科技类播客&lt;/p&gt;
&lt;h2 id=&#34;忽左忽右-小宇宙-听播客-上小宇宙&#34;&gt;&lt;a href=&#34;https://www.xiaoyuzhoufm.com/podcast/5e4ee557418a84a0466737b7&#34;&gt;忽左忽右 | 小宇宙 - 听播客，上小宇宙&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;知行小酒馆-小宇宙-听播客-上小宇宙&#34;&gt;&lt;a href=&#34;https://www.xiaoyuzhoufm.com/podcast/6013f9f58e2f7ee375cf4216&#34;&gt;知行小酒馆 | 小宇宙 - 听播客，上小宇宙&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&#34;对话曹丰泽-只要不饿死-人生没有必修课-google-search&#34;&gt;&lt;a href=&#34;https://www.google.com/search?q=%E5%AF%B9%E8%AF%9D%E6%9B%B9%E4%B8%B0%E6%B3%BD%EF%BC%9A%E5%8F%AA%E8%A6%81%E4%B8%8D%E9%A5%BF%E6%AD%BB%EF%BC%8C%E4%BA%BA%E7%94%9F%E6%B2%A1%E6%9C%89%E5%BF%85%E4%BF%AE%E8%AF%BE&#34;&gt;对话曹丰泽：只要不饿死，人生没有必修课 - Google Search&lt;/a&gt;&lt;/h3&gt;
&lt;h3 id=&#34;117--e227-疲惫经济学-为什么技术进步了-我们却更累了-youtube&#34;&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=B0vgnWmJRdU&#34;&gt;(117) E227 疲惫经济学：为什么技术进步了，我们却更累了？ - YouTube&lt;/a&gt;&lt;/h3&gt;
&lt;h2 id=&#34;半拿铁-商业沉浮录-小宇宙-听播客-上小宇宙&#34;&gt;&lt;a href=&#34;https://www.xiaoyuzhoufm.com/podcast/62382c1103bea1ebfffa1c00&#34;&gt;半拿铁 | 商业沉浮录 | 小宇宙 - 听播客，上小宇宙&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;talk三联-小宇宙-听播客-上小宇宙&#34;&gt;&lt;a href=&#34;https://www.xiaoyuzhoufm.com/podcast/61e7b5314675a08411f51319&#34;&gt;Talk三联 | 小宇宙 - 听播客，上小宇宙&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;硅谷101-小宇宙-听播客-上小宇宙&#34;&gt;&lt;a href=&#34;https://www.xiaoyuzhoufm.com/podcast/5e5c52c9418a84a04625e6cc&#34;&gt;硅谷101 | 小宇宙 - 听播客，上小宇宙&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&#34;146--e236-99-的作业都是ai写的-当代名校生眼里-大学还剩下什么-youtube&#34;&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=sFfMyVm6dOg&#34;&gt;(146) E236｜99%的作业都是AI写的：当代名校生眼里，大学还剩下什么？ - YouTube&lt;/a&gt;&lt;/h3&gt;
&lt;h2 id=&#34;e106-真正造星舰的人来了-与spacex前高管聊聊马斯克的火星计划-硅谷101-小宇宙-听播客-上小宇宙&#34;&gt;&lt;a href=&#34;https://www.xiaoyuzhoufm.com/episode/643f8096a2fb59c2a1adaa8b&#34;&gt;E106｜真正造星舰的人来了，与SpaceX前高管聊聊马斯克的火星计划 - 硅谷101 | 小宇宙 - 听播客，上小宇宙&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;科技乱炖-小宇宙-听播客-上小宇宙&#34;&gt;&lt;a href=&#34;https://www.xiaoyuzhoufm.com/podcast/5e4243cd418a84a0469573fb&#34;&gt;科技乱炖 | 小宇宙 - 听播客，上小宇宙&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;晚点聊-latetalk-小宇宙-听播客-上小宇宙&#34;&gt;&lt;a href=&#34;https://www.xiaoyuzhoufm.com/podcast/61933ace1b4320461e91fd55&#34;&gt;晚点聊 LateTalk | 小宇宙 - 听播客，上小宇宙&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;张小珺jùn-商业访谈录-小宇宙-听播客-上小宇宙&#34;&gt;&lt;a href=&#34;https://www.xiaoyuzhoufm.com/podcast/626b46ea9cbbf0451cf5a962&#34;&gt;张小珺Jùn｜商业访谈录 | 小宇宙 - 听播客，上小宇宙&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&#34;95-dot-对manus创始人肖弘的3小时访谈-世界不是线性外推-做博弈中的重要变量-张小珺jùn-商业访谈录-小宇宙-听播客-上小宇宙&#34;&gt;&lt;a href=&#34;https://www.xiaoyuzhoufm.com/episode/67c3d80fb0167b8db9e3ec0f&#34;&gt;95. 对Manus创始人肖弘的3小时访谈：世界不是线性外推，做博弈中的重要变量 - 张小珺Jùn｜商业访谈录 | 小宇宙 - 听播客，上小宇宙&lt;/a&gt;&lt;/h3&gt;
&lt;h2 id=&#34;episodes-三杯过后&#34;&gt;&lt;a href=&#34;https://xiaowenz.com/episodes/&#34;&gt;Episodes - 三杯过后&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;clearerthinking-dot-org-podcast-home&#34;&gt;&lt;a href=&#34;https://podcast.clearerthinking.org/&#34;&gt;ClearerThinking.org Podcast | Home&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;异见房间-小宇宙-听播客-上小宇宙&#34;&gt;&lt;a href=&#34;https://www.xiaoyuzhoufm.com/podcast/6628e91c67c973e1383b968a&#34;&gt;异见房间 | 小宇宙 - 听播客，上小宇宙&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;由三位总发出异见的女性媒体人发起的播客.&lt;/p&gt;</description>
    </item>
    <item>
      <title>那些名人名言</title>
      <link>http://blog.imcompany.cn/post/speech/</link>
      <pubDate>Wed, 28 Feb 2024 09:55:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/speech/</guid>
      <description>&lt;h2 id=&#34;一切的学习最终都是自学&#34;&gt;一切的学习最终都是自学&lt;/h2&gt;
&lt;h2 id=&#34;如果你没有时间集中精力学习新知识-那么就花时间复习已经学过的内容&#34;&gt;如果你没有时间集中精力学习新知识，那么就花时间复习已经学过的内容。&lt;/h2&gt;
&lt;h2 id=&#34;作为一个普通人-一个小人物-不要给自己使命感-你来这个世界上的核心目的-就是为了体验美好&#34;&gt;作为一个普通人，一个小人物，不要给自己使命感，你来这个世界上的核心目的，就是为了体验美好。&lt;/h2&gt;
&lt;h2 id=&#34;所谓好运-并不是你躺在那里好事就砸到了你-而是你的努力付出-得到了应有的回报&#34;&gt;所谓好运，并不是你躺在那里好事就砸到了你，而是你的努力付出，得到了应有的回报&lt;/h2&gt;
&lt;h2 id=&#34;学习技术最需要是耐心而不是智商&#34;&gt;学习技术最需要是耐心而不是智商&lt;/h2&gt;
&lt;h2 id=&#34;阅读无法由ai替代&#34;&gt;阅读无法由AI替代&lt;/h2&gt;
&lt;h2 id=&#34;如果你没见过什么是好的-你将永远无法成长&#34;&gt;如果你没见过什么是好的，你将永远无法成长&lt;/h2&gt;
&lt;h2 id=&#34;ai要当作-知识注入-和-向量数据库-去用-所以当ai半天写不对代码的时候-往往不是他笨-而是缺乏线索&#34;&gt;AI要当作 “知识注入” 和 “向量数据库” 去用， 所以当AI半天写不对代码的时候， 往往不是他笨， 而是缺乏线索&lt;/h2&gt;
&lt;h2 id=&#34;早段限时饮食--早点吃晚餐或不吃晚餐--有助于改善代谢健康&#34;&gt;早段限时饮食(早点吃晚餐或不吃晚餐)有助于改善代谢健康&lt;/h2&gt;
&lt;h2 id=&#34;大多数哲学的目的-都是强化你的身心-让你学会-对于那些自己无法控制的事情要漠不关心&#34;&gt;大多数哲学的目的，都是强化你的身心，让你学会，对于那些自己无法控制的事情要漠不关心&lt;/h2&gt;
&lt;h2 id=&#34;金融投资必须用闲钱-非金融投资对普通人更重要-例如教育-运动-健康生活这些&#34;&gt;金融投资必须用闲钱，非金融投资对普通人更重要，例如教育、运动、健康生活这些&lt;/h2&gt;
&lt;h2 id=&#34;一个人能力的大小-其实很多时候就是你想不想到-源头-去的欲望&#34;&gt;一个人能力的大小，其实很多时候就是你想不想到“源头”去的欲望！&lt;/h2&gt;
&lt;h2 id=&#34;ai要当作-知识注入-与-向量数据库-去用-多提供线索&#34;&gt;AI要当作“知识注入”与”向量数据库”去用，多提供线索&lt;/h2&gt;
&lt;h2 id=&#34;用户调研不是去问他们要什么-而是要看他们为什么而花钱&#34;&gt;用户调研不是去问他们要什么，而是要看他们为什么而花钱&lt;/h2&gt;
&lt;h2 id=&#34;只要一件事本质是有益的-就值得全心投入&#34;&gt;只要一件事本质是有益的，就值得全心投入&lt;/h2&gt;
&lt;h2 id=&#34;如果你没见过什么是好的-你将无法成长&#34;&gt;如果你没见过什么是好的，你将无法成长&lt;/h2&gt;
&lt;h2 id=&#34;学习语言不仅仅只是沟通-更大的目的是为了了解文化-无论母语还是外语&#34;&gt;学习语言不仅仅只是沟通，更大的目的是为了了解文化，无论母语还是外语&lt;/h2&gt;
&lt;h2 id=&#34;聪明的大脑-勤奋的双手-才是创造一切的根本&#34;&gt;聪明的大脑，勤奋的双手，才是创造一切的根本&lt;/h2&gt;
&lt;h2 id=&#34;语言的编程速度因人而异-符合程序员的个人经历和思维习惯的语言-写起来最快&#34;&gt;语言的编程速度因人而异，符合程序员的个人经历和思维习惯的语言，写起来最快。&lt;/h2&gt;
&lt;h2 id=&#34;如何缓解焦虑&#34;&gt;如何缓解焦虑&lt;/h2&gt;
&lt;p&gt;努力提高自己的下限&lt;/p&gt;
&lt;h2 id=&#34;高兴的时候不做承诺-生气的时候不做决定&#34;&gt;高兴的时候不做承诺，生气的时候不做决定&lt;/h2&gt;
&lt;h2 id=&#34;聪明的人不仅更擅长思考-他们似乎也更常选择去思考-这里的-思考-指的是那种需要努力的思考-而不是快速的判断或直觉&#34;&gt;聪明的人不仅更擅长思考，他们似乎也更常选择去思考。这里的「思考」指的是那种需要努力的思考，而不是快速的判断或直觉。&lt;/h2&gt;
&lt;h2 id=&#34;普通人更要心力内敛-磨练技能-让自己的人生走向一个更为开阔的世界&#34;&gt;普通人更要心力内敛，磨练技能，让自己的人生走向一个更为开阔的世界&lt;/h2&gt;
&lt;h2 id=&#34;人类所有的问题-都源于人无法独自安静地坐在房间里&#34;&gt;人类所有的问题，都源于人无法独自安静地坐在房间里。&lt;/h2&gt;
&lt;h2 id=&#34;笔记工具只是帮你记录更多信息-并不能自动帮你学习&#34;&gt;笔记工具只是帮你记录更多信息，并不能自动帮你学习&lt;/h2&gt;
&lt;h2 id=&#34;提高认知最便宜-最直接-最快能入手的一项-教育-不是自学-而是反思性写作reflective-writing&#34;&gt;提高认知最便宜，最直接，最快能入手的一项“教育”不是自学，而是反思性写作Reflective Writing&lt;/h2&gt;
&lt;h2 id=&#34;要复盘-要迭代-要深度思考-努力才有效率&#34;&gt;要复盘，要迭代，要深度思考，努力才有效率&lt;/h2&gt;
&lt;h2 id=&#34;编程-meta-skills-很重要-一切技术都有过时的一天-唯有思想才能永恒&#34;&gt;编程 meta-skills 很重要；一切技术都有过时的一天，唯有思想才能永恒。&lt;/h2&gt;
&lt;h2 id=&#34;凡事做得到-自己做得到的叫知道-自己还没有做到的-一律不叫知道&#34;&gt;凡事做得到，自己做得到的叫知道，自己还没有做到的，一律不叫知道。&lt;/h2&gt;
&lt;p&gt;不是你做到过的，一律不是你的&lt;/p&gt;
&lt;h2 id=&#34;你盯着这些极小概率事件-没有意义的-人要盘算的-谋划的-是自己生命中够得着的东西&#34;&gt;你盯着这些极小概率事件，没有意义的，人要盘算的，谋划的，是自己生命中够得着的东西。&lt;/h2&gt;
&lt;h2 id=&#34;未来属于那些有想法-还能动手去做的人&#34;&gt;未来属于那些有想法、还能动手去做的人。&lt;/h2&gt;
&lt;h2 id=&#34;避免偏见的最好方法-是保持好奇心和谦逊&#34;&gt;避免偏见的最好方法，是保持好奇心和谦逊&lt;/h2&gt;
&lt;h2 id=&#34;投资基础思维-不纠结-莫强求-拿得起-放得下&#34;&gt;投资基础思维: 不纠结，莫强求，拿得起，放得下&lt;/h2&gt;
&lt;h2 id=&#34;大模型的本质-它们是概率系统-而非确定性系统&#34;&gt;大模型的本质：它们是概率系统，而非确定性系统&lt;/h2&gt;
&lt;h2 id=&#34;学习是50-的术语和50-的实际学习&#34;&gt;学习是50%的术语和50%的实际学习&lt;/h2&gt;
&lt;h2 id=&#34;要学好东西-除了教材-书本-视频以外-一个良好的反馈环境太重要了&#34;&gt;要学好东西，除了教材、书本、视频以外，一个良好的反馈环境太重要了&lt;/h2&gt;
&lt;h2 id=&#34;任何时候-都不要放弃自己的思考&#34;&gt;任何时候，都不要放弃自己的思考&lt;/h2&gt;
&lt;h2 id=&#34;理想的人生-应该是随时死去-都不留遗憾&#34;&gt;理想的人生，应该是随时死去，都不留遗憾。&lt;/h2&gt;
&lt;h2 id=&#34;与-ai-交谈不像在与一个人交谈-而像在与人类的集体思维交谈-ai-不应该让你减少思考-而应该帮助你增加思考-ai-是你的杠杆-可以让你拓展自己&#34;&gt;与 AI 交谈不像在与一个人交谈，而像在与人类的集体思维交谈。AI 不应该让你减少思考，而应该帮助你增加思考，AI 是你的杠杆，可以让你拓展自己。&lt;/h2&gt;
&lt;h2 id=&#34;做任何事情之前我们都会先去找一下有没有现成的-锤子&#34;&gt;做任何事情之前我们都会先去找一下有没有现成的“锤子”&lt;/h2&gt;
&lt;h2 id=&#34;如果一件事情中相对的双方都对现状非常不满意-那通常就存在一个非常满意的第三方&#34;&gt;如果一件事情中相对的双方都对现状非常不满意，那通常就存在一个非常满意的第三方&lt;/h2&gt;
&lt;h2 id=&#34;软件工程里面-实践和人品最重要-学历不重要&#34;&gt;软件工程里面，实践和人品最重要，学历不重要&lt;/h2&gt;
&lt;h2 id=&#34;读书的目的是启发自己-而不要追求知识的多寡&#34;&gt;读书的目的是启发自己，而不要追求知识的多寡&lt;/h2&gt;
&lt;h2 id=&#34;无论什么事情-如果你发现你持续处于被动的状态下-那么你一定要停下来想一想如何把被动变为主动&#34;&gt;无论什么事情，如果你发现你持续处于被动的状态下，那么你一定要停下来想一想如何把被动变为主动。&lt;/h2&gt;
&lt;h2 id=&#34;能用钱解决的事情-就马上解决它-你会发现世界真美好&#34;&gt;能用钱解决的事情，就马上解决它。你会发现世界真美好&lt;/h2&gt;
&lt;h2 id=&#34;不要把职业-career-当成某一件具体的事情-这是人类发明的最危险-最令人窒息的概念之一-也是大多数梦想和直觉的敌人&#34;&gt;不要把职业（career）当成某一件具体的事情，这是人类发明的最危险、最令人窒息的概念之一，也是大多数梦想和直觉的敌人。&lt;/h2&gt;
&lt;p&gt;职业应该是一个抽象的概念，指的是一个人在日常的工作和生活中，不断探索、培训、实践、逐步进步的过程。&lt;/p&gt;
&lt;h2 id=&#34;让团队更顺利地运行不是你的工作-你的真正工作是执行公司领导层的使命&#34;&gt;让团队更顺利地运行不是你的工作，你的真正工作是执行公司领导层的使命。&lt;/h2&gt;
&lt;h2 id=&#34;我们已经到了这个地步-学习哪种编程语言无关紧要-现在真正的技能是系统设计-架构-devops-云计算-那些在-ai-之上快速构建系统的技能&#34;&gt;我们已经到了这个地步：学习哪种编程语言无关紧要。现在真正的技能是系统设计、架构、DevOps、云计算&amp;mdash;-那些在 AI 之上快速构建系统的技能。&lt;/h2&gt;
&lt;h2 id=&#34;构建强大且可靠的ai智能体-正逐渐不再是寻找魔法般的提示词或依赖模型更新-而变为如何高效地进行上下文工程&#34;&gt;构建强大且可靠的AI智能体，正逐渐不再是寻找魔法般的提示词或依赖模型更新，而变为如何高效地进行上下文工程。&lt;/h2&gt;
&lt;h2 id=&#34;ai-是第二大脑-系统才是第一生产力&#34;&gt;AI 是第二大脑，系统才是第一生产力。&lt;/h2&gt;
&lt;h2 id=&#34;高效学习&#34;&gt;高效学习&lt;/h2&gt;
&lt;p&gt;大量重试→大量犯错→注意自己犯的错误→改正错误，激活神经系统里的奖赏回路 →休息，放空，让大脑自己巩固&lt;/p&gt;</description>
    </item>
    <item>
      <title>那些名人名言</title>
      <link>http://blog.imcompany.cn/posts/speech/</link>
      <pubDate>Wed, 28 Feb 2024 09:55:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/posts/speech/</guid>
      <description>&lt;h2 id=&#34;一切的学习最终都是自学&#34;&gt;一切的学习最终都是自学&lt;/h2&gt;
&lt;h2 id=&#34;如果你没有时间集中精力学习新知识-那么就花时间复习已经学过的内容&#34;&gt;如果你没有时间集中精力学习新知识，那么就花时间复习已经学过的内容。&lt;/h2&gt;
&lt;h2 id=&#34;作为一个普通人-一个小人物-不要给自己使命感-你来这个世界上的核心目的-就是为了体验美好&#34;&gt;作为一个普通人，一个小人物，不要给自己使命感，你来这个世界上的核心目的，就是为了体验美好。&lt;/h2&gt;
&lt;h2 id=&#34;所谓好运-并不是你躺在那里好事就砸到了你-而是你的努力付出-得到了应有的回报&#34;&gt;所谓好运，并不是你躺在那里好事就砸到了你，而是你的努力付出，得到了应有的回报&lt;/h2&gt;
&lt;h2 id=&#34;学习技术最需要是耐心而不是智商&#34;&gt;学习技术最需要是耐心而不是智商&lt;/h2&gt;
&lt;h2 id=&#34;阅读无法由ai替代&#34;&gt;阅读无法由AI替代&lt;/h2&gt;
&lt;h2 id=&#34;如果你没见过什么是好的-你将永远无法成长&#34;&gt;如果你没见过什么是好的，你将永远无法成长&lt;/h2&gt;
&lt;h2 id=&#34;ai要当作-知识注入-和-向量数据库-去用-所以当ai半天写不对代码的时候-往往不是他笨-而是缺乏线索&#34;&gt;AI要当作 “知识注入” 和 “向量数据库” 去用， 所以当AI半天写不对代码的时候， 往往不是他笨， 而是缺乏线索&lt;/h2&gt;
&lt;h2 id=&#34;早段限时饮食--早点吃晚餐或不吃晚餐--有助于改善代谢健康&#34;&gt;早段限时饮食(早点吃晚餐或不吃晚餐)有助于改善代谢健康&lt;/h2&gt;
&lt;h2 id=&#34;大多数哲学的目的-都是强化你的身心-让你学会-对于那些自己无法控制的事情要漠不关心&#34;&gt;大多数哲学的目的，都是强化你的身心，让你学会，对于那些自己无法控制的事情要漠不关心&lt;/h2&gt;
&lt;h2 id=&#34;金融投资必须用闲钱-非金融投资对普通人更重要-例如教育-运动-健康生活这些&#34;&gt;金融投资必须用闲钱，非金融投资对普通人更重要，例如教育、运动、健康生活这些&lt;/h2&gt;
&lt;h2 id=&#34;一个人能力的大小-其实很多时候就是你想不想到-源头-去的欲望&#34;&gt;一个人能力的大小，其实很多时候就是你想不想到“源头”去的欲望！&lt;/h2&gt;
&lt;h2 id=&#34;ai要当作-知识注入-与-向量数据库-去用-多提供线索&#34;&gt;AI要当作“知识注入”与”向量数据库”去用，多提供线索&lt;/h2&gt;
&lt;h2 id=&#34;用户调研不是去问他们要什么-而是要看他们为什么而花钱&#34;&gt;用户调研不是去问他们要什么，而是要看他们为什么而花钱&lt;/h2&gt;
&lt;h2 id=&#34;只要一件事本质是有益的-就值得全心投入&#34;&gt;只要一件事本质是有益的，就值得全心投入&lt;/h2&gt;
&lt;h2 id=&#34;如果你没见过什么是好的-你将无法成长&#34;&gt;如果你没见过什么是好的，你将无法成长&lt;/h2&gt;
&lt;h2 id=&#34;学习语言不仅仅只是沟通-更大的目的是为了了解文化-无论母语还是外语&#34;&gt;学习语言不仅仅只是沟通，更大的目的是为了了解文化，无论母语还是外语&lt;/h2&gt;
&lt;h2 id=&#34;聪明的大脑-勤奋的双手-才是创造一切的根本&#34;&gt;聪明的大脑，勤奋的双手，才是创造一切的根本&lt;/h2&gt;
&lt;h2 id=&#34;语言的编程速度因人而异-符合程序员的个人经历和思维习惯的语言-写起来最快&#34;&gt;语言的编程速度因人而异，符合程序员的个人经历和思维习惯的语言，写起来最快。&lt;/h2&gt;
&lt;h2 id=&#34;如何缓解焦虑&#34;&gt;如何缓解焦虑&lt;/h2&gt;
&lt;p&gt;努力提高自己的下限&lt;/p&gt;
&lt;h2 id=&#34;高兴的时候不做承诺-生气的时候不做决定&#34;&gt;高兴的时候不做承诺，生气的时候不做决定&lt;/h2&gt;
&lt;h2 id=&#34;聪明的人不仅更擅长思考-他们似乎也更常选择去思考-这里的-思考-指的是那种需要努力的思考-而不是快速的判断或直觉&#34;&gt;聪明的人不仅更擅长思考，他们似乎也更常选择去思考。这里的「思考」指的是那种需要努力的思考，而不是快速的判断或直觉。&lt;/h2&gt;
&lt;h2 id=&#34;普通人更要心力内敛-磨练技能-让自己的人生走向一个更为开阔的世界&#34;&gt;普通人更要心力内敛，磨练技能，让自己的人生走向一个更为开阔的世界&lt;/h2&gt;
&lt;h2 id=&#34;人类所有的问题-都源于人无法独自安静地坐在房间里&#34;&gt;人类所有的问题，都源于人无法独自安静地坐在房间里。&lt;/h2&gt;
&lt;h2 id=&#34;笔记工具只是帮你记录更多信息-并不能自动帮你学习&#34;&gt;笔记工具只是帮你记录更多信息，并不能自动帮你学习&lt;/h2&gt;
&lt;h2 id=&#34;提高认知最便宜-最直接-最快能入手的一项-教育-不是自学-而是反思性写作reflective-writing&#34;&gt;提高认知最便宜，最直接，最快能入手的一项“教育”不是自学，而是反思性写作Reflective Writing&lt;/h2&gt;
&lt;h2 id=&#34;要复盘-要迭代-要深度思考-努力才有效率&#34;&gt;要复盘，要迭代，要深度思考，努力才有效率&lt;/h2&gt;
&lt;h2 id=&#34;编程-meta-skills-很重要-一切技术都有过时的一天-唯有思想才能永恒&#34;&gt;编程 meta-skills 很重要；一切技术都有过时的一天，唯有思想才能永恒。&lt;/h2&gt;
&lt;h2 id=&#34;凡事做得到-自己做得到的叫知道-自己还没有做到的-一律不叫知道&#34;&gt;凡事做得到，自己做得到的叫知道，自己还没有做到的，一律不叫知道。&lt;/h2&gt;
&lt;p&gt;不是你做到过的，一律不是你的&lt;/p&gt;
&lt;h2 id=&#34;你盯着这些极小概率事件-没有意义的-人要盘算的-谋划的-是自己生命中够得着的东西&#34;&gt;你盯着这些极小概率事件，没有意义的，人要盘算的，谋划的，是自己生命中够得着的东西。&lt;/h2&gt;
&lt;h2 id=&#34;未来属于那些有想法-还能动手去做的人&#34;&gt;未来属于那些有想法、还能动手去做的人。&lt;/h2&gt;
&lt;h2 id=&#34;避免偏见的最好方法-是保持好奇心和谦逊&#34;&gt;避免偏见的最好方法，是保持好奇心和谦逊&lt;/h2&gt;
&lt;h2 id=&#34;投资基础思维-不纠结-莫强求-拿得起-放得下&#34;&gt;投资基础思维: 不纠结，莫强求，拿得起，放得下&lt;/h2&gt;
&lt;h2 id=&#34;大模型的本质-它们是概率系统-而非确定性系统&#34;&gt;大模型的本质：它们是概率系统，而非确定性系统&lt;/h2&gt;
&lt;h2 id=&#34;学习是50-的术语和50-的实际学习&#34;&gt;学习是50%的术语和50%的实际学习&lt;/h2&gt;
&lt;h2 id=&#34;要学好东西-除了教材-书本-视频以外-一个良好的反馈环境太重要了&#34;&gt;要学好东西，除了教材、书本、视频以外，一个良好的反馈环境太重要了&lt;/h2&gt;
&lt;h2 id=&#34;任何时候-都不要放弃自己的思考&#34;&gt;任何时候，都不要放弃自己的思考&lt;/h2&gt;
&lt;h2 id=&#34;理想的人生-应该是随时死去-都不留遗憾&#34;&gt;理想的人生，应该是随时死去，都不留遗憾。&lt;/h2&gt;
&lt;h2 id=&#34;与-ai-交谈不像在与一个人交谈-而像在与人类的集体思维交谈-ai-不应该让你减少思考-而应该帮助你增加思考-ai-是你的杠杆-可以让你拓展自己&#34;&gt;与 AI 交谈不像在与一个人交谈，而像在与人类的集体思维交谈。AI 不应该让你减少思考，而应该帮助你增加思考，AI 是你的杠杆，可以让你拓展自己。&lt;/h2&gt;
&lt;h2 id=&#34;做任何事情之前我们都会先去找一下有没有现成的-锤子&#34;&gt;做任何事情之前我们都会先去找一下有没有现成的“锤子”&lt;/h2&gt;
&lt;h2 id=&#34;如果一件事情中相对的双方都对现状非常不满意-那通常就存在一个非常满意的第三方&#34;&gt;如果一件事情中相对的双方都对现状非常不满意，那通常就存在一个非常满意的第三方&lt;/h2&gt;
&lt;h2 id=&#34;软件工程里面-实践和人品最重要-学历不重要&#34;&gt;软件工程里面，实践和人品最重要，学历不重要&lt;/h2&gt;
&lt;h2 id=&#34;读书的目的是启发自己-而不要追求知识的多寡&#34;&gt;读书的目的是启发自己，而不要追求知识的多寡&lt;/h2&gt;
&lt;h2 id=&#34;无论什么事情-如果你发现你持续处于被动的状态下-那么你一定要停下来想一想如何把被动变为主动&#34;&gt;无论什么事情，如果你发现你持续处于被动的状态下，那么你一定要停下来想一想如何把被动变为主动。&lt;/h2&gt;
&lt;h2 id=&#34;能用钱解决的事情-就马上解决它-你会发现世界真美好&#34;&gt;能用钱解决的事情，就马上解决它。你会发现世界真美好&lt;/h2&gt;
&lt;h2 id=&#34;不要把职业-career-当成某一件具体的事情-这是人类发明的最危险-最令人窒息的概念之一-也是大多数梦想和直觉的敌人&#34;&gt;不要把职业（career）当成某一件具体的事情，这是人类发明的最危险、最令人窒息的概念之一，也是大多数梦想和直觉的敌人。&lt;/h2&gt;
&lt;p&gt;职业应该是一个抽象的概念，指的是一个人在日常的工作和生活中，不断探索、培训、实践、逐步进步的过程。&lt;/p&gt;
&lt;h2 id=&#34;让团队更顺利地运行不是你的工作-你的真正工作是执行公司领导层的使命&#34;&gt;让团队更顺利地运行不是你的工作，你的真正工作是执行公司领导层的使命。&lt;/h2&gt;
&lt;h2 id=&#34;我们已经到了这个地步-学习哪种编程语言无关紧要-现在真正的技能是系统设计-架构-devops-云计算-那些在-ai-之上快速构建系统的技能&#34;&gt;我们已经到了这个地步：学习哪种编程语言无关紧要。现在真正的技能是系统设计、架构、DevOps、云计算&amp;mdash;-那些在 AI 之上快速构建系统的技能。&lt;/h2&gt;
&lt;h2 id=&#34;构建强大且可靠的ai智能体-正逐渐不再是寻找魔法般的提示词或依赖模型更新-而变为如何高效地进行上下文工程&#34;&gt;构建强大且可靠的AI智能体，正逐渐不再是寻找魔法般的提示词或依赖模型更新，而变为如何高效地进行上下文工程。&lt;/h2&gt;
&lt;h2 id=&#34;ai-是第二大脑-系统才是第一生产力&#34;&gt;AI 是第二大脑，系统才是第一生产力。&lt;/h2&gt;
&lt;h2 id=&#34;高效学习&#34;&gt;高效学习&lt;/h2&gt;
&lt;p&gt;大量重试→大量犯错→注意自己犯的错误→改正错误，激活神经系统里的奖赏回路 →休息，放空，让大脑自己巩固&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 第8期</title>
      <link>http://blog.imcompany.cn/post/peng-week8/</link>
      <pubDate>Tue, 27 Feb 2024 16:17:17 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/peng-week8/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;h3 id=&#34;the-art-of-loving&#34;&gt;&lt;a href=&#34;https://impalas-sit-6xj.craft.me/DxNFpwLvkwxlsH&#34;&gt;The Art of Loving&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;爱是一门节术，它需要知识与努力&lt;/li&gt;
&lt;li&gt;新的爱的自由概念以对象的重要性为主，而不是功能性&lt;/li&gt;
&lt;li&gt;分离是所有焦虑的根源&lt;/li&gt;
&lt;li&gt;人最深切的需要就是克服孤独&lt;/li&gt;
&lt;li&gt;成熟的爱是在保持独立性与个人特质下的结合&lt;/li&gt;
&lt;li&gt;爱的主动性是给予而不是接受&lt;/li&gt;
&lt;li&gt;爱是产生爱的力量&lt;/li&gt;
&lt;li&gt;爱的积极性的基本要素：关怀、责任、尊重和知识&lt;/li&gt;
&lt;li&gt;尊重存在于自由的基础上，爱是自由之子而不是统治之子&lt;/li&gt;
&lt;li&gt;对自己的生活、幸福、成长、自由的肯定根植于一个人爱的能力&lt;/li&gt;
&lt;li&gt;爱是由适当的性满足所得到的结果&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;h3 id=&#34;nonwill-goldendict-ocr-goldendict-plus-plus&#34;&gt;&lt;a href=&#34;https://github.com/nonwill/GoldenDict-OCR&#34;&gt;nonwill/GoldenDict-OCR: GoldenDict++&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;GoldenDict官方版本增强与修正，速度杠杠的！&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/ULg3vI.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h2 id=&#34;image-️&#34;&gt;Image 🖼️&lt;/h2&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/Sgzih5.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;Amazon公司CEO贝佐斯创立的蓝色起源公司的&lt;a href=&#34;https://www.space.com/blue-origin-new-glenn-rocket-launch-pad-photo&#34;&gt;新格伦火箭发射&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;speech&#34;&gt;Speech 💬&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;If you want to reach the most people, learn to make videos. If you want to reach the smartest people, learn to write.&lt;/strong&gt; - &lt;a href=&#34;https://twitter.com/david_perell&#34;&gt;@david_perell&lt;/a&gt;
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/XLeQYR.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;ldquo;The more things you have, the more things you have to manage, Simplicity isn&amp;rsquo;t merely cheaper, it&amp;rsquo;s easier.&amp;rdquo;&lt;/strong&gt;
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/xzoxRW.jpg&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;idea&#34;&gt;Idea 💡&lt;/h2&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 第7期</title>
      <link>http://blog.imcompany.cn/post/peng-week7/</link>
      <pubDate>Wed, 31 Jan 2024 16:12:28 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/peng-week7/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;h3 id=&#34;the-go-to-person-what-you-need-to-become-one&#34;&gt;&lt;a href=&#34;https://www.forbes.com/sites/jeffschmitt/2013/10/31/the-go-to-person-what-you-need-to-become-one/?sh=243d1617522e&#34;&gt;The Go-To Person: What You Need To Become One&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;成为一个牛人需要做哪些，作者引入体育竞技中的牛人的特征来对工作上如何成为牛人提供参考，主要有以下10点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;时刻准备，准备的更多，处理的更快&lt;/li&gt;
&lt;li&gt;拥抱责任，只害怕错过而不是犯错误&lt;/li&gt;
&lt;li&gt;树立榜样，日常生活始终如一，不走捷径&lt;/li&gt;
&lt;li&gt;负责，只关心自己能控制什么&lt;/li&gt;
&lt;li&gt;不回避失败，失败是正常的，一次次的失败会带来成功&lt;/li&gt;
&lt;li&gt;忍受批评，坚定自己的信念&lt;/li&gt;
&lt;li&gt;建立联系，与队友建立起联系&lt;/li&gt;
&lt;li&gt;召唤意志，聚焦人心&lt;/li&gt;
&lt;li&gt;保持镇定，不过度反应&lt;/li&gt;
&lt;li&gt;认识自己的时间，可以交给其它人做&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;h3 id=&#34;stretchly-the-break-time-reminder-app&#34;&gt;&lt;a href=&#34;https://hovancik.net/stretchly/&#34;&gt;Stretchly - The break time reminder app&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;跨平台休息提醒APP，开源，配合&lt;a href=&#34;https://github.com/KingOfSpades/stretchFred&#34;&gt;Alfred插件&lt;/a&gt;食用更佳&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/yb86JR.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;还提供命令行接口
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/Zkr914.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;支持配置文件设置，默认配置文件在 &lt;strong&gt;~/Library/Application Support/Stretchly/config.json&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;image-️&#34;&gt;Image 🖼️&lt;/h2&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/cYHg8c.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;英语单词对世界空间维度的抽象，还是一个是空间维度的相对性问题&lt;/p&gt;
&lt;h2 id=&#34;speech&#34;&gt;Speech 💬&lt;/h2&gt;
&lt;p&gt;The power of better question:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&amp;ldquo;Why am I not successful?&amp;rdquo; You&amp;rsquo;ll get answers that berate you.&lt;/li&gt;
&lt;li&gt;&amp;ldquo;How can I succeed here?&amp;rdquo; You&amp;rsquo;ll get answers that push you.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Be deliberate in the questions you ask yourself.&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 第6期</title>
      <link>http://blog.imcompany.cn/post/peng-week6/</link>
      <pubDate>Tue, 23 Jan 2024 11:29:36 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/peng-week6/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;h3 id=&#34;how-to-build-a-minimum-loveable-product-by-laurence-mccahill-the-happy-startup-school-medium&#34;&gt;&lt;a href=&#34;https://medium.com/the-happy-startup-school/beyond-mvp-10-steps-to-make-your-product-minimum-loveable-51800164ae0c&#34;&gt;How to Build a Minimum Loveable Product | by Laurence McCahill | The Happy Startup School | Medium&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;如何构建一个最小可爱产品(MLP)，对应的MVP已经提出多年，它表示以最小工作量带回对客户的充分了解；而最小可爱产品则是以最少的努力从产品的早期用户中获取到最大的爱，强调产品要有爱。
作者给出做好MLP的几点建议：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;确定产品的点，专注于WHY&lt;/li&gt;
&lt;li&gt;做好一件事, FOCUS&lt;/li&gt;
&lt;li&gt;添加约束，限制产品时间，3个月足够&lt;/li&gt;
&lt;li&gt;只解决高价值问题&lt;/li&gt;
&lt;li&gt;给产品增加惊喜与喜悦&lt;/li&gt;
&lt;li&gt;请最好的设计师&lt;/li&gt;
&lt;li&gt;吸引用户，让用户渴望更多&lt;/li&gt;
&lt;li&gt;建立部落&lt;/li&gt;
&lt;li&gt;让产品变得非凡&lt;/li&gt;
&lt;li&gt;要有战略眼光，产品只是一部分&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;让产品超越可用，让用户爱你的产品！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;h3 id=&#34;keyboard-maestro-11-dot-0-dot-2-work-faster-with-macros-for-macos&#34;&gt;&lt;a href=&#34;https://www.keyboardmaestro.com/main/&#34;&gt;Keyboard Maestro 11.0.2: Work Faster with Macros for macOS&lt;/a&gt;&lt;/h3&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/uzSqzI.png&#34;/&gt; 
&lt;/figure&gt;

&lt;blockquote&gt;
&lt;p&gt;MAC生产力工具，内置上百个动作，收费软件，但绝对物超所值，列几个常用功能：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;快捷键映射&lt;/li&gt;
&lt;li&gt;palette(菜单面板)&lt;/li&gt;
&lt;li&gt;按键模拟&lt;/li&gt;
&lt;li&gt;针对特定应用执行动作&lt;/li&gt;
&lt;li&gt;配合&lt;a href=&#34;https://forum.keyboardmaestro.com/t/macro-spotlight-search-prompt/4665&#34;&gt;Spotlight Search Prompt macro&lt;/a&gt;无敌了&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;image-️&#34;&gt;Image 🖼️&lt;/h2&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://www.goodfreephotos.com/albums/vector-images/cat-sniffing-a-plate-bread-vector-clipart.png&#34;/&gt; 
&lt;/figure&gt;

&lt;blockquote&gt;
&lt;p&gt;开始使用&lt;a href=&#34;https://www.goodfreephotos.com/&#34;&gt;免费&lt;/a&gt;的图片，推荐一下这个&lt;a href=&#34;https://github.com/neutraltone/awesome-stock-resources&#34;&gt;免费资源仓库&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;speech&#34;&gt;Speech 💬&lt;/h2&gt;
&lt;p&gt;Domain names and websites are the new real-estate. - &lt;a href=&#34;https://en.wikipedia.org/wiki/Marc_Ostrofsky?useskin=vector&#34;&gt;Marc Ostrofsky&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;想, 全是问题；做，全是答案。&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 第5期</title>
      <link>http://blog.imcompany.cn/post/peng-week5/</link>
      <pubDate>Tue, 16 Jan 2024 10:17:09 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/peng-week5/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;h3 id=&#34;how-to-make-hard-decisions&#34;&gt;&lt;!-- raw HTML omitted --&gt;DONE&lt;!-- raw HTML omitted --&gt; &lt;a href=&#34;https://vasilishynkarenka.com/how-to-make-hard-decisions/&#34;&gt;How to make hard decisions&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Captured On: &lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;[2024-01-11 Thu 16:28]&lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;如何做出艰难的选择，可供参考的9个思想实验&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;模拟&lt;/li&gt;
&lt;li&gt;电影人物&lt;/li&gt;
&lt;li&gt;临终前的我&lt;/li&gt;
&lt;li&gt;后悔最小化框架&lt;/li&gt;
&lt;li&gt;恐惧设定&lt;/li&gt;
&lt;li&gt;幻想小人&lt;/li&gt;
&lt;li&gt;最后一天&lt;/li&gt;
&lt;li&gt;绿色大按钮&lt;/li&gt;
&lt;li&gt;信封&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;作者提供的决策原则&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;身体与精神状态良好&lt;/li&gt;
&lt;li&gt;给解决方案前先花时间描述问题&lt;/li&gt;
&lt;li&gt;检查偏差(沉没成本)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;目前只对&lt;a href=&#34;https://search.bilibili.com/all?vt=63109354&amp;amp;keyword=%E4%B9%94%E5%B8%83%E6%96%AF%E5%9C%A8%E6%96%AF%E5%9D%A6%E7%A6%8F%E5%A4%A7%E5%AD%A6%E7%9A%84%E6%BC%94%E8%AE%B2&#34;&gt;Jobs&lt;/a&gt;的最后一天(7)思想实验很有感触&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;h3 id=&#34;shortcat-universal-command-palette-for-your-mac-shortcat&#34;&gt;&lt;a href=&#34;https://shortcat.app/&#34;&gt;Shortcat: Universal command palette for your Mac | Shortcat&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;搜索&lt;/li&gt;
&lt;li&gt;选择&lt;/li&gt;
&lt;li&gt;动作&lt;/li&gt;
&lt;li&gt;支持emoji，输入 *:*，但是要知道emoji对应的编码&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;类似按键增强的APP还有付费软件 &lt;a href=&#34;https://superkey.app/&#34;&gt;superkey&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;image-️&#34;&gt;Image 🖼️&lt;/h2&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/VrssuX.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;&lt;a href=&#34;https://ultimatehackingkeyboard.com/&#34;&gt;https://ultimatehackingkeyboard.com/&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 第4期</title>
      <link>http://blog.imcompany.cn/post/peng-week4/</link>
      <pubDate>Fri, 29 Dec 2023 16:20:30 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/peng-week4/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read 📖&lt;/h2&gt;
&lt;h3 id=&#34;方便的代价&#34;&gt;&lt;a href=&#34;https://limboy.me/posts/the-price-of-convenience/&#34;&gt;方便的代价&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;万事皆有两面性，方便的代价有哪些呢？&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;不再理解过程，只关注结果，弱化了与目标的连接感&lt;/li&gt;
&lt;li&gt;过度依赖，不可控&lt;/li&gt;
&lt;li&gt;放大了欲望&lt;/li&gt;
&lt;li&gt;难以长时间集中注意力&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools 🧰&lt;/h2&gt;
&lt;h3 id=&#34;firefox&#34;&gt;Firefox&lt;/h3&gt;
&lt;p&gt;市面上基于Firefox浏览器的修改版本&lt;/p&gt;
&lt;h4 id=&#34;librewolf&#34;&gt;&lt;a href=&#34;https://librewolf.net/&#34;&gt;LibreWolf&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Firefox修改版，注意隐私、安全、用户自由，支持配置文件定制化配置&lt;/p&gt;
&lt;h4 id=&#34;floorp&#34;&gt;&lt;a href=&#34;https://floorp.app/en/&#34;&gt;Floorp&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Captured On: &lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;[2023-12-29 Fri 15:57]&lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;
&lt;p&gt;先进速度快的Firefox衍生品&lt;/p&gt;
&lt;h2 id=&#34;image-️&#34;&gt;Image 🖼️&lt;/h2&gt;
&lt;p&gt;Midjourney v6 杰作&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/Ak3amk.png&#34;/&gt; 
&lt;/figure&gt;

&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/chaseleantj/status/1738511249107767788&#34;&gt;https://twitter.com/chaseleantj/status/1738511249107767788&lt;/a&gt;&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;h2 id=&#34;speech&#34;&gt;Speech 💬&lt;/h2&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/zdNIQM.jpg&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;&lt;a href=&#34;https://twitter.com/baduyifei&#34;&gt;@baduyifei&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;idea&#34;&gt;Idea 💡&lt;/h2&gt;
&lt;p&gt;开始做减法&lt;/p&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 第3期</title>
      <link>http://blog.imcompany.cn/post/peng-week3/</link>
      <pubDate>Fri, 29 Dec 2023 15:48:35 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/peng-week3/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read&lt;/h2&gt;
&lt;h3 id=&#34;stop-springifying-your-unit-tests&#34;&gt;&lt;a href=&#34;https://saile.it/stop-springifying-your-unit-tests/&#34;&gt;Stop &amp;ldquo;Springifying&amp;rdquo; your unit tests&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Captured On: &lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;[2023-12-12 Tue 10:34]&lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;做单元测试真的需要Spring的Context吗?&lt;/li&gt;
&lt;li&gt;只是测试一个Service，需要引入Context吗？Spring只不过给new了一个Service&lt;/li&gt;
&lt;li&gt;测试前考虑好究竟要测试什么&lt;/li&gt;
&lt;li&gt;集成测试与单元测试的边界是什么&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;核电站-四种公认有效的学习法&#34;&gt;&lt;a href=&#34;https://hwv430.blogspot.com/2023/12/blog-post_90.html&#34;&gt;核电站: 四种公认有效的学习法&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Captured On: &lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;[2023-12-15 Fri 14:58]&lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;了解过费曼学习法和思维导图学习法&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;ai&#34;&gt;AI&lt;/h2&gt;
&lt;h3 id=&#34;onboard-ai&#34;&gt;&lt;a href=&#34;https://app.getonboardai.com/&#34;&gt;Onboard AI&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Captured On: &lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;[2023-12-15 Fri 10:34]&lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>2023年终总结</title>
      <link>http://blog.imcompany.cn/post/2023-sum-year/</link>
      <pubDate>Tue, 26 Dec 2023 10:44:15 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/2023-sum-year/</guid>
      <description>&lt;h2 id=&#34;今年开始写年终总结&#34;&gt;今年开始写年终总结&lt;/h2&gt;
&lt;h2 id=&#34;开始读书&#34;&gt;开始读书&lt;/h2&gt;
&lt;h2 id=&#34;开始锻炼&#34;&gt;开始锻炼&lt;/h2&gt;
&lt;h2 id=&#34;开始认真学英语&#34;&gt;开始认真学英语&lt;/h2&gt;
&lt;h2 id=&#34;开始系统学计算机基础&#34;&gt;开始系统学计算机基础&lt;/h2&gt;
&lt;h2 id=&#34;生活开始做减法&#34;&gt;生活开始做减法&lt;/h2&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 第2期</title>
      <link>http://blog.imcompany.cn/post/peng-week2/</link>
      <pubDate>Fri, 08 Dec 2023 11:45:44 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/peng-week2/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read&lt;/h2&gt;
&lt;h3 id=&#34;you-are-not-the-cause-of-everything-that-happens-to-you-but-you-are-responsible-for-how-you-respond-to-everything-that-happens-to-you&#34;&gt;You are not the cause of everything that happens to you, but you are responsible for how you respond to everything that happens to you&lt;/h3&gt;
&lt;p&gt;From &lt;a href=&#34;https://twitter.com/JamesClear&#34;&gt;JamesClear&lt;/a&gt; 321 weekly&lt;/p&gt;
&lt;h3 id=&#34;别了-华清嘉园&#34;&gt;&lt;a href=&#34;https://mp.weixin.qq.com/s/b99teSrzeg0S89Ey00c8WQ&#34;&gt;别了，华清嘉园&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Captured On: &lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;[2023-12-05 Tue 10:25]&lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;20年，见证互联网的兴衰，连带着房地产的兴衰&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;idea&#34;&gt;Idea&lt;/h2&gt;
&lt;h3 id=&#34;awl-highlighter&#34;&gt;&lt;a href=&#34;https://www.eapfoundation.com/vocab/academic/highlighter/&#34;&gt;AWL highlighter&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Captured On: &lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;[2023-12-07 Thu 17:25]&lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>这些年使用过的AI工具们</title>
      <link>http://blog.imcompany.cn/post/ai-tools/</link>
      <pubDate>Fri, 08 Dec 2023 11:40:07 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/ai-tools/</guid>
      <description>&lt;h2 id=&#34;github-copilot-your-ai-pair-programmer&#34;&gt;&lt;a href=&#34;https://github.com/features/copilot&#34;&gt;GitHub Copilot · Your AI pair programmer&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;微软的AI编程助手&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/29aimk.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h2 id=&#34;automatic1111-stable-diffusion-webui-stable-diffusion-web-ui&#34;&gt;&lt;a href=&#34;https://github.com/AUTOMATIC1111/stable-diffusion-webui&#34;&gt;AUTOMATIC1111/stable-diffusion-webui: Stable Diffusion web UI&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Stable Diffusion 本地浏览器UI&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/LqwqqB.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h2 id=&#34;ollama&#34;&gt;&lt;a href=&#34;https://github.com/jmorganca/ollama&#34;&gt;Ollama&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;本地运行大模型的Mac APP，搭配 &lt;a href=&#34;https://github.com/s-kostyaev/ellama&#34;&gt;ellama-emacs&lt;/a&gt; 食用更佳&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/uuo6eb.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h2 id=&#34;mozilla-ocho-llamafile-distribute-and-run-llms-with-a-single-file-dot&#34;&gt;&lt;a href=&#34;https://github.com/Mozilla-Ocho/llamafile&#34;&gt;Mozilla-Ocho/llamafile: Distribute and run LLMs with a single file.&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Mozilla发布的单个可执行运行大模型的文件，下载直接授权执行即可&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/Atlgbo.png&#34;/&gt; 
&lt;/figure&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://simonwillison.net/2023/Nov/29/llamafile/&#34;&gt;https://simonwillison.net/2023/Nov/29/llamafile/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;warp-your-terminal-reimagined&#34;&gt;&lt;a href=&#34;https://www.warp.dev/&#34;&gt;Warp: Your terminal, reimagined&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Captured On: &lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;[2023-12-08 Fri 11:36]&lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;
&lt;p&gt;带AI功能命令行客户端&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/vWCuIf.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h2 id=&#34;more-dot-dot-dot&#34;&gt;More&amp;hellip;&lt;/h2&gt;</description>
    </item>
    <item>
      <title>众乐乐-weekly 第1期</title>
      <link>http://blog.imcompany.cn/post/peng-week1/</link>
      <pubDate>Thu, 30 Nov 2023 16:22:20 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/peng-week1/</guid>
      <description>&lt;h2 id=&#34;read&#34;&gt;Read&lt;/h2&gt;
&lt;h3 id=&#34;how-to-choose-a-tool&#34;&gt;&lt;a href=&#34;https://karl-voit.at/2021/01/18/tool-choices/&#34;&gt;How to Choose a Tool&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Captured On: &lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;[2023-11-20 Mon 15:12]&lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;
&lt;p&gt;如何选择工具，作者认为可以从以下方面进行：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;确定需求
&lt;ol&gt;
&lt;li&gt;工具必备功能&lt;/li&gt;
&lt;li&gt;好用但不是必备的功能&lt;/li&gt;
&lt;li&gt;非必备功能&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;搜寻工具
&lt;ol&gt;
&lt;li&gt;上网搜索&lt;/li&gt;
&lt;li&gt;找人推荐&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;分析可用工具
&lt;ol&gt;
&lt;li&gt;具体开放性&lt;/li&gt;
&lt;li&gt;灵活性&lt;/li&gt;
&lt;li&gt;数据复用与导出&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;选择工具
&lt;ol&gt;
&lt;li&gt;重新比对一下需求与要使用的工具&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;定期改进与评估&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;我选择工具的标准:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;优选开源免费&lt;/li&gt;
&lt;li&gt;可配置，可扩展&lt;/li&gt;
&lt;li&gt;数据可方便导入导出&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;罗肖尼-如何永远学会一个单词-哔哩哔哩-bilibili&#34;&gt;&lt;a href=&#34;https://www.bilibili.com/video/BV1ns4y1A7fj/&#34;&gt;【罗肖尼】如何永远学会一个单词？_哔哩哔哩_bilibili&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Captured On: &lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;[2023-11-21 Tue 17:53]&lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;
&lt;p&gt;如何学习英语:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;单词在语境中才有意义&lt;/li&gt;
&lt;li&gt;如何记住单词并扩充广度和深度
&lt;ol&gt;
&lt;li&gt;读英文书&lt;/li&gt;
&lt;li&gt;有褶皱的书更有意义&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;重复(万能大法)&lt;/li&gt;
&lt;li&gt;不要低估习惯的力量，从读一段文字开始，每天坚持，逐步递进，给自己一个加速度&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;app&#34;&gt;APP&lt;/h2&gt;
&lt;p&gt;主要是一些MAC相关的APP&lt;/p&gt;</description>
    </item>
    <item>
      <title>Logseq常用插件</title>
      <link>http://blog.imcompany.cn/post/logseq-plugin/</link>
      <pubDate>Fri, 24 Nov 2023 19:07:41 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/logseq-plugin/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;
&lt;p&gt;以此文章记录我常用的Logseq plugin，常用常更新&lt;/p&gt;
&lt;h2 id=&#34;readwise-official-plugin&#34;&gt;Readwise Official Plugin&lt;/h2&gt;
&lt;h2 id=&#34;logseq-anki-sync&#34;&gt;Logseq Anki Sync&lt;/h2&gt;</description>
    </item>
    <item>
      <title>MAC本地编译go源码记录</title>
      <link>http://blog.imcompany.cn/post/go-compile-source-code/</link>
      <pubDate>Wed, 20 Sep 2023 11:35:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/go-compile-source-code/</guid>
      <description>&lt;h2 id=&#34;说明&#34;&gt;说明&lt;/h2&gt;
&lt;p&gt;近期在学习GO语言，想深入研读一下GO的源码，第一步就要是可以在本地正常的编译源代码，此文对MAC上go源的安装进行记录&lt;/p&gt;
&lt;h2 id=&#34;下载go源码&#34;&gt;下载go源码&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git clone https://github.com/golang/go
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;选择go版本分支&#34;&gt;选择go版本分支&lt;/h2&gt;
&lt;p&gt;本次使用go 1.8版本分支来进行编译，切换分支&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git checkout release-branch.go1.8
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;本地编译&#34;&gt;本地编译&lt;/h2&gt;
&lt;h3 id=&#34;查看本地的go版本&#34;&gt;查看本地的go版本&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;go version
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;go version go1.20.5 darwin/amd64
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;设置编译源码的go版本&#34;&gt;设置编译源码的go版本&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;GOROOT_BOOTSTRAP&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$GOROOT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;设置go-mod模式为auto&#34;&gt;设置go mod模式为auto&lt;/h3&gt;
&lt;p&gt;因为在go1.16后，go默认在任何路径下都开启gomod模式，待编译的go源码不需要使用gomod模式，设置其它模式为自动&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;GO111MODULE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;auto
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/AtJ5N0.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h3 id=&#34;编译&#34;&gt;编译&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; go/src
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;./make.bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;输出结果如下&#34;&gt;输出结果如下&lt;/h4&gt;
&lt;hr&gt;
&lt;p&gt;Installed Go for darwin/amd64 in /Users/tomyli/github/go
Installed commands in /Users/tomyli/github/go/bin&lt;/p&gt;
&lt;h2 id=&#34;测试验证&#34;&gt;测试验证&lt;/h2&gt;
&lt;h3 id=&#34;修改go1-dot-8的fmt包-增加一行打印内容-打印出来-tomyli&#34;&gt;修改go1.8的fmt包，增加一行打印内容，打印出来 tomyli&lt;/h3&gt;
&lt;p&gt;/Users/tomyli/github/go/src/fmt/print.go&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;...&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;interface&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{})&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;tomyli&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Fprintln&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Stdout&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;...&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;重新编译&#34;&gt;重新编译&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; go/src
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;./make.bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;验证脚本&#34;&gt;验证脚本&lt;/h3&gt;
&lt;h4 id=&#34;创建一个新编译的go的gopath&#34;&gt;创建一个新编译的go的GOPATH&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mkdir /Users/tomyli/github/go/localhost
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;测试脚本保存到localhost文件夹&#34;&gt;测试脚本保存到localhost文件夹&lt;/h4&gt;
&lt;p&gt;main.go内容如下&lt;/p&gt;</description>
    </item>
    <item>
      <title>GO语言学习与分享-入门篇</title>
      <link>http://blog.imcompany.cn/post/learn-go/</link>
      <pubDate>Tue, 19 Sep 2023 16:00:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/learn-go/</guid>
      <description>&lt;h2 id=&#34;简介&#34;&gt;简介&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;GO诞生于2009年，&lt;a href=&#34;https://go.dev/&#34;&gt;官网&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;静态编译型语言&lt;/li&gt;
&lt;li&gt;强类型语言&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;http://blog.imcompany.cn/ox-hugo/golang.png&#34; width=&#34;50%&#34; height=&#34;50%&#34;/&gt; 
&lt;/figure&gt;

&lt;h3 id=&#34;创始人&#34;&gt;创始人&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Ken Thompson&lt;/li&gt;
&lt;li&gt;Rob Pike&lt;/li&gt;
&lt;li&gt;Robert Griesemer&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;http://blog.imcompany.cn/ox-hugo/go-fathers.jpg&#34;/&gt; 
&lt;/figure&gt;

&lt;!-- raw HTML omitted --&gt;
&lt;ol&gt;
&lt;li&gt;肯 汤普森&lt;/li&gt;
&lt;li&gt;罗伯 派克&lt;/li&gt;
&lt;li&gt;罗伯特 格瑞史莫&lt;/li&gt;
&lt;/ol&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;h3 id=&#34;目标&#34;&gt;目标&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;简单&lt;/li&gt;
&lt;li&gt;高效&lt;/li&gt;
&lt;li&gt;生产力&lt;/li&gt;
&lt;/ol&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;借鉴多门编程语言，新时代的C&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;h2 id=&#34;设计哲学&#34;&gt;设计哲学&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;简单&lt;/li&gt;
&lt;li&gt;显式&lt;/li&gt;
&lt;li&gt;组合&lt;/li&gt;
&lt;li&gt;并发&lt;/li&gt;
&lt;li&gt;面向工程&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;类型&#34;&gt;类型&lt;/h2&gt;
&lt;h3 id=&#34;普通类型&#34;&gt;普通类型&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;$GOPATH/src/builtin/builtin.go&lt;/p&gt;
&lt;/blockquote&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;type-study/type-study_test.go&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.educative.io/answers/what-is-type-uintptr-in-golang&#34;&gt;https://www.educative.io/answers/what-is-type-uintptr-in-golang&lt;/a&gt;&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;h4 id=&#34;int&#34;&gt;int&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;int&lt;/li&gt;
&lt;li&gt;int8&lt;/li&gt;
&lt;li&gt;int16&lt;/li&gt;
&lt;li&gt;int32&lt;/li&gt;
&lt;li&gt;int64&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;uint&#34;&gt;uint&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;uint&lt;/li&gt;
&lt;li&gt;uint8&lt;/li&gt;
&lt;li&gt;uint16&lt;/li&gt;
&lt;li&gt;uint32&lt;/li&gt;
&lt;li&gt;uint64&lt;/li&gt;
&lt;li&gt;uintptr&lt;/li&gt;
&lt;/ol&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;不带数字的为平台相关的类型&lt;/p&gt;</description>
    </item>
    <item>
      <title>性能的本质IPC之动手验证</title>
      <link>http://blog.imcompany.cn/post/system-ipc/</link>
      <pubDate>Thu, 25 May 2023 15:42:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/system-ipc/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;
&lt;p&gt;最近在实践学习plantegg大佬的程序员案例，对IPC的实验进行一下记录，以备查验&lt;/p&gt;
&lt;h2 id=&#34;术语说明&#34;&gt;术语说明&lt;/h2&gt;
&lt;h3 id=&#34;ipc&#34;&gt;IPC&lt;/h3&gt;
&lt;p&gt;本文的主角，全名为 Instructions per cycle(clock), 表示每个时钟周期可执行的指令数，常用来做为评判处理器性能的指标&lt;/p&gt;
&lt;h3 id=&#34;nop&#34;&gt;NOP&lt;/h3&gt;
&lt;p&gt;no operation, 在指令集中表示一个指令不改变所执行程序的 register，status flag，也就是不要进行上下文的切换，CPU的上下文切换是有时间开销的&lt;/p&gt;
&lt;h2 id=&#34;实验代码下载&#34;&gt;实验代码下载&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git clone https://github.com/plantegg/programmer_case
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;实验机器信息&#34;&gt;实验机器信息&lt;/h2&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/1581-lscpu.png&#34;/&gt; 
&lt;/figure&gt;

&lt;blockquote&gt;
&lt;p&gt;实验只可在物理机下进行&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;实验验证&#34;&gt;实验验证&lt;/h2&gt;
&lt;h3 id=&#34;测试nop指令&#34;&gt;测试nop指令&lt;/h3&gt;
&lt;h4 id=&#34;编译测试代码&#34;&gt;编译测试代码&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;gcc ./nop.c -o nop
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;执行测试&#34;&gt;执行测试&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;perf stat ./nop
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;现象&lt;/p&gt;
&lt;p&gt;IPC跑到3.79&lt;/p&gt;
&lt;figure&gt;
        &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/1581-nop-alone-3.79.png&#34;/&gt; 
    &lt;/figure&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;问题&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;我记得第一次执行IPC好像跑到了4(未改变代码)，当时忘记截图了，后续测试的都到不了4了&lt;/li&gt;
&lt;li&gt;IPC与perf执行时间长短有关吗？
&lt;ol&gt;
&lt;li&gt;好像是无关的，保证cpu 100%后就可以停止进行查看&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;IPC怎么接近4？
&lt;ol&gt;
&lt;li&gt;改代码增加nop指令的数量，加到将近700个，IPC达到3.97&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;测试pause指令&#34;&gt;测试pause指令&lt;/h3&gt;
&lt;h4 id=&#34;编译测试代码&#34;&gt;编译测试代码&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;gcc ./pause.c -o pause
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;执行测试&#34;&gt;执行测试&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;perf stat ./pause
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;现象&lt;/p&gt;
&lt;p&gt;IPC只跑到了0.11&lt;/p&gt;
&lt;figure&gt;
        &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/1581-pause-alone-0.11.png&#34;/&gt; 
    &lt;/figure&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;测试nop指令跑两份各自绑定到同一物理核&#34;&gt;测试nop指令跑两份各自绑定到同一物理核&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;如何判断HT？通过查看/proc/cpuinfo信息，
如果physical id和core id都一样的话，说明这两个core实际是一个物理core，其中一个是HT&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id=&#34;执行测试&#34;&gt;执行测试&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;taskset -c &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; perf stat ./nop
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;taskset -c &lt;span class=&#34;m&#34;&gt;24&lt;/span&gt; perf stat ./nop
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;现象&lt;/p&gt;</description>
    </item>
    <item>
      <title>Linux命令学习之wc</title>
      <link>http://blog.imcompany.cn/post/linux-wc/</link>
      <pubDate>Thu, 02 Mar 2023 15:44:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/linux-wc/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;
&lt;p&gt;在日常应用中，统计文件内容是一种常见的需求，可以通过 &lt;strong&gt;wc&lt;/strong&gt; 命令来实现&lt;/p&gt;
&lt;h2 id=&#34;wc&#34;&gt;Wc&lt;/h2&gt;
&lt;h3 id=&#34;wc-file&#34;&gt;wc file&lt;/h3&gt;
&lt;p&gt;统计文件，显示行数、单词数、字节数，带文件名
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/uSkm52.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;wc-c-file&#34;&gt;wc -c file&lt;/h3&gt;
&lt;p&gt;统计文件，只显示字节数
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/kdVyQV.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;wc-w-file&#34;&gt;wc -w file&lt;/h3&gt;
&lt;p&gt;统计文件，只显示单词数
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/qRx3ta.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;wc-l-file&#34;&gt;wc -l file&lt;/h3&gt;
&lt;p&gt;统计文件，只显示文件行数
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/knyLfa.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;wc-file1-file2&#34;&gt;wc file1 file2&lt;/h3&gt;
&lt;p&gt;统计多个文件，显示汇总信息
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/2FhCi3.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;wc-file&#34;&gt;wc &amp;lt; file&lt;/h3&gt;
&lt;p&gt;统计文件，显示行数、单词数、字节数，不带文件，便于shell脚本后续处理
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/aQe3Of.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;wc-l-file&#34;&gt;wc -L file&lt;/h3&gt;
&lt;p&gt;打印出文件行最长的节数
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/pZaMqM.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;疑惑&#34;&gt;疑惑&lt;/h2&gt;
&lt;h3 id=&#34;wc-c-与-wc-w-是如何统计的&#34;&gt;wc -c 与 wc -w 是如何统计的&lt;/h3&gt;
&lt;p&gt;在统计 &lt;strong&gt;hello.txt&lt;/strong&gt; 时， &lt;strong&gt;wc -c&lt;/strong&gt; 的结果为 &lt;strong&gt;55&lt;/strong&gt; ， &lt;strong&gt;wc -m&lt;/strong&gt; 的结果为 &lt;strong&gt;45&lt;/strong&gt; ，为什么统计的结果不一样？这个文本中包含了中文内容，猜测和这个有关&lt;/p&gt;
&lt;h4 id=&#34;验证是否与中文有关&#34;&gt;验证是否与中文有关&lt;/h4&gt;
&lt;p&gt;这个好办，建一个不带中文的文件，验证如下
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/lGB8Hn.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;可以看到统计的结果是一样的&lt;/p&gt;
&lt;h4 id=&#34;中文是如何统计的&#34;&gt;中文是如何统计的?&lt;/h4&gt;
&lt;p&gt;这个就涉及到编码的问题了，先用 &lt;a href=&#34;https://github.com/sharkdp/hexyl&#34;&gt;hexyl&lt;/a&gt; 查看一下，字节的总数为55，但是在进行字符统计时，使用的&lt;a href=&#34;https://en.wikipedia.org/wiki/Unicode?useskin=vector&#34;&gt;unicode&lt;/a&gt;编码将3个字节计算为1个字符(例如 &lt;strong&gt;好&lt;/strong&gt; 被编码成 &lt;strong&gt;E5 A5 BD&lt;/strong&gt; )，这就对上了，哈哈!
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/yCMZHP.png&#34;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;编码是个大话题，后续好好学习一下&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;ref&#34;&gt;REF&lt;/h2&gt;
&lt;h3 id=&#34;wc--unix--wikipedia-useskin-vector&#34;&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Wc_(Unix)?useskin=vector&#34;&gt;wc (Unix) - Wikipedia&lt;/a&gt;&lt;/h3&gt;
&lt;h3 id=&#34;wc-how-to-display-the-number-of-lines-words-and-characters-in-separate-lines-unix-and-linux-stack-exchange&#34;&gt;&lt;a href=&#34;https://unix.stackexchange.com/questions/154322/how-to-display-the-number-of-lines-words-and-characters-in-separate-lines&#34;&gt;wc - How to display the number of lines, words and characters in separate lines? - Unix &amp;amp; Linux Stack Exchange&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Captured On: &lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;[2023-03-02 Thu 16:28]&lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Linux命令学习之More and Less</title>
      <link>http://blog.imcompany.cn/post/linux-moreless/</link>
      <pubDate>Wed, 08 Feb 2023 15:54:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/linux-moreless/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;
&lt;p&gt;开发中查看日志信息过多时，可以使用linux中的 &lt;strong&gt;more&lt;/strong&gt; 和 &lt;strong&gt;less&lt;/strong&gt; 命令进行分页查看&lt;/p&gt;
&lt;h2 id=&#34;more&#34;&gt;More&lt;/h2&gt;
&lt;p&gt;分页显示文件内容，只可以向后翻页&lt;/p&gt;
&lt;h3 id=&#34;more-file&#34;&gt;more file&lt;/h3&gt;
&lt;p&gt;分页显示文件内容, 在页面使用 &lt;strong&gt;空格键&lt;/strong&gt; 进行翻页
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/linux-more-file.gif&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;more-n-file&#34;&gt;more -n file&lt;/h3&gt;
&lt;p&gt;分页显示文件内容，一页显示指定行数
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/linux-more-file-number.gif&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;more-d-file&#34;&gt;more -d file&lt;/h3&gt;
&lt;p&gt;分页显示文件内容，带页面操作提示信息
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/linux-more-file-slient.gif&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;more-p-file&#34;&gt;more -p file&lt;/h3&gt;
&lt;p&gt;分页显示文件内容，不进行滚动，而是直接替换页面的内容
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/linux-more-file-p.gif&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;more-s-file&#34;&gt;more -s file&lt;/h3&gt;
&lt;p&gt;分页显示文件内容，多行空格按一行空格显示
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/linux-more-file-blank-line.gif&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;more-plus-num-file&#34;&gt;more +num file&lt;/h3&gt;
&lt;p&gt;分页显示文件内容，从文件的第 &lt;strong&gt;n&lt;/strong&gt; 行开始显示
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/linux-more-file-with-start.gif&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;more-f-file&#34;&gt;more -f file&lt;/h3&gt;
&lt;p&gt;分页显示文件内容，不折叠长行
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/linux-more-file-with-longline.gif&#34;&gt;&lt;/p&gt;
&lt;p&gt;如上图所示，第一行这个长行按两行进行了统计&lt;/p&gt;
&lt;h2 id=&#34;less&#34;&gt;Less&lt;/h2&gt;
&lt;p&gt;分页显示文件内容，More的增强版本，支持向前向后翻页，页面操作类VI形式。less &amp;gt; more&lt;/p&gt;
&lt;h3 id=&#34;less-file&#34;&gt;less file&lt;/h3&gt;
&lt;p&gt;分页显示文件内容，可上下(b)翻页，按行(j/k)翻
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/linux-less-file.gif&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;less-g-file&#34;&gt;less -g file&lt;/h3&gt;
&lt;p&gt;分页显示内容，只高亮单条结果(默认高亮所有匹配)，对大文件可提升性能
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/linux-less-file-highlight-one.gif&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;less-n-file&#34;&gt;less -N file&lt;/h3&gt;
&lt;p&gt;分页显示内容，带行号，可用来查看源码
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/linux-less-file-show-number.gif&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;less-s-file&#34;&gt;less -s file&lt;/h3&gt;
&lt;p&gt;分页显示文件内容，多行空格按一行空格显示
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/linux-less-file-blank-line.gif&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;less-m-file&#34;&gt;less -M file&lt;/h3&gt;
&lt;p&gt;分页显示文件内容，底部显示更多信息(当前的进度和屏幕显示的行信息)
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/linux-less-file-show-line-info.gif&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;less-p-file&#34;&gt;less -p file&lt;/h3&gt;
&lt;p&gt;分页显示文件内容，查询指定内容，在匹配处开始显示
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/linux-less-file-search-pattern.gif&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;less-plus-g-file&#34;&gt;less +G file&lt;/h3&gt;
&lt;p&gt;分页显示文件内容，从文件结尾开始显示
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/linux-less-file-from-bottom.gif&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Linux命令学习-只看文件一部分的head与tail</title>
      <link>http://blog.imcompany.cn/post/linux-headtail/</link>
      <pubDate>Mon, 30 Jan 2023 18:27:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/linux-headtail/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;
&lt;p&gt;开发中常常需要查看文件的部分内容，这时可以用 &lt;strong&gt;head&lt;/strong&gt; 命令来查看文件开头部分与 &lt;strong&gt;tail&lt;/strong&gt; 命令来查看文件结尾部分&lt;/p&gt;
&lt;h2 id=&#34;head&#34;&gt;Head&lt;/h2&gt;
&lt;h3 id=&#34;head-file&#34;&gt;head file&lt;/h3&gt;
&lt;p&gt;打印文件的前10行内容&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/o2zr7E.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h3 id=&#34;head-n-file&#34;&gt;head -n file&lt;/h3&gt;
&lt;p&gt;打印文件前n行的内容&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/TCsOEj.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h3 id=&#34;head-c-file&#34;&gt;head -c file&lt;/h3&gt;
&lt;p&gt;打印文件前n个字节(换行符计算在内)的内容，文件小于指定字节则打印全部文件内容&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/lsEmuL.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h3 id=&#34;head-v-file&#34;&gt;head -v file&lt;/h3&gt;
&lt;p&gt;打印文件的前10行内容，显示打印的文件标题&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/Nkabtm.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h3 id=&#34;head-file1-file2&#34;&gt;head file1 file2&lt;/h3&gt;
&lt;p&gt;同时查看多个文件的头部内容
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/mEcQRv.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;head-q-file1-file2&#34;&gt;head -q file1 file2&lt;/h3&gt;
&lt;p&gt;同时查看多个文件的头部内容，不打印文件标题，可用于后续文件内容合并处理
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/Lw9ZuL.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;tail&#34;&gt;Tail&lt;/h2&gt;
&lt;h3 id=&#34;tail-file&#34;&gt;tail file&lt;/h3&gt;
&lt;p&gt;打印文件后10行内容，不足则打印全部内容
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/fFRryh.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;tail-n-file&#34;&gt;tail -n file&lt;/h3&gt;
&lt;p&gt;指定打印文件后n行的内容
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/KVopOw.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;tail-c-file&#34;&gt;tail -c file&lt;/h3&gt;
&lt;p&gt;打印文件尾部n个字节(换行符计算在内)的内容，文件小于指定字节则打印全部文件内容
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/1G0PFd.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;tail-v-file&#34;&gt;tail -v file&lt;/h3&gt;
&lt;p&gt;打印文件的尾部10行内容，显示打印的文件标题
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/x1LfMy.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;tail-q-file1-file2&#34;&gt;tail -q file1 file2&lt;/h3&gt;
&lt;p&gt;同时查看多个文件的尾部内容，不打印文件标题，可用于后续文件内容合并处理
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/jUhR6k.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;tail-f-file&#34;&gt;tail -f file&lt;/h3&gt;
&lt;p&gt;监控文件后续输出，对监控线上服务日志输出很有用
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/tail-with-follow.gif&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;tail-f-file&#34;&gt;tail -F file&lt;/h3&gt;
&lt;p&gt;监控文件后续输出，即使文件重命名也可以正确输出，对监控线上服务日志输出很有用
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/tail-with-follow-f.gif&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;tail-f-pid-n-file&#34;&gt;tail -f &amp;ndash;pid=n file&lt;/h3&gt;
&lt;p&gt;监控文件输出，当监控的进程退出时， &lt;strong&gt;tail&lt;/strong&gt; 程序退出&lt;/p&gt;
&lt;h2 id=&#34;ref&#34;&gt;REF&lt;/h2&gt;
&lt;h3 id=&#34;head--unix--wikipedia-useskin-vector&#34;&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Head_(Unix)?useskin=vector&#34;&gt;head (Unix) - Wikipedia&lt;/a&gt;&lt;/h3&gt;
&lt;h3 id=&#34;using-linux-tail-command-with-pid-terminate-option-youtube&#34;&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=wWHz1mfFZ-w&#34;&gt;Using Linux Tail Command with PID Terminate Option - YouTube&lt;/a&gt;&lt;/h3&gt;</description>
    </item>
    <item>
      <title>Linux命令学习之cat</title>
      <link>http://blog.imcompany.cn/post/linux-cat/</link>
      <pubDate>Fri, 13 Jan 2023 11:41:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/linux-cat/</guid>
      <description>&lt;h2 id=&#34;功能&#34;&gt;功能&lt;/h2&gt;
&lt;p&gt;Cat命令有两个作用：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;输出文件内容到标准输出&lt;/li&gt;
&lt;li&gt;合并文件内容&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/UPmfmN.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h2 id=&#34;输出文件内容&#34;&gt;输出文件内容&lt;/h2&gt;
&lt;h3 id=&#34;cat-file&#34;&gt;cat file&lt;/h3&gt;
&lt;p&gt;查看文件内容&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/9LJohL.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h3 id=&#34;cat-n-file&#34;&gt;cat -n file&lt;/h3&gt;
&lt;p&gt;查看文件内容，带行号，统计所有行(包括空行)&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/7C1eEu.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h3 id=&#34;cat-b-file&#34;&gt;cat -b file&lt;/h3&gt;
&lt;p&gt;查看文件内容，带行号，不统计空行&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/rQsJte.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h3 id=&#34;cat-s-file&#34;&gt;cat -s file&lt;/h3&gt;
&lt;p&gt;查看文件内容，压缩空行，多个空行只显示一行空行
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/kqjJl8.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;cat-e-file&#34;&gt;cat -E file&lt;/h3&gt;
&lt;p&gt;查看文件内容，显示行结束符号为 &lt;strong&gt;$&lt;/strong&gt;
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/7FBdUy.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;cat-t-file&#34;&gt;cat -T file&lt;/h3&gt;
&lt;p&gt;查看文件内容，显示tab符号为 &lt;strong&gt;^&lt;/strong&gt;
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/MRJk0v.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;cat-a-file&#34;&gt;cat -A file&lt;/h3&gt;
&lt;p&gt;查看文件内容，显示tab符号为 &lt;strong&gt;^&lt;/strong&gt; ，显示行结束符号为 &lt;strong&gt;$&lt;/strong&gt;
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/WeFwYd.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;cat-multiple-files&#34;&gt;cat multiple files&lt;/h3&gt;
&lt;p&gt;查看多个文件
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/ElyTTc.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;合并文件内容&#34;&gt;合并文件内容&lt;/h2&gt;
&lt;p&gt;cat配合linux的管道命令可以实现更强大的功能&lt;/p&gt;
&lt;h3 id=&#34;cat-file1-file2-file3&#34;&gt;cat file1 file2 &amp;gt; file3&lt;/h3&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/Ekol3C.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h3 id=&#34;cat-newfile&#34;&gt;cat &amp;gt;newfile&lt;/h3&gt;
&lt;p&gt;这是一个很强大的命令，可以直接创建文件并把输入的内容写入到新创建的文件中
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/cat-newfile.gif&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;cat&#34;&gt;cat&lt;/h3&gt;
&lt;p&gt;只输入cat会发生什么呢，它会把输入的内容再输出出来，没事可以自言自语了
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/cat-self.gif&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;cat-n-file1-file2-file3&#34;&gt;cat -n file1 file2 &amp;gt; file3&lt;/h3&gt;
&lt;p&gt;统计两个文件的内容带行号写入到file3
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/hjApFc.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;cat-file1-file2-file3&#34;&gt;cat file1 - file2 &amp;gt; file3&lt;/h3&gt;
&lt;p&gt;获取file1的内容，用户进行输入，最后加上file2的内容写到file3文件中
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/cat-with-middle-write.gif&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;cat-file1-file2&#34;&gt;cat file1 &amp;gt;&amp;gt; file2&lt;/h3&gt;
&lt;p&gt;追加file1的内容到file2中
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/QQWmfb.png&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Linux命令学习之touch</title>
      <link>http://blog.imcompany.cn/post/linux-touch/</link>
      <pubDate>Fri, 06 Jan 2023 17:55:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/linux-touch/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;
&lt;p&gt;今天学习一下Linux的 &lt;strong&gt;touch&lt;/strong&gt; 命令&lt;/p&gt;
&lt;h2 id=&#34;功能&#34;&gt;功能&lt;/h2&gt;
&lt;p&gt;按man文档的说明，是修改文件的时间戳，目前常用的操作是用来 &lt;strong&gt;创建文件&lt;/strong&gt;
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/RPJQDx.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;touch-file&#34;&gt;touch file&lt;/h2&gt;
&lt;p&gt;创建一个空文件，文件的访问时间与修改时间为当前时间&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/Rf6wbV.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h2 id=&#34;touch-a-file&#34;&gt;touch -a file&lt;/h2&gt;
&lt;p&gt;改变文件的访问时间
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/iU6HMm.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;从上图可以看出来， &lt;strong&gt;b.txt&lt;/strong&gt; 文件只有访问时间被修改了，修改时间没有变&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;验证时用到 &lt;a href=&#34;https://linux.die.net/man/1/stat&#34;&gt;stat&lt;/a&gt; 命令， 这个后续具体学习&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;touch-m-file&#34;&gt;touch -m file&lt;/h2&gt;
&lt;p&gt;改变文件的修改时间
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/ayyjFL.png&#34;&gt;
从上图可以看出来， &lt;strong&gt;cc.txt&lt;/strong&gt; 文件只有修改时间变了，访问时间没有变&lt;/p&gt;
&lt;h2 id=&#34;touch-t-file&#34;&gt;touch -t file&lt;/h2&gt;
&lt;p&gt;修改文件为指定的时间，格式为 &lt;strong&gt;[[CC]YY]MMDDhhmm[.ss]&lt;/strong&gt;
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/vtge5A.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;上图命令将 &lt;strong&gt;dd.txt&lt;/strong&gt; 文件的访问时间与修改时间改成了 &lt;strong&gt;2022-01-02 12:22:23&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;touch-d-file&#34;&gt;touch -d file&lt;/h2&gt;
&lt;p&gt;修改文件为指定的日期，支持的时间格式更广泛
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/d6IgY9.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;touch-r-reffile-file&#34;&gt;touch -r reffile file&lt;/h2&gt;
&lt;p&gt;修改文件的时间为引用的文件时间
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/3N9iFx.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;如图， &lt;strong&gt;ff.txt&lt;/strong&gt; 文件与 &lt;strong&gt;a.txt&lt;/strong&gt; 的时间同步了&lt;/p&gt;
&lt;h2 id=&#34;ref&#34;&gt;REF&lt;/h2&gt;
&lt;h3 id=&#34;touch--command--wikipedia&#34;&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Touch_(command)&#34;&gt;touch (command) - Wikipedia&lt;/a&gt;&lt;/h3&gt;
&lt;h3 id=&#34;check-file-access-and-modification-time-in-linux-linux-tutorials-learn-linux-configuration&#34;&gt;&lt;a href=&#34;https://linuxconfig.org/check-file-access-and-modification-time-in-linux&#34;&gt;Check file access and modification time in Linux - Linux Tutorials - Learn Linux Configuration&lt;/a&gt;&lt;/h3&gt;
&lt;h3 id=&#34;stat--1--file-file-system-status-linux-man-page&#34;&gt;&lt;a href=&#34;https://linux.die.net/man/1/stat&#34;&gt;stat(1): file/file system status - Linux man page&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Captured On: &lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;[2023-01-06 Fri 18:55]&lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Linux命令学习之Cp, Mv</title>
      <link>http://blog.imcompany.cn/post/linux-cpmv/</link>
      <pubDate>Wed, 04 Jan 2023 10:11:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/linux-cpmv/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;
&lt;p&gt;今天学习一下Linux中的复制移动相关命令，主要学习 &lt;strong&gt;cp&lt;/strong&gt; 与 &lt;strong&gt;mv&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;cp&#34;&gt;CP&lt;/h2&gt;
&lt;h3 id=&#34;功能&#34;&gt;功能&lt;/h3&gt;
&lt;p&gt;复制文件或文件夹&lt;/p&gt;
&lt;h3 id=&#34;cp-file-target&#34;&gt;cp file target&lt;/h3&gt;
&lt;p&gt;复制文件到target目录&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/awxABc.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h3 id=&#34;cp-i&#34;&gt;cp -i&lt;/h3&gt;
&lt;p&gt;复制前进行询问(如果存在同名文件)&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/UIwLJ9.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h3 id=&#34;cp-n&#34;&gt;cp -n&lt;/h3&gt;
&lt;p&gt;复制，但不覆盖已经存在的文件&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/LWdOji.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h3 id=&#34;cp-b&#34;&gt;cp -b&lt;/h3&gt;
&lt;p&gt;复制，复制前备份目标同名文件(如果存在)&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/RmwxBW.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h3 id=&#34;cp-f&#34;&gt;cp -f&lt;/h3&gt;
&lt;p&gt;强制删除(目录文件不能打开)并覆盖
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/tPA8AB.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;cp-p&#34;&gt;cp -p&lt;/h3&gt;
&lt;p&gt;复制文件到目标文件夹，保留原文件的修改时间、访问时间与归属相关信息&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/0Rt6Ur.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h3 id=&#34;cp-u&#34;&gt;cp -u&lt;/h3&gt;
&lt;p&gt;复制文件到目标文件夹，仅当源文件的修改时间晚于目标同名文件时进行复制&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/0cVlU7.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h3 id=&#34;cp-r&#34;&gt;cp -r&lt;/h3&gt;
&lt;p&gt;递归复制文件夹内容到目标文件夹&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/yUFV2H.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h3 id=&#34;组合杀&#34;&gt;组合杀&lt;/h3&gt;
&lt;h4 id=&#34;对文件进行备份-按数字方式&#34;&gt;对文件进行备份，按数字方式&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cp -f --backup&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;numbered aa.txt aa.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/6P4lSq.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;如图所示，每执行一次命令，就顺序产生一个同名文件+编号的备份，有点类似于一个版本管理系统&lt;/p&gt;
&lt;h4 id=&#34;更新文件夹&#34;&gt;更新文件夹&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cp -ruv e ../target
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/cZw5ta.png&#34;&gt;
如图所示，只有e/ee.txt有更新，执行命令时只做了增量更新文件&lt;/p&gt;
&lt;h2 id=&#34;mv&#34;&gt;MV&lt;/h2&gt;
&lt;h3 id=&#34;功能&#34;&gt;功能&lt;/h3&gt;
&lt;p&gt;移动(重命名)文件或文件夹&lt;/p&gt;
&lt;h3 id=&#34;mv&#34;&gt;mv&lt;/h3&gt;
&lt;h4 id=&#34;移动文件&#34;&gt;移动文件&lt;/h4&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/T0iZkY.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h4 id=&#34;移动并重命名&#34;&gt;移动并重命名&lt;/h4&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/GSDCV7.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h3 id=&#34;mv-i&#34;&gt;mv -i&lt;/h3&gt;
&lt;p&gt;移动前询问（目标有同名文件）&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/zMSVIF.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h3 id=&#34;mv-n&#34;&gt;mv -n&lt;/h3&gt;
&lt;p&gt;移动文件，但不覆盖存在的文件&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/rhG7PO.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h3 id=&#34;mv-u&#34;&gt;mv -u&lt;/h3&gt;
&lt;p&gt;移动文件，只在源文件比目标文件新时才执行
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/lOLRtR.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;mv-f&#34;&gt;mv -f&lt;/h3&gt;
&lt;p&gt;执行覆盖，不提示
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/uBKFdn.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;ref&#34;&gt;REF&lt;/h2&gt;
&lt;h3 id=&#34;cp--unix--wikipedia&#34;&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Cp_(Unix)&#34;&gt;cp (Unix) - Wikipedia&lt;/a&gt;&lt;/h3&gt;
&lt;h3 id=&#34;mv--unix--wikipedia&#34;&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Mv_(Unix)&#34;&gt;mv (Unix) - Wikipedia&lt;/a&gt;&lt;/h3&gt;
&lt;h3 id=&#34;two-great-uses-for-the-cp-command-opensource-dot-com&#34;&gt;&lt;a href=&#34;https://opensource.com/article/17/7/two-great-uses-cp-command&#34;&gt;Two great uses for the cp command | Opensource.com&lt;/a&gt;&lt;/h3&gt;</description>
    </item>
    <item>
      <title>Linux命令学习之删除rm, rmdir</title>
      <link>http://blog.imcompany.cn/post/linux-mkdir-rm/</link>
      <pubDate>Wed, 21 Dec 2022 15:20:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/linux-mkdir-rm/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;
&lt;p&gt;今天学习一下Linux命令中的删除命令，主要学习 &lt;strong&gt;rm&lt;/strong&gt; 与 &lt;strong&gt;rmdir&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;rm&#34;&gt;rm&lt;/h2&gt;
&lt;h3 id=&#34;功能&#34;&gt;功能&lt;/h3&gt;
&lt;p&gt;删除文件或目录&lt;/p&gt;
&lt;h3 id=&#34;删除谁&#34;&gt;删除谁&lt;/h3&gt;
&lt;h4 id=&#34;rm-file&#34;&gt;rm file&lt;/h4&gt;
&lt;p&gt;删除指定文件，只能删除文件，不能删除目录
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/h8RcDg.png&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;rm-r-file&#34;&gt;rm -r file&lt;/h4&gt;
&lt;p&gt;递归删除目录及目录下的文件
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/0OFKsT.png&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;rm-d-file&#34;&gt;rm -d file&lt;/h4&gt;
&lt;p&gt;删除空文件夹，文件夹不空则报错
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/MULkwJ.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;删除方式&#34;&gt;删除方式&lt;/h3&gt;
&lt;h4 id=&#34;rm-f-file&#34;&gt;rm -f file&lt;/h4&gt;
&lt;p&gt;强制删除文件，忽略文件不存在的错误信息
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/zBH6Cy.png&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;rm-i-file&#34;&gt;rm -i file&lt;/h4&gt;
&lt;p&gt;删除文件前进行确认提示，每删除一个文件提示一次
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/ZZ6ZMd.png&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;rm-i-file&#34;&gt;rm -I file&lt;/h4&gt;
&lt;p&gt;删除文件前进行有条件的确认提示，触发条件为：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;删除文件大于3个，只提示一次，小于等于3个不提示，直接删除&lt;/li&gt;
&lt;li&gt;递归删除时提示一次&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/0R32Gj.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h3 id=&#34;删除记录&#34;&gt;删除记录&lt;/h3&gt;
&lt;h4 id=&#34;rm-v-file&#34;&gt;rm -v file&lt;/h4&gt;
&lt;p&gt;显示删除的文件明细，有日志作用，有写脚本时很有用
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/62s2jL.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;组合杀&#34;&gt;组合杀&lt;/h3&gt;
&lt;h4 id=&#34;递归删除目录的文件-不带确认&#34;&gt;递归删除目录的文件（不带确认）&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;rm -rf file&lt;/strong&gt; 常用的删除命令（在受限用户上使用比较稳妥）
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/I46Y4y.png&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;递归删除目录的文件-带确认一次&#34;&gt;递归删除目录的文件（带确认一次）&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;rm -rfI file&lt;/strong&gt; 比较稳妥的删除目录方式，有一步确认提示(又防止了文件多提示多的烦恼)，防止手快
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/xoAoe9.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;rmdir&#34;&gt;rmdir&lt;/h2&gt;
&lt;h3 id=&#34;功能&#34;&gt;功能&lt;/h3&gt;
&lt;p&gt;删除空的文件夹(支持多个)&lt;/p&gt;
&lt;h3 id=&#34;为什么有这个命令&#34;&gt;为什么有这个命令&lt;/h3&gt;
&lt;p&gt;删除空文件夹的功能 &lt;strong&gt;rm -d&lt;/strong&gt; 也可以实现，为什么还要有这个命令?&lt;/p&gt;
&lt;h4 id=&#34;rmdir存在的原因&#34;&gt;rmdir存在的原因&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;它只能删除文件夹，功能更具体&lt;/li&gt;
&lt;li&gt;它可以删除目录及其父目录，这个 &lt;strong&gt;rm -d&lt;/strong&gt; 是做不到的, &lt;strong&gt;rm -d&lt;/strong&gt; 只能删除一层&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;rm -d&lt;/p&gt;</description>
    </item>
    <item>
      <title>Linux-ls命令学习</title>
      <link>http://blog.imcompany.cn/post/linux-ls/</link>
      <pubDate>Thu, 15 Dec 2022 20:17:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/linux-ls/</guid>
      <description>&lt;h2 id=&#34;功能&#34;&gt;功能&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;ls&lt;/strong&gt; 的功能为显示目录下的内容，默认情况下显示当前所在目录下的内容。用 &lt;strong&gt;man ls&lt;/strong&gt; 查看帮助，发现 &lt;strong&gt;ls&lt;/strong&gt; 支持了非常多的参数，后续学习以实际应用为主，只展示常用的内容&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/qlBbbJ.png&#34;/&gt; 
&lt;/figure&gt;

&lt;blockquote&gt;
&lt;p&gt;ls 命令帮助归属于&lt;a href=&#34;https://blog.imcompany.cn/post/linux-man/&#34;&gt;man&lt;/a&gt;文件第一章节&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;显示哪些内容&#34;&gt;显示哪些内容&lt;/h2&gt;
&lt;h3 id=&#34;ls&#34;&gt;ls&lt;/h3&gt;
&lt;p&gt;不带任何参数，显示当前目录下的文件内容，结果按字母自然排序
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/gn4J0K.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;ls-a&#34;&gt;ls -a&lt;/h3&gt;
&lt;p&gt;显示当前目录下所有的内容，包含隐藏(以.开头的文件)的内容，如上显示 &lt;strong&gt;.emacs&lt;/strong&gt; 和 &lt;strong&gt;.hide&lt;/strong&gt; 文件显示了出来
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/GWPMbm.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;ls-a&#34;&gt;ls -A&lt;/h3&gt;
&lt;p&gt;显示当前目录下所有的内容，包含隐藏(以.开头的文件)的内容，但不包含 &lt;strong&gt;.&lt;/strong&gt; 和 &lt;strong&gt;..&lt;/strong&gt;
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/yq9OSr.png&#34;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;. 代表当前目录
.. 代表上一级目录&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;ls-tmp&#34;&gt;ls /tmp&lt;/h3&gt;
&lt;p&gt;显示/tmp目录下的文件内容&lt;/p&gt;
&lt;h2 id=&#34;显示方式&#34;&gt;显示方式&lt;/h2&gt;
&lt;h3 id=&#34;ls-l&#34;&gt;ls -l&lt;/h3&gt;
&lt;p&gt;默认情况 &lt;strong&gt;ls&lt;/strong&gt; 只显示内容的名称， &lt;strong&gt;ls -l&lt;/strong&gt; 表示以长列表方式显示目录内容
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/lJyhLJ.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;增加了 &lt;strong&gt;-l&lt;/strong&gt; 选项后，显示结果中包含的文件内容更详细(包括权限、所属用户组、大小、修改时间等信息)&lt;/p&gt;
&lt;h4 id=&#34;ls-lh&#34;&gt;ls -lh&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;ls&lt;/strong&gt; 中有很多与 &lt;strong&gt;-l&lt;/strong&gt; 选项配合使用的其它选项，如 &lt;strong&gt;-h&lt;/strong&gt; 选项，可以显示文件大小为可读的形式（以M、G为单位）
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/xK7nfK.png&#34;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ls -l&lt;/strong&gt; 中文件大小默认是按byte为单位显示的&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;ls-x&#34;&gt;ls -x&lt;/h3&gt;
&lt;p&gt;按列显示
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/RmVnyB.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;ls-x&#34;&gt;ls -X&lt;/h3&gt;
&lt;p&gt;按文件类型字母排序显示
&lt;img loading=&#34;lazy&#34; src=&#34;http://pic.imcompany.cn/pic/c55emA.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;ls-1&#34;&gt;ls -1&lt;/h3&gt;
&lt;p&gt;一行显示一个
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/5yYqrQ.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;ls-r&#34;&gt;ls -R&lt;/h3&gt;
&lt;p&gt;递归显示所有内容
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/T47nqt.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;格式化显示&#34;&gt;格式化显示&lt;/h2&gt;
&lt;h3 id=&#34;ls-q&#34;&gt;ls -Q&lt;/h3&gt;
&lt;p&gt;显示结果加 &lt;strong&gt;引号&lt;/strong&gt;
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/1juQbr.png&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>如何使用Java JDK17版本OpenJ9 JVM</title>
      <link>http://blog.imcompany.cn/post/how-to-use-jdk17-j9jvm/</link>
      <pubDate>Wed, 14 Dec 2022 16:23:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/how-to-use-jdk17-j9jvm/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;
&lt;p&gt;心血来潮，看到JDK19都出来了，想着升级一下自己电脑上的JDK到JDK17 LTS版本+OpenJ9 JVM，在升级过程中遇到找不到安装资源的问题，记录一下解决过程&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;JDK17是Oracle的提供的长期支持版本，IBM J9是IBM优化的JVM版本，使用它可以节省JAVA服务使用的内存&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;使用adoptopenjdk-openjdk-安装&#34;&gt;使用adoptopenjdk/openjdk/安装&lt;/h2&gt;
&lt;p&gt;先前的adoptopenjdk11-openj9版本是从&lt;a href=&#34;https://github.com/AdoptOpenJDK/homebrew-openjdk&#34;&gt;adoptOpenJdk&lt;/a&gt;源进行安装的，想着JDK17版本也从这个源进行安装，执行以下命令进行安装&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew install adoptopenjdk/openjdk/adoptopenjdk17-openj9
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/Xk0c7b.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;报错了，没有找到，为什么？明明JDK已经到19版本了，openjdk的17版本却没有更新?&lt;/p&gt;
&lt;h2 id=&#34;adoptopenjdk不维护了&#34;&gt;AdoptOpenJdk不维护了&lt;/h2&gt;
&lt;p&gt;查了半天的google，又上 AdoptOpenJDK 的&lt;a href=&#34;https://github.com/AdoptOpenJDK/homebrew-openjdk&#34;&gt;brew&lt;/a&gt;源上看，找到了问题所在
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/TawO63.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;根据官方brew源仓库的说明， &lt;strong&gt;AdoptOpenJdk&lt;/strong&gt; 在2021-08-01 后不再更新了，所有版本都迁移到了Eclipse 基金会维护的JAVA生态顶级项目 &lt;a href=&#34;https://projects.eclipse.org/projects/adoptium&#34;&gt;Eclipse Adoptium&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;temurin中不包含openj9-jvm&#34;&gt;Temurin中不包含OpenJ9 JVM&lt;/h2&gt;
&lt;p&gt;Eclipse Adoptium维护的JDK版本，通过 &lt;strong&gt;temurin&lt;/strong&gt; 命令进行安装&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew search temurin
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/AN1wNl.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;没有看到带OpenJ9名称的版本，查询&lt;a href=&#34;https://blog.adoptopenjdk.net/2021/08/goodbye-adoptopenjdk-hello-adoptium/&#34;&gt;temurin官方博客&lt;/a&gt;中发现目前的 &lt;strong&gt;temurin&lt;/strong&gt; 中暂时不包含OpenJ9版本，需要到 IBM 官网进行安装&lt;/p&gt;
&lt;h2 id=&#34;使用ibm维护的jdk&#34;&gt;使用IBM维护的JDK&lt;/h2&gt;
&lt;p&gt;最后从&lt;a href=&#34;https://developer.ibm.com/languages/java/semeru-runtimes/&#34;&gt;IBM的网站&lt;/a&gt;上找到了OpenJ9，IBM的JDK版本在brew中使用 &lt;strong&gt;semeru&lt;/strong&gt; 命令&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew install semeru-jdk17-open
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;安装成功. 终于可以使用 J9版本的JDK17了&lt;/p&gt;
&lt;h2 id=&#34;ref&#34;&gt;REF&lt;/h2&gt;
&lt;h3 id=&#34;https-medium-dot-com-sdkman-adoptopenjdk-is-dead-long-live-eclipse-adoptium-4f2677ca935a&#34;&gt;&lt;a href=&#34;https://medium.com/@sdkman_/adoptopenjdk-is-dead-long-live-eclipse-adoptium-4f2677ca935a&#34;&gt;https://medium.com/@sdkman_/adoptopenjdk-is-dead-long-live-eclipse-adoptium-4f2677ca935a&lt;/a&gt;&lt;/h3&gt;</description>
    </item>
    <item>
      <title>JAVA中如何判断对象与类的关系之-instanceOf, Class.isInstance, Class.isAssignableFrom</title>
      <link>http://blog.imcompany.cn/post/java-check-object-class/</link>
      <pubDate>Mon, 12 Dec 2022 19:14:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/java-check-object-class/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;
&lt;p&gt;在开发中，常常会碰到检查JAVA对象是不是指定类型的情况，在JAVA中提供了以下几种方法实现此类需求:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;instanceOf&lt;/li&gt;
&lt;li&gt;Class.isInstance()&lt;/li&gt;
&lt;li&gt;Class.isAssignbleFrom()&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;今天对此三种实现进行具体学习，以加深理解并更好的使用&lt;/p&gt;
&lt;h2 id=&#34;准备工作&#34;&gt;准备工作&lt;/h2&gt;
&lt;p&gt;先创建一个名为 &lt;strong&gt;Shape&lt;/strong&gt; 的接口，一个实现了 &lt;strong&gt;Shape&lt;/strong&gt; 接口的类 &lt;strong&gt;Triangle&lt;/strong&gt; , 再定义一个继承 &lt;strong&gt;Triangle&lt;/strong&gt; 类的类 &lt;strong&gt;IsoscelesTriangle&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;interface&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Shape&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Triangle&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;implements&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Shape&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;IsoscelesTriangle&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;extends&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Triangle&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以上三个类的类图关系如下
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/qiSfeO.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;instanceof&#34;&gt;instanceOf&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;instanceOf&lt;/strong&gt; 是JAVA中的一个关键字，用于判断 &lt;strong&gt;实例对象是否是指定类型的子类型&lt;/strong&gt; ，常用于类型转换(cast)之前进行判断，操作的元素是一个对象和一个类型&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Shape&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;shape&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Triangle&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Triangle&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;triangle&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Triangle&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;IsoscelesTriangle&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;isoscelesTriangle&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;IsoscelesTriangle&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Shape&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nonspecificShape&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;assertTrue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;shape&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;instanceof&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Shape&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;assertTrue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;triangle&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;instanceof&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Shape&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;assertTrue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;isoscelesTriangle&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;instanceof&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Shape&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;assertFalse&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nonspecificShape&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;instanceof&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Shape&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;assertTrue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;shape&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;instanceof&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Triangle&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;assertTrue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;triangle&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;instanceof&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Triangle&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;assertTrue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;isoscelesTriangle&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;instanceof&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Triangle&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;assertFalse&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nonspecificShape&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;instanceof&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Triangle&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;assertFalse&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;shape&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;instanceof&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;IsoscelesTriangle&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;assertFalse&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;triangle&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;instanceof&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;IsoscelesTriangle&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;assertTrue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;isoscelesTriangle&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;instanceof&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;IsoscelesTriangle&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;assertFalse&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nonspecificShape&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;instanceof&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;IsoscelesTriangle&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上面例子测试 &lt;strong&gt;instanceOf&lt;/strong&gt; 左侧对象是否是右侧类型的实例类型&lt;/p&gt;</description>
    </item>
    <item>
      <title>Linux-man学习</title>
      <link>http://blog.imcompany.cn/post/linux-man/</link>
      <pubDate>Thu, 08 Dec 2022 11:29:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/linux-man/</guid>
      <description>&lt;h2 id=&#34;功能&#34;&gt;功能&lt;/h2&gt;
&lt;p&gt;显示命令行命令的帮助手册
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/npZhjZ.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;排版&#34;&gt;排版&lt;/h2&gt;
&lt;p&gt;Man页面是按章节(section)进行分配的，在Man中包含9个特定章节
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/edrOUj.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;特定章节&#34;&gt;特定章节&lt;/h3&gt;
&lt;h4 id=&#34;可执行程序或者shell命令--1&#34;&gt;可执行程序或者Shell命令(1)&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;man &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; ls
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;man 默认查询第1章节，也可以直接忽略写章节进行查询&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;man ls
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;此命令与上边命令效果相同&lt;/p&gt;
&lt;h4 id=&#34;系统调用--2&#34;&gt;系统调用(2)&lt;/h4&gt;
&lt;p&gt;系统调用（内核的功能）相关的帮助在第2章节，例如下面查询系统调用 &lt;strong&gt;read&lt;/strong&gt; 的帮助手册&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;man &lt;span class=&#34;m&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;read&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;库调用--3&#34;&gt;库调用(3)&lt;/h4&gt;
&lt;p&gt;库调用相关帮助在第3章节，例如下面查询 &lt;a href=&#34;https://libzip.org/documentation/zip_fread.html&#34;&gt;ziplib&lt;/a&gt; 库中read 的帮助信息&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;man &lt;span class=&#34;m&#34;&gt;3&lt;/span&gt; zip_fread
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;特定设备文件--4&#34;&gt;特定设备文件(4)&lt;/h4&gt;
&lt;p&gt;查询/dev（保存的设备文件）下的待定文件相关帮助在第4章节, 查一下 &lt;strong&gt;null&lt;/strong&gt; 设备的帮助信息&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;man &lt;span class=&#34;m&#34;&gt;4&lt;/span&gt; null
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;配置文件书写规则与约定--5&#34;&gt;配置文件书写规则与约定(5)&lt;/h4&gt;
&lt;p&gt;配置文件的帮助信息放在了第5章，查询一下 /etc/passwd 的帮助&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;man &lt;span class=&#34;m&#34;&gt;5&lt;/span&gt; passwod
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;游戏相关--6&#34;&gt;游戏相关(6)&lt;/h4&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;h4 id=&#34;杂项--7&#34;&gt;杂项(7)&lt;/h4&gt;
&lt;p&gt;一些杂项帮助信息放在第7章，查一下 groff 文件的帮助&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;man &lt;span class=&#34;m&#34;&gt;7&lt;/span&gt; groff
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;系统管理员命令--8&#34;&gt;系统管理员命令(8)&lt;/h4&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;h4 id=&#34;内核相关--9&#34;&gt;内核相关(9)&lt;/h4&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;h3 id=&#34;章节组织形式&#34;&gt;章节组织形式&lt;/h3&gt;
&lt;p&gt;以下只列出比较常用的信息&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;名称&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;总览&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;配置&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;描述&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;命令选项&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;退出码&lt;/li&gt;
&lt;li&gt;返回值&lt;/li&gt;
&lt;li&gt;环境变量&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;例子&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;作者&lt;/li&gt;
&lt;li&gt;延伸阅读(see also)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;常用命令&#34;&gt;常用命令&lt;/h2&gt;
&lt;h3 id=&#34;man&#34;&gt;man&lt;/h3&gt;
&lt;h4 id=&#34;man-f&#34;&gt;man -f&lt;/h4&gt;
&lt;p&gt;显示命令的简介, 同 &lt;strong&gt;whatis&lt;/strong&gt; 命令&lt;/p&gt;
&lt;h4 id=&#34;man-k&#34;&gt;man -k&lt;/h4&gt;
&lt;p&gt;搜索命令描述，当只记得一些关键词时很有用。同 &lt;strong&gt;apropos&lt;/strong&gt; 命令&lt;/p&gt;</description>
    </item>
    <item>
      <title>Java枚举学习</title>
      <link>http://blog.imcompany.cn/post/java-enum/</link>
      <pubDate>Wed, 23 Nov 2022 12:01:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/java-enum/</guid>
      <description>&lt;h2 id=&#34;枚举&#34;&gt;枚举&lt;/h2&gt;
&lt;p&gt;枚举是指包含指定个数特定类型的实例类，所有枚举类默认都继承 &lt;a href=&#34;https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Enum.html&#34;&gt;java.lang.Enum&lt;/a&gt;
，枚举类是可序列化、可比较的&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;enum&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Person&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MAN&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;WOMAN&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;out&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Person&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;MAN&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;MAN
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;枚举构造器&#34;&gt;枚举构造器&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;枚举中自动生成的无参构造器默认是private的&lt;/li&gt;
&lt;li&gt;显示定义的构造器只能是私有或无访问符的，即枚举不可以从外部进行实例化&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;无参构造器&#34;&gt;无参构造器&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;enum&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Person&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MAN&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(),&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;WOMAN&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Person&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Person&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;person&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Person&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;values&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;out&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;person&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;MAN
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;WOMAN
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;带参构造器&#34;&gt;带参构造器&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;enum&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Person&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MAN&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;WOMAN&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;UNKNOWN&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Person&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Person&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;status&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;status&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;status&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;status&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Person&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;person&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Person&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;values&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;out&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;person&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;status&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;枚举类初始化&#34;&gt;枚举类初始化&lt;/h2&gt;
&lt;p&gt;枚举类的初始化与一般类的初始化过程(静态代码块-&amp;gt;构造器代码块-&amp;gt;构造函数)不同，它的执行顺序为：实例构造器代码块-&amp;gt;构造函数-&amp;gt;静态常量代码块，以下代码进行演示&lt;/p&gt;</description>
    </item>
    <item>
      <title>Org-babel学习记录</title>
      <link>http://blog.imcompany.cn/post/org-babel-study/</link>
      <pubDate>Wed, 28 Sep 2022 15:12:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/org-babel-study/</guid>
      <description>&lt;h2 id=&#34;基础&#34;&gt;基础&lt;/h2&gt;
&lt;h3 id=&#34;匿名代码段&#34;&gt;匿名代码段&lt;/h3&gt;
&lt;h3 id=&#34;命名的代码块&#34;&gt;命名的代码块&lt;/h3&gt;
&lt;p&gt;命名的代码块与结果项是可以分开的，orgmode通过代码块的名称进行匹配&lt;/p&gt;
&lt;h3 id=&#34;定义参数&#34;&gt;定义参数&lt;/h3&gt;
&lt;p&gt;参数变量根据对应语言表现方式不同
:var x=0&lt;/p&gt;
&lt;h3 id=&#34;header&#34;&gt;Header&lt;/h3&gt;
&lt;p&gt;header多行书写便于阅读&lt;/p&gt;
&lt;h3 id=&#34;内联代码段&#34;&gt;内联代码段&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;4&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&#34;常用命令&#34;&gt;常用命令&lt;/h2&gt;
&lt;h3 id=&#34;org-babel-execute-buffer&#34;&gt;org-babel-execute-buffer&lt;/h3&gt;
&lt;p&gt;执行buffer的所有代码段&lt;/p&gt;</description>
    </item>
    <item>
      <title>Org-anki, Org与Anki的完美结合</title>
      <link>http://blog.imcompany.cn/post/tools-org-anki/</link>
      <pubDate>Tue, 27 Sep 2022 15:03:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/tools-org-anki/</guid>
      <description>&lt;h2 id=&#34;org-anki&#34;&gt;Org-anki&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/eyeinsky/org-anki&#34;&gt;Org-anki&lt;/a&gt;是一个同步Org中note到&lt;a href=&#34;https://apps.ankiweb.net/&#34;&gt;Anki&lt;/a&gt;的Emacs包，它的实现非常简单灵活，文档书写体验好&lt;/p&gt;
&lt;h2 id=&#34;安装&#34;&gt;安装&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-emacs-lisp&#34; data-lang=&#34;emacs-lisp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;use-package&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;org-anki&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nb&#34;&gt;:commands&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;org-anki-sync-entry&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;org-anki-sync-all&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;支持的note&#34;&gt;支持的note&lt;/h2&gt;
&lt;h3 id=&#34;基础note&#34;&gt;基础note&lt;/h3&gt;
&lt;p&gt;基本的正反两面问答形式，在org中，heading表示问题，内容表示答案&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-org&#34; data-lang=&#34;org&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gh&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;gs&#34;&gt; 我是问题&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;我就是答案了
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/O1233j.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h3 id=&#34;填空型note&#34;&gt;填空型note&lt;/h3&gt;
&lt;p&gt;填空形式，处理格式为 {{&amp;hellip;}}, 只关注heading，不关注内容&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-org&#34; data-lang=&#34;org&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gh&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;gs&#34;&gt; 我是问题 {{c1::答案在这}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/FlXgWy.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h3 id=&#34;嵌套型&#34;&gt;嵌套型&lt;/h3&gt;
&lt;p&gt;其它也是基础型，但是这种功能让org note的组织更加友好，因为有时一个记忆点可能需要多种方式来实现&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-org&#34; data-lang=&#34;org&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gh&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;gs&#34;&gt; 我是问题1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;我是答案1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gu&#34;&gt;**&lt;/span&gt; 我是问题1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;我是问题1的另一种答案
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上面的情况会在anki中创建两个基础的card，也就是两个记忆点，好用&lt;/p&gt;
&lt;h2 id=&#34;常用命令&#34;&gt;常用命令&lt;/h2&gt;
&lt;h3 id=&#34;org-anki-sync-all&#34;&gt;org-anki-sync-all&lt;/h3&gt;
&lt;p&gt;同步所有note到anki&lt;/p&gt;
&lt;h3 id=&#34;org-anki-sync-entry&#34;&gt;org-anki-sync-entry&lt;/h3&gt;
&lt;p&gt;同步当前光标所属的entry到anki&lt;/p&gt;
&lt;h3 id=&#34;org-anki-cloze-dwim&#34;&gt;org-anki-cloze-dwim&lt;/h3&gt;
&lt;p&gt;创建填空形式，要选中标题部分区域进行转换&lt;/p&gt;
&lt;h3 id=&#34;org-anki-browse-entry&#34;&gt;org-anki-browse-entry&lt;/h3&gt;
&lt;p&gt;在Anki中浏览当前光标下entry的note信息&lt;/p&gt;
&lt;h3 id=&#34;org-anki-import-deck&#34;&gt;org-anki-import-deck&lt;/h3&gt;
&lt;p&gt;从Anki中导入，在Anki中已经存在部分note时，可以先导入到org中，再进行同步&lt;/p&gt;
&lt;h3 id=&#34;org-anki-delete-entry&#34;&gt;org-anki-delete-entry&lt;/h3&gt;
&lt;p&gt;删除当前entry&lt;/p&gt;
&lt;h3 id=&#34;org-anki-delete-all&#34;&gt;org-anki-delete-all&lt;/h3&gt;
&lt;p&gt;删除所有entry&lt;/p&gt;</description>
    </item>
    <item>
      <title>Apollo不更新配置了？</title>
      <link>http://blog.imcompany.cn/post/apollo-work-issue/</link>
      <pubDate>Fri, 16 Sep 2022 15:22:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/apollo-work-issue/</guid>
      <description>&lt;h2 id=&#34;问题描述&#34;&gt;问题描述&lt;/h2&gt;
&lt;p&gt;近期改造服务调用，需要使用Apollo配置进行灵活切换，上线后发现有些机器配置生效，有些配置未生效，开发小伙伴反馈此问题发生有一段时间&lt;/p&gt;
&lt;h2 id=&#34;问题排查&#34;&gt;问题排查&lt;/h2&gt;
&lt;h3 id=&#34;机器排查&#34;&gt;机器排查&lt;/h3&gt;
&lt;p&gt;对线上机器进行排查，发现有几台机器根本没有拉取新的应用配置&lt;/p&gt;
&lt;h3 id=&#34;指定问题机器信息&#34;&gt;指定问题机器信息&lt;/h3&gt;
&lt;p&gt;进入到问题机器查看本地Apollo文件信息&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-rw-rw-r-- &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; mqq mqq  &lt;span class=&#34;m&#34;&gt;3429&lt;/span&gt; May &lt;span class=&#34;m&#34;&gt;19&lt;/span&gt; 15:32 main-webapp+default+CoopReader.baipai.switch.properties
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-rw-r--r-- &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; mqq mqq  &lt;span class=&#34;m&#34;&gt;1621&lt;/span&gt; Jul  &lt;span class=&#34;m&#34;&gt;4&lt;/span&gt; 15:39 main-webapp+default+CoopReader.switcher.properties
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-rw-r--r-- &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; mqq mqq    &lt;span class=&#34;m&#34;&gt;89&lt;/span&gt; Aug &lt;span class=&#34;m&#34;&gt;26&lt;/span&gt; 11:18 main-webapp+default+CoopReader.personal.menu.properties
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-rw-r--r-- &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; mqq mqq  &lt;span class=&#34;m&#34;&gt;3958&lt;/span&gt; Aug &lt;span class=&#34;m&#34;&gt;26&lt;/span&gt; 15:45 main-webapp+default+CoopReader.common.config.propertie
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;可以看到文件的最新日期在8月26日&lt;/p&gt;
&lt;h3 id=&#34;apollo-服务的问题&#34;&gt;Apollo 服务的问题?&lt;/h3&gt;
&lt;p&gt;先前小伙伴反应问过运维相关问题，得到的结论是Apollo没有改动，且服务配置不是完全不可用，此方向排除&lt;/p&gt;
&lt;h3 id=&#34;服务的问题&#34;&gt;服务的问题?&lt;/h3&gt;
&lt;p&gt;从目前得到的信息可以确认是某几台机器上的Apollo client没有去拉取最新的配置信息&lt;/p&gt;
&lt;h3 id=&#34;为什么没有拉取到最新配置&#34;&gt;为什么没有拉取到最新配置?&lt;/h3&gt;
&lt;p&gt;先来梳理一下Apollo的使用流程:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;业务对Apollo的访问都基于 &lt;strong&gt;L5&lt;/strong&gt; 的方式&lt;/li&gt;
&lt;li&gt;目前业务工程使用cloudlevel5.Protocol来获取L5的信息与Apollo Portal进行交互&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;com.yuewen&lt;span class=&#34;nt&#34;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;userbase-l5-system&lt;span class=&#34;nt&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;1.0.3.Final&lt;span class=&#34;nt&#34;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;为什么业务机没有与apollo-portal交互&#34;&gt;为什么业务机没有与Apollo portal交互?&lt;/h4&gt;
&lt;p&gt;怀疑与出问题的机器获取不到L5信息有关&lt;/p&gt;
&lt;h2 id=&#34;问题猜测验证&#34;&gt;问题猜测验证&lt;/h2&gt;
&lt;p&gt;大体知道问题出在哪了，下面就需要进行验证了。最简单的方式就是打印出Apollo的相关日志信息对猜测进行验证，但是目前业务的日志级别设置的 &lt;strong&gt;ERROR&lt;/strong&gt; ，啥也看不到&lt;/p&gt;
&lt;h3 id=&#34;修改业务日志级别&#34;&gt;修改业务日志级别?&lt;/h3&gt;
&lt;p&gt;现在需要打印aplllo相关的日志级别为 &lt;strong&gt;Info&lt;/strong&gt; ，需要修改Logback中配置如下：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;logger&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;com.ctrip.framework.apollo&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;level=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;info&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;但是还是需要发版本上线，未免太麻烦，有没有其它办法？&lt;/p&gt;
&lt;h3 id=&#34;arthas动态修改日志级别&#34;&gt;Arthas动态修改日志级别&lt;/h3&gt;
&lt;p&gt;现在已经有非常成熟的线上调试工具了，Arthas就能实现对Logback的动态日志修改，二话不说，直接机器上修改验证&lt;/p&gt;
&lt;h4 id=&#34;在问题机器上启动arthas&#34;&gt;在问题机器上启动arthas&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;java -jar arthas-boot.jar
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;选择要处理的应用(10384)进入到arthas&lt;/p&gt;</description>
    </item>
    <item>
      <title>那些高效的VSCode插件</title>
      <link>http://blog.imcompany.cn/post/vscode-plugin/</link>
      <pubDate>Mon, 05 Sep 2022 17:45:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/vscode-plugin/</guid>
      <description>&lt;h2 id=&#34;必备&#34;&gt;必备&lt;/h2&gt;
&lt;h3 id=&#34;vscodevim-dot-vim&#34;&gt;&lt;a href=&#34;https://marketplace.visualstudio.com/items?itemName=vscodevim.vim&#34;&gt;vscodevim.vim&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;在VSCode中使用VIM&lt;/p&gt;
&lt;h3 id=&#34;angelo-breuer-dot-clock&#34;&gt;&lt;a href=&#34;https://marketplace.visualstudio.com/items?itemName=angelo-breuer.clock&#34;&gt;angelo-breuer.clock&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;在状态栏增加时间显示&lt;/p&gt;
&lt;h3 id=&#34;redguardtoo-dot-matchit&#34;&gt;&lt;a href=&#34;https://marketplace.visualstudio.com/items?itemName=redguardtoo.matchit&#34;&gt;redguardtoo.matchit&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Tag匹配，在代码结构中快速跳转&lt;/p&gt;
&lt;h3 id=&#34;kahole-dot-magit&#34;&gt;&lt;a href=&#34;https://marketplace.visualstudio.com/items?itemName=kahole.magit&#34;&gt;kahole.magit&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;类Emacs magit&lt;/p&gt;
&lt;h3 id=&#34;chadalen-dot-vscode-jetbrains-icon-theme&#34;&gt;&lt;a href=&#34;https://marketplace.visualstudio.com/items?itemName=chadalen.vscode-jetbrains-icon-theme&#34;&gt;chadalen.vscode-jetbrains-icon-theme&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;类JetBrains的文件图标&lt;/p&gt;
&lt;h3 id=&#34;codezombiech-dot-gitignore&#34;&gt;&lt;a href=&#34;https://marketplace.visualstudio.com/items?itemName=codezombiech.gitignore&#34;&gt;codezombiech.gitignore&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;.ignore文件支持&lt;/p&gt;
&lt;h3 id=&#34;wmaurer-dot-change-case&#34;&gt;&lt;a href=&#34;https://marketplace.visualstudio.com/items?itemName=wmaurer.change-case&#34;&gt;wmaurer.change-case&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;快速切换选择单词的格式，支持驼峰，大小写等&lt;/p&gt;
&lt;h3 id=&#34;lucax88x-dot-codeacejumper&#34;&gt;&lt;a href=&#34;https://marketplace.visualstudio.com/items?itemName=lucax88x.codeacejumper&#34;&gt;lucax88x.codeacejumper&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;快速跳转到指定字符&lt;/p&gt;
&lt;h3 id=&#34;ntbbloodbath-dot-doom-one&#34;&gt;&lt;a href=&#34;https://marketplace.visualstudio.com/items?itemName=NTBBloodbath.doom-one&#34;&gt;NTBBloodbath.doom-one&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;类Emacs doom-one主题&lt;/p&gt;
&lt;h3 id=&#34;geeebe-dot-duplicate&#34;&gt;&lt;a href=&#34;https://marketplace.visualstudio.com/items?itemName=geeebe.duplicate&#34;&gt;geeebe.duplicate&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;复制当前光标中的行，VSCode默认行为增强&lt;/p&gt;
&lt;h3 id=&#34;usernamehw-dot-errorlens&#34;&gt;&lt;a href=&#34;https://marketplace.visualstudio.com/items?itemName=usernamehw.errorlens&#34;&gt;usernamehw.errorlens&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;VSCode错误提示增强&lt;/p&gt;
&lt;h3 id=&#34;zerodind-dot-familiar-java-themes&#34;&gt;&lt;a href=&#34;https://marketplace.visualstudio.com/items?itemName=zerodind.familiar-java-themes&#34;&gt;zerodind.familiar-java-themes&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;类Idea主题&lt;/p&gt;
&lt;h3 id=&#34;vsls-contrib-dot-gistfs&#34;&gt;&lt;a href=&#34;https://marketplace.visualstudio.com/items?itemName=vsls-contrib.gistfs&#34;&gt;vsls-contrib.gistfs&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Github gist快速查看与编辑&lt;/p&gt;
&lt;h3 id=&#34;qezhu-dot-gitlink&#34;&gt;&lt;a href=&#34;https://marketplace.visualstudio.com/items?itemName=qezhu.gitlink&#34;&gt;qezhu.gitlink&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;复制当前文件的仓库地址&lt;/p&gt;
&lt;h3 id=&#34;trixnz-dot-go-to-method&#34;&gt;&lt;a href=&#34;https://marketplace.visualstudio.com/items?itemName=trixnz.go-to-method&#34;&gt;trixnz.go-to-method&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;跳转到指定方法，不包换其它Symbol信息&lt;/p&gt;
&lt;h3 id=&#34;yutengjing-dot-open-in-external-app&#34;&gt;&lt;a href=&#34;https://marketplace.visualstudio.com/items?itemName=YuTengjing.open-in-external-app&#34;&gt;YuTengjing.open-in-external-app&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;使用外部应用打开当前文件&lt;/p&gt;
&lt;h3 id=&#34;tootone-dot-org-mode&#34;&gt;&lt;a href=&#34;https://marketplace.visualstudio.com/items?itemName=tootone.org-mode&#34;&gt;tootone.org-mode&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Emacs org-mode局部支持&lt;/p&gt;
&lt;h3 id=&#34;mushan-dot-vscode-paste-image&#34;&gt;&lt;a href=&#34;https://marketplace.visualstudio.com/items?itemName=mushan.vscode-paste-image&#34;&gt;mushan.vscode-paste-image&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;粘贴图片到Markdown&lt;/p&gt;
&lt;h3 id=&#34;shan-dot-code-settings-sync&#34;&gt;&lt;a href=&#34;https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync&#34;&gt;Shan.code-settings-sync&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;VSCode配置多终端同步&lt;/p&gt;
&lt;h3 id=&#34;mybells-dot-someone-github-stars&#34;&gt;&lt;a href=&#34;https://marketplace.visualstudio.com/items?itemName=mybells.someone-github-stars&#34;&gt;mybells.someone-github-stars&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;获取指定Githuber的Star并写入到Markdown&lt;/p&gt;
&lt;h3 id=&#34;tabnine-dot-tabnine-vscode&#34;&gt;&lt;a href=&#34;https://marketplace.visualstudio.com/items?itemName=TabNine.tabnine-vscode&#34;&gt;TabNine.tabnine-vscode&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;TabNine AI代码完成&lt;/p&gt;
&lt;h3 id=&#34;vspacecode-dot-whichkey&#34;&gt;&lt;a href=&#34;https://marketplace.visualstudio.com/items?itemName=VSpaceCode.whichkey&#34;&gt;VSpaceCode.whichkey&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;VSCode按键修改与提示&lt;/p&gt;
&lt;h3 id=&#34;office-viewer--markdown-editor--visual-studio-marketplace&#34;&gt;&lt;a href=&#34;https://marketplace.visualstudio.com/items?itemName=cweijan.vscode-office&#34;&gt;Office Viewer(Markdown Editor) - Visual Studio Marketplace&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Captured On: &lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;[2023-05-19 Fri 10:08]&lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>用Riggrep进行快速搜索</title>
      <link>http://blog.imcompany.cn/post/ripgrep-study/</link>
      <pubDate>Tue, 30 Aug 2022 20:01:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/ripgrep-study/</guid>
      <description>&lt;h2 id=&#34;为什么要学习riggrep&#34;&gt;为什么要学习riggrep?&lt;/h2&gt;
&lt;h3 id=&#34;riggrep快&#34;&gt;Riggrep快&lt;/h3&gt;
&lt;p&gt;天下武功，唯快不破&lt;/p&gt;
&lt;h3 id=&#34;riggrep聪明&#34;&gt;Riggrep聪明&lt;/h3&gt;
&lt;p&gt;默认会排除 .gitignore/.ignore/.rgignore 文件下的配置和隐藏文件、二进制文件&lt;/p&gt;
&lt;h2 id=&#34;安装&#34;&gt;安装&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew install ripgrep
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;使用说明&#34;&gt;使用说明&lt;/h2&gt;
&lt;p&gt;样例所有操作使用 &lt;strong&gt;&lt;a href=&#34;https://github.com/peng051410/study-sample&#34;&gt;study-sample&lt;/a&gt;&lt;/strong&gt; 仓库，里面是常用语言的入门学习资源，操作文档结构如下：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tree ~/github/study-sample
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/Users/tomyli/github/study-sample
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;-- LearnBash.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;-- LearnJava.java
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;-- README.md
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;-- commonlisp.lisp
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;-- learn-emacs-lisp.el
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;-- learn.nix
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;-- learnc.c
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;-- learnclojure.clj
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;-- learngo.go
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;-- learnlua.lua
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;-- learnpython.py
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;-- learnrust.rs
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;-- markdown.md
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; directories, &lt;span class=&#34;m&#34;&gt;13&lt;/span&gt; files
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;基本使用&#34;&gt;基本使用&lt;/h2&gt;
&lt;p&gt;遍历查询 &lt;strong&gt;~/github/study-sample/&lt;/strong&gt; 下所有包含 &lt;strong&gt;TODO say hello&lt;/strong&gt; 字符串的结果&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rg &lt;span class=&#34;s1&#34;&gt;&amp;#39;TODO say hello&amp;#39;&lt;/span&gt; ~/github/study-sample/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/Users/tomyli/github/study-sample/learnc.c:/* TODO say hello */
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/Users/tomyli/github/study-sample/commonlisp.lisp:&lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt; TODO say hello
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/Users/tomyli/github/study-sample/learnclojure.clj:&lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt; TODO say hello
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/Users/tomyli/github/study-sample/learn-emacs-lisp.el:&lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt; TODO say hello
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/Users/tomyli/github/study-sample/LearnBash.sh:# TODO say hello
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/Users/tomyli/github/study-sample/LearnJava.java: // TODO say hello
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/Users/tomyli/github/study-sample/learnrust.rs:// TODO say hello
&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;strong&gt;分号&lt;/strong&gt; 进行分割，分号前为文件路径，分号后为查询匹配到的内容&lt;/p&gt;</description>
    </item>
    <item>
      <title>Spring的RedisTemplate如何与Lettuce进行交互的</title>
      <link>http://blog.imcompany.cn/post/spring-redisttemplate-lettuce/</link>
      <pubDate>Wed, 01 Jun 2022 11:04:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/spring-redisttemplate-lettuce/</guid>
      <description>&lt;h2 id=&#34;问题&#34;&gt;问题&lt;/h2&gt;
&lt;p&gt;SpringWebFlux项目，使用的Redis客户端是Lettuce(基于异步)，在Spring中封装了两种操作Redis的模板 &lt;strong&gt;RedisTemplate&lt;/strong&gt; 与 &lt;strong&gt;ReactiveRedisTemplate&lt;/strong&gt; ，正常情况下，异步编程要使用 &lt;strong&gt;ReactiveRedisTemplate&lt;/strong&gt; ，那么可以在项目中使用 &lt;strong&gt;RedisTemplate&lt;/strong&gt; 进行redis的操作吗？为什么？&lt;/p&gt;
&lt;h2 id=&#34;答案&#34;&gt;答案&lt;/h2&gt;
&lt;p&gt;可以使用 &lt;strong&gt;RedisTemplate&lt;/strong&gt; 在异步代码中进行操作&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@Autowried&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;StringRedisTemplate&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;redisTemplate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;redisTemplate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;opsForValue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;追根溯源&#34;&gt;追根溯源&lt;/h2&gt;
&lt;p&gt;先来明确一下应用与Redis的交互流程&lt;/p&gt;
&lt;h3 id=&#34;redis交互流程&#34;&gt;Redis交互流程&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;获取连接&lt;/li&gt;
&lt;li&gt;执行命令&lt;/li&gt;
&lt;li&gt;返回结果&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;源码追踪&#34;&gt;源码追踪&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;redisTemplate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;opsForValue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以下以redis的get命令为例进行解析，get方法是通过 &lt;strong&gt;RedisTemplate&lt;/strong&gt; 的 &lt;strong&gt;ValueOperations&lt;/strong&gt; 属性进行处理的，因为 &lt;strong&gt;ValueOperations&lt;/strong&gt; 是一个接口，要从其实现类 &lt;strong&gt;DefaultValueOperations&lt;/strong&gt; 的get方法进行解析，直接上图&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/RedisGet.png&#34;
         alt=&#34;Figure 1: 整体流程图&#34;/&gt; &lt;figcaption&gt;
            &lt;p&gt;&lt;!-- raw HTML omitted --&gt;Figure 1: &lt;!-- raw HTML omitted --&gt;整体流程图&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h4 id=&#34;关键点解析&#34;&gt;关键点解析&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;第1-5步只是为了获取Redis连接&lt;/p&gt;
&lt;p&gt;getConnection是为了获取具体的底层redis命令，项目使用Lettuce且为String操作，此处获取的连接为 &lt;strong&gt;LettuceStringCommands&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;第6步是命令执行触发点&lt;/p&gt;
&lt;p&gt;它调用了执行DefaultValueOperations.execute(ValueDeserializingRedisCallback)方法调用时方法参数ValueDeserializingRedisCallback的实现方法inRedis，由此转入到真正的命令执行阶段&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;第9步获取API&lt;/p&gt;
&lt;p&gt;LettuceConnection获取的是通过调用StatefulConnection.async()方法获取的异步API&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;第12步进行返回处理&lt;/p&gt;
&lt;p&gt;LettuceConnection的doInvoke方法进行了LettuceInvoker的返回处理，在里面看到的是调用了feture.get()方法使用等待的方式来实现了异步转同步的调用&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;获取连接阶段与执行命令阶段图示&#34;&gt;获取连接阶段与执行命令阶段图示&lt;/h4&gt;
&lt;p&gt;更近一步，可以把 &lt;strong&gt;获取连接阶段&lt;/strong&gt; 与 &lt;strong&gt;执行命令阶段&lt;/strong&gt; 分开来，看图更加清晰&lt;/p&gt;</description>
    </item>
    <item>
      <title>Springwebflux源码学习-服务启动流程</title>
      <link>http://blog.imcompany.cn/post/springwebflux-start/</link>
      <pubDate>Tue, 24 May 2022 17:37:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/springwebflux-start/</guid>
      <description>&lt;h2 id=&#34;学习目标&#34;&gt;学习目标&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;理解WebFlux核心组件HttpHandler、WebHandler的创建过程&lt;/li&gt;
&lt;li&gt;理解DispatcherHandler如何映射请求url及参数的过程&lt;/li&gt;
&lt;li&gt;理解Netty服务的主要启动节点&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;此次学习的Spring boot版本为2.6.6，对应的Spring webflux版本为5.3.18&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;入口&#34;&gt;入口&lt;/h2&gt;
&lt;p&gt;Springboot工程入口方法为 &lt;strong&gt;SpringApplication.run()&lt;/strong&gt; ，从此方法开始进行分析。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;SpringApplication&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;run&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;决定启动的web应用类型&#34;&gt;决定启动的web应用类型&lt;/h2&gt;
&lt;p&gt;整个服务的web应用类型是在构造 &lt;strong&gt;SpringApplication&lt;/strong&gt; 类时进行确定的，具体代码如下：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;webApplicationType&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;WebApplicationType&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;deduceFromClasspath&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;判断应用类型的逻辑&#34;&gt;判断应用类型的逻辑&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;org.springframework.web.reactive.DispatcherHandler存在&lt;/li&gt;
&lt;li&gt;org.springframework.web.servlet.DispatcherServlet不存在&lt;/li&gt;
&lt;li&gt;org.glassfish.jersey.servlet.ServletContainer不存在&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;即确认webApplicationType为 &lt;strong&gt;Reactive&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ClassUtils&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;isPresent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;WEBFLUX_INDICATOR_CLASS&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ClassUtils&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;isPresent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;WEBMVC_INDICATOR_CLASS&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ClassUtils&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;isPresent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JERSEY_INDICATOR_CLASS&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;WebApplicationType&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;REACTIVE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;创建具体的applicationcontext&#34;&gt;创建具体的ApplicationContext&lt;/h2&gt;
&lt;p&gt;根据webApplicationType(Reactive)确定创建的ApplicationContext为AnnotationConfigReactiveWebServerApplicationContext，此Context支持 &lt;strong&gt;@Component&lt;/strong&gt; 和 &lt;a href=&#34;https://jcp.org/en/jsr/detail?id=330&#34;&gt;JSR-330&lt;/a&gt;规范中 &lt;strong&gt;@Inject&lt;/strong&gt; 形式的依赖注解&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;SpringAplication&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;createApplicationContext&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;switch&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;webApplicationType&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;case&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;SERVLET&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AnnotationConfigServletWebServerApplicationContext&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;case&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;REACTIVE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AnnotationConfigReactiveWebServerApplicationContext&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;default&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AnnotationConfigApplicationContext&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;最主要的applicationcontext-dot-refresh方法&#34;&gt;最主要的ApplicationContext.refresh()方法&lt;/h2&gt;
&lt;h3 id=&#34;refresh的refresh阶段&#34;&gt;refresh的Refresh阶段&lt;/h3&gt;
&lt;p&gt;刷新操作是在 &lt;strong&gt;AbstractApplicationContext&lt;/strong&gt; 类的refresh方法中进行，在调用invokeBeanFactoryPostProcessors方法时会有对controller注解的扫描与处理&lt;/p&gt;</description>
    </item>
    <item>
      <title>开发中会遇到的Maven问题解惑</title>
      <link>http://blog.imcompany.cn/post/maven-case/</link>
      <pubDate>Thu, 07 Apr 2022 19:30:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/maven-case/</guid>
      <description>&lt;h2 id=&#34;多模块系统版本控制问题&#34;&gt;多模块系统版本控制问题&lt;/h2&gt;
&lt;p&gt;在开发想保持项目下的所有子模块版本一致，可以使用${rversion}变量&lt;/p&gt;
&lt;h3 id=&#34;配置父pom&#34;&gt;配置父pom&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;cn.imcompany&lt;span class=&#34;nt&#34;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;big-parent&lt;span class=&#34;nt&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;${revision}&lt;span class=&#34;nt&#34;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;packaging&amp;gt;&lt;/span&gt;pom&lt;span class=&#34;nt&#34;&gt;&amp;lt;/packaging&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;modules&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;module&amp;gt;&lt;/span&gt;big-web&lt;span class=&#34;nt&#34;&gt;&amp;lt;/module&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/modules&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;properties&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;revision&amp;gt;&lt;/span&gt;1.0.0&lt;span class=&#34;nt&#34;&gt;&amp;lt;/revision&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/properties&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;子模块配置&#34;&gt;子模块配置&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;parent&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;cn.imcompany&lt;span class=&#34;nt&#34;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;big-parent&lt;span class=&#34;nt&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;${revision}&lt;span class=&#34;nt&#34;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/parent&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;big-web&lt;span class=&#34;nt&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;修改版本方式&#34;&gt;修改版本方式&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;直接修改revision变量的值&lt;/li&gt;
&lt;li&gt;使用 &lt;strong&gt;mvn clean package -Drevision=1.1.0&lt;/strong&gt; 进行配置&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;使用revision后deploy操作不显示正确版本问题&#34;&gt;使用revision后Deploy操作不显示正确版本问题&lt;/h2&gt;
&lt;p&gt;需要配合 &lt;a href=&#34;https://www.mojohaus.org/flatten-maven-plugin/&#34;&gt;Flatten Maven Plugin&lt;/a&gt; 即可解决，父pom中需要增加以下配置：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;build&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;plugins&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nt&#34;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.codehaus.mojo&lt;span class=&#34;nt&#34;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nt&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;flatten-maven-plugin&lt;span class=&#34;nt&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nt&#34;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;1.2.2&lt;span class=&#34;nt&#34;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nt&#34;&gt;&amp;lt;configuration&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;nt&#34;&gt;&amp;lt;updatePomFile&amp;gt;&lt;/span&gt;true&lt;span class=&#34;nt&#34;&gt;&amp;lt;/updatePomFile&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nt&#34;&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nt&#34;&gt;&amp;lt;executions&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;nt&#34;&gt;&amp;lt;execution&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    &lt;span class=&#34;nt&#34;&gt;&amp;lt;id&amp;gt;&lt;/span&gt;flatten&lt;span class=&#34;nt&#34;&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    &lt;span class=&#34;nt&#34;&gt;&amp;lt;phase&amp;gt;&lt;/span&gt;process-resources&lt;span class=&#34;nt&#34;&gt;&amp;lt;/phase&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    &lt;span class=&#34;nt&#34;&gt;&amp;lt;goals&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                        &lt;span class=&#34;nt&#34;&gt;&amp;lt;goal&amp;gt;&lt;/span&gt;flatten&lt;span class=&#34;nt&#34;&gt;&amp;lt;/goal&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    &lt;span class=&#34;nt&#34;&gt;&amp;lt;/goals&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;nt&#34;&gt;&amp;lt;/execution&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;nt&#34;&gt;&amp;lt;execution&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    &lt;span class=&#34;nt&#34;&gt;&amp;lt;id&amp;gt;&lt;/span&gt;flatten.clean&lt;span class=&#34;nt&#34;&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    &lt;span class=&#34;nt&#34;&gt;&amp;lt;phase&amp;gt;&lt;/span&gt;clean&lt;span class=&#34;nt&#34;&gt;&amp;lt;/phase&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    &lt;span class=&#34;nt&#34;&gt;&amp;lt;goals&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                        &lt;span class=&#34;nt&#34;&gt;&amp;lt;goal&amp;gt;&lt;/span&gt;clean&lt;span class=&#34;nt&#34;&gt;&amp;lt;/goal&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    &lt;span class=&#34;nt&#34;&gt;&amp;lt;/goals&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;nt&#34;&gt;&amp;lt;/execution&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nt&#34;&gt;&amp;lt;/executions&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;/plugins&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/build&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;配置指定项目不发布到远程仓库&#34;&gt;配置指定项目不发布到远程仓库&lt;/h2&gt;
&lt;p&gt;在新版本的deploy插件已经支持配置，配置skip变量即可&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.apache.maven.plugins&lt;span class=&#34;nt&#34;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;maven-deploy-plugin&lt;span class=&#34;nt&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;3.0.0-M2&lt;span class=&#34;nt&#34;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;configuration&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;lt;skip&amp;gt;&lt;/span&gt;true&lt;span class=&#34;nt&#34;&gt;&amp;lt;/skip&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;reference&#34;&gt;Reference&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.soebes.de/blog/2017/04/02/maven-pom-files-without-a-version-in-it/&#34;&gt;Maven: POM files without a version in it? - SoftwareEntwicklung Beratung Schulung&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Linux代码结构学习</title>
      <link>http://blog.imcompany.cn/post/linux-source/</link>
      <pubDate>Wed, 06 Apr 2022 18:53:00 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/linux-source/</guid>
      <description>&lt;h2 id=&#34;linux代码结构&#34;&gt;Linux代码结构&lt;/h2&gt;
&lt;p&gt;准备学习Linux，看源码是少不了的，先对Linux源码有个大体认识(基于linux4.13)&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/6Xc7mE.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h2 id=&#34;代码主要文件解析&#34;&gt;代码主要文件解析&lt;/h2&gt;
&lt;h3 id=&#34;makefile&#34;&gt;Makefile&lt;/h3&gt;
&lt;p&gt;这是整个源码的Makefile，里面定义了一系列的变量和规则，比如默认的gcc编译flag。&lt;/p&gt;
&lt;h3 id=&#34;documentation&#34;&gt;Documentation/&lt;/h3&gt;
&lt;p&gt;项目文档，里面包含了很多关于配置内核、与ramdisk运行等有用的信息。这里面没有不同配置项的帮助信息，这些信息可以在相关子目录的 &lt;strong&gt;Kconfig&lt;/strong&gt; 文件中查看。&lt;/p&gt;
&lt;h3 id=&#34;arch&#34;&gt;arch/&lt;/h3&gt;
&lt;p&gt;体系结构相关代码都在这里，还有一部分在include/arch-generic中。每个体系结构在这个目录下都有一个子目录。比如基于x86体系的代码都在 &lt;strong&gt;arch/x86&lt;/strong&gt; 下。另外，这个目录下还包含低级别的内存管理，中断处理，早期初始化，汇编例程等信息。&lt;/p&gt;
&lt;h3 id=&#34;crypto&#34;&gt;crypto/&lt;/h3&gt;
&lt;p&gt;内核使用的加密API代码。&lt;/p&gt;
&lt;h3 id=&#34;drivers&#34;&gt;drivers/&lt;/h3&gt;
&lt;p&gt;所有设备相关的信息都在这个目录下。包括视频设备，网卡设备，低级别的SCSI设备。比如网络设备一般是在 &lt;strong&gt;drivers/net&lt;/strong&gt; 目录下。&lt;/p&gt;
&lt;h3 id=&#34;fs&#34;&gt;fs/&lt;/h3&gt;
&lt;p&gt;通用的文件系统与其它类型的文件系统代码都在这里。现在的操作系统的根文件系统一般为ext4格式，它的代码在 &lt;strong&gt;fs/ext4&lt;/strong&gt; 下&lt;/p&gt;
&lt;h3 id=&#34;include&#34;&gt;include/&lt;/h3&gt;
&lt;p&gt;所有.c文件中包含的头文件都定义在这个目录下。&lt;/p&gt;
&lt;h3 id=&#34;init&#34;&gt;init/&lt;/h3&gt;
&lt;p&gt;这个目录包含了内核启动的入口文件 &lt;strong&gt;main.c&lt;/strong&gt; ，版本信息文件 &lt;strong&gt;version.c&lt;/strong&gt; 和早期用户空间相关的代码，早期空间代码提供内核出现时的功能，它不需要在内核中进行运行。&lt;/p&gt;
&lt;h3 id=&#34;ipc&#34;&gt;ipc/&lt;/h3&gt;
&lt;p&gt;进程间通信相关代码，包含共享内存，信号量等信息。&lt;/p&gt;
&lt;h3 id=&#34;kernel&#34;&gt;kernel/&lt;/h3&gt;
&lt;p&gt;内核级别代码，上层的系统调用代码在这里，还有关于 &lt;strong&gt;printk()&lt;/strong&gt; 代码，调度，信号量处理的代码。&lt;/p&gt;
&lt;h3 id=&#34;lib&#34;&gt;lib/&lt;/h3&gt;
&lt;p&gt;内核所有使用的库都在这里。常见的字符串运算，调试库，命令行解析代码等。&lt;/p&gt;
&lt;h3 id=&#34;mm&#34;&gt;mm/&lt;/h3&gt;
&lt;p&gt;高级别的内存管理代码。虚拟内存是通过这些库与低级别的体系结构代码(在 &lt;strong&gt;arch/&lt;!-- raw HTML omitted --&gt;/mm&lt;/strong&gt; )一同实现的。这里完成了早期引导内存管理，涉及文件的内存映射，页缓存的管理，内存分配和RAM中页面的交换。&lt;/p&gt;
&lt;h3 id=&#34;net&#34;&gt;net/&lt;/h3&gt;
&lt;p&gt;高级别的网络代码。与低级别的网络进行发包与收包交互。*net/core* 中包含其它网络协议使用的核心代码。net子目录就是特定的网络协议实现。&lt;/p&gt;
&lt;h3 id=&#34;scripts&#34;&gt;scripts/&lt;/h3&gt;
&lt;p&gt;这里面包含构建内核的脚本文件。&lt;/p&gt;
&lt;h3 id=&#34;security&#34;&gt;security/&lt;/h3&gt;
&lt;p&gt;不同Linux的安全模型代码。&lt;/p&gt;
&lt;h3 id=&#34;sound&#34;&gt;sound/&lt;/h3&gt;
&lt;p&gt;声卡及相关代码在这里。&lt;/p&gt;
&lt;h3 id=&#34;usr&#34;&gt;usr/&lt;/h3&gt;
&lt;p&gt;该目录包含构建根文件系统映射的cpio格式的文档代码，该文档用于早期的用户空间。&lt;/p&gt;</description>
    </item>
    <item>
      <title>记一次SpringWebflux框架下堆外OOM排查经历</title>
      <link>http://blog.imcompany.cn/post/springwebflux-leak-bug/</link>
      <pubDate>Thu, 31 Mar 2022 20:12:23 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/springwebflux-leak-bug/</guid>
      <description>&lt;h2 id=&#34;症状&#34;&gt;症状&lt;/h2&gt;
&lt;p&gt;生产环境业务页面打不开，看错误日志是 &lt;strong&gt;OutOfDirectMemoryError&lt;/strong&gt; (OOM)了，详情报错信息如下：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2022-03-21 06:00:00.541 &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;,&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;tafprx-asyrecv_9&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; ERROR r.c.p.Operators - &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;error,314&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; - Operator called default onErrorDropped
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;java.lang.OutOfMemoryError: Direct buffer memory
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        at java.base/java.nio.Bits.reserveMemory&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;Bits.java:175&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        at java.base/java.nio.DirectByteBuffer.&amp;lt;init&amp;gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;DirectByteBuffer.java:118&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        at java.base/java.nio.ByteBuffer.allocateDirect&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;ByteBuffer.java:317&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        at io.netty.buffer.PoolArena&lt;span class=&#34;nv&#34;&gt;$DirectArena&lt;/span&gt;.allocateDirect&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;PoolArena.java:632&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        at io.netty.buffer.PoolArena&lt;span class=&#34;nv&#34;&gt;$DirectArena&lt;/span&gt;.newChunk&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;PoolArena.java:607&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        at io.netty.buffer.PoolArena.allocateNormal&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;PoolArena.java:202&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        at io.netty.buffer.PoolArena.tcacheAllocateSmall&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;PoolArena.java:172&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        at io.netty.buffer.PoolArena.allocate&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;PoolArena.java:134&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        at io.netty.buffer.PoolArena.allocate&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;PoolArena.java:126&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        at io.netty.buffer.PooledByteBufAllocator.newDirectBuffer&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;PooledByteBufAllocator.java:395&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        at io.netty.buffer.AbstractByteBufAllocator.directBuffer&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;AbstractByteBufAllocator.java:187&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        at io.netty.buffer.AbstractByteBufAllocator.directBuffer&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;AbstractByteBufAllocator.java:178&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        at io.netty.buffer.AbstractByteBufAllocator.buffer&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;AbstractByteBufAllocator.java:115&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        at org.springframework.core.io.buffer.NettyDataBufferFactory.allocateBuffer&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;NettyDataBufferFactory.java:71&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        at org.springframework.core.io.buffer.NettyDataBufferFactory.allocateBuffer&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;NettyDataBufferFactory.java:39&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        at org.springframework.http.codec.json.AbstractJackson2Encoder.encodeValue&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;AbstractJackson2Encoder.java:236&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        at org.springframework.http.codec.json.AbstractJackson2Encoder.lambda&lt;span class=&#34;nv&#34;&gt;$encode$0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;AbstractJackson2Encoder.java:150&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        at reactor.core.publisher.FluxMapFuseable&lt;span class=&#34;nv&#34;&gt;$MapFuseableSubscriber&lt;/span&gt;.onNext&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;FluxMapFuseable.java:113&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        at reactor.core.publisher.Operators&lt;span class=&#34;nv&#34;&gt;$MonoSubscriber&lt;/span&gt;.complete&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;Operators.java:1815&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        at reactor.core.publisher.MonoCompletionStage.lambda&lt;span class=&#34;nv&#34;&gt;$subscribe$0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;MonoCompletionStage.java:82&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;CompletableFuture.java:859&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        at java.base/java.util.concurrent.CompletableFuture.uniWhenCompleteStage&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;CompletableFuture.java:883&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        at java.base/java.util.concurrent.CompletableFuture.whenComplete&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;CompletableFuture.java:2251&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        at java.base/java.util.concurrent.CompletableFuture.whenComplete&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;CompletableFuture.java:143&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        at reactor.core.publisher.MonoCompletionStage.subscribe&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;MonoCompletionStage.java:57&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        at reactor.core.publisher.InternalMonoOperator.subscribe&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;InternalMonoOperator.java:64&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        at reactor.core.publisher.MonoFlatMap&lt;span class=&#34;nv&#34;&gt;$FlatMapMain&lt;/span&gt;.onNext&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;MonoFlatMap.java:157&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        at reactor.core.publisher.Operators&lt;span class=&#34;nv&#34;&gt;$MonoSubscriber&lt;/span&gt;.complete&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;Operators.java:1815&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        at reactor.core.publisher.MonoFlatMap&lt;span class=&#34;nv&#34;&gt;$FlatMapInner&lt;/span&gt;.onNext&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;MonoFlatMap.java:249&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        at reactor.core.publisher.FluxOnErrorResume&lt;span class=&#34;nv&#34;&gt;$ResumeSubscriber&lt;/span&gt;.onNext&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;FluxOnErrorResume.java:79&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        at reactor.core.publisher.FluxPeek&lt;span class=&#34;nv&#34;&gt;$PeekSubscriber&lt;/span&gt;.onNext&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;FluxPeek.java:199&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        at reactor.core.publisher.FluxPeek&lt;span class=&#34;nv&#34;&gt;$PeekSubscriber&lt;/span&gt;.onNext&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;FluxPeek.java:199&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        at reactor.core.publisher.MonoIgnoreThen&lt;span class=&#34;nv&#34;&gt;$ThenIgnoreMain&lt;/span&gt;.complete&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;MonoIgnoreThen.java:284&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        at reactor.core.publisher.MonoIgnoreThen&lt;span class=&#34;nv&#34;&gt;$ThenIgnoreMain&lt;/span&gt;.onNext&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;MonoIgnoreThen.java:187&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        at reactor.core.publisher.Operators&lt;span class=&#34;nv&#34;&gt;$MonoSubscriber&lt;/span&gt;.complete&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;Operators.java:1815&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        at reactor.core.publisher.MonoFlatMap&lt;span class=&#34;nv&#34;&gt;$FlatMapMain&lt;/span&gt;.onNext&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;MonoFlatMap.java:151&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;根据报错的堆栈，找到 &lt;strong&gt;AbstractJackson2Encoder:236&lt;/strong&gt; 行，调试发现框架使用的buffer在最后都进行了释放，看着没问题。&lt;/p&gt;</description>
    </item>
    <item>
      <title>那些提高效率MAC软件(全程免费)</title>
      <link>http://blog.imcompany.cn/post/mac-soft/</link>
      <pubDate>Mon, 25 Oct 2021 20:12:23 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/mac-soft/</guid>
      <description>&lt;h2 id=&#34;ntfs&#34;&gt;&lt;a href=&#34;https://github.com/ntfstool/ntfstool&#34;&gt;NTFS&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;支持MAC电脑读取NTFS格式文件
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/ntfs-display.jpeg&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;eul&#34;&gt;&lt;a href=&#34;https://github.com/gao-sun/eul&#34;&gt;eul&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;监控MAC运行状态的工具
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/eul.jpeg&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;upic&#34;&gt;&lt;a href=&#34;https://github.com/gee1k/uPic&#34;&gt;uPic&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;文件与图片云端上传工具
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/upic.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;sequel-ace&#34;&gt;&lt;a href=&#34;https://github.com/Sequel-Ace/Sequel-Ace&#34;&gt;Sequel-Ace&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;MAC上数据库管理工具，支持Mysql与MariaDB
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/sequelAce.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;copyq&#34;&gt;&lt;a href=&#34;https://github.com/hluk/CopyQ&#34;&gt;CopyQ&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;MAC上免费的剪切板工具
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/copyq.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;bob&#34;&gt;&lt;a href=&#34;https://github.com/ripperhe/Bob&#34;&gt;Bob&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;MAC上翻译软件
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/bob.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;lulu&#34;&gt;&lt;a href=&#34;https://github.com/objective-see/LuLu&#34;&gt;LuLu&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;MAC上强大的防火墙
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/lulu.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;hidden&#34;&gt;&lt;a href=&#34;https://github.com/dwarvesf/hidden&#34;&gt;hidden&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;MAC菜单栏图标隐藏工具
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/hiddenbar.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;brooklyn&#34;&gt;&lt;a href=&#34;https://github.com/pedrommcarrasco/Brooklyn&#34;&gt;Brooklyn&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;MAC上炫酷的屏保程序
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/brooklyn.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;gifski&#34;&gt;&lt;a href=&#34;https://github.com/sindresorhus/Gifski&#34;&gt;Gifski&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;把Video转换成Gif
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/gifski.jpg&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;backgroundmusic&#34;&gt;&lt;a href=&#34;https://github.com/kyleneideck/BackgroundMusic&#34;&gt;BackgroundMusic&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;音频工具，可以为每个app设定音量值
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/Backgroundmusic.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;pixel-picker&#34;&gt;&lt;a href=&#34;https://github.com/acheronfail/pixel-picker&#34;&gt;pixel-picker&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;MAC取色软件
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/pixel-picker.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;itsycal&#34;&gt;&lt;a href=&#34;https://github.com/sfsam/Itsycal&#34;&gt;Itsycal&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;MAC日历软件
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/itsycal.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;switchhosts&#34;&gt;&lt;a href=&#34;https://github.com/oldj/SwitchHosts&#34;&gt;SwitchHosts&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;快速切换机器Host，开发必备
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/switchhosts.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;hammerspoon&#34;&gt;&lt;a href=&#34;https://github.com/Hammerspoon/hammerspoon&#34;&gt;hammerspoon&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;使用Lua脚本来控制电脑&lt;/p&gt;
&lt;h2 id=&#34;squirrel&#34;&gt;&lt;a href=&#34;https://github.com/rime/squirrel&#34;&gt;squirrel&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;鼠鬚管，无敌的输入法
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/squirrel.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;iterm2&#34;&gt;&lt;a href=&#34;https://github.com/gnachman/iTerm2&#34;&gt;iTerm2&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;MAC上的终端模拟器
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/iterm2.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;keycastr&#34;&gt;&lt;a href=&#34;https://github.com/keycastr/keycastr&#34;&gt;keycastr&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;MAC上按键显示工具
&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.jsdelivr.net/gh/peng051410/bucket@main/img/keycastr.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;pot-app-pot-desktop-一个跨平台的划词翻译和ocr软件-a-cross-platform-software-for-text-translation-and-recognition-dot&#34;&gt;&lt;!-- raw HTML omitted --&gt;TODO&lt;!-- raw HTML omitted --&gt; &lt;a href=&#34;https://github.com/pot-app/pot-desktop&#34;&gt;pot-app/pot-desktop: 🌈一个跨平台的划词翻译和OCR软件 | A cross-platform software for text translation and recognition.&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;jordanbaird-ice-powerful-menu-bar-manager-for-macos&#34;&gt;&lt;!-- raw HTML omitted --&gt;TODO&lt;!-- raw HTML omitted --&gt; &lt;a href=&#34;https://github.com/jordanbaird/Ice&#34;&gt;jordanbaird/Ice: Powerful menu bar manager for macOS&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;qarmin-czkawka-multi-functional-app-to-find-duplicates-empty-folders-similar-images-etc-dot&#34;&gt;&lt;!-- raw HTML omitted --&gt;TODO&lt;!-- raw HTML omitted --&gt; &lt;a href=&#34;https://github.com/qarmin/czkawka&#34;&gt;qarmin/czkawka: Multi functional app to find duplicates, empty folders, similar images etc.&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;felixkratz-sketchybar-a-highly-customizable-macos-status-bar-replacement&#34;&gt;&lt;!-- raw HTML omitted --&gt;TODO&lt;!-- raw HTML omitted --&gt; &lt;a href=&#34;https://github.com/FelixKratz/SketchyBar&#34;&gt;FelixKratz/SketchyBar: A highly customizable macOS status bar replacement&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;nikitabobko-aerospace-aerospace-is-an-i3-like-tiling-window-manager-for-macos&#34;&gt;&lt;!-- raw HTML omitted --&gt;TODO&lt;!-- raw HTML omitted --&gt; &lt;a href=&#34;https://github.com/nikitabobko/AeroSpace&#34;&gt;nikitabobko/AeroSpace: AeroSpace is an i3-like tiling window manager for macOS&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;alex313031-thorium-chromium-fork-named-after-radioactive-element-no-dot-90-dot-windows-and-macos-raspi-android-special-builds-are-in-different-repositories-links-are-towards-the-top-of-the-readme-dot-md-dot&#34;&gt;&lt;!-- raw HTML omitted --&gt;TODO&lt;!-- raw HTML omitted --&gt; &lt;a href=&#34;https://github.com/Alex313031/thorium&#34;&gt;Alex313031/thorium: Chromium fork named after radioactive element No. 90. Windows and MacOS/Raspi/Android/Special builds are in different repositories, links are towards the top of the README.md.&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;odlp-bluesnooze-sleeping-mac-bluetooth-off&#34;&gt;&lt;!-- raw HTML omitted --&gt;TODO&lt;!-- raw HTML omitted --&gt; &lt;a href=&#34;https://github.com/odlp/bluesnooze&#34;&gt;odlp/bluesnooze: Sleeping Mac = Bluetooth off&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;nonwill-goldendict-ocr-goldendict-plus-plus-内置大量的官方版本问题的修正-先期添加了一个简单的插件机制-并基于该机制接入了多个-ocr-划词-和-音频播放-引擎-后期在增强易用性的基础上为提高查询效率-减少运行时-cpu-及-内存-占用-降低代码维护难度-完全重构了所有的实现-将来的目标是将功能扩展和词典格式处理抽象为完整的插件实现-以进一步增强应用的扩展性和可维护性&#34;&gt;&lt;!-- raw HTML omitted --&gt;TODO&lt;!-- raw HTML omitted --&gt; &lt;a href=&#34;https://github.com/nonwill/GoldenDict-OCR&#34;&gt;nonwill/GoldenDict-OCR: GoldenDict++：内置大量的官方版本问题的修正；先期添加了一个简单的插件机制，并基于该机制接入了多个 OCR 划词 和 音频播放 引擎；后期在增强易用性的基础上为提高查询效率、减少运行时 CPU 及 内存 占用、降低代码维护难度，完全重构了所有的实现；将来的目标是将功能扩展和词典格式处理抽象为完整的插件实现，以进一步增强应用的扩展性和可维护性。&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;homebrew-homebrew-bundle-bundler-for-non-ruby-dependencies-from-homebrew-homebrew-cask-and-the-mac-app-store-dot&#34;&gt;&lt;!-- raw HTML omitted --&gt;TODO&lt;!-- raw HTML omitted --&gt; &lt;a href=&#34;https://github.com/Homebrew/homebrew-bundle&#34;&gt;Homebrew/homebrew-bundle: 📦 Bundler for non-Ruby dependencies from Homebrew, Homebrew Cask and the Mac App Store.&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;ungoogled-software-ungoogled-chromium-google-chromium-sans-integration-with-google&#34;&gt;&lt;a href=&#34;https://github.com/ungoogled-software/ungoogled-chromium&#34;&gt;ungoogled-software/ungoogled-chromium: Google Chromium, sans integration with Google&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;生活中去google化&lt;/p&gt;</description>
    </item>
    <item>
      <title>让好代码生生不息-更好的使用String</title>
      <link>http://blog.imcompany.cn/post/best-code-string/</link>
      <pubDate>Mon, 23 Aug 2021 14:04:09 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/best-code-string/</guid>
      <description>&lt;h2 id=&#34;开发中常用的string操作&#34;&gt;开发中常用的String操作&lt;/h2&gt;
&lt;p&gt;开发中经常用到的操作有：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;格式化/日志格式化&lt;/li&gt;
&lt;li&gt;字符串判断&lt;/li&gt;
&lt;li&gt;字符串处理，常见的如处理字符串的第一个/最后一个字符&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;string-dot-format&#34;&gt;String.format&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/String.html#format(java.lang.String,java.lang.Object...)&#34;&gt;String.format()&lt;/a&gt;是一个格式化的方法，使用%为前缀来表示要格式化的内容占位，一般的使用方法为：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;format&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;test result is %s&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;success&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;但是当要格式化的占位符与参数个数不同时会发生什么呢？&lt;/p&gt;
&lt;h4 id=&#34;占位符个数与参数个数相同&#34;&gt;占位符个数与参数个数相同&lt;/h4&gt;
&lt;p&gt;如上代码，可以正常进行输出: test result is success&lt;/p&gt;
&lt;h4 id=&#34;占位符个数少于参数个数&#34;&gt;占位符个数少于参数个数&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;format&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;test result is %s&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;success&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;other&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;可以正常打印，输出结果为: test result is success&lt;/p&gt;
&lt;h4 id=&#34;占位符个数多于参数个数&#34;&gt;占位符个数多于参数个数&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;format&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;test result is %s %s %s&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;success&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;other&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;抛出了异常java.util.MissingFormatArgumentException: Format specifier &amp;lsquo;%s&amp;rsquo;&lt;/p&gt;
&lt;h4 id=&#34;问题总结&#34;&gt;问题总结&lt;/h4&gt;
&lt;p&gt;为什么占位符数少于参数个数可以正常执行，而多于参数个数却报了异常？看JAVADOC发现，如果占位符个数少于参数个数，则多余的参数被忽略，如果多于参数个数，则在进行解析时会判断待处理占位符位置与参数个数，主要代码逻辑如下：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lasto&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;length&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;throw&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MissingFormatArgumentException&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;toString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;());&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;所以在使用String.format方法 &lt;code&gt;切记&lt;/code&gt; 要参数个数多于待解析占位符的个数，这种问题常因为Copy操作后，处理了部分参数而忘记对应处理占位符&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;替换方案&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;目前看到很多的老代码打印日志时大都使用String.format()，可以改成slf4j的{}&lt;/li&gt;
&lt;li&gt;还可以使用Apache common utils中的StringUtils.joinWith()或者Google guava的Joiner连接器&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;apache-commons-utils-stringutils&#34;&gt;Apache commons utils-StringUtils&lt;/h3&gt;
&lt;p&gt;在StringUtils中有一个&lt;a href=&#34;https://commons.apache.org/proper/commons-lang/javadocs/api-release/org/apache/commons/lang3/StringUtils.html#isNumeric-java.lang.CharSequence-&#34;&gt;isNumeric&lt;/a&gt;方法，用来判断字符串是不是数字，那下面的代码会返回什么呢？&lt;/p&gt;</description>
    </item>
    <item>
      <title>让好代码生生不息-更好的对待NULL</title>
      <link>http://blog.imcompany.cn/post/best-code1/</link>
      <pubDate>Sat, 17 Jul 2021 16:04:09 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/best-code1/</guid>
      <description>&lt;h2 id=&#34;什么样的代码是好代码&#34;&gt;什么样的代码是好代码&lt;/h2&gt;
&lt;p&gt;易读的代码，行云流水的代码&lt;/p&gt;
&lt;h2 id=&#34;java中的null处理&#34;&gt;JAVA中的NULL处理&lt;/h2&gt;
&lt;p&gt;众所周知，在Java代码中总是少不了一堆的判null逻辑，在代码bug中，NullPointerException出镜率也是非常高的，尤其是现在的主流分布式架构，一个web接口要调用后端的N个RPC服务来实现功能，基于防御编程的思想，判null就更重要了&lt;/p&gt;
&lt;h2 id=&#34;在处理null时怎么做更好&#34;&gt;在处理NULL时怎么做更好&lt;/h2&gt;
&lt;h3 id=&#34;ide&#34;&gt;IDE&lt;/h3&gt;
&lt;p&gt;既然无法避免null，IDE就给程序员增加了可以快速判断空的功能，比如在IDEA中，可以使用Postfix功能，在对象上o使用.nn来快速输入if(o != null) {}&lt;/p&gt;
&lt;h3 id=&#34;java基础类库&#34;&gt;JAVA基础类库&lt;/h3&gt;
&lt;p&gt;近期的JDK版本也针对null判断增加了一些实用的方法&lt;/p&gt;
&lt;h4 id=&#34;objects类&#34;&gt;Objects类&lt;/h4&gt;
&lt;p&gt;JAVA8在Objects工具提供了isNull()和nonNull()方法，JAVA9又增加了requireNonNullElse()和requireNonNullElseGet()来给待处理对象增加设置默认值的方法&lt;/p&gt;
&lt;h3 id=&#34;知名三方库&#34;&gt;知名三方库&lt;/h3&gt;
&lt;p&gt;Apache common utils中提供了非常多的判空工具类，如针对String操作的StringUtils类和针对集合操作的CollectionUtils、MapUtils、ListUtils、SetUtils，这几个类都有一些典型的方法来进行判空处理，通用的方法如下：&lt;/p&gt;
&lt;h4 id=&#34;stringutils&#34;&gt;StringUtils&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;isEmpty()/isNotEmpty()&lt;/p&gt;
&lt;p&gt;判断String是否为空/不空&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;isBlank()/isNoneBlank()&lt;/p&gt;
&lt;p&gt;判断String是否为空/不空，这类方法还会判断实际值是否为空串&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;defaultString()&lt;/p&gt;
&lt;p&gt;此方法允许在String为null时为返回空串&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;defaultIfBlank()/defaultIfEmpty()&lt;/p&gt;
&lt;p&gt;此方法允许在String为空串或null时设置一个默认值&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;集合类utils&#34;&gt;集合类Utils&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;isEmpty()/isNotEmpty()&lt;/p&gt;
&lt;p&gt;判断集合是否为空/不空&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;emptyIfNull()&lt;/p&gt;
&lt;p&gt;这是一个很有用的方法，当传入对象为空时则返回设置的默认对象，可以很好的根治if处理null的问题，下面两段代码演示一下&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;正常情况下有if判断&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;List&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;values&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rpcClient&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getFromRpcList&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;CollectionUtils&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;isNotEmpty&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;values&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;values&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;forEach&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;out&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol&gt;
&lt;li&gt;使用emptyIfNull方法&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;CollectionUtils&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;emptyIfNull&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rpcClient&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getFromRpcList&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;forEach&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;out&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这样保证了代码编写的连贯性，爽！&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;此方法在ListUtis、MapUtils、SetUtils中也有提供&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;defaultIfNull()&lt;/p&gt;
&lt;p&gt;此方法允许在集合为null时设置一个默认值，也是可以链式操作&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;优秀的coder&#34;&gt;优秀的Coder&lt;/h3&gt;
&lt;p&gt;在编写通用方法时，对于有null返回的情况可以使用返回默认值来代替null&lt;/p&gt;
&lt;h4 id=&#34;不返回空-以空对象来代替&#34;&gt;不返回空，以空对象来代替&lt;/h4&gt;
&lt;p&gt;比如返回一个new Object()&lt;/p&gt;</description>
    </item>
    <item>
      <title>JAVA中获取调用栈帧的最优方式</title>
      <link>http://blog.imcompany.cn/post/java-stackwalker/</link>
      <pubDate>Tue, 20 Apr 2021 19:30:23 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/java-stackwalker/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;
&lt;p&gt;近期在做日志优化，需要记录业务日志，日志内容包括业务的请求、响应信息。当然还应该有具体的调用方法位置、日志的所在的方法等通用信息。&lt;/p&gt;
&lt;h2 id=&#34;解决方案&#34;&gt;解决方案&lt;/h2&gt;
&lt;p&gt;一般情况下，在程序有异常信息时可以打印出整个调用堆栈信息，但是现在需要的是正常调用下来获取到当前方法的调用帧。&lt;/p&gt;
&lt;h3 id=&#34;java9之前&#34;&gt;JAVA9之前&lt;/h3&gt;
&lt;h4 id=&#34;thread-dot-dumpstack&#34;&gt;Thread.dumpStack()&lt;/h4&gt;
&lt;p&gt;这个可以打印出当前的堆栈错误信息，本质上是new一个Exception，调用了printStackTrace()方法，但是这个方法只建议用于调试。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;StackTraceExample1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;one&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;one&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;two&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;two&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;three&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;three&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Thread&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;dumpStack&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;执行后输出如下:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;lang&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;Exception&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Stack&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;trace&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;at&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;base&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;lang&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;Thread&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;dumpStack&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Thread&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1379&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;at&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;imcompany&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;stack&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;StackTraceExample1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;three&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;StackTraceExample1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;25&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;at&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;imcompany&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;stack&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;StackTraceExample1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;two&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;StackTraceExample1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;21&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;at&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;imcompany&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;stack&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;StackTraceExample1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;one&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;StackTraceExample1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;at&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;imcompany&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;stack&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;StackTraceExample1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;StackTraceExample1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;13&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;直接以异常的方式显示出来了。&lt;/p&gt;</description>
    </item>
    <item>
      <title>2020-ARTS-打卡第十四天</title>
      <link>http://blog.imcompany.cn/post/2020-arts-014/</link>
      <pubDate>Mon, 20 Apr 2020 09:12:41 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/2020-arts-014/</guid>
      <description>&lt;h2 id=&#34;algorithm&#34;&gt;Algorithm&lt;/h2&gt;
&lt;h3 id=&#34;题目&#34;&gt;题目&lt;/h3&gt;
&lt;h4 id=&#34;题目描述&#34;&gt;题目描述&lt;/h4&gt;
&lt;p&gt;&lt;a href=&#34;https://leetcode-cn.com/problems/validate-binary-search-tree/&#34;&gt;98.验证二叉搜索树&lt;/a&gt;，给定一个二叉树，判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;节点的左子树只包含小于当前节点的树&lt;/li&gt;
&lt;li&gt;节点的右子树只包含大于当前节点的树&lt;/li&gt;
&lt;li&gt;所有左子树及右子树自身也必须是二叉搜索树&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;题目解答&#34;&gt;题目解答&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;java.util.Stack&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;ValidBST&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;boolean&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;isValidBST&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TreeNode&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;root&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Stack&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TreeNode&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stack&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Stack&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;double&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;inorder&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Double&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;MAX_VALUE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;while&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stack&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;isEmpty&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;||&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;root&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;while&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;root&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stack&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;push&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;root&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;root&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;root&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;left&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;root&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stack&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;pop&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;inorder&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;root&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;val&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;inorder&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;root&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;val&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;root&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;root&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;right&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;使用中序遍历(即左-&amp;gt;根-&amp;gt;右)来实现，从左至右进行比对，每次与上次保存的值进行对比，如果当前节点值比上次保存的值小，则可以判定此树不是二叉搜索树。时间复杂度为O(n)，空间复杂度为O(n)&lt;/p&gt;</description>
    </item>
    <item>
      <title>2020-ARTS-打卡第十二天</title>
      <link>http://blog.imcompany.cn/post/2020-arts-012/</link>
      <pubDate>Mon, 30 Mar 2020 13:23:29 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/2020-arts-012/</guid>
      <description>&lt;h2 id=&#34;algorithm&#34;&gt;Algorithm&lt;/h2&gt;
&lt;h3 id=&#34;题目&#34;&gt;题目&lt;/h3&gt;
&lt;h4 id=&#34;题目描述&#34;&gt;题目描述&lt;/h4&gt;
&lt;p&gt;给定两个字符串 s 和 t ，编写一个函数来判断 t 是否是 s 的字母异位词。&lt;a href=&#34;https://leetcode-cn.com/problems/valid-anagram/&#34;&gt;242 valid anagram&lt;/a&gt;&lt;/p&gt;
&lt;h4 id=&#34;题目解答&#34;&gt;题目解答&lt;/h4&gt;
&lt;p&gt;可以使用先排序后判断的方法来实现，这样的时间复杂度为O(nlog(n))。更好的方法是借助Hash表来实现，可以达到O(n)的时间复杂度。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;ValidAnagram&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;boolean&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;isAnagram&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;||&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;||&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;length&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;length&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Map&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Character&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Integer&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;HashMap&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;final&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;char&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;chars&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;toCharArray&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;chars&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;length&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;final&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;char&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;charAt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;put&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getOrDefault&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;final&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;char&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;key1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;charAt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;put&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;key1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getOrDefault&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;key1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;Entry&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Character&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Integer&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;entry&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;entrySet&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;entry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getValue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;review&#34;&gt;Review&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://coolshell.cn/articles/8619.html&#34;&gt;你可能不知道的SHELL&lt;/a&gt;CoolShell左耳朵耗子2012年的关于强大Shell的文章，里面列出了很多有用的命令，看完后收获颇丰。针对实际使用场景，列出我认为暂时可以直接使用的一些操作命令。&lt;/p&gt;</description>
    </item>
    <item>
      <title>2020-ARTS-打卡第十一天</title>
      <link>http://blog.imcompany.cn/post/2020-arts-011/</link>
      <pubDate>Mon, 23 Mar 2020 09:49:04 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/2020-arts-011/</guid>
      <description>&lt;h2 id=&#34;algorithm&#34;&gt;Algorithm&lt;/h2&gt;
&lt;h3 id=&#34;题目&#34;&gt;题目&lt;/h3&gt;
&lt;h4 id=&#34;题目描述&#34;&gt;题目描述&lt;/h4&gt;
&lt;p&gt;给定一个数组 nums，有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。 &lt;a href=&#34;https://leetcode-cn.com/problems/sliding-window-maximum/&#34;&gt;239 sliding-window-maximum&lt;/a&gt;&lt;/p&gt;
&lt;h4 id=&#34;题目解答&#34;&gt;题目解答&lt;/h4&gt;
&lt;p&gt;一般与滑动窗口有关的问题都可以使用双端队列来处理。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;java.util.ArrayDeque&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;java.util.List&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;java.util.ArrayList&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;MaxSlidingWindow&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ArrayDeque&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Integer&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;window&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ArrayDeque&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;slidingWindowMax&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;k&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;length&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;List&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Integer&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ArrayList&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;length&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;k&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;window&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getFirst&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;k&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;window&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;pollFirst&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;while&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;window&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;isEmpty&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;window&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getLast&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;window&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;pollLast&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;window&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;k&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;window&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getFirst&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;stream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;mapToInt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;toArray&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;review&#34;&gt;Review&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Consistent_hashing&#34;&gt;Consistent_hashing&lt;/a&gt;一致性Hash算法。&lt;/p&gt;</description>
    </item>
    <item>
      <title>2020-ARTS-打卡第十天</title>
      <link>http://blog.imcompany.cn/post/2020-arts-010/</link>
      <pubDate>Mon, 16 Mar 2020 17:06:14 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/2020-arts-010/</guid>
      <description>&lt;h2 id=&#34;algorithm&#34;&gt;Algorithm&lt;/h2&gt;
&lt;h3 id=&#34;题目&#34;&gt;题目&lt;/h3&gt;
&lt;h4 id=&#34;题目描述&#34;&gt;题目描述&lt;/h4&gt;
&lt;p&gt;设计一个找到数据流中第K大元素的类（class）。注意是排序后的第K大元素，不是第K个不同的元素。&lt;a href=&#34;https://leetcode-cn.com/problems/kth-largest-element-in-a-stream/&#34;&gt;703 数据流中的第K大元素&lt;/a&gt;&lt;/p&gt;
&lt;h4 id=&#34;题目解答&#34;&gt;题目解答&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;KthLargest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PriorityQueue&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Integer&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;queue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;k&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;KthLargest&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;k&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;k&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;k&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;queue&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PriorityQueue&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;k&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;num&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;num&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;val&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;queue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;k&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;queue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;offer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;val&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;queue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;peek&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;val&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;queue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;poll&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;queue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;offer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;val&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;queue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;peek&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;review&#34;&gt;Review&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://coolshell.cn/articles/20793.html&#34;&gt;与程序员相关的CPU缓存知识&lt;/a&gt;这是左耳朵耗子的一篇微观技术分享，讲解了程序员要知道的关于CPU缓存的知识，并举例进行了说明。&lt;/p&gt;</description>
    </item>
    <item>
      <title>2020-ARTS-打卡第九天</title>
      <link>http://blog.imcompany.cn/post/2020-arts-009/</link>
      <pubDate>Sat, 07 Mar 2020 14:40:09 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/2020-arts-009/</guid>
      <description>&lt;h2 id=&#34;algorithm&#34;&gt;Algorithm&lt;/h2&gt;
&lt;h3 id=&#34;题目一&#34;&gt;题目一&lt;/h3&gt;
&lt;h4 id=&#34;题目描述&#34;&gt;题目描述&lt;/h4&gt;
&lt;p&gt;使用栈实现队列的操作：push(), peek(), pop(), empty()操作，只能使用标准的栈操作 &amp;ndash; 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。&lt;a href=&#34;https://leetcode-cn.com/problems/implement-queue-using-stacks/&#34;&gt;232 用栈实现队列&lt;/a&gt;&lt;/p&gt;
&lt;h4 id=&#34;题目解答&#34;&gt;题目解答&lt;/h4&gt;
&lt;p&gt;由于队列是FIFO，而栈是FILO，要想使用栈来实现队列，则可以使用两个栈来达到目的，即负负到正，核心点就是pop()和peek()方法的处理上，在调用pop()与peek()方法时都在要从outStack中来操作，如果outStack不为空，则直接进行操作，否则要把inStack中的元素添加到outStack中。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;java.util.Iterator&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;java.util.Stack&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;MyQueue&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Stack&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Integer&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;inputStack&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Stack&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Integer&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;outStack&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;/** Initialize your data structure here. */&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;MyQueue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;inputStack&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Stack&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;outStack&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Stack&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;/** Push element x to the back of queue. */&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;push&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;inputStack&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;push&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;/** Removes the element from in front of queue and returns that element. */&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;pop&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;empty&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;outStack&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;empty&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;while&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;inputStack&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;empty&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;outStack&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;push&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;inputStack&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;pop&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;());&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;outStack&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;pop&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;/** Get the front element. */&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;peek&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;empty&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;outStack&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;empty&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;while&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;inputStack&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;empty&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;outStack&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;push&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;inputStack&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;pop&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;());&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;outStack&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;peek&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;/** Returns whether the queue is empty. */&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;boolean&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;empty&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;inputStack&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;empty&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;outStack&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;empty&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;时间复杂度：push O(1), pop O(n), peek O(n)&lt;/p&gt;</description>
    </item>
    <item>
      <title>2020-ARTS-打卡第八天</title>
      <link>http://blog.imcompany.cn/post/2020-arts-008/</link>
      <pubDate>Sat, 29 Feb 2020 14:00:09 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/2020-arts-008/</guid>
      <description>&lt;h2 id=&#34;algorithm&#34;&gt;Algorithm&lt;/h2&gt;
&lt;h3 id=&#34;题目描述&#34;&gt;题目描述&lt;/h3&gt;
&lt;p&gt;在未排序的数组中找到第 k 个最大的元素。请注意，你需要找的是数组排序后的第 k 个最大的元素，而不是第 k 个不同的元素。&lt;/p&gt;
&lt;h4 id=&#34;example&#34;&gt;Example&lt;/h4&gt;
&lt;p&gt;输入: [3,2,1,5,6,4] 和 k = 2
输出: 5&lt;/p&gt;
&lt;h3 id=&#34;题目解答&#34;&gt;题目解答&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;KthMax&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;findKthLargest&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;k&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;length&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;k&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;length&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;q&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;partition&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;while&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;k&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;q&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;k&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;q&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;q&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;partition&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;q&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;q&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pyrtition&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;q&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;q&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;partition&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;povit&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;j&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;j&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;j&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;j&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;povit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tmp&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;j&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;j&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tmp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tmp&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tmp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;主要是使用快速排序算法来进行查找，先找到一个分区点q，如果k=q+1，则说明找到了，如果k&amp;gt;q+1则从后半区找，否则从前半区找。&lt;/p&gt;</description>
    </item>
    <item>
      <title>2020-ARTS-打卡第七天</title>
      <link>http://blog.imcompany.cn/post/2020-arts-007/</link>
      <pubDate>Sat, 22 Feb 2020 14:30:09 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/2020-arts-007/</guid>
      <description>&lt;h2 id=&#34;algorithm&#34;&gt;Algorithm&lt;/h2&gt;
&lt;h3 id=&#34;题目描述&#34;&gt;题目描述&lt;/h3&gt;
&lt;p&gt;给定一个非负整数 num，反复将各个位上的数字相加，直到结果为一位数。&lt;a href=&#34;https://leetcode-cn.com/problems/add-digits/&#34;&gt;258.各位相加&lt;/a&gt;&lt;/p&gt;
&lt;h4 id=&#34;example&#34;&gt;Example&lt;/h4&gt;
&lt;p&gt;输入: 38
输出: 2
解释: 各位相加的过程为：3 + 8 = 11, 1 + 1 = 2。 由于 2 是一位数，所以返回 2。&lt;/p&gt;
&lt;h3 id=&#34;题目解答&#34;&gt;题目解答&lt;/h3&gt;
&lt;h4 id=&#34;解答一-递归&#34;&gt;解答一（递归）&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;AddDigitsV1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;addDigits&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;num&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;num&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;num&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;addDigits&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;num&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;num&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;此解法的时间复杂度为O(log(n))，空间复杂度为O(1)&lt;/p&gt;
&lt;p&gt;使用递归要满足的条件&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;一个任务可以拆分成多个子任务&lt;/li&gt;
&lt;li&gt;每个任务都有相似的处理步骤（流程）&lt;/li&gt;
&lt;li&gt;存在终止条件&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;解答二-模9法&#34;&gt;解答二（模9法）&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;addDigitsV2&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;addDigits&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;num&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;num&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;9&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;查找规律发现可以以%9来得到答案，但是对于整除9的结果就不行了，所以还要采用借1还1的方式来处理。此解的时间复杂度为O(1)，空间复杂度为O(1)&lt;/p&gt;</description>
    </item>
    <item>
      <title>2020-ARTS-打卡第六天</title>
      <link>http://blog.imcompany.cn/post/2020-arts-006/</link>
      <pubDate>Thu, 13 Feb 2020 19:04:09 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/2020-arts-006/</guid>
      <description>&lt;h2 id=&#34;algorithm&#34;&gt;Algorithm&lt;/h2&gt;
&lt;h3 id=&#34;题目描述&#34;&gt;题目描述&lt;/h3&gt;
&lt;p&gt;设计你的&lt;a href=&#34;https://leetcode-cn.com/problems/design-circular-queue/&#34;&gt;循环队列&lt;/a&gt;实现，支持入队，出队，获取队首元素，获取队尾元素&lt;/p&gt;
&lt;h3 id=&#34;题目解答&#34;&gt;题目解答&lt;/h3&gt;
&lt;p&gt;采用数组可以实现，由于要达到循环效果，主要要考虑队头与队尾的情况&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;MyCircurlarQueue&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;queue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;headIndex&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;count&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;MyCircurlarQueue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;capacity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;queue&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;capacity&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;boolean&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;inQueue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;isFull&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;queue&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;headIndex&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;count&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;queue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;length&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;count&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;boolean&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;deQueue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;isEmpty&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;headIndex&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;headIndex&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;queue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;length&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;count&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;First&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;isEmpty&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;queue&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;headIndex&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;queue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;length&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Rear&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;isEmpty&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;queue&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;headIndex&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;count&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;queue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;length&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;boolean&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;isEmpty&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;count&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;boolean&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;isFull&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;count&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;queue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;length&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;review&#34;&gt;Review&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.jetbrains.com/idea/2017/09/code-smells-multi-responsibility-methods/&#34;&gt;code-smells-multi-responsibility-methods&lt;/a&gt;本文是Idea作者代码味道系列的第五篇。讲述作者对一个大方法进行重构的过程，主要处理的代码坏味道为多职责方法，在实际开发中随着功能的增加方法会一点点膨胀，这时候就要注意了&lt;/p&gt;</description>
    </item>
    <item>
      <title>Mac上使用网易Mumu模拟器踩坑指北</title>
      <link>http://blog.imcompany.cn/post/mumu-android-issue/</link>
      <pubDate>Tue, 11 Feb 2020 16:04:09 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/mumu-android-issue/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;
&lt;p&gt;为了给mac找一款合适的android模拟器，先前使用的Nox player，但是老哥这Mac版本好几年都不更新了，使用的VirtualBox也不兼容。&lt;/p&gt;
&lt;h2 id=&#34;替代者&#34;&gt;替代者&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://mumu.163.com/&#34;&gt;网易MuMu模拟器&lt;/a&gt;
号称非常快，主要是Mac版本有更新。其它的都不行。&lt;/p&gt;
&lt;h2 id=&#34;配置charles抓包&#34;&gt;配置Charles抓包&lt;/h2&gt;
&lt;p&gt;以为找到了一个非常好的模拟器，没想到配置Charles抓包时遇到很多问题（我这使用的是Mumu版本是1.9.1）&lt;/p&gt;
&lt;h3 id=&#34;ssl代理配置问题&#34;&gt;SSL代理配置问题&lt;/h3&gt;
&lt;p&gt;正常情况下的代码只需要配置ip和端口就可以，但是发现配置保存后，不能进行输入，修改成无代理就又可以了，后来各种找发现还得在配置中不使用代理中要配置10.0.2.2这个ip，好像是模拟器内部要用这个地址。
&lt;img loading=&#34;lazy&#34; src=&#34;http://blog.imcompany.cn/ox-hugo/mumu-net-config.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;ssl证书安装问题&#34;&gt;SSL证书安装问题&lt;/h3&gt;
&lt;p&gt;配置好代码ip后，要下载Charles的证书并安装，这时要配置模拟器的解锁密码，如果遇到输入正确密码后不能安装的问题，则可以考虑重新配置一下密码，大于6位的吧&lt;/p&gt;
&lt;h3 id=&#34;多开问题&#34;&gt;多开问题&lt;/h3&gt;
&lt;p&gt;对于Nox player可以进行真正意义的完全多开（模拟器环境隔离），Mumu只是实现了简单的多开，不能使用不同版本的app，目测只是一个镜像。但是好在能使用了，希望后续开发团队可以支持。&lt;/p&gt;
&lt;h3 id=&#34;软件窗口问题&#34;&gt;软件窗口问题&lt;/h3&gt;
&lt;p&gt;如果在Mac使用窗口操作工具对Mumu进行操作，则可能一下子就找不到应用了，只能重启，正确的使用方式是使用Mumu菜单中的窗口下的拼贴功能，使用起来还不错。&lt;/p&gt;</description>
    </item>
    <item>
      <title>2020-ARTS-打卡第五天</title>
      <link>http://blog.imcompany.cn/post/2020-arts-005/</link>
      <pubDate>Thu, 06 Feb 2020 11:04:09 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/2020-arts-005/</guid>
      <description>&lt;h2 id=&#34;algorithm&#34;&gt;Algorithm&lt;/h2&gt;
&lt;h3 id=&#34;题目描述&#34;&gt;题目描述&lt;/h3&gt;
&lt;p&gt;给定一个只包括 &amp;lsquo;(&amp;rsquo;，&amp;rsquo;)&amp;rsquo;，&amp;rsquo;{&amp;rsquo;，&amp;rsquo;}&amp;rsquo;，&amp;rsquo;[&amp;rsquo;，&amp;rsquo;]&amp;rsquo; 的字符串，判断字符串是否有效。&lt;a href=&#34;https://leetcode-cn.com/problems/valid-parentheses/&#34;&gt;leetcode-20&lt;/a&gt;&lt;/p&gt;
&lt;h4 id=&#34;example&#34;&gt;Example&lt;/h4&gt;
&lt;p&gt;输入: &amp;ldquo;()&amp;rdquo; -&amp;gt; 输出: true
输入: &amp;ldquo;()[]{}&amp;rdquo; -&amp;gt; 输出：true&lt;/p&gt;
&lt;h3 id=&#34;题目解答&#34;&gt;题目解答&lt;/h3&gt;
&lt;p&gt;此种题目可以使用栈来进行处理，主要有几个核心点&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;入参数为奇数则一定不匹配&lt;/li&gt;
&lt;li&gt;对于左括号，直接进行push操作&lt;/li&gt;
&lt;li&gt;对于右括号，对栈进行pop操作与右括号进行匹配&lt;/li&gt;
&lt;li&gt;最后栈为空则说明所有都匹配成功&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;BracketMatching&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;boolean&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;isValid&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;||&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;length&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Stack&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Character&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stack&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Stack&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Map&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Character&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Character&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;HashMap&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;put&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sc&#34;&gt;&amp;#39;)&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;sc&#34;&gt;&amp;#39;(&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;put&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sc&#34;&gt;&amp;#39;}&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;sc&#34;&gt;&amp;#39;{&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;put&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sc&#34;&gt;&amp;#39;]&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;sc&#34;&gt;&amp;#39;[&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;char&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;toCharArray&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;containsKey&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stack&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;push&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stack&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;empty&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;||&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stack&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;pop&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stack&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;empty&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;review&#34;&gt;Review&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.jetbrains.com/idea/2017/08/code-smells-mutation/&#34;&gt;code-smells-mutation&lt;/a&gt;本文是Idea作者代码味道系列的第四篇。讲述了作者对一个近百行的方法进行重构的过程，主要是因为可变变量的坏味道。&lt;/p&gt;</description>
    </item>
    <item>
      <title>2020-ARTS-打卡第四天</title>
      <link>http://blog.imcompany.cn/post/2020-arts-004/</link>
      <pubDate>Sat, 01 Feb 2020 13:04:09 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/2020-arts-004/</guid>
      <description>&lt;h2 id=&#34;algorithm&#34;&gt;Algorithm&lt;/h2&gt;
&lt;h3 id=&#34;题目描述&#34;&gt;题目描述&lt;/h3&gt;
&lt;p&gt;给定一个链表，判断链表中是否有环。&lt;/p&gt;
&lt;h4 id=&#34;example&#34;&gt;Example&lt;/h4&gt;
&lt;p&gt;输入：head = [3,2,0,-4], pos = 1
输出：true
解释：链表中有一个环，其尾部连接到第二个节点。&lt;/p&gt;
&lt;h3 id=&#34;题目解答&#34;&gt;题目解答&lt;/h3&gt;
&lt;p&gt;首先能想到的解法是使用一个Set存储已经遍历过的节点，如果在遍历中节点已经存在于Set中，则说明链表是有环的，这种解法额外使用了其它的数据结构。另一种更好的方法就是使用快慢指针的方式，类似于跑道上的套圈，如果快的人追上了慢的人则说明是有环的，否则就是快的人先到达终点（即访问到最后的Null）&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;CycleSolution&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;boolean&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;hasCycle&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ListNode&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;node&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ListNode&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;slow&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;node&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ListNode&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fast&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;node&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;while&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;slow&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fast&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fast&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;next&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;slow&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;slow&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;next&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fast&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fast&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;next&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;next&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;slow&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fast&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;快慢指针的解法的时间复杂度为O(n)，空间复杂度为O(1)，因为只使用了两个指针。&lt;/p&gt;</description>
    </item>
    <item>
      <title>2020-ARTS-打卡第三天</title>
      <link>http://blog.imcompany.cn/post/2020-arts-003/</link>
      <pubDate>Fri, 24 Jan 2020 16:04:09 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/2020-arts-003/</guid>
      <description>&lt;h2 id=&#34;algorithm&#34;&gt;Algorithm&lt;/h2&gt;
&lt;h3 id=&#34;题目描述&#34;&gt;题目描述&lt;/h3&gt;
&lt;p&gt;反转一个单链表。&lt;/p&gt;
&lt;h4 id=&#34;example&#34;&gt;Example&lt;/h4&gt;
&lt;p&gt;输入: 1-&amp;gt;2-&amp;gt;3-&amp;gt;4-&amp;gt;5-&amp;gt;NULL
输出: 5-&amp;gt;4-&amp;gt;3-&amp;gt;2-&amp;gt;1-&amp;gt;NULL&lt;/p&gt;
&lt;h3 id=&#34;题目解答&#34;&gt;题目解答&lt;/h3&gt;
&lt;h4 id=&#34;迭代解法&#34;&gt;迭代解法&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Solution3&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ListNode&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;reverseList&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ListNode&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;head&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ListNode&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;prev&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ListNode&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;current&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;head&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;while&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;current&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ListNode&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tempNode&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;current&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;next&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;current&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;next&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;prev&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;prev&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;current&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;current&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tempNode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;prev&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;第一次搞链表的题，还真是给难住了。此题的核心就是当前节点的指针要指向前一个节点，处理过程中还要考虑节点的丢失问题，所以要有一个变量保存当前节点的前一个节点，还要有一个变量来保存当前节点的下一个节点，方便后续的指针前移。此解法的时间复杂度为O(n)，因其不需要额外的空间，所以空间复杂度为O(1)。&lt;/p&gt;
&lt;h4 id=&#34;递归解法&#34;&gt;递归解法&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Solution3&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ListNode&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;reverseList2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ListNode&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;node&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;node&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;||&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;node&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;next&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;node&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ListNode&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;current&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;reverseList2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;node&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;next&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;node&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;next&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;next&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;node&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;node&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;next&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;current&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;此解的核心在于当有一部分是反转时，后续的反转问题，对于node.next.next = node这句，使用A-&amp;gt;B两个节点进行示例，A.next为B，A.next.next为B.next，A.next.next = A为B.next = A，这样就实现了A与B两个节点的反转。这个递归看着还是有点懵，多看看就好了。&lt;/p&gt;</description>
    </item>
    <item>
      <title>2020-ARTS-打卡第二天</title>
      <link>http://blog.imcompany.cn/post/2020-arts-002/</link>
      <pubDate>Thu, 16 Jan 2020 19:04:09 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/2020-arts-002/</guid>
      <description>&lt;h2 id=&#34;algorithm&#34;&gt;Algorithm&lt;/h2&gt;
&lt;h3 id=&#34;题目描述&#34;&gt;题目描述&lt;/h3&gt;
&lt;p&gt;判断一个整数是否是回文数。回文数是指正序（从左向右）和倒序（从右向左）读都是一样的整数。&lt;/p&gt;
&lt;h4 id=&#34;example&#34;&gt;Example&lt;/h4&gt;
&lt;p&gt;输入123-&amp;gt;true
输入-123-&amp;gt;false
输入12-&amp;gt;true&lt;/p&gt;
&lt;h3 id=&#34;题目解答&#34;&gt;题目解答&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Solution2&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;boolean&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;isPalindrome&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;reverseNumber&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;while&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;reverseNumber&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;reverseNumber&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;reverseNumber&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;reverseNumber&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;||&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;reverseNumber&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;最简单暴力的方法是把int转换成String进行处理，String反转一半再与后续的进行比较，对于溢出的数字一定不是回文字。此方法则可以更快速的解决问题，关键是怎么找到当前数字的一半位置，可以使用当前数字pop与反转数字的push相比较，当push后的值大于pop后的值则说明到达了数字长度的一半了，对于奇数位的数字则可以使用reverseNumber/10来判断，因为中间的单个字默认就是回文字。此算法的时间复杂度为O(log(n))，空间复杂度为O(1)。&lt;/p&gt;</description>
    </item>
    <item>
      <title>2020-ARTS-打卡第一天</title>
      <link>http://blog.imcompany.cn/post/2020-arts-001/</link>
      <pubDate>Wed, 08 Jan 2020 18:54:09 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/2020-arts-001/</guid>
      <description>&lt;h2 id=&#34;algorithm&#34;&gt;Algorithm&lt;/h2&gt;
&lt;h3 id=&#34;题目描述&#34;&gt;题目描述&lt;/h3&gt;
&lt;p&gt;给出一个 32 位的有符号整数，你需要将这个整数中每位上的数字进行反转。&lt;/p&gt;
&lt;h4 id=&#34;example&#34;&gt;Example&lt;/h4&gt;
&lt;p&gt;输入123-&amp;gt;321
输入-123-&amp;gt;-321
输入120-&amp;gt;21&lt;/p&gt;
&lt;h3 id=&#34;题目解答&#34;&gt;题目解答&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;java.util.*&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Solution1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;reverseNumber&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;num&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;while&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;num&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pod&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;num&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Integer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;MAX_VALUE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;||&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Integer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;MAX_VALUE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pod&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;7&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Integer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;MIN_VALUE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;||&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Integer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;MIN_VALUE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pod&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;8&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pod&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;num&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;num&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;此题主要考察对栈的使用，如果不使用其它辅助类，则要考虑Int的整数溢出问题。时间复杂度O(log(n))，空间复杂度为O(1)&lt;/p&gt;</description>
    </item>
    <item>
      <title>Maven发布401问题排查</title>
      <link>http://blog.imcompany.cn/post/maven-deploy-issue/</link>
      <pubDate>Tue, 31 Dec 2019 11:15:55 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/maven-deploy-issue/</guid>
      <description>&lt;h2 id=&#34;日志问题现象&#34;&gt;日志问题现象&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Caused by: org.apache.maven.shared.transfer.artifact.deploy.ArtifactDeployerException: Failed to deploy artifacts: Could not transfer artifact com.aa.bb:client:jar:1.0.0-20191231.021137-1 from/to company::default (http://test.company.local/nexus/repository/maven-snapshots): Transfer failed for http://test.company.local/nexus/repository/maven-snapshots/com/aa/bb/client/1.0.0-SNAPSHOT/client-1.0.0-20191231.021137-1.jar 401 Unauthorized
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;根据提示，401未授权，表面来看就是发布的权限未认证&lt;/p&gt;
&lt;h2 id=&#34;排查步骤&#34;&gt;排查步骤&lt;/h2&gt;
&lt;h3 id=&#34;settings文件是否配置了发布的用户名与密码-且用户有deploy的权限&#34;&gt;settings文件是否配置了发布的用户名与密码，且用户有deploy的权限&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-nxml&#34; data-lang=&#34;nxml&#34;&gt;&amp;lt;servers&amp;gt;
  &amp;lt;server&amp;gt;
    &amp;lt;id&amp;gt;myid&amp;lt;/id&amp;gt;
    &amp;lt;username&amp;gt;myuser&amp;lt;/username&amp;gt;
    &amp;lt;password&amp;gt;mypasswd&amp;lt;/password&amp;gt;
  &amp;lt;/server&amp;gt;
&amp;lt;/servers&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;查看deploy插件的版本&#34;&gt;查看deploy插件的版本&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;如果是2.X的版本,可以使用以下命令进行发布&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mvn -DaltDeploymentRepository&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;company::default::http://test.compnay.local/nexus/repository/maven-snapshots clean package deploy
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol&gt;
&lt;li&gt;如果是3.X的版本，则需要按3.X版本进行指定发布&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mvn deploy:deploy-file -Dfile&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;xxx-1.0.0-SNAPSHOT.jar -Durl&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;http://test.local/nexus/content/repositories/snapshots -DrepositoryId&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;test-snapshot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;deploy-3-dot-0-dot-0-m1的发布bug&#34;&gt;Deploy 3.0.0-M1的发布bug&lt;/h3&gt;
&lt;p&gt;如果配置的deploy的插件为3.0.0-M1，则可参考&lt;a href=&#34;https://support.sonatype.com/hc/en-us/articles/360010223594-maven-deploy-plugin-version-3-0-0-M1-deploy-fails-with-401-ReasonPhrase-Unauthorized&#34;&gt;3.0.0-M1 401 bug&lt;/a&gt; 进行修改，具体就是指定depoly版本为2.8，根据&lt;a href=&#34;https://issues.apache.org/jira/browse/MDEPLOY-244?focusedCommentId=16648217&amp;amp;page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-16648217&#34;&gt;插件作者的回复&lt;/a&gt;感觉就是3.0.0-M1与altDeploymentRepository参数不能一起用&lt;/p&gt;</description>
    </item>
    <item>
      <title>那些有用maven命令</title>
      <link>http://blog.imcompany.cn/post/maven-swim/</link>
      <pubDate>Tue, 31 Dec 2019 10:45:55 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/maven-swim/</guid>
      <description>&lt;h2 id=&#34;查看当前系统的配置信息&#34;&gt;查看当前系统的配置信息&lt;/h2&gt;
&lt;p&gt;排查问题可以查看当前maven所依赖系统的所有变量(系统变量或者环境变量)信息&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mvn help:system
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;查看当前有效的settings文件&#34;&gt;查看当前有效的settings文件&lt;/h2&gt;
&lt;p&gt;maven的配置文件分为全局配置与个人配置，全局配置在$M2_HOME/conf/下，个人配置一般在~/.m2/下，此时查看当前有效的settings配置可以使用&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mvn help:effective-settings
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;查看settings配置的值&#34;&gt;查看Settings配置的值&lt;/h2&gt;
&lt;p&gt;以下命令可以查看settings文件中的settings-&amp;gt;servers的配置&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mvn -q -Dexpression&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;settings.servers -DforceStdout help:evaluate
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;使用&lt;a href=&#34;https://maven.apache.org/plugins/maven-help-plugin/evaluate-mojo.html&#34;&gt;help:evaluate&lt;/a&gt;可以查看所有的配置信息&lt;/p&gt;
&lt;h2 id=&#34;指定发布到其它仓库&#34;&gt;指定发布到其它仓库&lt;/h2&gt;
&lt;h3 id=&#34;deploy插件2-dot-x版本发布&#34;&gt;Deploy插件2.X版本发布&lt;/h3&gt;
&lt;p&gt;有时候在pom文件中指定了发布的仓库地址，但是又需要发布到另一个仓库，这时可以指定-DaltDeploymentRepository来实现&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mvn -DaltDeploymentRepository&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;id::layout::url
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;具体说明参见&lt;a href=&#34;https://maven.apache.org/plugins/maven-deploy-plugin/deploy-mojo.html&#34;&gt;deploy:deploy&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;deploy插件3-dot-0-dot-0-m1版本发布&#34;&gt;Deploy插件3.0.0-M1版本发布&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/data/mvn/bin/mvn org.apache.maven.plugins:maven-deploy-plugin:3.0.0-M1:deploy-file -DgroupId&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;com.qqreader -Dfile&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;./target/&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;/data/mvn/bin/mvn -q -Dexpression&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;project.build.finalName -DforceStdout help:evaluate&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;.jar -Durl&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;http://testurl.local/nexus/content/repositories/snapshots -DrepositoryId&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;snapshot-id
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>JAVA8问题处理回顾-持续更新</title>
      <link>http://blog.imcompany.cn/post/java8-issue-review/</link>
      <pubDate>Sat, 24 Aug 2019 10:15:55 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/java8-issue-review/</guid>
      <description>&lt;h2 id=&#34;金额累加问题&#34;&gt;金额累加问题&lt;/h2&gt;
&lt;p&gt;使用Reduce进行累加操作，&lt;a href=&#34;https://stackoverflow.com/questions/22635945/adding-up-bigdecimals-using-streams&#34;&gt;参考这里&lt;/a&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;List&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;BigDecimal&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bdList&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ArrayList&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;//populate list&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;BigDecimal&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;result&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bdList&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;stream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;reduce&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;BigDecimal&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;ZERO&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;BigDecimal&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;查找集合的最后一个元素&#34;&gt;查找集合的最后一个元素&lt;/h2&gt;
&lt;p&gt;JAVA8的Stream只提供了FindFirst功能，没有FindLast功能，可以使用Reduce来实现查找最后一个元素的效果&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;java.util.*&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;java.util.stream.*&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;GetLastEleFromCollection&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;List&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;list&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ArrayList&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;list&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;aaa&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;list&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;idddd&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;list&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;bbbb&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lastElement&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;list&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;stream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;reduce&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;first&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;second&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;second&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;orElse&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;out&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lastElement&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bbbb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;比较两个时间是否是同一天&#34;&gt;比较两个时间是否是同一天&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;java.time.*&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;java.time.temporal.*&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;CompareDay&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;final&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;LocalDateTime&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;now&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;LocalDateTime&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;now&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;final&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;LocalDateTime&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;localDateTime&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;LocalDateTime&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;of&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;2019&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;9&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;29&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;out&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;localDateTime&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;truncatedTo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ChronoUnit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;DAYS&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;isEqual&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;now&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;truncatedTo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ChronoUnit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;DAYS&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)));&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;true
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;实现与python的zip函数功能&#34;&gt;实现与Python的zip函数功能&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;java.util.*&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;java.util.function.*&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Zip&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;List&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;List&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Integer&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;result&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;handle&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Arrays&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;asList&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Arrays&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;asList&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;6&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;j&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Arrays&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;asList&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;j&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;out&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;result&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;T&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;U&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;R&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;List&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;R&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;handle&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;List&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;T&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;list&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;List&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;U&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;list1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;BiFunction&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;T&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;U&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;R&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;biFunction&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;List&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;R&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;result&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ArrayList&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;list&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;result&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;biFunction&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;apply&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;list&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;list1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)));&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;result&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[[1 (\, 4)] (\, [2 (\, 5)]) (\, [3 (\, 6)])]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;多个predicate链&#34;&gt;多个Predicate链&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;java.util.*&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;java.util.stream.*&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;java.util.function.*&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;MorePredicate&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;List&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Integer&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;list&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Arrays&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;asList&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;6&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;final&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Predicate&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Integer&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;predicate&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;final&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Predicate&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Integer&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;predicate1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;predicate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;and&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;integer&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;integer&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;List&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Integer&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;result&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;list&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;stream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;filter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;predicate1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;collect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Collectors&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;toList&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;());&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;out&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;result&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[6]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Apollo Client自定义问题拾遗</title>
      <link>http://blog.imcompany.cn/post/apollo-client-custom/</link>
      <pubDate>Mon, 01 Jul 2019 07:04:09 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/apollo-client-custom/</guid>
      <description>&lt;p&gt;&lt;strong&gt;由于公司很多服务要接入Apollo配置中心，并且对于项目的接入有网络要求，根据&lt;a href=&#34;https://github.com/ctripcorp/apollo/wiki/Java%25E5%25AE%25A2%25E6%2588%25B7%25E7%25AB%25AF%25E4%25BD%25BF%25E7%2594%25A8%25E6%258C%2587%25E5%258D%2597#1221-%25E8%2587%25AA%25E5%25AE%259A%25E4%25B9%2589apollo-meta-server%25E5%259C%25B0%25E5%259D%2580%25E5%25AE%259A%25E4%25BD%258D%25E9%2580%25BB%25E8%25BE%2591&#34;&gt;官方说明&lt;/a&gt;，需要自定义Client来完成&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;接入步骤&#34;&gt;接入步骤&lt;/h2&gt;
&lt;h3 id=&#34;新建maven项目&#34;&gt;新建maven项目&lt;/h3&gt;
&lt;p&gt;在Idea中新建maven项目，基于quickstart构建&lt;/p&gt;
&lt;h3 id=&#34;增加项目依赖&#34;&gt;增加项目依赖&lt;/h3&gt;
&lt;p&gt;官方说明的建议在新的client中依赖Apollo官方的client，再根据业务进行扩展，所以maven依赖apollo-client，公司项目的网络访问需要通过L5来进行，所以还要依赖L5的jar，目前这个jar包没有maven坐标，只能以lib方式引入&lt;/p&gt;
&lt;h3 id=&#34;自定义metaserver&#34;&gt;自定义MetaServer&lt;/h3&gt;
&lt;p&gt;关键的部分，自定义满足公司网络条件的MetaServer，Apollo官网说明是实现MetaServerProvider且Order值小的Providor被使用，按照说明进行实现&lt;/p&gt;
&lt;h3 id=&#34;maven打包client&#34;&gt;Maven打包Client&lt;/h3&gt;
&lt;p&gt;执行
&lt;strong&gt;mvn clean install&lt;/strong&gt;
进行打包，解压jar包发现就只有一个Providor的实现类，这样jar运行有问题。需要把新Client所有的依赖都打进jar包，在网上找了半天，需要在POM中增加maven的plugin的配置，如下：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-nxml&#34; data-lang=&#34;nxml&#34;&gt;&amp;lt;!-- 打包所有的maven依赖到jar包 --&amp;gt;
&amp;lt;plugin&amp;gt;
    &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;maven-shade-plugin&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;3.2.1&amp;lt;/version&amp;gt;
    &amp;lt;executions&amp;gt;
        &amp;lt;execution&amp;gt;
            &amp;lt;phase&amp;gt;package&amp;lt;/phase&amp;gt;
            &amp;lt;goals&amp;gt;
                &amp;lt;goal&amp;gt;shade&amp;lt;/goal&amp;gt;
            &amp;lt;/goals&amp;gt;
            &amp;lt;configuration&amp;gt;
                &amp;lt;artifactSet&amp;gt;
                    &amp;lt;excludes&amp;gt;
                        &amp;lt;exclude&amp;gt;junit:junit&amp;lt;/exclude&amp;gt;
                    &amp;lt;/excludes&amp;gt;
                &amp;lt;/artifactSet&amp;gt;
            &amp;lt;/configuration&amp;gt;
        &amp;lt;/execution&amp;gt;
    &amp;lt;/executions&amp;gt;
&amp;lt;/plugin&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-nxml&#34; data-lang=&#34;nxml&#34;&gt;&amp;lt;!-- 添加依赖的非maven jar包 --&amp;gt;
&amp;lt;plugin&amp;gt;
    &amp;lt;groupId&amp;gt;com.googlecode.addjars-maven-plugin&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;addjars-maven-plugin&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;1.0.5&amp;lt;/version&amp;gt;
    &amp;lt;executions&amp;gt;
        &amp;lt;execution&amp;gt;
            &amp;lt;goals&amp;gt;
                &amp;lt;goal&amp;gt;add-jars&amp;lt;/goal&amp;gt;
            &amp;lt;/goals&amp;gt;
            &amp;lt;configuration&amp;gt;
                &amp;lt;resources&amp;gt;
                    &amp;lt;resource&amp;gt;
                        &amp;lt;directory&amp;gt;${basedir}/lib&amp;lt;/directory&amp;gt;
                    &amp;lt;/resource&amp;gt;
                &amp;lt;/resources&amp;gt;
            &amp;lt;/configuration&amp;gt;
        &amp;lt;/execution&amp;gt;
    &amp;lt;/executions&amp;gt;
&amp;lt;/plugin&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;由于项目中使用了maven依赖与非maven依赖，所以上述的两个插件都要使用。增加了上面两个插件后再运行打包命令查看生成的jar就发现所有的依赖都在jar中了。&lt;/p&gt;
&lt;h3 id=&#34;项目中使用client&#34;&gt;项目中使用Client&lt;/h3&gt;
&lt;p&gt;选择一个项目在测试环境进行配置调试，自定义的Meta Server一直没有生效，所以查找&lt;a href=&#34;https://github.com/ctripcorp/apollo/issues/1472&#34;&gt;官方文档&lt;/a&gt;，由于自定义Providor是通过&lt;a href=&#34;https://blog.csdn.net/comkingfly/article/details/7645245?utm_source=tuicool&amp;amp;utm_medium=referral&#34;&gt;SPI&lt;/a&gt;方式实现的，所以正确的实现方式是新建resource文件夹，指定MetaServerProvider的真正实现类的带包名类才可以，哎，找了我好久。&lt;/p&gt;
&lt;h3 id=&#34;后续操作&#34;&gt;后续操作&lt;/h3&gt;
&lt;p&gt;后续会把client上传到内部maven仓库，完善配置API，使业务方可以零配置来使用配置中心。&lt;/p&gt;
&lt;h3 id=&#34;总结&#34;&gt;总结&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Maven的打包机制还是不清晰，处理打包问题费了很多时间，要好好重新学习一下&lt;/li&gt;
&lt;li&gt;Apollo的官方文档还需要再仔细阅读，有问题多查issue，因为可能有人已经遇到了&lt;/li&gt;
&lt;li&gt;多读读源码，真正的体会大牛的软件设计思想&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Apollo 配置中心畅游</title>
      <link>http://blog.imcompany.cn/post/apollo-config-swim/</link>
      <pubDate>Thu, 09 May 2019 17:34:09 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/apollo-config-swim/</guid>
      <description>&lt;h2 id=&#34;目前市面上的开源产品&#34;&gt;目前市面上的开源产品&lt;/h2&gt;
&lt;h3 id=&#34;disconf&#34;&gt;&lt;a href=&#34;https://github.com/knightliao/disconf&#34;&gt;Disconf&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;2014年7月百度开源的配置管理中心，同样具备配置的管理能力，目前已经不维护了，最近的一次代码提交是两年前了。&lt;/p&gt;
&lt;h3 id=&#34;spring-cloud-config&#34;&gt;&lt;a href=&#34;https://github.com/spring-cloud/spring-cloud-config&#34;&gt;Spring Cloud Config&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;2014年9月开源，Spring Cloud生态组件，与Spring Cloud体系无缝整合。&lt;/p&gt;
&lt;h3 id=&#34;apollo&#34;&gt;&lt;a href=&#34;https://github.com/ctripcorp/apollo&#34;&gt;Apollo&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;2016年5月，携程框架部开源的配置管理中心，具备规范的权限、流程治理等特性。&lt;/p&gt;
&lt;h3 id=&#34;nacos&#34;&gt;&lt;a href=&#34;https://github.com/alibaba/nacos&#34;&gt;Nacos&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;2018年6月，阿里开源的配置中心，可以做DNS和RPC的服务发现。&lt;/p&gt;
&lt;h2 id=&#34;为什么选择apollo&#34;&gt;为什么选择Apollo&lt;/h2&gt;
&lt;h3 id=&#34;社区活跃&#34;&gt;社区活跃&lt;/h3&gt;
&lt;p&gt;刚刚发布了&lt;a href=&#34;https://github.com/ctripcorp/apollo/releases/tag/v1.4.0&#34;&gt;1.4.0&lt;/a&gt;版本，Issue处理速度快&lt;/p&gt;
&lt;h3 id=&#34;文档齐全&#34;&gt;文档齐全&lt;/h3&gt;
&lt;p&gt;体验，部署，设计文档都齐全&lt;/p&gt;
&lt;h3 id=&#34;重要的灰度发布&#34;&gt;重要的灰度发布&lt;/h3&gt;
&lt;p&gt;想发布一台机器试试水，可以！&lt;/p&gt;
&lt;h3 id=&#34;开源协议友好&#34;&gt;开源协议友好&lt;/h3&gt;
&lt;p&gt;Apache 2 license&lt;/p&gt;
&lt;h2 id=&#34;apollo都有哪些重要功能&#34;&gt;Apollo都有哪些重要功能&lt;/h2&gt;
&lt;p&gt;以下摘自&lt;a href=&#34;https://github.com/ctripcorp/apollo#features&#34;&gt;官网说明&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;统一管理不同环境-不同集群的配置&#34;&gt;统一管理不同环境、不同集群的配置&lt;/h3&gt;
&lt;h3 id=&#34;配置修改实时生效-热发布&#34;&gt;配置修改实时生效（热发布）&lt;/h3&gt;
&lt;h3 id=&#34;版本发布管理&#34;&gt;版本发布管理&lt;/h3&gt;
&lt;p&gt;目前只支持对最近版本的恢复。&lt;a href=&#34;https://github.com/ctripcorp/apollo/issues/1642&#34;&gt;https://github.com/ctripcorp/apollo/issues/1642&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;灰度发布&#34;&gt;灰度发布&lt;/h3&gt;
&lt;h3 id=&#34;权限管理-发布审核-操作审计&#34;&gt;权限管理、发布审核、操作审计&lt;/h3&gt;
&lt;p&gt;编辑与发布是两个独立的操作。&lt;/p&gt;
&lt;h3 id=&#34;客户端配置信息监控&#34;&gt;客户端配置信息监控&lt;/h3&gt;
&lt;h3 id=&#34;提供java和-dot-net原生客户端&#34;&gt;提供Java和.Net原生客户端&lt;/h3&gt;
&lt;h3 id=&#34;提供开放平台api&#34;&gt;提供开放平台API&lt;/h3&gt;
&lt;p&gt;这样可以通过其它方式来查看配置信息，&lt;a href=&#34;https://github.com/ctripcorp/apollo/wiki/Apollo%25E5%25BC%2580%25E6%2594%25BE%25E5%25B9%25B3%25E5%258F%25B0&#34;&gt;平台API说明&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;使用方便的后台配置系统portal&#34;&gt;使用方便的后台配置系统Portal&lt;/h3&gt;
&lt;h3 id=&#34;分布式部署相对较复杂-这是缺点&#34;&gt;分布式部署相对较复杂，这是缺点&lt;/h3&gt;
&lt;p&gt;外部依赖少，目前依赖Mysql&lt;/p&gt;
&lt;h2 id=&#34;apollo的组成&#34;&gt;Apollo的组成&lt;/h2&gt;
&lt;h3 id=&#34;apollo长什么样&#34;&gt;Apollo长什么样?&lt;/h3&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;http://blog.imcompany.cn/ox-hugo/apollo-home-screenshot.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h3 id=&#34;apollo整体设计&#34;&gt;Apollo整体设计&lt;/h3&gt;
&lt;h4 id=&#34;总体架构&#34;&gt;总体架构&lt;/h4&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;http://blog.imcompany.cn/ox-hugo/apollo-overall-architecture.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h4 id=&#34;代码结构&#34;&gt;代码结构&lt;/h4&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;http://blog.imcompany.cn/ox-hugo/apollo-code-structure.png&#34;/&gt; 
&lt;/figure&gt;

&lt;p&gt;&lt;a href=&#34;https://github.com/ctripcorp/apollo/wiki/Apollo%25E9%2585%258D%25E7%25BD%25AE%25E4%25B8%25AD%25E5%25BF%2583%25E8%25AE%25BE%25E8%25AE%25A1#13-%25E5%2590%2584%25E6%25A8%25A1%25E5%259D%2597%25E6%25A6%2582%25E8%25A6%2581%25E4%25BB%258B%25E7%25BB%258D&#34;&gt;各模块概要介绍&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;apollo-config-service&#34;&gt;Apollo Config Service&lt;/h3&gt;
&lt;p&gt;提供配置获取接口，服务对象为Apollo客户端&lt;/p&gt;
&lt;h3 id=&#34;apollo-admin-service&#34;&gt;Apollo Admin Service&lt;/h3&gt;
&lt;p&gt;提供配置管理（修改、发布）接口，服务与Portal&lt;/p&gt;
&lt;h3 id=&#34;apollo-portal&#34;&gt;Apollo Portal&lt;/h3&gt;
&lt;p&gt;提供WEB界面供用户管理配置&lt;/p&gt;
&lt;h2 id=&#34;apollo的重要设计&#34;&gt;Apollo的重要设计&lt;/h2&gt;
&lt;h3 id=&#34;admin-service与config-service的通信方式&#34;&gt;Admin Service与Config Service的通信方式&lt;/h3&gt;
&lt;p&gt;Apollo使用Mysql实现消息(ReleaseMessage)的处理，消息内容为AppId+Cluster+Namespace，具体的设计思想可以参考&lt;a href=&#34;https://github.com/ctripcorp/apollo/wiki/Apollo%25E9%2585%258D%25E7%25BD%25AE%25E4%25B8%25AD%25E5%25BF%2583%25E8%25AE%25BE%25E8%25AE%25A1#211-%25E5%258F%2591%25E9%2580%2581releasemessage%25E7%259A%2584%25E5%25AE%259E%25E7%258E%25B0%25E6%2596%25B9%25E5%25BC%258F&#34;&gt;这里&lt;/a&gt;&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;http://blog.imcompany.cn/ox-hugo/apollo-release-message-design.png&#34;/&gt; 
&lt;/figure&gt;

&lt;h3 id=&#34;客户端与服务端的通信方式&#34;&gt;客户端与服务端的通信方式&lt;/h3&gt;
&lt;p&gt;客户端与服务端保持一个长连接(通过Http Long Polling实现)
&lt;a href=&#34;~/github/apollo/doc/images/client-architecture.png&#34;&gt;Client Server&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;重要的namespace&#34;&gt;重要的Namespace&lt;/h3&gt;
&lt;p&gt;Namespace是配置项的集合，类似于一个配置文件的概念，获取的权限分为private与public两种权限。&lt;/p&gt;
&lt;h4 id=&#34;namespace的类型&#34;&gt;Namespace的类型&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;私有类型&lt;/li&gt;
&lt;li&gt;公有类型&lt;/li&gt;
&lt;li&gt;关联类型（继承类型）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;cluster能用来做什么&#34;&gt;Cluster能用来做什么?&lt;/h3&gt;
&lt;p&gt;分机房实例，分任务功能实例，比如在一些实例执行job，需要增加-Dapollo.cluster=配置指定集群名&lt;/p&gt;</description>
    </item>
    <item>
      <title>ARTS-打卡第一天</title>
      <link>http://blog.imcompany.cn/post/arts-001/</link>
      <pubDate>Thu, 09 May 2019 17:34:09 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/arts-001/</guid>
      <description>&lt;h2 id=&#34;algorithm&#34;&gt;Algorithm&lt;/h2&gt;
&lt;p&gt;LeetCode 第一题&lt;/p&gt;
&lt;h3 id=&#34;题目描述&#34;&gt;题目描述&lt;/h3&gt;
&lt;p&gt;给一个int数组，返回数组中两个数字相加的和是目标 数的下标。可以假设每个输入只有一个解决方案，并且不能使用同一个元素两次。&lt;/p&gt;
&lt;h4 id=&#34;example&#34;&gt;Example&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;给出nums = [2, 7, 11, 15], 目标数为9，则返回[0, 1]&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&#34;题目解答&#34;&gt;题目解答&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;java.util.*&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Solution&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;twoSum&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;target&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Map&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Integer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Integer&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;HashMap&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;length&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;second&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;target&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;containsKey&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;second&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;second&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;put&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{};&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;相比两次循环的方式，这种处理的时间复杂度为O(n), 空间复杂度也为O(n).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Centos7 install issue collect</title>
      <link>http://blog.imcompany.cn/post/centos7-install-issue-collect/</link>
      <pubDate>Mon, 06 May 2019 13:00:55 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/centos7-install-issue-collect/</guid>
      <description>&lt;p&gt;&lt;strong&gt;由于工作需要，使用VMWare虚拟机安装了Centos7系统，遇到了很多问题，现在把这些问题记录下来，以备后用。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;解决centos7-yum-could-not-retrieve-mirrorlist错误&#34;&gt;解决Centos7 yum could not retrieve mirrorlist错误&lt;/h2&gt;
&lt;p&gt;刚安装好的VM使用ip add查看局域网的ip没有结果，这个参考&lt;a href=&#34;https://my.oschina.net/u/2456768/blog/3011881&#34;&gt;https://my.oschina.net/u/2456768/blog/3011881&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;配置静态ip&#34;&gt;配置静态ip&lt;/h2&gt;
&lt;p&gt;安装虚拟机就是模拟多个机器通讯的情况，但是目前的配置是机器ip是动态获取的，老是变，每次都得看ip，所以需要配置一下VMware来支持静态ip。主要机器上的配置信息为：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;IPADDR&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;192.168.116.101
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;NETMASK&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;255.255.255.0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;GATEWAY&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;192.168.116.2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;DNS1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;192.168.116.2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这个参考了&lt;a href=&#34;https://blog.csdn.net/zhishengqianjun/article/details/77046796&#34;&gt;https://blog.csdn.net/zhishengqianjun/article/details/77046796&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;centos7安装后配置国内仓库源&#34;&gt;Centos7安装后配置国内仓库源&lt;/h2&gt;
&lt;p&gt;由于国内访问centos的原始源慢，需要换成163的软件源，新安装的系统执行命令都提示not found，只能从物理下载源的配置再上传到VM中，但是首先得知道VM的ip地址，使用ifconfig是不可能了，查了一下可以使用&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ip a
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;来查看VM的ip地址，这样配置源的的问题可以解决了，具体的配置源的方法参考&lt;a href=&#34;https://blog.csdn.net/inslow/article/details/54177191&#34;&gt;https://blog.csdn.net/inslow/article/details/54177191&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;centos7安装vmware-tools&#34;&gt;Centos7安装VMware Tools&lt;/h3&gt;
&lt;p&gt;想更好的让VM与物理机协同，则VMware Tools必须要安装，好久不用linux的我连挂载也忘的一干二净了。搜了一下，参考&lt;a href=&#34;https://blog.csdn.net/WarnerWu/article/details/73718901&#34;&gt;https://blog.csdn.net/WarnerWu/article/details/73718901&lt;/a&gt; 完成VMware Tools的安装。这样共享目录的功能就可以正常使用了&lt;/p&gt;
&lt;h2 id=&#34;安装jdk8&#34;&gt;安装Jdk8&lt;/h2&gt;
&lt;p&gt;一句命令搞定：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;安装mysql&#34;&gt;安装mysql&lt;/h2&gt;
&lt;p&gt;使用yum安装mysql需要下载安装mysql的源，更新后就可以安装了，这个参考了&lt;a href=&#34;https://www.linode.com/docs/databases/mysql/how-to-install-mysql-on-centos-7/&#34;&gt;https://www.linode.com/docs/databases/mysql/how-to-install-mysql-on-centos-7/&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;修改mysql的root密码&#34;&gt;修改mysql的root密码&lt;/h2&gt;
&lt;p&gt;安装完mysql后登录找不到密码了，其实在使用yum安装时会mysql会自动生成一个随机密码，这个密码可以在安装的日志中找到。此方法参考了&lt;a href=&#34;https://blog.csdn.net/kuluzs/article/details/51924086&#34;&gt;https://blog.csdn.net/kuluzs/article/details/51924086&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;开放3306端口&#34;&gt;开放3306端口&lt;/h2&gt;
&lt;p&gt;为了方便mysql工具进行操作，需要开放3306端口。Centos7的防火墙还改了。具体就3个命令：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;systemctl start firewalld
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;firewall-cmd --zone&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;public --add-port&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;3306/tcp --permanent
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;firewall-cmd --reload
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这个参考了&lt;a href=&#34;https://www.jianshu.com/p/225a853350d9&#34;&gt;https://www.jianshu.com/p/225a853350d9&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;安装oh-my-bash&#34;&gt;安装oh-my-bash&lt;/h2&gt;
&lt;p&gt;由于一般服务器都自带bash为默认的shell，但是操作起来着实不方便，安装oh-my-bash可以对shell进行一些增强。&lt;a href=&#34;https://github.com/ohmybash/oh-my-bash&#34;&gt;https://github.com/ohmybash/oh-my-bash&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;centos自动登录&#34;&gt;Centos自动登录&lt;/h2&gt;
&lt;p&gt;安装后每次启动VM都要输入密码，这个对于自己测试很麻烦，要使Centos能登录后自动登录需要做以下操作：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;移除原来的getty@tty1.service软链接&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rm /etc/systemd/system/getty.target.wants/getty@tty1.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;拷贝getty@.service file 并且命名为 &lt;a href=&#34;mailto:getty@tty1.service&#34;&gt;getty@tty1.service&lt;/a&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cp /lib/systemd/system/getty@.service /etc/systemd/system/getty@tty1.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;编辑新拷贝的getty@tty1.service，修改以下内容，最后一行必须加上&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;Service&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;ExecStart&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;-/sbin/agetty --autologin root --noclear %I
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;Install&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;Alias&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;getty@tty1.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在getty.target.wants目录做一下软链接&lt;/p&gt;</description>
    </item>
    <item>
      <title>那些高效的Chrome插件</title>
      <link>http://blog.imcompany.cn/post/na-xie-gao-xiao-de-chromecha-jian/</link>
      <pubDate>Fri, 08 Mar 2019 07:48:34 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/na-xie-gao-xiao-de-chromecha-jian/</guid>
      <description>&lt;h2 id=&#34;surfingkeys&#34;&gt;&lt;a href=&#34;https://github.com/brookhong/Surfingkeys&#34;&gt;Surfingkeys&lt;/a&gt; 👍&lt;/h2&gt;
&lt;p&gt;严重推荐，VIM键盘模拟，自定义程度非常高&lt;/p&gt;
&lt;h2 id=&#34;immersive-translate&#34;&gt;&lt;a href=&#34;https://immersivetranslate.com/en/docs/installation/&#34;&gt;Immersive Translate&lt;/a&gt; 👍&lt;/h2&gt;
&lt;p&gt;无敌翻译软件，支持网页、PDF、本地文件翻译&lt;/p&gt;
&lt;h2 id=&#34;tampermonkey&#34;&gt;&lt;a href=&#34;https://github.com/Tampermonkey/tampermonkey&#34;&gt;Tampermonkey&lt;/a&gt; 👍&lt;/h2&gt;
&lt;p&gt;用户自定义脚本管理器&lt;/p&gt;
&lt;h2 id=&#34;enhanced-github&#34;&gt;Enhanced GitHub&lt;/h2&gt;
&lt;p&gt;Github加强版，显示仓库大小，下载单个文件等好用功能。&lt;a href=&#34;https://chrome.google.com/webstore/detail/enhanced-github/anlikcnbgdeidpacdbdljnabclhahhmd&#34;&gt;插件地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;眺览-tillglance&#34;&gt;&lt;a href=&#34;https://chromewebstore.google.com/detail/%E7%9C%BA%E8%A7%88-tillglance/aomnlmcemihejgfkeplljkcelfpneakg&#34;&gt;眺览 TillGlance&lt;/a&gt; 👍&lt;/h2&gt;
&lt;p&gt;一目十行的阅读方式&lt;/p&gt;
&lt;h2 id=&#34;elmo-your-ai-companion-to-create-summaries-and-insights&#34;&gt;&lt;a href=&#34;https://www.elmo.chat/&#34;&gt;Elmo - Your AI companion to create summaries and insights&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;最大优点是生成的摘要最接近原文&lt;/p&gt;
&lt;h2 id=&#34;language-reactor&#34;&gt;&lt;a href=&#34;https://www.languagereactor.com/&#34;&gt;Language Reactor&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;探索、理解并从母语材料中学习的完美助手&lt;/p&gt;
&lt;h2 id=&#34;peeklink-chrome-web-store&#34;&gt;&lt;a href=&#34;https://chromewebstore.google.com/detail/peeklink/hdaniddaeomoofbnoagkncfofebaablc&#34;&gt;PeekLink - Chrome Web Store&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;浏览体验大升级&lt;/p&gt;
&lt;h2 id=&#34;iorate-ublacklist-blocks-specific-sites-from-appearing-in-google-search-results&#34;&gt;&lt;a href=&#34;https://github.com/iorate/ublacklist?tab=readme-ov-file&#34;&gt;iorate/ublacklist: Blocks specific sites from appearing in Google search results&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;weread-to-readwise-sync-微信读书笔记同步到readwise-chrome-web-store&#34;&gt;&lt;a href=&#34;https://chromewebstore.google.com/detail/weread-to-readwise-sync-%E5%BE%AE/nmdgmoganjdiofngeapmjcfichpbbbed&#34;&gt;WeRead to Readwise Sync, 微信读书笔记同步到Readwise - Chrome Web Store&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&#34;podstation-podstation-podstation-is-a-web-podcast-aggregator-for-chrome-dot&#34;&gt;&lt;a href=&#34;https://github.com/podStation/podStation&#34;&gt;podStation/podStation: podStation is a web podcast aggregator for Chrome.&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;浏览器中播放播客，支持下载&lt;/p&gt;
&lt;h2 id=&#34;justineo-github-hovercard-neat-hovercards-for-github-dot&#34;&gt;&lt;a href=&#34;https://github.com/Justineo/github-hovercard&#34;&gt;Justineo/github-hovercard: Neat hovercards for GitHub.&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Github hover增强&lt;/p&gt;</description>
    </item>
    <item>
      <title>那些提高效率的命令行工具</title>
      <link>http://blog.imcompany.cn/post/na-xie-ti-gao-xiao-lu-de-ming-ling-xing-gong-ju/</link>
      <pubDate>Sun, 30 Sep 2018 07:15:55 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/na-xie-ti-gao-xiao-lu-de-ming-ling-xing-gong-ju/</guid>
      <description>&lt;h2 id=&#34;brew&#34;&gt;brew&lt;/h2&gt;
&lt;p&gt;Mac软件包管理工具。用命令行命令来安装软件，仓库软件丰富。&lt;a href=&#34;https://github.com/Homebrew/brew&#34;&gt;地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;bat&#34;&gt;bat&lt;/h2&gt;
&lt;p&gt;bat? No，高端cat，不费眼。带颜色显示，支持git状态，自动分页。&lt;a href=&#34;https://github.com/sharkdp/bat&#34;&gt;地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;cowsay&#34;&gt;cowsay&lt;/h2&gt;
&lt;p&gt;奶牛说： &lt;a href=&#34;https://github.com/piuccio/cowsay&#34;&gt;地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;coreutils&#34;&gt;coreutils&lt;/h2&gt;
&lt;p&gt;使用Rust重写的gnuutils。&lt;a href=&#34;https://github.com/uutils/coreutils&#34;&gt;地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;direnv&#34;&gt;direnv&lt;/h2&gt;
&lt;p&gt;环境变量切换，可以指定在进入某一文件夹后的操作，比如输出一条欢迎语句，在退出文件夹后则卸载变量（操作），它的&lt;a href=&#34;https://github.com/direnv/direnv/blob/master/stdlib.sh%0A%0A&#34;&gt;stdlib&lt;/a&gt;内置了一些功能来处理环境。 &lt;a href=&#34;https://github.com/direnv/direnv&#34;&gt;地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;exa&#34;&gt;exa&lt;/h2&gt;
&lt;p&gt;ls、tree的替代者，支持多种显示方式，支持按指定条件排序显示。&lt;a href=&#34;https://github.com/ogham/exa&#34;&gt;地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;duti&#34;&gt;duti&lt;/h2&gt;
&lt;p&gt;mac默认软件打开程序配置。再也不用一个手动的点击设置了，可以脚本化。&lt;a href=&#34;https://github.com/moretension/duti&#34;&gt;地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;riggrep&#34;&gt;riggrep&lt;/h2&gt;
&lt;p&gt;强大的find，查询速度更快，支持匹配结果的字符替换，支持定义输出颜色。&lt;a href=&#34;https://github.com/BurntSushi/ripgrep&#34;&gt;地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;fortune&#34;&gt;fortune&lt;/h2&gt;
&lt;p&gt;英文名言集合，可以使用&lt;a href=&#34;https://github.com/ruanyf/fortunes&#34;&gt;fortunes&lt;/a&gt;进行扩展，对中文用户更友好。&lt;a href=&#34;https://www.ibiblio.org/pub/linux/games/amusements/fortune/!INDEX.html&#34;&gt;地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;fzf&#34;&gt;fzf&lt;/h2&gt;
&lt;p&gt;强大的交互式搜索，大大提高效率，官网提供了很多实用的操作目录与git的命令。&lt;a href=&#34;https://github.com/junegunn/fzf&#34;&gt;地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;goku&#34;&gt;goku&lt;/h2&gt;
&lt;p&gt;改键神器Karabiner的配置管理器，更健康，更人性化。&lt;a href=&#34;https://github.com/yqrashawn/GokuRakuJoudo&#34;&gt;地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;htop&#34;&gt;htop&lt;/h2&gt;
&lt;p&gt;交互式的top信息显示，支持配色。&lt;a href=&#34;https://github.com/hishamhm/htop&#34;&gt;地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;imgcat&#34;&gt;imgcat&lt;/h2&gt;
&lt;p&gt;命令行看图片。可以控制显示的高度、宽度。&lt;a href=&#34;https://github.com/eddieantonio/imgcat&#34;&gt;地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;jq&#34;&gt;jq&lt;/h2&gt;
&lt;p&gt;json内容操作显示。支持分离、过滤、转换元素，判断JSON元素节点是否存在等功能，内置了很多方便的函数。 &lt;a href=&#34;https://github.com/stedolan/jq&#34;&gt;地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;jenv&#34;&gt;jenv&lt;/h2&gt;
&lt;p&gt;JDK版本管理命令行工具，支持全局、当前目录、当前shell的jdk版本指定。还可以指定Java虚拟机指定的JVM参数。支持插件的启用与禁用。&lt;a href=&#34;https://www.jenv.be/&#34;&gt;地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;lnav&#34;&gt;lnav&lt;/h2&gt;
&lt;p&gt;log file navigator，增加的日志查看，可以根据日志级别显示不同颜色的日志信息。支持分页显示。&lt;a href=&#34;https://github.com/tstack/lnav&#34;&gt;地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;lolcat&#34;&gt;lolcat&lt;/h2&gt;
&lt;p&gt;命令、文件内容多彩输出。&lt;a href=&#34;https://github.com/busyloop/lolcat&#34;&gt;地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;m-cli&#34;&gt;m-cli&lt;/h2&gt;
&lt;p&gt;Mac的瑞士军刀，支持各种mac组件(Dock，蓝牙，WIFI，Finder)的操作。&lt;a href=&#34;https://github.com/rgcr/m-cli&#34;&gt;地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;mackup&#34;&gt;mackup&lt;/h2&gt;
&lt;p&gt;Mac应用配置同步，支持多种存储方式。支持自定义应用的同步配置。主要命令为backup，restore，uninstall。&lt;a href=&#34;https://github.com/lra/mackup&#34;&gt;地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;mas&#34;&gt;mas&lt;/h2&gt;
&lt;p&gt;命令行安装apple store应用。&lt;a href=&#34;https://github.com/mas-cli/mas&#34;&gt;地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;mycli&#34;&gt;mycli&lt;/h2&gt;
&lt;p&gt;命令行中的mysql客户端。&lt;a href=&#34;https://github.com/dbcli/mycli&#34;&gt;地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;ncdu&#34;&gt;ncdu&lt;/h2&gt;
&lt;p&gt;增强版本的du，机器空间使用查询，支持扫描结果导出与导入，支持多种排序方式。&lt;a href=&#34;https://dev.yorhel.nl/ncdu&#34;&gt;地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;ranger&#34;&gt;Ranger&lt;/h2&gt;
&lt;p&gt;命令行下的文件管理，强大到没朋友。&lt;a href=&#34;https://github.com/ranger/ranger&#34;&gt;地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;pandoc&#34;&gt;pandoc&lt;/h2&gt;
&lt;p&gt;文档转换，支持非常多的的格式转换。&lt;a href=&#34;https://pandoc.org/&#34;&gt;地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;pyenv&#34;&gt;pyenv&lt;/h2&gt;
&lt;p&gt;pythne版本管理工具。&lt;a href=&#34;https://github.com/pyenv/pyenv&#34;&gt;地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;pyenv-virtualenv&#34;&gt;pyenv-virtualenv&lt;/h2&gt;
&lt;p&gt;pythne虚拟环境管理，管理pyenv配置的环境。&lt;a href=&#34;https://github.com/pyenv/pyenv-virtualenv&#34;&gt;地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;prettyping&#34;&gt;prettyping&lt;/h2&gt;
&lt;p&gt;增强的ping，图形化显示，可以轻松的看出ping的地址的网络状况。&lt;a href=&#34;http://denilson.sa.nom.br/prettyping/&#34;&gt;地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;rtv&#34;&gt;rtv&lt;/h2&gt;
&lt;p&gt;命令行中浏览reddit。&lt;a href=&#34;https://github.com/michael-lazar/rtv&#34;&gt;地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;s-search&#34;&gt;s-search&lt;/h2&gt;
&lt;p&gt;命令行下进行web搜索。&lt;a href=&#34;https://github.com/zquestz/s&#34;&gt;地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;tmux&#34;&gt;tmux&lt;/h2&gt;
&lt;p&gt;终端多会话管理器。&lt;a href=&#34;https://github.com/tmux/tmux&#34;&gt;地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;tldr&#34;&gt;tldr&lt;/h2&gt;
&lt;p&gt;命令快速查询。简单的man。&lt;a href=&#34;https://tldr.sh/&#34;&gt;地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;terminal-notify&#34;&gt;Terminal Notify&lt;/h2&gt;
&lt;p&gt;命令行操作mac显示通知，支持图标显示与点击后操作（如打开网址，执行命令）等。&lt;a href=&#34;https://github.com/julienXX/terminal-notifier&#34;&gt;地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;w3m&#34;&gt;w3m&lt;/h2&gt;
&lt;p&gt;终端浏览器，操作方便。&lt;a href=&#34;http://w3m.sourceforge.net/&#34;&gt;地址&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>那些提高效率的Alfred Workflow</title>
      <link>http://blog.imcompany.cn/post/na-xie-ti-gao-xiao-lu-de-alfred-workflow/</link>
      <pubDate>Fri, 21 Sep 2018 10:02:49 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/na-xie-ti-gao-xiao-lu-de-alfred-workflow/</guid>
      <description>&lt;h2 id=&#34;alfred-maestro&#34;&gt;Alfred Maestro&lt;/h2&gt;
&lt;p&gt;操作Maestro的workflow，可以直接查找macro并执行。&lt;a href=&#34;https://github.com/iansinnott/alfred-maestro&#34;&gt;插件地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;alfred-github-workflow&#34;&gt;Alfred github workflow&lt;/h2&gt;
&lt;p&gt;搜索github上的项目，可以搜索项目，人物等。&lt;a href=&#34;https://github.com/gharlan/alfred-github-workflow&#34;&gt;插件地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;myip&#34;&gt;MyIP&lt;/h2&gt;
&lt;p&gt;快速的查询本机的ip，包括本地IP与外网IP。&lt;/p&gt;
&lt;h2 id=&#34;switchhosts&#34;&gt;SwitchHosts!&lt;/h2&gt;
&lt;p&gt;在alfred中快速本地host的配置，配合&lt;a href=&#34;https://github.com/oldj/SwitchHosts&#34;&gt;SwitchHosts&lt;/a&gt;来使用。&lt;a href=&#34;http://www.packal.org/workflow/switchhosts&#34;&gt;插件地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;snippetslab&#34;&gt;SnippetsLab&lt;/h2&gt;
&lt;p&gt;在alfred中快速查看SnippetsLab中的代码片断&lt;/p&gt;
&lt;h2 id=&#34;vmware-control&#34;&gt;VMWare Control&lt;/h2&gt;
&lt;p&gt;在alfred中控制vmware虚拟机。支持启动、停止、挂起、切换等操作。&lt;a href=&#34;http://www.packal.org/workflow/vmware-control&#34;&gt;插件地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;lxbrvr-alfred-keepassxc-workflow-alfred-workflow-for-fetching-the-attributes-of-the-keepassxc-entries-dot&#34;&gt;&lt;a href=&#34;https://github.com/lxbrvr/alfred-keepassxc-workflow&#34;&gt;lxbrvr/alfred-keepassxc-workflow: Alfred workflow for fetching the attributes of the KeepassXC entries.&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Alfred 快速密码访问&lt;/p&gt;
&lt;h2 id=&#34;8ed41f&#34;&gt;&lt;del&gt;Alfred Browser Toolbox&lt;/del&gt;&lt;/h2&gt;
&lt;p&gt;Toolbox是一个文件操作浏览的工具，它支持创建、查找文件的功能，还可以查询pdf文件，非常方便。Mac上的Finder使用确定不方便。&lt;a href=&#34;https://www.alfredforum.com/topic/5166-copymove-to-and-alfred-browser-workflows/&#34;&gt;这里&lt;/a&gt;有具体的使用方式。&lt;/p&gt;
&lt;h2 id=&#34;da05df&#34;&gt;&lt;del&gt;Alfred Keywords Help&lt;/del&gt;&lt;/h2&gt;
&lt;p&gt;安装的workflow多了，记忆触发的keyword就比较困难，使用&lt;a href=&#34;https://github.com/pochemuto/alfred-help-workflow&#34;&gt;Keywords help&lt;/a&gt;这个插件可以显示出所有已经安装的workflow的触发key，还可以根据workflow进行查询。&lt;/p&gt;
&lt;h2 id=&#34;alfred-my-mind&#34;&gt;Alfred My Mind&lt;/h2&gt;
&lt;p&gt;快速查询&lt;a href=&#34;https://nikitavoloboev.xyz/&#34;&gt;Nikita&lt;/a&gt;的githubpage内容的workflow，我在他的文章里面学到了很多。&lt;a href=&#34;https://github.com/nikitavoloboev/alfred-my-mind#readme&#34;&gt;插件地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;f0b25f&#34;&gt;&lt;del&gt;Awesome lists&lt;/del&gt;&lt;/h2&gt;
&lt;p&gt;快速查询Github上awesome列表的workflow，只为发现更多。&lt;a href=&#34;https://github.com/nikitavoloboev/alfred-awesome-lists&#34;&gt;插件地址&lt;/a&gt;，这个也是Nikita的作品。&lt;/p&gt;
&lt;h2 id=&#34;baidu-map&#34;&gt;Baidu Map&lt;/h2&gt;
&lt;p&gt;在alfred上使用百度地图。&lt;a href=&#34;https://github.com/wofeiwo/alfred-baidu-map&#34;&gt;插件地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;birthday&#34;&gt;Birthday&lt;/h2&gt;
&lt;p&gt;在alfred中显示你来到这个世界多长时间，让你珍惜每一分，每一秒。&lt;a href=&#34;https://github.com/nikitavoloboev/small-workflows/tree/master/birthday#readme&#34;&gt;插件地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;calendar&#34;&gt;Calendar&lt;/h2&gt;
&lt;p&gt;在alfred中显示出当月的日历信息。&lt;a href=&#34;https://github.com/owenwater/alfred-cal&#34;&gt;插件地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;chromes-bookmarks&#34;&gt;Chromes Bookmarks&lt;/h2&gt;
&lt;p&gt;在aflred中搜索Chrome浏览器的书签，非常的好用。&lt;a href=&#34;https://github.com/blainesch/alfred-chrome-bookmarks&#34;&gt;插件地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;common-search&#34;&gt;Common Search&lt;/h2&gt;
&lt;p&gt;国内常用网站的搜索，现在支持知乎、淘宝、掘金、github。&lt;a href=&#34;https://github.com/MuYunyun/commonSearch&#34;&gt;插件地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;dash&#34;&gt;Dash&lt;/h2&gt;
&lt;p&gt;在alfred中进行Dash的搜索，开发者必备。&lt;a href=&#34;https://github.com/Kapeli/Dash-Alfred-Workflow&#34;&gt;插件地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;directory-watches&#34;&gt;Directory watches&lt;/h2&gt;
&lt;p&gt;本地目录文件查看，指定目录的搜索，回收站文件显示。&lt;/p&gt;
&lt;h2 id=&#34;emacs-workflow&#34;&gt;Emacs Workflow&lt;/h2&gt;
&lt;p&gt;在alfred中进行emacs的操作，比如打开文件等。&lt;a href=&#34;https://www.alfredforum.com/topic/8444-emacs-workflow/&#34;&gt;插件地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;git-repos&#34;&gt;Git Repos&lt;/h2&gt;
&lt;p&gt;搜索本地的git文件夹，搜索到后可以使用指定软件进行打开，开发时很有用。&lt;a href=&#34;https://github.com/deanishe/alfred-repos&#34;&gt;插件地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;google-chrome-history&#34;&gt;Google Chrome History&lt;/h2&gt;
&lt;p&gt;在alfred中快速查看Chrome的浏览历史。&lt;a href=&#34;https://github.com/tupton/alfred-chrome-history&#34;&gt;插件地址&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>那些提高效率的Idea插件</title>
      <link>http://blog.imcompany.cn/post/na-xie-ti-gao-xiao-lu-de-ideacha-jian/</link>
      <pubDate>Wed, 05 Sep 2018 08:12:23 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/na-xie-ti-gao-xiao-lu-de-ideacha-jian/</guid>
      <description>&lt;h2 id=&#34;dot-ignore&#34;&gt;.ignore&lt;/h2&gt;
&lt;h3 id=&#34;插件说明&#34;&gt;插件说明&lt;/h3&gt;
&lt;p&gt;ignore文件忽略，支持绝大多数的开发语言，支持直接导航到忽略的文件，在创建时可以选择模板，比如Java开发可以选择Java与Idea选项来生成忽略target文件与.idea文件等的忽略规则。&lt;/p&gt;
&lt;h3 id=&#34;项目地址&#34;&gt;项目地址&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/hsz/idea-gitignore&#34;&gt;https://github.com/hsz/idea-gitignore&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;ideavim&#34;&gt;IdeaVim&lt;/h2&gt;
&lt;h3 id=&#34;插件说明&#34;&gt;插件说明&lt;/h3&gt;
&lt;p&gt;在Idea中使用vi键位来进行编码操作,可以很高的提高效率,插件支持自定义键位来对Idea的action来进行定制,程序员可以根据自己的编程习惯来定制出一个键盘流来.&lt;/p&gt;
&lt;h3 id=&#34;项目地址&#34;&gt;项目地址&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/JetBrains/ideavim&#34;&gt;https://github.com/JetBrains/ideavim&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;ideavimextension-plugin-for-jetbrains-ides-jetbrains-marketplace&#34;&gt;&lt;a href=&#34;https://plugins.jetbrains.com/plugin/9615-ideavimextension&#34;&gt;IdeaVimExtension Plugin for JetBrains IDEs | JetBrains Marketplace&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;IdeaVim的扩展功能&lt;/p&gt;
&lt;h2 id=&#34;5a9516&#34;&gt;&lt;del&gt;emacsIDEAs&lt;/del&gt;&lt;/h2&gt;
&lt;h3 id=&#34;插件说明&#34;&gt;插件说明&lt;/h3&gt;
&lt;p&gt;支持一些Emacs操作的Idea插件,主要是一些复制,移动,替换,跳转的快捷操作,目前使用最多的是快速查找替换.&lt;/p&gt;
&lt;h3 id=&#34;项目地址&#34;&gt;项目地址&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/whunmr/emacsIDEAs&#34;&gt;https://github.com/whunmr/emacsIDEAs&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;acejump-acejump-️-single-character-search-select-and-jump&#34;&gt;&lt;a href=&#34;https://github.com/acejump/AceJump#acejump&#34;&gt;acejump/AceJump: 🅰️ single character search, select, and jump&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Idea中快速跳转&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;支持行模式&lt;/li&gt;
&lt;li&gt;支持IdeaVim集成&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;custom-postfix-templates&#34;&gt;Custom Postfix Templates&lt;/h2&gt;
&lt;h3 id=&#34;插件说明&#34;&gt;插件说明&lt;/h3&gt;
&lt;p&gt;Idea中非常高效的就是postfix，但是系统自带不可以进行增加，这个插件就可以让用户可以自定义一些高级的postfix语句来提高效率。&lt;/p&gt;
&lt;h3 id=&#34;项目地址&#34;&gt;项目地址&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/xylo/intellij-postfix-templates&#34;&gt;https://github.com/xylo/intellij-postfix-templates&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;jrebel&#34;&gt;Jrebel&lt;/h2&gt;
&lt;h3 id=&#34;插件说明&#34;&gt;插件说明&lt;/h3&gt;
&lt;p&gt;动态部署代码插件,可以在不重启Tomcat的情况下进行代码的热部署，提高开发效率没得说。先前可以使用twitter号来免费使用，现在不行，需要自行购买了。&lt;/p&gt;
&lt;h3 id=&#34;项目地址&#34;&gt;项目地址&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://zeroturnaround.com/software/jrebel/&#34;&gt;https://zeroturnaround.com/software/jrebel/&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;hotswaphelper&#34;&gt;&lt;a href=&#34;https://github.com/gejun123456/HotSwapHelper&#34;&gt;HotSwapHelper&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;开源免费的热部署插件&lt;/p&gt;
&lt;h2 id=&#34;camelcase&#34;&gt;CamelCase&lt;/h2&gt;
&lt;h3 id=&#34;插件说明&#34;&gt;插件说明&lt;/h3&gt;
&lt;p&gt;文本驼峰规则快速转换，支持从CamelCase-&amp;gt;camelCaase-&amp;gt;camel_case-&amp;gt;camel-case-&amp;gt;CAMEL_CASE的顺序转换，idea中只支持全部大写与全部小写的转换.&lt;/p&gt;
&lt;h3 id=&#34;项目地址&#34;&gt;项目地址&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://plugins.jetbrains.com/plugin/7160-camelcase&#34;&gt;https://plugins.jetbrains.com/plugin/7160-camelcase&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;codehelper&#34;&gt;Codehelper&lt;/h2&gt;
&lt;h3 id=&#34;插件说明&#34;&gt;插件说明&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;代码自动生成插件，支持根据Pojo名来生成dao,mapper,xml等文件，目前使用较少&lt;/li&gt;
&lt;li&gt;生成实体类的setter方法，使用频率高，主要是生成类的setter方法，配合F2查找下一个错误而使焦点至上而下，操作起来非常顺畅。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;项目地址&#34;&gt;项目地址&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/zhengjunbase/codehelper.generator&#34;&gt;https://github.com/zhengjunbase/codehelper.generator&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;translation&#34;&gt;Translation&lt;/h2&gt;
&lt;h3 id=&#34;插件说明&#34;&gt;插件说明&lt;/h3&gt;
&lt;p&gt;Idea中集成翻译功能,目前支持有道和goolge,百度翻译.&lt;/p&gt;
&lt;h3 id=&#34;项目地址&#34;&gt;项目地址&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/izhangzhihao/intellij-rainbow-brackets&#34;&gt;https://github.com/izhangzhihao/intellij-rainbow-brackets&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;clock&#34;&gt;Clock&lt;/h2&gt;
&lt;h3 id=&#34;插件说明&#34;&gt;插件说明&lt;/h3&gt;
&lt;p&gt;当你全屏投入工作时，想知道当前的时间，需要切换出全屏模式，这样就打乱了节奏，这个插件可以在Idea的右下方显示出当前的时间信息，非常实用。&lt;/p&gt;
&lt;h3 id=&#34;插件地址&#34;&gt;插件地址&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/xamgore/intellij-clock&#34;&gt;https://github.com/xamgore/intellij-clock&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>设计模式学习之代理模式</title>
      <link>http://blog.imcompany.cn/post/she-ji-mo-shi-xue-xi-zhi-dai-li-mo-shi/</link>
      <pubDate>Mon, 16 Jul 2018 21:08:28 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/she-ji-mo-shi-xue-xi-zhi-dai-li-mo-shi/</guid>
      <description>&lt;h2 id=&#34;说明&#34;&gt;说明&lt;/h2&gt;
&lt;p&gt;代理模式是设计模式中使用频率非常的高的模式，像日常生活中的房产中介、外卖平台都属于代理。代理模式就是在访问真正的业务之时不会直接与真正的业务进行调用，而是与一个与真正业务对象有着相同功能声明的代理来进行处理，但是最终的处理还是由真正的业务类来进行（决定），比如房产中介，他们会帮助找房者根据条件来对可选房屋进行筛选，但是最终订与不订的权利还是由找房者来决定。常见的代理有保护代理、虚拟代理、远程代理。&lt;/p&gt;
&lt;h2 id=&#34;代理模式&#34;&gt;代理模式&lt;/h2&gt;
&lt;p&gt;我们常用的后台系统一般会根据用户权限的不同对用户展示不同的业务菜单，拥有高权限的人会展示相对多的菜单进行操作，在这个过程中还要记录用户的操作日志，用户点了什么，执行了什么操作都需要进行记录，达到有据可查。在这个业务场景下，就可以使用代理模式进行实现。代理对象会持有一个真正业务对象的实例，在代理对象中还引用日志服务与权限服务，所有的请求都经过这个代理类来进行，这样就可以根据操作的用户的状态来进行相应的处理了。具体的代码实现如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;定义一个查询接口，在这里定义一个查询用户收入的方法，如下:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;cn.imcompany.proxy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * Created by tomyli on 2018/6/28.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * Github: https://github.com/peng051410
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; */&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;interface&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Search&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;queryIncome&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;username&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;再定义一个实现该接口的具体业务类：&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;cn.imcompany.proxy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * Created by tomyli on 2018/6/28.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * Github: https://github.com/peng051410
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; */&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;SearchService&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;implements&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Search&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Override&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;queryIncome&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;username&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;out&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;username&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;开始查询&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Thread&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;sleep&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;catch&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;InterruptedException&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;printStackTrace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;out&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;username&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;查询完成&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在上面代码中就实现了查询收入的方法，简单的打印了两行日志。&lt;/p&gt;</description>
    </item>
    <item>
      <title>设计模式学习之委托模式</title>
      <link>http://blog.imcompany.cn/post/she-ji-mo-shi-xue-xi-zhi-wei-tuo-mo-shi/</link>
      <pubDate>Sat, 07 Jul 2018 18:53:57 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/she-ji-mo-shi-xue-xi-zhi-wei-tuo-mo-shi/</guid>
      <description>&lt;h2 id=&#34;说明&#34;&gt;说明&lt;/h2&gt;
&lt;p&gt;委托模式不属于23种设计模式中，但是它在Spring框架中使用的很频繁，Spring的作用在Java的开发是非常大，所以需要学习一下委托模式。委托模式是指两个对象都有相同的方法与功能，比如A、B两个对象都有相同的方法，但是有调用A的method方法，A不会自己来处理而是直接调用了B的同名方法，由两个对象参与同一个请求，接受请求的对象将委托给另一个对象来处理。&lt;/p&gt;
&lt;h2 id=&#34;委托模式&#34;&gt;委托模式&lt;/h2&gt;
&lt;p&gt;在一般的公司中，都会分为老板、项目经理、开发人员结构，老板负责制定决策，分配给项目经理后，他不会自己来完成，而是把需要的功能进行分解，交给擅长的开发人员进行实现。虽然项目经理也可以完成，但是是他把这些事情委托给了多个开发人员来做，加快了完成任务的速度。就以这个需求来说，使用委托模式来进行实现:&lt;/p&gt;
&lt;p&gt;定义抽象的人类接口：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;cn.imcompany.delegate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * Created by tomyli on 2018/6/27.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * Github: https://github.com/peng051410
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; */&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;interface&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Member&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;showName&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;showSkill&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;doWork&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上面代码中定义了抽象的人类接口，显示这个人的名字，拥有的技能，工作的状态情况，接下来实现需求中的每个人。&lt;/p&gt;
&lt;p&gt;定义老板(BOSS):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;cn.imcompany.delegate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * Created by tomyli on 2018/6/27.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * Github: https://github.com/peng051410
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; */&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Boss&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;implements&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Member&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Override&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;showName&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;out&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;i am boss&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Override&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;showSkill&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;out&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;send commend&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Override&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;doWork&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;定义项目经理和员工:&lt;/p&gt;</description>
    </item>
    <item>
      <title>设计模式学习之观察者</title>
      <link>http://blog.imcompany.cn/post/she-ji-mo-shi-xue-xi-zhi-guan-cha-zhe/</link>
      <pubDate>Wed, 04 Jul 2018 20:31:41 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/she-ji-mo-shi-xue-xi-zhi-guan-cha-zhe/</guid>
      <description>&lt;h2 id=&#34;说明&#34;&gt;说明&lt;/h2&gt;
&lt;p&gt;观察者模式在日常开发中使用频率也是非常高的，它建立了对象与对象之间的关系，一个对象的行为改变会通知到另一个对象，被通知的对象根据通知做出相应的处理动作。在观察者中分为目标对象（被观察者）、观察者。观察者模式是一种对象行为模式。&lt;/p&gt;
&lt;h2 id=&#34;观察者模式&#34;&gt;观察者模式&lt;/h2&gt;
&lt;p&gt;现在很多人都购买股票，在市面上有很多的股票软件供广大股民使用。股票软件一般会在用户关注的股票有变动时发送消息来通知股民。在这里，某一支股票就是目标对象，广大股民与股票软件就是观察者，他们根据股票的行情变化来做出相应买入或者卖出操作。这一需求可以使用观察者模式进行实现。代码如下：&lt;/p&gt;
&lt;p&gt;先来定义一个抽象的购买股票的股民们，他们有喜有悲的心情:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;cn.imcompany.observer.stock&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * Created by tomyli on 2018/6/23.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * Github: https://github.com/peng051410
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; */&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;interface&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Buyer&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;setName&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;getName&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;happy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;sad&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;再来定义具体的股民行为实现类：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;cn.imcompany.observer.stock&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * Created by tomyli on 2018/6/23.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * Github: https://github.com/peng051410
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; */&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;ConcrectBuyer&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;implements&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Buyer&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Override&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;setName&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Override&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;getName&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Override&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;happy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;out&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getName&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;:happy&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Override&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;sad&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;out&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getName&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;:sad&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;具体的股民实现了喜与悲的方法，这样观察者已经准备就绪。下面来定义股票软件：&lt;/p&gt;</description>
    </item>
    <item>
      <title>设计模式学习之装饰器</title>
      <link>http://blog.imcompany.cn/post/she-ji-mo-shi-xue-xi-zhi-zhuang-shi-qi/</link>
      <pubDate>Mon, 02 Jul 2018 20:09:14 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/she-ji-mo-shi-xue-xi-zhi-zhuang-shi-qi/</guid>
      <description>&lt;h2 id=&#34;说明&#34;&gt;说明&lt;/h2&gt;
&lt;p&gt;装饰器设计模式是使用比较频繁的设计模式，它在不改变原物体的情况对原物体实现了功能的增加，原物体还是一个可单独使用的个体。在JAVA的类库中应该会马上想到IO类，各种的InputStrem，OutputStrem。&lt;/p&gt;
&lt;h2 id=&#34;装饰器模式&#34;&gt;装饰器模式&lt;/h2&gt;
&lt;p&gt;在用户登录的中过程，我们需要对用户输入的密码进行加密操作，在设计时会提供好多种加密的算法，例如简单的BASE64加密，复杂的如MD5、DSA加密。直接把用户的密码存入数据库是真的在耍流氓。在使用这些算法时，我们想灵活的使用，比如使用完简单加密还可以再进行一下MD5的加密。针对这样的需求，可以使用装饰器模式进行实现。大体思路如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;加密接口，定义加密方法。&lt;/li&gt;
&lt;li&gt;在装饰器中，最原始的被装饰者是目标实现，它们一般会实现加密定义的具体方法。&lt;/li&gt;
&lt;li&gt;装饰者会针对目标对象进行装饰，所以它要同样实现加密接口的方法，一般情况下这个装饰器会定义为抽象的形式，在这个装饰器父类中维护着对目标对象的引用。&lt;/li&gt;
&lt;li&gt;具体装饰器继承抽象装饰器来实现对目标对象的真正装饰操作。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;以上的情况在代码上体现为如下形式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;加密接口&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;cn.imcompany.decorator.encrypt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * Created by tomyli on 2018/6/25.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * Github: https://github.com/peng051410
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; */&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;interface&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Encryptor&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;encrypt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;具体加密类，实现加密处理接口&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;cn.imcompany.decorator.encrypt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * Created by tomyli on 2018/6/25.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * Github: https://github.com/peng051410
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; */&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;ConcreteEncryptor&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;implements&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Encryptor&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Override&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;encrypt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;out&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;base encrypt!&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;抽象加密装饰器&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;cn.imcompany.decorator.encrypt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * Created by tomyli on 2018/6/25.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * Github: https://github.com/peng051410
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; */&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;abstract&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;EncryptDecorator&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;implements&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Encryptor&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Encryptor&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;encrypt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;EncryptDecorator&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Encryptor&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;encrypt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;encrypt&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;encrypt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Override&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;encrypt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;encrypt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;encrypt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上面的抽象装饰器实现的加密接口，在这个类中维护加密接口的实体，加密方法直接调用其维护实体的加密方法。&lt;/p&gt;</description>
    </item>
    <item>
      <title>设计模式学习之适配器</title>
      <link>http://blog.imcompany.cn/post/she-ji-mo-shi-xue-xi-zhi-gua-pei-qi/</link>
      <pubDate>Tue, 26 Jun 2018 21:30:17 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/she-ji-mo-shi-xue-xi-zhi-gua-pei-qi/</guid>
      <description>&lt;h2 id=&#34;说明&#34;&gt;说明&lt;/h2&gt;
&lt;p&gt;在&lt;a href=&#34;http://blog.imcompany.cn/posts/she-ji-mo-shi-xue-xi-zhi-mo-ban-mo-shi&#34;&gt;前面&lt;/a&gt;的文章中介绍了一些关于支付相关的功能，现在转向登录，在早些时期的系统登录就是用户使用用户名与密码进行注册，注册成功后就可以进行登录了。随着时代的发展，出现很多三方的平台，它们对外提供了获取平台用户信息的功能，例如微信、qq、微博等三方登录，在接入这些三方登录时都是遵循相应的规则，老的登录的方式需要保留，对接新的登录方式还想要使用老的登录服务，这样可以使用适配器模式来实现。&lt;/p&gt;
&lt;h2 id=&#34;适配器模式&#34;&gt;适配器模式&lt;/h2&gt;
&lt;p&gt;比如我们平常使用的转接头一样，就是一种适配器的模式。它使两个不相关的物体很好的关联在一起。对于要接入的新的登录方式，首先定义新的三方登录的接口，定义要使用的三方登录方式，如下代码示例：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;cn.imcompany.adapter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * Created by tomyli on 2018/6/22.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * Github: https://github.com/peng051410
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; */&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;interface&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;ThirdLogin&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;wechatLogin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;accessToken&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;qqLogin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;accessToken&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;sinaLogin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;accessToken&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如上定义了微信、qq、微博三种登录方式，它们都是使用accessToken来进行认证，经用户同意后获取相应的用户的信息调用方使用。下面来进行具体的实现：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;cn.imcompany.adapter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * Created by tomyli on 2018/6/22.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * Github: https://github.com/peng051410
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; */&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;ThirdLoginAdapter&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;implements&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ThirdLogin&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;LoginService&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;loginService&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;ThirdLoginAdapter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;loginService&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;LoginService&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Override&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;wechatLogin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;accessToken&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;out&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;微信获取用户信息&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;loginService&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;login&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;accessToken&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Override&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;qqLogin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;accessToken&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;out&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;qq获取用户信息&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;loginService&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;login&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;accessToken&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Override&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;sinaLogin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;accessToken&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;out&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;微博获取用户信息&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;loginService&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;login&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;accessToken&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在上面的实现，并没有重新写登录的逻辑，除了要调用三方平台的代码，登录的功能是直接使用老的登录服务实现的。在这个实现类中引用了老的服务，然后使用其已经非常成熟的功能来完成登录的操作。这样以最少的代码达到了新的需求也使老的服务可以正常运行。免去了很多测试的功能点。这种适配器叫做对象适配器。&lt;/p&gt;</description>
    </item>
    <item>
      <title>设计模式学习之模板模式</title>
      <link>http://blog.imcompany.cn/post/she-ji-mo-shi-xue-xi-zhi-mo-ban-mo-shi/</link>
      <pubDate>Mon, 25 Jun 2018 21:06:17 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/she-ji-mo-shi-xue-xi-zhi-mo-ban-mo-shi/</guid>
      <description>&lt;h2 id=&#34;说明&#34;&gt;说明&lt;/h2&gt;
&lt;p&gt;在一般实现处理用户支付订单时，通常都会在一个单独的回调项目中来处理用户的支付方式回调。一般情况下，回调的处理过程都是相似的，大体的步骤就是获取参数-&amp;gt;验证参数-&amp;gt;验证签名-&amp;gt;验证支付状态（可选）-&amp;gt;订单状态为成功增加用户的充值金额。具体的过程由于不同的支付方式不同而处理的不同。这种需求可以使用模板的模板模式来实现。&lt;/p&gt;
&lt;h2 id=&#34;模板设计模式实现&#34;&gt;模板设计模式实现&lt;/h2&gt;
&lt;p&gt;模板模式就是由一个类来声明整个处理流程的步骤，具体的实现由各个实现类来进行实现。处理的流程不变，变是就是里面具体的实现。针对上面的支付回调，可以声明一个抽象类来声明具体的流程方法，代码如下：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;cn.imcompany.callback&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;java.util.Map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * Created by tomyli on 2018/6/21.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * Github: https://github.com/peng051410
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; */&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;abstract&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;PayCallback&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;abstract&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Map&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;getParam&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;abstract&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;boolean&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;checkParam&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Map&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;param&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;abstract&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;boolean&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;validSign&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;     * 定义了一个钩子方法来让子类控制流程实现
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;     * @return true：强制返回，false：不强制返回
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;     */&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;boolean&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;forceReturn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;doService&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Map&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;getParam&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;checkParam&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;param fail&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;validSign&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;sign fail&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;status&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;equals&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;success&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;forceReturn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;order fail&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;success&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在上面的PayCallback类中声明了getParam(获取参数)，checkParam（验证参数），validSign（验证签名），验证支付状态四个步骤，具体的支付回调类要来实现这里声明的方法即可。下面是一个微信支付的回调类的代码实现：&lt;/p&gt;</description>
    </item>
    <item>
      <title>设计模式学习之策略模式</title>
      <link>http://blog.imcompany.cn/post/she-ji-mo-shi-xue-xi-zhi-ce-lue-mo-shi/</link>
      <pubDate>Wed, 20 Jun 2018 07:04:56 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/she-ji-mo-shi-xue-xi-zhi-ce-lue-mo-shi/</guid>
      <description>&lt;h2 id=&#34;说明&#34;&gt;说明&lt;/h2&gt;
&lt;p&gt;策略模式是设计模式中使用频率很高的模式，主要的就是实现对行为的包装，达到结果的方式有多种，使用者可以选择任何一个方式来得到想要结果，在增加新的方式时更加的方便与灵活。它是为了适应算法的灵活性而产生的。&lt;/p&gt;
&lt;h2 id=&#34;策略模式实现&#34;&gt;策略模式实现&lt;/h2&gt;
&lt;p&gt;以常用的购物为例，一般情况下购物分为浏览商品，下单，支付。在支付时消费者可以选择多种不同的支付方式，如支付宝、微信、京东支付、银联支付等。在支付中流程就可以使用到策略模式，网站为用户提供了这些支付方式可供选择，用户只需要选择自己喜欢的支付方式来进行充值就可以得到商品了。在一般情况下都会定义一个抽象类来定义支付的一些行为，如金额，商品简介等信息。实现的抽象类如以下定义：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;cn.imcompany.pay&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * Created by tomyli on 2018/6/20.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * Github: https://github.com/peng051410
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; */&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;interface&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Payment&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;boolean&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;pay&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;param&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这样就定义了支付方式的行为，剩下的就由不同的支付方式来进行实现，比如支付宝支付、微信支付，示例代码如下：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;cn.imcompany.pay&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * Created by tomyli on 2018/6/20.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * Github: https://github.com/peng051410
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; */&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;AliPay&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;implements&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Payment&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Override&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;boolean&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;pay&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;param&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;out&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;AliPay&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;WechatPay&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;implements&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Payment&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Override&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;boolean&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;pay&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;param&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;out&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;WechatPay&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;要是再增加一种支付方式则可以实现Payment接口进行实现就可以了，一般情况下会有一个维护支付方式的常量类，由它来维护可用的支付方式。这个常量类的简化代码如下：&lt;/p&gt;</description>
    </item>
    <item>
      <title>设计模式学习之工厂模式</title>
      <link>http://blog.imcompany.cn/post/she-ji-mo-shi-xue-xi-zhi-gong-han-mo-shi/</link>
      <pubDate>Tue, 12 Jun 2018 21:33:40 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/she-ji-mo-shi-xue-xi-zhi-gong-han-mo-shi/</guid>
      <description>&lt;h2 id=&#34;说明&#34;&gt;说明&lt;/h2&gt;
&lt;p&gt;工厂设计模式是23种设计模式中使用频率非常高的，属于创建型模式。主要特点是实现了实体创建与使用的分离，达到了解耦的目的。工厂设计模式一般分为简单工厂、工厂方法、抽象工厂。&lt;/p&gt;
&lt;h2 id=&#34;前提准备&#34;&gt;前提准备&lt;/h2&gt;
&lt;p&gt;4年一界世界杯即将到来，啤酒厂商又要大嫌一笔。我们先准备好要生产的啤酒实体。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;cn.imcompany&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * Created by tomyli on 2018/5/27.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * Github: https://github.com/peng051410
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; */&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;interface&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Beer&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;getName&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;JinShiBai&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;implements&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Beer&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Override&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;getName&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;金士百&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;QingDao&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;implements&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Beer&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Override&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;getName&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;青岛&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;BaiWei&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;implements&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Beer&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Override&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;getName&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;百威&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在上面定义三种啤酒，它们都由抽象类Beer继承而来。下面使用简单工厂来给消费者提供啤酒。&lt;/p&gt;</description>
    </item>
    <item>
      <title>设计模式学习之原型模式</title>
      <link>http://blog.imcompany.cn/post/she-ji-mo-shi-xue-xi-zhi-yuan-xing-mo-shi/</link>
      <pubDate>Sat, 09 Jun 2018 17:12:41 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/she-ji-mo-shi-xue-xi-zhi-yuan-xing-mo-shi/</guid>
      <description>&lt;h2 id=&#34;特点&#34;&gt;特点&lt;/h2&gt;
&lt;p&gt;原型设计模式就是系统中产生的每一个对象都不相同，通过原型来创建新的对象，原型模式属于创建型模式。&lt;/p&gt;
&lt;h2 id=&#34;实现方式&#34;&gt;实现方式&lt;/h2&gt;
&lt;p&gt;一般情况可以通过对象克隆的方式来根据一个对象创建出来多个对象，每个对象在内存占用的内存地址都不一样。在JAVA中克隆又分为浅克隆与深克隆。&lt;/p&gt;
&lt;h3 id=&#34;浅克隆&#34;&gt;浅克隆&lt;/h3&gt;
&lt;p&gt;JAVA中是按值进行传递。实现克隆的方式就是实现Cloneable接口，这样就可以重写Object对象的clone方法来进行对象的克隆。代码如下：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * Created by tomyli on 2018/5/30.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * Github: https://github.com/peng051410
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; */&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Apple&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;implements&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Cloneable&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;double&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;weight&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Override&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;protected&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;clone&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;throws&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;CloneNotSupportedException&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;super&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;clone&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;测试代码如下：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;throws&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Exception&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Apple&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;apple&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Apple&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;apple&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;apple&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;apple&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;weight&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;23&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Apple&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;clone&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Apple&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;apple&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;clone&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;out&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;clone&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;apple&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;catch&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Exception&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;printStackTrace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;测试代码中clone与apple是两个完全不同的对象，这样就通过apple这个原型创建出来一个全新的对象。但是这里存在一个问题，现在Apple对象中只包含了值类型的成员变量，如果包含了其它对象会克隆也会成功吗？我们在Apple对象中增加一个Stone对象的集合，代码：&lt;/p&gt;</description>
    </item>
    <item>
      <title>设计模式学习之单例模式</title>
      <link>http://blog.imcompany.cn/post/she-ji-mo-shi-xue-xi-zhi-dan-li-mo-shi/</link>
      <pubDate>Tue, 05 Jun 2018 16:36:08 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/she-ji-mo-shi-xue-xi-zhi-dan-li-mo-shi/</guid>
      <description>&lt;h2 id=&#34;特点&#34;&gt;特点&lt;/h2&gt;
&lt;p&gt;单例模式就是确保在系统中只在一个实例提供功能。单例有好几种写法，主要有饿汉式、懒汉式、静态方法内部类、注册式单例。&lt;/p&gt;
&lt;h2 id=&#34;饿汉式&#34;&gt;饿汉式&lt;/h2&gt;
&lt;p&gt;饿汉式单例就是在类定义时就已经将实例进行了初始化，在系统调用时可以直接返回不需要再实例化。示例代码如下：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Hungry&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Hungry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;final&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Hungry&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;INSTANCE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Hungry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Hungry&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;getInstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;INSTANCE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;饿汉式的优点是提前进行初始化，线程安全。缺点是在系统未调用的情况下占用了内存空间，是以空间换取时间的样例&lt;/p&gt;
&lt;h2 id=&#34;懒汉式&#34;&gt;懒汉式&lt;/h2&gt;
&lt;p&gt;懒汉式就是在使用才对对象实例进行初始化，达到了延迟加载的目的。示例代码如下：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;LazyOne&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;LazyOne&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;LazyOne&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;instance&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;LazyOne&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;getInstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;instance&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;instance&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;LazyOne&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;instance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;懒式式优化点使用时实例化，延迟加载。缺点是存在线程安全问题&lt;/p&gt;</description>
    </item>
    <item>
      <title>Idea中vim键的映射</title>
      <link>http://blog.imcompany.cn/post/chang-yong-de-ideacha-jian/</link>
      <pubDate>Mon, 14 May 2018 14:48:33 +0800</pubDate>
      <guid>http://blog.imcompany.cn/post/chang-yong-de-ideacha-jian/</guid>
      <description>&lt;p&gt;Idea中IdeaVim插件可以让我们在Idea中使用vi的按键来进行操作，但是原生的配置只带有一些基本的移动操作。需要在~/.ideavimrc文件中进行Idea的动作映射来发挥它们的最大力量。&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Key&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;kj&lt;/td&gt;
					&lt;td&gt;&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;gt&lt;/td&gt;
					&lt;td&gt;VimBack&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;gT&lt;/td&gt;
					&lt;td&gt;VimForward&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;gd&lt;/td&gt;
					&lt;td&gt;GotoDeclaration&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;gf&lt;/td&gt;
					&lt;td&gt;GotoTypeDeclaration&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;gh&lt;/td&gt;
					&lt;td&gt;QuickJavaDoc&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;gs&lt;/td&gt;
					&lt;td&gt;GotoSymbol&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;gi&lt;/td&gt;
					&lt;td&gt;GotoImplementation&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;gu&lt;/td&gt;
					&lt;td&gt;FindUsages&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;gj&lt;/td&gt;
					&lt;td&gt;IntroduceVariable&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;leader w d&lt;/td&gt;
					&lt;td&gt;ActivateDatabaseToolWindow&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;leader &#39;&lt;/td&gt;
					&lt;td&gt;ActivateTerminalToolWindow&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;leader w r&lt;/td&gt;
					&lt;td&gt;ActivateRedisServersToolWindow&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;leader w m&lt;/td&gt;
					&lt;td&gt;ActivateMavenProjectsToolWindow&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;leader w a&lt;/td&gt;
					&lt;td&gt;HideActiveWindow&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;leader w w&lt;/td&gt;
					&lt;td&gt;HideAllWindows&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;leader w p&lt;/td&gt;
					&lt;td&gt;ActivateProjectToolWindow&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;leader w s&lt;/td&gt;
					&lt;td&gt;ActivateStructureToolWindow&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;leader w v&lt;/td&gt;
					&lt;td&gt;ActivateVersionControlToolWindow&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;leader w h&lt;/td&gt;
					&lt;td&gt;&lt;!-- raw HTML omitted --&gt;h  Go to left window&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;leader w l&lt;/td&gt;
					&lt;td&gt;&lt;!-- raw HTML omitted --&gt;l  Go to right window&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;leader w k&lt;/td&gt;
					&lt;td&gt;&lt;!-- raw HTML omitted --&gt;k  Go to window up&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;leader w j&lt;/td&gt;
					&lt;td&gt;&lt;!-- raw HTML omitted --&gt;j  Go to window down&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;leader w V&lt;/td&gt;
					&lt;td&gt;&lt;!-- raw HTML omitted --&gt;v  Split Window Vertically&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;leader w -&lt;/td&gt;
					&lt;td&gt;&lt;!-- raw HTML omitted --&gt;s  Split Winodw Horizontally&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;leader w c&lt;/td&gt;
					&lt;td&gt;&lt;!-- raw HTML omitted --&gt;c  Close current window&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;leader w o&lt;/td&gt;
					&lt;td&gt;&lt;!-- raw HTML omitted --&gt;o  Close all window except current&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;leader &lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
					&lt;td&gt;GotoAction&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;leader c c&lt;/td&gt;
					&lt;td&gt;GotoClass&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;leader c r&lt;/td&gt;
					&lt;td&gt;CopyReference&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;leader c p&lt;/td&gt;
					&lt;td&gt;CopyPaths&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;leader f f&lt;/td&gt;
					&lt;td&gt;GotoFile&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;leader f d&lt;/td&gt;
					&lt;td&gt;DashLauncherAction&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;leader b b&lt;/td&gt;
					&lt;td&gt;RecentFiles&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;leader b p&lt;/td&gt;
					&lt;td&gt;FileStructurePopup&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;leader b u&lt;/td&gt;
					&lt;td&gt;ReopenClosedTab&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;leader d d&lt;/td&gt;
					&lt;td&gt;Debug&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;leader d D&lt;/td&gt;
					&lt;td&gt;DebugClass&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;leader d j&lt;/td&gt;
					&lt;td&gt;JRebel&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;leader l l&lt;/td&gt;
					&lt;td&gt;EvaluateExpression&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;leader t t&lt;/td&gt;
					&lt;td&gt;ToggleLineBreakpoint&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;leader r r&lt;/td&gt;
					&lt;td&gt;Run&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;leader r R&lt;/td&gt;
					&lt;td&gt;RunClass&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;leader i m&lt;/td&gt;
					&lt;td&gt;ImplementMethods&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;leader e e&lt;/td&gt;
					&lt;td&gt;ShowErrorDescription&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;leader e n&lt;/td&gt;
					&lt;td&gt;GotoNextError&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;leader R&lt;/td&gt;
					&lt;td&gt;:source ~/.ideavimrc&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;leader g s&lt;/td&gt;
					&lt;td&gt;Vcs.QuickListPopupAction&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;leader r p&lt;/td&gt;
					&lt;td&gt;ReplaceInPath&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;zO&lt;/td&gt;
					&lt;td&gt;ExpandAllRegions&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;zo&lt;/td&gt;
					&lt;td&gt;ExpandRegion&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;zc&lt;/td&gt;
					&lt;td&gt;CollapseRegion&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;zC&lt;/td&gt;
					&lt;td&gt;CollapseAllRegions&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;fj&lt;/td&gt;
					&lt;td&gt;emacsIDEAs.AceJump&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;fw&lt;/td&gt;
					&lt;td&gt;emacsIDEAs.AceJumpWord&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;ff&lt;/td&gt;
					&lt;td&gt;CommentByLineComment&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;fb&lt;/td&gt;
					&lt;td&gt;CommentByBlockComment&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;gd&lt;/td&gt;
					&lt;td&gt;GotoDeclaration&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;gf&lt;/td&gt;
					&lt;td&gt;GotoTypeDeclaration&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;gh&lt;/td&gt;
					&lt;td&gt;QuickJavaDoc&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;gs&lt;/td&gt;
					&lt;td&gt;GotoSymbol&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;gi&lt;/td&gt;
					&lt;td&gt;GotoImplementation&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;gu&lt;/td&gt;
					&lt;td&gt;FindUsages&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;gj&lt;/td&gt;
					&lt;td&gt;IntroduceVariable&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;,,&lt;/td&gt;
					&lt;td&gt;ReformatCode&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;,r&lt;/td&gt;
					&lt;td&gt;RenameElement&lt;!-- raw HTML omitted --&gt;i&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
					&lt;td&gt;Back&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
					&lt;td&gt;Forward&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;leader R&lt;/td&gt;
					&lt;td&gt;reload ~/.ideavimrc&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;leader a l&lt;/td&gt;
					&lt;td&gt;:actionlist&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;leader g s&lt;/td&gt;
					&lt;td&gt;Vcs.QuickListPopupAction&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;leader s p&lt;/td&gt;
					&lt;td&gt;FindInPath&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;leader r p&lt;/td&gt;
					&lt;td&gt;ReplaceInPath&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;, c r&lt;/td&gt;
					&lt;td&gt;Revert change&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;, c t&lt;/td&gt;
					&lt;td&gt;Close other tab&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;</description>
    </item>
    <item>
      <title></title>
      <link>http://blog.imcompany.cn/post/2020-arts-015/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>http://blog.imcompany.cn/post/2020-arts-015/</guid>
      <description>&lt;p&gt;title = &amp;ldquo;2020-ARTS-打卡第十五天&amp;rdquo;
lastmod = 2026-01-26T15:43:06+08:00
tags = [&amp;ldquo;arts&amp;rdquo;, &amp;ldquo;java&amp;rdquo;, &amp;ldquo;leetcode&amp;rdquo;]
categories = [&amp;ldquo;arts&amp;rdquo;]
draft = false
author = &amp;ldquo;tomyli&amp;rdquo;
+++&lt;/p&gt;
&lt;h2 id=&#34;algorithm&#34;&gt;Algorithm&lt;/h2&gt;
&lt;h3 id=&#34;题目&#34;&gt;题目&lt;/h3&gt;
&lt;h4 id=&#34;题目描述&#34;&gt;题目描述&lt;/h4&gt;
&lt;p&gt;求一个数的N次幂&lt;/p&gt;
&lt;h4 id=&#34;题目解答&#34;&gt;题目解答&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;MyPow&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;double&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;doPow&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;double&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;||&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;long&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;double&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;while&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;res&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;review&#34;&gt;Review&lt;/h2&gt;
&lt;h2 id=&#34;tip&#34;&gt;Tip&lt;/h2&gt;
&lt;h2 id=&#34;share&#34;&gt;Share&lt;/h2&gt;</description>
    </item>
  </channel>
</rss>
