<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.9.0">Jekyll</generator><link href="https://blog.ismisv.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://blog.ismisv.com/" rel="alternate" type="text/html" /><updated>2025-11-21T03:55:10+00:00</updated><id>https://blog.ismisv.com/feed.xml</id><title type="html">挖井</title><subtitle>挖一口属于自己的井</subtitle><entry><title type="html">免费搭建域名邮箱，使用Cloudflare、Mailgun和Gmail</title><link href="https://blog.ismisv.com/2025/04/domain-mailbox-cloudflare-email-routing-mailgun-sending/" rel="alternate" type="text/html" title="免费搭建域名邮箱，使用Cloudflare、Mailgun和Gmail" /><published>2025-04-26T00:00:00+00:00</published><updated>2025-04-26T00:00:00+00:00</updated><id>https://blog.ismisv.com/2025/04/domain-mailbox-cloudflare-email-routing-mailgun-sending</id><content type="html" xml:base="https://blog.ismisv.com/2025/04/domain-mailbox-cloudflare-email-routing-mailgun-sending/">&lt;p&gt;以前QQ邮箱是支持域名邮箱的，不知从何时起就限制不让新增域名也不让新增邮箱地址了，相关业务全部被引导到腾讯企业邮箱上去了。但是要用腾讯企业邮箱就需要开通企业微信，开通企业微信要在腾讯申请创建企业，最后每次增一个邮箱地址，就要一个新的微信绑定和激活，实在是一笔不小的负担。而且我第一次这样走下来后，第二天我的主账号就不能登录了，人脸识别也不能通过，本来使用体验就不好，我只是想要域名邮箱，并不是真的要开公司，只能另外找解决方案了。&lt;/p&gt;

&lt;p&gt;之前就听说过Cloudflare的邮件路由功能，刚好我的域名本来就是在Cloudflare上托管的，随便看了一点资料很快就能上手，直接在域名页面左侧栏选&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Email Routing&lt;/code&gt;，添加邮箱地址比如&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;missdeer@dfordsoft.com&lt;/code&gt;，&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Action&lt;/code&gt;选&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Send to an email&lt;/code&gt;，&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Destination&lt;/code&gt;选目标邮箱比如我用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;missdeer@gmail.com&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://blogassets.ismisv.com/media/2025-04-26/email-routing.png&quot; alt=&quot;Email Routing&quot; /&gt;&lt;/p&gt;

&lt;p&gt;如果是第一次设置邮件路由，Cloudflare会提示要增加几条DNS解析记录，直接点鼠标就能加上，以后就不用管了。等几分钟后DNS解析记录生效，用其他邮箱给&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;missdeer@dfordsoft.com&lt;/code&gt;发邮箱试一下，一切正常的话在&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;missdeer@gmail.com&lt;/code&gt;里就能收到邮件。如此可以添加多个邮箱地址，全部转发到Gmail里，可以在Gmail里添加filter，根据不同的收件邮箱地址，打上不同的label进行分类管理。这样就搞定了域名邮箱收邮件的需求。&lt;/p&gt;

&lt;p&gt;然后是发邮件，点击Gmail页面右上角齿轮图标，再点击&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;See All Settings&lt;/code&gt;,&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://blogassets.ismisv.com/media/2025-04-26/gmail-all-settings.png&quot; alt=&quot;See All Settings&quot; /&gt;&lt;/p&gt;

&lt;p&gt;切到&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Accounts and Import&lt;/code&gt;页面，可以在&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Send mail as&lt;/code&gt;栏添加不同的邮箱地址：&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://blogassets.ismisv.com/media/2025-04-26/send-mail-as.png&quot; alt=&quot;Send mail as&quot; /&gt;&lt;/p&gt;

&lt;p&gt;添加显示名称和邮箱地址：&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://blogassets.ismisv.com/media/2025-04-26/name-info.png&quot; alt=&quot;mail name&quot; /&gt;&lt;/p&gt;

&lt;p&gt;再设置发送件的SMTP服务器：&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://blogassets.ismisv.com/media/2025-04-26/smtp-info.png&quot; alt=&quot;SMTP server&quot; /&gt;&lt;/p&gt;

&lt;p&gt;图省事的话可以直接用Gmail的SMTP服务(smtp.gmail.com:587)，用当前Gmail账号信息即可，但这样会有个问题，用新增的邮箱地址发送的邮件在接收方会显示类似于&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;missdeer@dfordsoft.com (由missdeer@gmail.com代发)&lt;/code&gt;这样的提示：&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://blogassets.ismisv.com/media/2025-04-26/unexpected-from-name.png&quot; alt=&quot;Unexpected from name&quot; /&gt;&lt;/p&gt;

&lt;p&gt;就会显得很不专业，我用域名邮箱的目的就是为了不让对方知道我其他邮箱的信息，不然我干脆直接全部用Gmail就行了。所以我用了Mailgun这个邮件发送服务，有免费额度，需求更大的话可以使用收费套餐。&lt;/p&gt;

&lt;p&gt;注册一个Mailgun账号，这时已经可以用之前设置好的域名邮箱了，比如&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;missdeer@dfordsoft.com&lt;/code&gt;，然后在后台管理页面左侧栏选&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SENDING&lt;/code&gt;-&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Domains&lt;/code&gt;添加域名&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dfordsoft.com&lt;/code&gt;：&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://blogassets.ismisv.com/media/2025-04-26/mailgun-add-domains.png&quot; alt=&quot;Mailgun SENDING Domains&quot; /&gt;&lt;/p&gt;

&lt;p&gt;这时Mailgun也会要求添加几个DNS解析记录，其中一条TXT记录是SPF验证信息，会与之前Cloudflare设置的重合，比如Cloudflare之前加了&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;v=spf1 include:_spf.mx.cloudflare.net ~all&lt;/code&gt;，而Mailgun要你加&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;v=spf1 include:mailgun.org ~all&lt;/code&gt;，这需要把两个记录合并成一个，即&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;v=spf1 include:_spf.mx.cloudflare.net  include:mailgun.org ~all&lt;/code&gt;。然后点右上角&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Verify&lt;/code&gt;按钮，等记录状态变成&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Active&lt;/code&gt;了，就可以用默认邮箱地址&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;postmaster@dfordsoft.com&lt;/code&gt;进行发邮件验证了。Mailgun会提供2种方式，一种是常见的SMTP协议，另一种是HTTP接口调用发邮件，一切正常的话，使用支持这些协议的软件应该就可以发邮件，对方收邮件了。然后添加新的邮箱地址比如&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;missdeer@dfordsoft.com&lt;/code&gt;，并设置密码，Mailgun支持自动生成和手动设置2种方式，按自己喜好任选其中一种即可：&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://blogassets.ismisv.com/media/2025-04-26/mailgun-smtp-credentials.png&quot; alt=&quot;SMTP Credentials&quot; /&gt;&lt;/p&gt;

&lt;p&gt;最后就是回到Gmail设置页面，把Mailgun的SMTP服务器地址填进去，用户名密码就是上一步设置的邮箱地址和密码。现在再用Gmail以域名邮箱发送邮件，收件方就不会再看到&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;missdeer@gmail.com&lt;/code&gt;这个地址了：&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://blogassets.ismisv.com/media/2025-04-26/expected-from-name.png&quot; alt=&quot;Expected from name&quot; /&gt;&lt;/p&gt;

&lt;p&gt;整个过程就是这样，Cloudflare和Mailgun都有免费额度，轻度使用绰绰有余。&lt;/p&gt;</content><author><name>missdeer</name></author><category term="Cloudflare" /><category term="Mailgun" /><category term="Gmail" /><category term="EmailRouting" /><summary type="html">以前QQ邮箱是支持域名邮箱的，不知从何时起就限制不让新增域名也不让新增邮箱地址了，相关业务全部被引导到腾讯企业邮箱上去了。但是要用腾讯企业邮箱就需要开通企业微信，开通企业微信要在腾讯申请创建企业，最后每次增一个邮箱地址，就要一个新的微信绑定和激活，实在是一笔不小的负担。而且我第一次这样走下来后，第二天我的主账号就不能登录了，人脸识别也不能通过，本来使用体验就不好，我只是想要域名邮箱，并不是真的要开公司，只能另外找解决方案了。</summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://sendgrid.com/content/dam/sendgrid/legacy/2022/04/Untitled-design-2022-06-14T105831.696.png" /></entry><entry><title type="html">被优化了</title><link href="https://blog.ismisv.com/2025/01/be-optimized/" rel="alternate" type="text/html" title="被优化了" /><published>2025-01-03T00:00:00+00:00</published><updated>2025-01-03T00:00:00+00:00</updated><id>https://blog.ismisv.com/2025/01/be-optimized</id><content type="html" xml:base="https://blog.ismisv.com/2025/01/be-optimized/">&lt;p&gt;人到中年，终于轮到我了。&lt;/p&gt;

&lt;p&gt;2020年底，也是公司传出风声要裁员，我心知肚明自己是不被领导喜欢的那个，担心那个名额落到我头上，于是匆匆忙忙在外面找了个工作跳槽了，而且领域跨度非常大，进了一个&lt;a href=&quot;https://blog.ismisv.com/2020/12/996/&quot;&gt;末日行业&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;那个公司原来是呆着感觉不错的，算是个创业公司，因为研发总监的看重，技术上相关的东西基本可以由我来做决策，也做出了一些成果。不过1年多后，开始大股东破产、工资延迟发放，加上有个平级的人越级背后打小报告，把我气得够呛，原本一直向着我的研发总监也顶不住上头的压力，要求我晚上加班，当天晚上我就在微信上找到原来聊过的G厂人事，马上联系面试入职。入职过程非常顺利，还以为可以如鱼得水了，事实是我人到中年了，依然太天真了。&lt;/p&gt;

&lt;p&gt;在G厂两年半的时间内，工作强度出奇的大，而且工作内容非常枯燥乏味，身体彻底搞垮了，连无偿献血的检测指标都不能通过了。所做的产品技术路线就很失败，是个非常奇怪的缝合怪，下面的人干得累死，客户不愿意买单，当然这跟当前行业整体环境恶劣也有很大关系。第一年年终，打了6.4折，第2年年终打了4.5折，系数这么低，和部门业绩低有关，和个人职级高有关，还和个人绩效不好有关，这个行业对我来说真是太不友好了。协商补偿的时候说有2个方案，其中1个方案是等几个月后和集团一起结算年终，我一想这还不知道会打个几折呢，就选了个固定数字的方案，落袋为安。补充说一句，上家公司做的是BIM设计软件，在这家公司做的是施工建模和算量软件，在房地产行业如此没落的今天，生意真的很难做，何况是能不为客户带来太多收益且难用的软件。&lt;/p&gt;

&lt;p&gt;这次被裁，其实我没有任何心理准备，只不过自己也一直想着要辞职，真是太累了，干不动了，一身的病痛。但是我一直想的是骑驴找马有另一个稳定的收入渠道后再辞职，这次就打得我有点措手不及。而且这个年纪真不好再找工作了，就业环境太差了。我得好好想想接下去的路该怎么走。&lt;/p&gt;</content><author><name>missdeer</name></author><category term="Job" /><summary type="html">人到中年，终于轮到我了。</summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://framerusercontent.com/images/o6ItmU6HixalSmcXYtAYxlCuIgs.png" /></entry><entry><title type="html">C++ Builder12.1试用体验</title><link href="https://blog.ismisv.com/2024/07/try-cpp-builder12.1/" rel="alternate" type="text/html" title="C++ Builder12.1试用体验" /><published>2024-07-14T00:00:00+00:00</published><updated>2024-07-14T00:00:00+00:00</updated><id>https://blog.ismisv.com/2024/07/try-cpp-builder12.1</id><content type="html" xml:base="https://blog.ismisv.com/2024/07/try-cpp-builder12.1/">&lt;p&gt;这几天突然又想试试C++ Builder，现在最新的版本是12.1。曾在大学时使用C++ Builder 6写过一些小程序，这么多年过去，源代码丢掉了一些，还能找到一些。用12.1是不能直接打开6.0的工程文件的，需要新建VCL工程，再把窗体文件、源代码文件和头文件添加进去，才能编译。12.1的VCL整体上变化不大，主要是字符串类变成了UnicodeString，以前的C++ Builder和Delphi在字符编码方面的支持确实是一大弱项，项目代码拷过来后，主要就是字符串部分需要修改一下。&lt;/p&gt;

&lt;p&gt;6.0的时候编译器就是Borland经典C++编译器，曾经是能与微软扳手腕的存在，12.1中虽然仍然保留了这个经典编译器，但已经不推荐用了，它只能生成32位代码，而且对C++新标准的支持也没跟上，C++ Builder几经易手，后来基于Clang 5这个版本魔改实现了对VCL的支持，以及跨平台目录代码编译的支持，不但能生成Windows可执行代码，还能生成Android，Linux，iOS，macOS的可执行代码，而且Windows平台上还同时支持生成32位和64位代码，都是得益于Clang这个编译器。12.1版本在Windows平台上共有3套编译器，分别是经典32位编译器bcc32，基于Clang 5的32位编译器bcc32c/bcc32x和64位编译器bcc64，以及基于Clang 15的64位现代（modern）编译器bcc64x。&lt;/p&gt;

&lt;p&gt;具体使用哪套编译器，要根据自己的实际需求来考虑。一般说来32位编译器生成的可执行文件比64位的文件体积小很多，但64位的程序可以使用更大的内存以及更宽的处理位宽带来的更快的运行速度。所以我觉得如果要编译32位程序，则使用基于Clang 5的编译器，如果要编译64位程序，则使用基于Clang 15的现代编译器。有个需要注意的是，64位现代编译器刚上市，有不少小问题，比如不能动态链接VCL的运行时DLL和BPL，默认会把调试符号打进exe文件导致文件体积暴增（可在链接命令行中增加&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-pdb nul.pdb&lt;/code&gt;规避），暂时不支持CMake构建，编译速度慢等等。&lt;/p&gt;

&lt;p&gt;C++ Builder 12.1还集成了MSVS上的强力辅助插件&lt;a href=&quot;https://www.wholetomato.com/&quot;&gt;Visual Assist X&lt;/a&gt;，我也是这才发现原来小番茄不知道什么时候已经被Embarcadero收购了。曾经C++ Builder 6上的自动完成非常快且可靠，自那以后慢慢就废掉了。现在集成了小番茄倒是有所改善，但还是很容易就不工作了，需要在工具菜单上选择清理VA缓存，再重启BDS，重建VA索引，才能重新工作。&lt;/p&gt;

&lt;p&gt;总体上，写一些简单UI的Windows程序使用C++ Builder还是很方便的，可以生成体积较小的本地代码，但是这个IDE本身质量方面比较差，勉强用用还可以。真是怀念Borland时代的产品啊。&lt;/p&gt;</content><author><name>missdeer</name></author><category term="C++" /><category term="software" /><summary type="html">这几天突然又想试试C++ Builder，现在最新的版本是12.1。曾在大学时使用C++ Builder 6写过一些小程序，这么多年过去，源代码丢掉了一些，还能找到一些。用12.1是不能直接打开6.0的工程文件的，需要新建VCL工程，再把窗体文件、源代码文件和头文件添加进去，才能编译。12.1的VCL整体上变化不大，主要是字符串类变成了UnicodeString，以前的C++ Builder和Delphi在字符编码方面的支持确实是一大弱项，项目代码拷过来后，主要就是字符串部分需要修改一下。</summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogassets.ismisv.com/media/2024-07-14/bds.jpg" /></entry><entry><title type="html">Windows平台使调试器在子进程启动时attach</title><link href="https://blog.ismisv.com/2024/06/attach-child-process-at-startup-on-windows/" rel="alternate" type="text/html" title="Windows平台使调试器在子进程启动时attach" /><published>2024-06-16T00:00:00+00:00</published><updated>2024-06-16T00:00:00+00:00</updated><id>https://blog.ismisv.com/2024/06/attach-child-process-at-startup-on-windows</id><content type="html" xml:base="https://blog.ismisv.com/2024/06/attach-child-process-at-startup-on-windows/">&lt;p&gt;因为程序使用了多进程的架构，有时候需要在子进程被启动后非常早的阶段就进行调试，比较常见的极端情况是要调试子进程的&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main()&lt;/code&gt;函数，MSVS上有&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=vsdbgplat.MicrosoftChildProcessDebuggingPowerTool&quot;&gt;插件&lt;/a&gt;可以在同一个调试环境同时挂载父进程和子进程进行调试，WinDBG在启动被调试程序时自带选项支持同时调试父子进程，但就我使用下来的体验发现，这时调试器的性能会变得非常差，非常影响心情和调试效果。也有比较low的办法，就是在子进程的&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main()&lt;/code&gt;函数开头加一个&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MessageBox&lt;/code&gt;，使其启动后用户有机会使用调试器attach子进程进行调试，但要改代码终归麻烦了点，而且不是所有程序都适合加&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MessageBox&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;其实Windows系统提供了相应的机制可以应付这种需求，根据&lt;a href=&quot;https://learn.microsoft.com/en-us/archive/blogs/greggm/inside-image-file-execution-options-debugging#using-image-file-execution-options-with-vs-2005&quot;&gt;这篇文章&lt;/a&gt;和&lt;a href=&quot;https://learn.microsoft.com/en-us/visualstudio/debugger/debug-using-the-just-in-time-debugger?view=vs-2022#jit_errors&quot;&gt;这篇文章&lt;/a&gt;的说明，只要简单的改一下注册表，当Windows系统要启动某个可执行文件（即调用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CreateProcess&lt;/code&gt; API）时，会检查注册表中是否有该可执行文件的项，如果有，则取得该项下的&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Debugger&lt;/code&gt;键值作为此次真正被启动的程序，同时将前面的可执行文件及命令行参数一起作为参数传递给该Debugger程序，由该Debugger程序负责启动并调试真正需要被调试的程序。&lt;/p&gt;

&lt;p&gt;可以使用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vsjitdebugger.exe&lt;/code&gt;程序调起MSVS进程调试，所以写一个简单的批处理文件修改注册表：&lt;/p&gt;

&lt;div class=&quot;language-powershell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;@cd/d&lt;span class=&quot;s2&quot;&gt;&quot;%~dp0&quot;&lt;/span&gt;&amp;amp;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;cacls &lt;span class=&quot;s2&quot;&gt;&quot;%SystemDrive%\System Volume Information&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;nul 2&amp;gt;nul&lt;span class=&quot;o&quot;&gt;)||(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;start&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&quot;&lt;/span&gt; mshta vbscript:CreateObject^&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Shell.Application&quot;&lt;/span&gt;^&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;.ShellExecute^&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;%~nx0&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot; %*&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;runas&quot;&lt;/span&gt;,1^&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;^&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;window.close^&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&amp;amp;exit /b&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
@echo off
&lt;span class=&quot;nb&quot;&gt;set &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;EXENAME&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;GFYProStartupCadIdentifier.exe
reg add &lt;span class=&quot;s2&quot;&gt;&quot;HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\%EXENAME%&quot;&lt;/span&gt; /v Debugger /t REG_SZ /d vsjitdebugger.exe /f
reg add &lt;span class=&quot;s2&quot;&gt;&quot;HKLM\Software\WOW6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug&quot;&lt;/span&gt; /v Auto /t REG_DWORD /d 1 /f
@echo on
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;第一行是让本批处理文件以管理员权限运行。&lt;/p&gt;

&lt;p&gt;第二行是取消控制台命令行回显。&lt;/p&gt;

&lt;p&gt;第三行是设置要被调试的子进程可执行文件名，可以按自己需要修改为其他文件名。&lt;/p&gt;

&lt;p&gt;第四行设置使用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vsjitdebugger.exe&lt;/code&gt;进行调试。&lt;/p&gt;

&lt;p&gt;第五行是为了规避某些情况&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vsjitdebugger.exe&lt;/code&gt;起不来子进程的问题，&lt;a href=&quot;https://learn.microsoft.com/en-us/visualstudio/debugger/debug-using-the-just-in-time-debugger?view=vs-2022#jit_errors&quot;&gt;这篇文章&lt;/a&gt;有说明。&lt;/p&gt;

&lt;p&gt;第六行是恢复第二行被关闭的回显。第二行和第六行并不是必须的，只是个人习惯。&lt;/p&gt;

&lt;p&gt;执行完该批处理文件后，就每当&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GFYProStartupCadIdentifier.exe&lt;/code&gt;程序要被启动时就会自动启动&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vsjitdebugger.exe&lt;/code&gt;，可以先在MSVS中打开该程序的源代码解决方案，在需要的地方打好断点，如果一切正常的话，&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vsjitdebugger.exe&lt;/code&gt;会显示这样的对话框用于选择MSVS会话进行调试：&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://blogassets.ismisv.com/media/2024-06-16/choose-debugger.png&quot; alt=&quot;选择调试器&quot; /&gt;&lt;/p&gt;

&lt;p&gt;选择相应的MSVS会话后，就会显示MSVS主窗口，如下：
&lt;img src=&quot;https://blogassets.ismisv.com/media/2024-06-16/start-debugging.png&quot; alt=&quot;MSVS主窗口&quot; /&gt;&lt;/p&gt;

&lt;p&gt;点击“继续”按钮，就会从程序的起始点开始运行了，我们就可以开心地进行调试了。&lt;/p&gt;

&lt;p&gt;如果不想再每次启动该程序就被自动调起调试器，就要把前面修改的注册表项还原回去，同样写个批处理文件双击执行一下即可：&lt;/p&gt;

&lt;div class=&quot;language-powershell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;@cd/d&lt;span class=&quot;s2&quot;&gt;&quot;%~dp0&quot;&lt;/span&gt;&amp;amp;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;cacls &lt;span class=&quot;s2&quot;&gt;&quot;%SystemDrive%\System Volume Information&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;nul 2&amp;gt;nul&lt;span class=&quot;o&quot;&gt;)||(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;start&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&quot;&lt;/span&gt; mshta vbscript:CreateObject^&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Shell.Application&quot;&lt;/span&gt;^&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;.ShellExecute^&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;%~nx0&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot; %*&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;runas&quot;&lt;/span&gt;,1^&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;^&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;window.close^&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&amp;amp;exit /b&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
@echo off
&lt;span class=&quot;nb&quot;&gt;set &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;EXENAME&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;GFYProStartupCadIdentifier.exe
reg delete &lt;span class=&quot;s2&quot;&gt;&quot;HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\%EXENAME%&quot;&lt;/span&gt; /f
reg delete &lt;span class=&quot;s2&quot;&gt;&quot;HKLM\Software\WOW6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug&quot;&lt;/span&gt; /v Auto /f
@echo on
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</content><author><name>missdeer</name></author><category term="Windows" /><category term="coding" /><category term="debugging" /><summary type="html">因为程序使用了多进程的架构，有时候需要在子进程被启动后非常早的阶段就进行调试，比较常见的极端情况是要调试子进程的main()函数，MSVS上有插件可以在同一个调试环境同时挂载父进程和子进程进行调试，WinDBG在启动被调试程序时自带选项支持同时调试父子进程，但就我使用下来的体验发现，这时调试器的性能会变得非常差，非常影响心情和调试效果。也有比较low的办法，就是在子进程的main()函数开头加一个MessageBox，使其启动后用户有机会使用调试器attach子进程进行调试，但要改代码终归麻烦了点，而且不是所有程序都适合加MessageBox。</summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogassets.ismisv.com/media/2024-06-16/debugger.png" /></entry><entry><title type="html">更新FreeBSD、NetBSD、OpenBSD、DragonflyBSD</title><link href="https://blog.ismisv.com/2024/04/update-bsd/" rel="alternate" type="text/html" title="更新FreeBSD、NetBSD、OpenBSD、DragonflyBSD" /><published>2024-04-14T00:00:00+00:00</published><updated>2024-04-14T00:00:00+00:00</updated><id>https://blog.ismisv.com/2024/04/update-bsd</id><content type="html" xml:base="https://blog.ismisv.com/2024/04/update-bsd/">&lt;p&gt;之前在PVE上装了几个BSD系统后，也没怎么用，就时不时更新一下，各个BSD有各自的更新方式，这里简单记一下。&lt;/p&gt;

&lt;p&gt;更新都是在root下进行，或在命令前加&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sudo&lt;/code&gt;。系统更新尽量在控制台进行，不要通过&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ssh&lt;/code&gt;远程登录执行，因为&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ssh&lt;/code&gt;进程很可能会在更新过程中被干掉。&lt;/p&gt;

&lt;h1 id=&quot;freebsd&quot;&gt;FreeBSD&lt;/h1&gt;

&lt;h2 id=&quot;更新系统&quot;&gt;更新系统&lt;/h2&gt;

&lt;h3 id=&quot;更新补丁&quot;&gt;更新补丁&lt;/h3&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;freebsd-update fetch &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;更新大版本&quot;&gt;更新大版本&lt;/h3&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;freebsd-update &lt;span class=&quot;nt&quot;&gt;-r&lt;/span&gt; 14.0-RELEASE upgrade
freebsd-update &lt;span class=&quot;nb&quot;&gt;install
&lt;/span&gt;reboot
freebsd-update &lt;span class=&quot;nb&quot;&gt;install
&lt;/span&gt;pkg-static &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; pkg
pkg update
pkg upgrade
/usr/sbin/freebsd-update &lt;span class=&quot;nb&quot;&gt;install
&lt;/span&gt;reboot
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;更新预编译包&quot;&gt;更新预编译包&lt;/h2&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;pkg update &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; pkg upgrade
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;修改包镜像源&quot;&gt;修改包镜像源&lt;/h2&gt;

&lt;p&gt;修改文件&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/usr/local/etc/pkg/repos/FreeBSD.conf&lt;/code&gt;。&lt;/p&gt;

&lt;h1 id=&quot;netbsd&quot;&gt;NetBSD&lt;/h1&gt;

&lt;h2 id=&quot;更新系统-1&quot;&gt;更新系统&lt;/h2&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;sysupgrade auto ftp://ftp.netbsd.org/pub/NetBSD/NetBSD-10.0/amd64
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;更新预编译包-1&quot;&gt;更新预编译包&lt;/h2&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;pkgin update &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; pkgin upgrade
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;修改包镜像源-1&quot;&gt;修改包镜像源&lt;/h2&gt;

&lt;p&gt;修改文件&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/usr/pkg/etc/pkgin/repositories.conf&lt;/code&gt;。&lt;/p&gt;

&lt;h1 id=&quot;openbsd&quot;&gt;OpenBSD&lt;/h1&gt;

&lt;h2 id=&quot;更新系统-2&quot;&gt;更新系统&lt;/h2&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;sysupgrade auto https://ftp.usa.openbsd.org/pub/OpenBSD/7.5/amd64
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;更新预编译包-2&quot;&gt;更新预编译包&lt;/h2&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;pkg_add &lt;span class=&quot;nt&quot;&gt;-iuv&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;修改包镜像源-2&quot;&gt;修改包镜像源&lt;/h2&gt;

&lt;p&gt;修改文件&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/etc/installurl&lt;/code&gt;。&lt;/p&gt;

&lt;h1 id=&quot;dragonflybsd&quot;&gt;DragonflyBSD&lt;/h1&gt;

&lt;h2 id=&quot;更新系统-3&quot;&gt;更新系统&lt;/h2&gt;

&lt;p&gt;看&lt;a href=&quot;https://www.dragonflybsd.org/docs/handbook/Upgrading/&quot;&gt;官方文档&lt;/a&gt;，需要自己下载源代码，编译，安装，再重启。&lt;/p&gt;

&lt;h2 id=&quot;更新预编译包-3&quot;&gt;更新预编译包&lt;/h2&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;pkg update &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; pkg upgrade
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;修改包镜像源-3&quot;&gt;修改包镜像源&lt;/h2&gt;

&lt;p&gt;修改文件&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/usr/local/etc/pkg/repos/df-latest.conf&lt;/code&gt;。&lt;/p&gt;</content><author><name>missdeer</name></author><category term="BSD" /><category term="FreeBSD" /><category term="NetBSD" /><category term="OpenBSD" /><category term="DragonflyBSD" /><summary type="html">之前在PVE上装了几个BSD系统后，也没怎么用，就时不时更新一下，各个BSD有各自的更新方式，这里简单记一下。</summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogassets.ismisv.com/media/2024-04-14/system-upgrades.jpg" /></entry><entry><title type="html">湖州龙之梦乐园跨年</title><link href="https://blog.ismisv.com/2024/01/hu-zhou-long-zhi-meng-le-yuan-trip/" rel="alternate" type="text/html" title="湖州龙之梦乐园跨年" /><published>2024-01-01T00:00:00+00:00</published><updated>2024-01-01T00:00:00+00:00</updated><id>https://blog.ismisv.com/2024/01/hu-zhou-long-zhi-meng-le-yuan-trip</id><content type="html" xml:base="https://blog.ismisv.com/2024/01/hu-zhou-long-zhi-meng-le-yuan-trip/">&lt;p&gt;节假日不用回老家真是太好了，29号晚上才决定去湖州龙之梦乐园玩一下，在网上团了酒店房间，虽然网上都说那边商业化很严重，似乎评价不高的样子，但总归要自己去过才知道到底行不行，反正离得不远，自驾1个半小时就行了。&lt;/p&gt;

&lt;h1 id=&quot;住&quot;&gt;住&lt;/h1&gt;

&lt;p&gt;我们订了瑞峰国际大酒店的大床房，面朝太湖古镇的那一边房间要比另一边面朝大山的房间贵100块钱一天，主要是可以晚上直接在阳台上观赏烟花表演，但我们没选，因为可以很方便地在酒店外的地面上观看。&lt;/p&gt;

&lt;h1 id=&quot;行&quot;&gt;行&lt;/h1&gt;

&lt;p&gt;无论是打车还是公交，都比较方便，公交大多2元随便坐，也可以自己开车，就会有找停车位的麻烦，另外就是晚上水秀和烟花秀时段，太湖古镇那一路段会交通管制，要等9点半表演结束后才放开，那时乌泱泱的人和车，最好避开这个时段。&lt;/p&gt;

&lt;p&gt;值得吐槽的是，在一些明显需要红绿灯的地方，只有斑马线，没有红绿灯，而那边的车辆基本不会停下礼让行人，反而开得飞快，生怕行人挡了他们的路似的。&lt;/p&gt;

&lt;p&gt;有一次我在斑马线上等了好几分钟，直到有2辆私家车主动减速停在斑马线前，我老婆看了一眼说：“果然是沪牌。”&lt;/p&gt;

&lt;p&gt;再后来又一次过斑马线，趁着车流量较大，车速不快，我们强行穿过斑马线，我老婆看了一眼停下的车说：“像这些牌的就只能被动逼停。”&lt;/p&gt;

&lt;p&gt;感觉到了浓浓的地域歧视，哈哈。&lt;/p&gt;

&lt;h1 id=&quot;吃&quot;&gt;吃&lt;/h1&gt;

&lt;p&gt;非常不好，一则是没找到好吃的，别说堂食了，外卖都没什么好吃的，晚上居然看到不少人排队在酒店一楼的超市买泡面。二则是很贵，无论是连锁的肯德基、必胜客，还是小馆子，价格都比其他地方贵不少。如果想吃得好点可以跑到湖州市区去，比如吾悦广场，大概10公里左右。感觉这点是这个度假区最大的败笔，如果让我说一个不想再去第二次的理由，或者劝阻别人去那里的理由，我就说这点。&lt;/p&gt;

&lt;h1 id=&quot;游&quot;&gt;游&lt;/h1&gt;

&lt;p&gt;我只去了动物园，排队一个多小时坐了小火车，花了120块钱买了投喂动物的食物，反正我挺反感这点的，感觉就是拿捏住小孩家长的命脉使劲薅羊毛，还那么贵，诛心点说，怪不得越来越多的人不想生小孩了。&lt;/p&gt;

&lt;h1 id=&quot;演&quot;&gt;演&lt;/h1&gt;

&lt;p&gt;看了大马戏，还是挺精彩的，或者说紧张刺激的，但我看那些高空杂技表演的时候一直心惊胆战的。期间有熊出来表演，旁边一些人在那说“好可爱”，我就联想到前些天在网上看到日本熊吃人的新闻，总归心里不大舒服。&lt;/p&gt;

&lt;p&gt;两天晚上都看了喷泉表演，感觉还不如上海爱琴海购物公园门口的喷泉表演呢。&lt;/p&gt;

&lt;p&gt;烟花表演倒还不错，就是时间短了点，几十架航拍的无人机在头顶闪着灯，别有一番趣味。&lt;/p&gt;</content><author><name>missdeer</name></author><category term="trip" /><summary type="html">节假日不用回老家真是太好了，29号晚上才决定去湖州龙之梦乐园玩一下，在网上团了酒店房间，虽然网上都说那边商业化很严重，似乎评价不高的样子，但总归要自己去过才知道到底行不行，反正离得不远，自驾1个半小时就行了。</summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogassets.ismisv.com/media/2024-01-01/fireworks.jpg" /></entry><entry><title type="html">修改DNS去广告</title><link href="https://blog.ismisv.com/2023/08/dns-block-ads/" rel="alternate" type="text/html" title="修改DNS去广告" /><published>2023-08-01T00:00:00+00:00</published><updated>2023-08-01T00:00:00+00:00</updated><id>https://blog.ismisv.com/2023/08/dns-block-ads</id><content type="html" xml:base="https://blog.ismisv.com/2023/08/dns-block-ads/">&lt;p&gt;以前也尝试过在DNS上做手脚拦截广告，但因为误杀太多以及漏网之鱼太多，觉得还不如不折腾呢。&lt;/p&gt;

&lt;p&gt;最近偶然发现了&lt;a href=&quot;https://github.com/missdeer/blocklist&quot;&gt;一组列表&lt;/a&gt;，又尝试了一番，发现效果挺不错的，手机开屏广告绝大多数不见，浏览网页时Google Ads也基本没有了，真是让我喜出望外。所以以前效果不好的原因只是因为使用的黑名单列表不好而已。&lt;/p&gt;

&lt;p&gt;我是在路由器上的&lt;a href=&quot;https://github.com/missdeer/coredns_custom_build&quot;&gt;CoreDNS&lt;/a&gt;使用&lt;a href=&quot;https://github.com/missdeer/ads&quot;&gt;ads&lt;/a&gt;插件设置拦截的，所有接入的设备都可以享受到这个效果。用到3组黑名单源，分别是&lt;a href=&quot;https://anti-ad.net&quot;&gt;Anti-ad&lt;/a&gt;，&lt;a href=&quot;https://github.com/AdguardTeam&quot;&gt;AdGuard&lt;/a&gt;和&lt;a href=&quot;https://github.com/easylist/easylist/&quot;&gt;EasyList&lt;/a&gt;，然后自己写了点代码将列表规整了一下，转成&lt;a href=&quot;https://github.com/missdeer/blocklist&quot;&gt;hosts文件的格式&lt;/a&gt;后合并为一个文件，&lt;a href=&quot;https://github.com/missdeer/ads&quot;&gt;ads&lt;/a&gt;插件可以直接通过http协议加载hosts格式的文件。CoreDNS的配置文件增加ads就行了：&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;err&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;blocklist&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;domains&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;txt&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;ads&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;blacklist&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;https&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;//cdn.jsdelivr.net/gh/missdeer/blocklist@master/convert/alldomains.txt&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;nxdomain&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</content><author><name>missdeer</name></author><category term="DNS" /><category term="CoreDNS" /><summary type="html">以前也尝试过在DNS上做手脚拦截广告，但因为误杀太多以及漏网之鱼太多，觉得还不如不折腾呢。</summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogassets.ismisv.com/media/2023-08-01/noads.png" /></entry><entry><title type="html">Debian上使用Nginx搭建WebDav服务要点</title><link href="https://blog.ismisv.com/2023/07/debian-nginx-webdav-tips/" rel="alternate" type="text/html" title="Debian上使用Nginx搭建WebDav服务要点" /><published>2023-07-18T00:00:00+00:00</published><updated>2023-07-18T00:00:00+00:00</updated><id>https://blog.ismisv.com/2023/07/debian-nginx-webdav-tips</id><content type="html" xml:base="https://blog.ismisv.com/2023/07/debian-nginx-webdav-tips/">&lt;p&gt;要点：&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;不要用Nginx官方的源，而是用Debian的源安装Nginx&lt;/li&gt;
  &lt;li&gt;一键安装Nginx及扩展：&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sudo aptitude -y install nginx-full nginx-extras libnginx-mod-http-dav-ext libnginx-mod-http-auth-pam&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;配置要给zone分配内存：&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dav_ext_lock_zone zone=webdav:10m;&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;最容易出问题的就是以上3点，其他配置从网上抄一下就行，大体如下：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-txt&quot;&gt;location / {
    root /home/missdeer/;
    dav_methods PUT DELETE MKCOL COPY MOVE;
    dav_ext_methods PROPFIND OPTIONS LOCK UNLOCK;
    dav_access user:rw group:rw all:rw;
    dav_ext_lock zone=webdav;

    client_max_body_size 102400M;
    create_full_put_path on;
    client_body_temp_path /tmp/;

    set $dest $http_destination;
    if (-d $request_filename) {
        rewrite ^(.*[^/])$ $1/;
        set $dest $dest/;
    }

    if ($request_method ~ (MOVE|COPY)) {
        more_set_input_headers 'Destination: $dest';
    }

    if ($request_method ~ MKCOL) {
        rewrite ^(.*[^/])$ $1/ break;
    }

    auth_pam &quot;Restricted&quot;;
    auth_pam_service_name &quot;common-auth&quot;;

    index index.html index.htm index.php admin.php;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;最后启用Nginx：&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sudo systemctl restart nginx&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;如果起不来，先看一下配置文件是否有问题：&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sudo /sbin/nginx -t&lt;/code&gt;。&lt;/p&gt;</content><author><name>missdeer</name></author><category term="Debian" /><category term="Nginx" /><category term="WebDav" /><summary type="html">要点：</summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogassets.ismisv.com/media/2023-07-18/debian-nginx-webdav.png" /></entry><entry><title type="html">武夷山之旅</title><link href="https://blog.ismisv.com/2023/06/wuyishan-trip/" rel="alternate" type="text/html" title="武夷山之旅" /><published>2023-06-24T00:00:00+00:00</published><updated>2023-06-24T00:00:00+00:00</updated><id>https://blog.ismisv.com/2023/06/wuyishan-trip</id><content type="html" xml:base="https://blog.ismisv.com/2023/06/wuyishan-trip/">&lt;p&gt;端午节最终决定去武夷山游玩，对旅游这块确实既没多大兴趣，更没什么经验，都是老婆一手操办下来的。这个决定做的比较晚，导致买高铁票都是老婆花了不少日子靠在app上抢来，好在总体而言还算顺利，叫上两边的老人一起，浩浩荡荡7个人。&lt;/p&gt;

&lt;h2 id=&quot;住&quot;&gt;住&lt;/h2&gt;

&lt;p&gt;住宿是在一个叫一同山居的民墅，环境和服务都感觉不错，还可以提前让他们帮忙订《印象大红袍》的门票，可以讲价，当然羊毛出在羊身上，毕竟还有大头房费呢，看怎么谈更划算。高铁坐到南平市站，然后转K1线公交车到茶博园站下车。周围很多类似的民墅，和酒店的经营方式非常相似，有前台，有自己的停车场，有电梯，有自己的餐厅提供早餐，当然还有当地特色的茶厅，可以自己泡茶。价格不是很贵，估计是受疫情影响生意比以前差了，反正在这3天里我只见过另两个客人。&lt;/p&gt;

&lt;h2 id=&quot;吃&quot;&gt;吃&lt;/h2&gt;

&lt;p&gt;22号中饭是在茶人村吃的，环境挺好的，菜的口味也还好，份量也大。晚饭则是在五小厨，环境就比较一般，菜的口味还好，但份量不如茶人村那么足。两家店总的说来都是价格实惠，大概人均50元就够了，习惯了上海的馆子的价格后，这样的真算得上价廉物美了。23号中饭是在一家叫闽味私厨的馆子吃的，只有2个大妈服务员，服务差点，味道差不多，价格也差不多，结账的时候和老板聊了几句，老板说2010年-2018年就在上海开店的，后来回了老家云云。因为中饭吃得晚，晚上又要看表演，就没吃晚饭，特别跑去网上推荐的旧街小光饼，一个非常非常小的店铺，只有一个烤炉，说这炉在烤的都已经被订了，要么等50分钟出下一炉，老婆居然还犹豫，真是无法想像那些为个网红小吃等几个小时的人是怎样的脑回路，就算时间是用来浪费的，也可以浪费在更有趣的事情上啊，我直接拉她到路对面的另一个小光饼梅干菜饼店买了20块钱的饼。表演结束后回到住处，在饿了么上点夜宵，非常贵，就是专砍游客的，非常不推荐，应该去店里吃的。&lt;/p&gt;

&lt;h2 id=&quot;游&quot;&gt;游&lt;/h2&gt;

&lt;p&gt;比较恼火的是天气不好，一直在下午，22号吃过中饭，下午冒着大雨去了一下大红袍景点，看到了传说中的几株母树。23号本来想去天游峰的，但是因为我妈身体不好，我和我爸只好爬到1/3的路程返回，我老婆和丈人丈母娘带着我儿子居然爬上去了，结果因为我妈爬不了山，到哪都是要爬山的，跑去水帘洞，走了不少路，发现最后也是要爬山的，只能原路返回，直到我老婆他们下山。&lt;/p&gt;

&lt;h2 id=&quot;演&quot;&gt;演&lt;/h2&gt;

&lt;p&gt;这一趟最值的是晚上看《印象大红袍》表演了，天公作美，表演期间没有下雨，这种表演形式也新奇，感觉是这次到武夷山旅游最值得的一个项目了。非常推荐！&lt;/p&gt;

&lt;h2 id=&quot;行&quot;&gt;行&lt;/h2&gt;

&lt;p&gt;最想吐槽的是交通状况，那边红绿灯非常少，斑马线也非常少，要横穿马路就是裸奔，全靠司机素质好，遇到行人肯停车等待。另一个是高德地图的实时公交功能不能用，对于在上海用惯这功能的人来说，简直变成了瞎子。24号赶高铁，在公交站等了十几分钟没等到K1线，老婆就着急忙慌打了个车先走了，结果不到2分钟后我刚在高德地图下了单，K1线就过来了，上了车就接到接单出租车司机的电话，连忙取消订单。这个体验太差了。&lt;/p&gt;</content><author><name>missdeer</name></author><category term="trip" /><summary type="html">端午节最终决定去武夷山游玩，对旅游这块确实既没多大兴趣，更没什么经验，都是老婆一手操办下来的。这个决定做的比较晚，导致买高铁票都是老婆花了不少日子靠在app上抢来，好在总体而言还算顺利，叫上两边的老人一起，浩浩荡荡7个人。</summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogassets.ismisv.com/media/2023-06-24/wuyishanyingxiangdahongpao.jpeg" /></entry><entry><title type="html">配置Debian路由器双WAN接入</title><link href="https://blog.ismisv.com/2022/11/dual-wan-internet-access/" rel="alternate" type="text/html" title="配置Debian路由器双WAN接入" /><published>2022-11-03T00:00:00+00:00</published><updated>2022-11-03T00:00:00+00:00</updated><id>https://blog.ismisv.com/2022/11/dual-wan-internet-access</id><content type="html" xml:base="https://blog.ismisv.com/2022/11/dual-wan-internet-access/">&lt;p&gt;鉴于移动免费送了1年200M的一条宽带，没多犹豫决定还是要用起来。经过一番折腾，基本搞好了，目前的情况大概是这样的：&lt;/p&gt;

&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; contentStyleType=&quot;text/css&quot; data-diagram-type=&quot;CLASS&quot; height=&quot;1089px&quot; preserveAspectRatio=&quot;none&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 1075 1089&quot; width=&quot;1075px&quot; zoomAndPan=&quot;magnify&quot;&gt;&lt;title&gt;&amp;#23478;&amp;#20013;&amp;#32593;&amp;#32476;&amp;#25299;&amp;#25169;&lt;/title&gt;&lt;defs /&gt;&lt;g&gt;&lt;g class=&quot;title&quot; data-source-line=&quot;6&quot;&gt;&lt;rect fill=&quot;none&quot; height=&quot;26.2969&quot; rx=&quot;2.5&quot; ry=&quot;2.5&quot; style=&quot;stroke:#000000;stroke-width:1;&quot; width=&quot;93.9996&quot; x=&quot;483.9952&quot; y=&quot;5&quot; /&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; font-weight=&quot;bold&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;83.9996&quot; x=&quot;488.9952&quot; y=&quot;22.9951&quot;&gt;&amp;#23478;&amp;#20013;&amp;#32593;&amp;#32476;&amp;#25299;&amp;#25169;&lt;/text&gt;&lt;/g&gt;&lt;!--cluster ???--&gt;&lt;g class=&quot;cluster&quot; data-entity=&quot;...&quot; data-source-line=&quot;5&quot; data-uid=&quot;ent0002&quot; id=&quot;cluster_...&quot;&gt;&lt;polygon fill=&quot;none&quot; points=&quot;670.35,489.4469,680.35,479.4469,1058.99,479.4469,1058.99,733.4469,1048.99,743.4469,670.35,743.4469,670.35,489.4469&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;line style=&quot;stroke:#181818;stroke-width:1;&quot; x1=&quot;1048.99&quot; x2=&quot;1058.99&quot; y1=&quot;489.4469&quot; y2=&quot;479.4469&quot; /&gt;&lt;line style=&quot;stroke:#181818;stroke-width:1;&quot; x1=&quot;670.35&quot; x2=&quot;1048.99&quot; y1=&quot;489.4469&quot; y2=&quot;489.4469&quot; /&gt;&lt;line style=&quot;stroke:#181818;stroke-width:1;&quot; x1=&quot;1048.99&quot; x2=&quot;1048.99&quot; y1=&quot;489.4469&quot; y2=&quot;743.4469&quot; /&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; font-weight=&quot;bold&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;41.9998&quot; x=&quot;839.6701&quot; y=&quot;505.442&quot;&gt;&amp;#24369;&amp;#30005;&amp;#31665;&lt;/text&gt;&lt;/g&gt;&lt;!--entity CTModem--&gt;&lt;g class=&quot;entity&quot; data-entity=&quot;CTModem&quot; data-source-line=&quot;7&quot; data-uid=&quot;ent0003&quot; id=&quot;entity_CTModem&quot;&gt;&lt;polygon fill=&quot;#F1F1F1&quot; points=&quot;933.81,529.2969,943.81,519.2969,1029.8098,519.2969,1029.8098,555.5938,1019.8098,565.5938,933.81,565.5938,933.81,529.2969&quot; style=&quot;stroke:#000000;stroke-width:1;&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;1019.8098&quot; x2=&quot;1029.8098&quot; y1=&quot;529.2969&quot; y2=&quot;519.2969&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;933.81&quot; x2=&quot;1019.8098&quot; y1=&quot;529.2969&quot; y2=&quot;529.2969&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;1019.8098&quot; x2=&quot;1019.8098&quot; y1=&quot;529.2969&quot; y2=&quot;565.5938&quot; /&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; font-weight=&quot;bold&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;55.9998&quot; x=&quot;948.81&quot; y=&quot;552.292&quot;&gt;&amp;#30005;&amp;#20449;&amp;#20809;&amp;#29483;&lt;/text&gt;&lt;/g&gt;&lt;!--entity CMModem--&gt;&lt;g class=&quot;entity&quot; data-entity=&quot;CMModem&quot; data-source-line=&quot;10&quot; data-uid=&quot;ent0004&quot; id=&quot;entity_CMModem&quot;&gt;&lt;polygon fill=&quot;#F1F1F1&quot; points=&quot;933.81,691.2969,943.81,681.2969,1029.8098,681.2969,1029.8098,717.5938,1019.8098,727.5938,933.81,727.5938,933.81,691.2969&quot; style=&quot;stroke:#000000;stroke-width:1;&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;1019.8098&quot; x2=&quot;1029.8098&quot; y1=&quot;691.2969&quot; y2=&quot;681.2969&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;933.81&quot; x2=&quot;1019.8098&quot; y1=&quot;691.2969&quot; y2=&quot;691.2969&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;1019.8098&quot; x2=&quot;1019.8098&quot; y1=&quot;691.2969&quot; y2=&quot;727.5938&quot; /&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; font-weight=&quot;bold&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;55.9998&quot; x=&quot;948.81&quot; y=&quot;714.292&quot;&gt;&amp;#31227;&amp;#21160;&amp;#20809;&amp;#29483;&lt;/text&gt;&lt;/g&gt;&lt;!--entity R86S--&gt;&lt;g class=&quot;entity&quot; data-entity=&quot;R86S&quot; data-source-line=&quot;13&quot; data-uid=&quot;ent0005&quot; id=&quot;entity_R86S&quot;&gt;&lt;polygon fill=&quot;#F1F1F1&quot; points=&quot;920.64,610.2969,930.64,600.2969,1042.9855,600.2969,1042.9855,636.5938,1032.9855,646.5938,920.64,646.5938,920.64,610.2969&quot; style=&quot;stroke:#000000;stroke-width:1;&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;1032.9855&quot; x2=&quot;1042.9855&quot; y1=&quot;610.2969&quot; y2=&quot;600.2969&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;920.64&quot; x2=&quot;1032.9855&quot; y1=&quot;610.2969&quot; y2=&quot;610.2969&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;1032.9855&quot; x2=&quot;1032.9855&quot; y1=&quot;610.2969&quot; y2=&quot;646.5938&quot; /&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; font-weight=&quot;bold&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;82.3455&quot; x=&quot;935.64&quot; y=&quot;633.292&quot;&gt;R86S&amp;#36719;&amp;#36335;&amp;#30001;&lt;/text&gt;&lt;/g&gt;&lt;!--entity TPLinkSG1210P--&gt;&lt;g class=&quot;entity&quot; data-entity=&quot;TPLinkSG1210P&quot; data-source-line=&quot;16&quot; data-uid=&quot;ent0006&quot; id=&quot;entity_TPLinkSG1210P&quot;&gt;&lt;polygon fill=&quot;#F1F1F1&quot; points=&quot;686.35,590.0069,696.35,580.0069,860.642,580.0069,860.642,656.8975,850.642,666.8975,686.35,666.8975,686.35,590.0069&quot; style=&quot;stroke:#000000;stroke-width:1;&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;850.642&quot; x2=&quot;860.642&quot; y1=&quot;590.0069&quot; y2=&quot;580.0069&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;686.35&quot; x2=&quot;850.642&quot; y1=&quot;590.0069&quot; y2=&quot;590.0069&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;850.642&quot; x2=&quot;850.642&quot; y1=&quot;590.0069&quot; y2=&quot;666.8975&quot; /&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; font-weight=&quot;bold&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;134.292&quot; x=&quot;701.35&quot; y=&quot;613.002&quot;&gt;TP-Link SG1210P&lt;/text&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;stroke-dasharray:1,2;&quot; x1=&quot;686.35&quot; x2=&quot;850.642&quot; y1=&quot;616.3038&quot; y2=&quot;616.3038&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;stroke-dasharray:1,2;&quot; x1=&quot;850.642&quot; x2=&quot;860.642&quot; y1=&quot;616.3038&quot; y2=&quot;606.3038&quot; /&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;95.8532&quot; x=&quot;701.35&quot; y=&quot;633.2989&quot;&gt;PoE&amp;#21315;&amp;#20806;&amp;#20132;&amp;#25442;&amp;#26426;&lt;/text&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;55.9998&quot; x=&quot;701.35&quot; y=&quot;649.5957&quot;&gt;@&amp;#24369;&amp;#30005;&amp;#31665;&lt;/text&gt;&lt;/g&gt;&lt;!--entity TPLinkSwitch--&gt;&lt;g class=&quot;entity&quot; data-entity=&quot;TPLinkSwitch&quot; data-source-line=&quot;23&quot; data-uid=&quot;ent0007&quot; id=&quot;entity_TPLinkSwitch&quot;&gt;&lt;polygon fill=&quot;#F1F1F1&quot; points=&quot;457.73,362.1469,467.73,352.1469,626.3479,352.1469,626.3479,412.7406,616.3479,422.7406,457.73,422.7406,457.73,362.1469&quot; style=&quot;stroke:#000000;stroke-width:1;&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;616.3479&quot; x2=&quot;626.3479&quot; y1=&quot;362.1469&quot; y2=&quot;352.1469&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;457.73&quot; x2=&quot;616.3479&quot; y1=&quot;362.1469&quot; y2=&quot;362.1469&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;616.3479&quot; x2=&quot;616.3479&quot; y1=&quot;362.1469&quot; y2=&quot;422.7406&quot; /&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; font-weight=&quot;bold&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;128.6179&quot; x=&quot;472.73&quot; y=&quot;385.142&quot;&gt;TP-Link&amp;#21315;&amp;#20806;&amp;#20132;&amp;#25442;&amp;#26426;&lt;/text&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;stroke-dasharray:1,2;&quot; x1=&quot;457.73&quot; x2=&quot;616.3479&quot; y1=&quot;388.4437&quot; y2=&quot;388.4437&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;stroke-dasharray:1,2;&quot; x1=&quot;616.3479&quot; x2=&quot;626.3479&quot; y1=&quot;388.4437&quot; y2=&quot;378.4437&quot; /&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;41.9999&quot; x=&quot;472.73&quot; y=&quot;405.4389&quot;&gt;@&amp;#23458;&amp;#21381;&lt;/text&gt;&lt;/g&gt;&lt;!--entity TPLinkSwitchBD--&gt;&lt;g class=&quot;entity&quot; data-entity=&quot;TPLinkSwitchBD&quot; data-source-line=&quot;29&quot; data-uid=&quot;ent0008&quot; id=&quot;entity_TPLinkSwitchBD&quot;&gt;&lt;polygon fill=&quot;#F1F1F1&quot; points=&quot;229.11,476.1469,239.11,466.1469,397.7279,466.1469,397.7279,526.7406,387.7279,536.7406,229.11,536.7406,229.11,476.1469&quot; style=&quot;stroke:#000000;stroke-width:1;&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;387.7279&quot; x2=&quot;397.7279&quot; y1=&quot;476.1469&quot; y2=&quot;466.1469&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;229.11&quot; x2=&quot;387.7279&quot; y1=&quot;476.1469&quot; y2=&quot;476.1469&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;387.7279&quot; x2=&quot;387.7279&quot; y1=&quot;476.1469&quot; y2=&quot;536.7406&quot; /&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; font-weight=&quot;bold&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;128.6179&quot; x=&quot;244.11&quot; y=&quot;499.142&quot;&gt;TP-Link&amp;#21315;&amp;#20806;&amp;#20132;&amp;#25442;&amp;#26426;&lt;/text&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;stroke-dasharray:1,2;&quot; x1=&quot;229.11&quot; x2=&quot;387.7279&quot; y1=&quot;502.4437&quot; y2=&quot;502.4437&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;stroke-dasharray:1,2;&quot; x1=&quot;387.7279&quot; x2=&quot;397.7279&quot; y1=&quot;502.4437&quot; y2=&quot;492.4437&quot; /&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;41.9999&quot; x=&quot;244.11&quot; y=&quot;519.4389&quot;&gt;@&amp;#20027;&amp;#21351;&lt;/text&gt;&lt;/g&gt;&lt;!--entity HTPC--&gt;&lt;g class=&quot;entity&quot; data-entity=&quot;HTPC&quot; data-source-line=&quot;34&quot; data-uid=&quot;ent0009&quot; id=&quot;entity_HTPC&quot;&gt;&lt;polygon fill=&quot;#F1F1F1&quot; points=&quot;244.13,354.0069,254.13,344.0069,382.7178,344.0069,382.7178,420.8975,372.7178,430.8975,244.13,430.8975,244.13,354.0069&quot; style=&quot;stroke:#000000;stroke-width:1;&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;372.7178&quot; x2=&quot;382.7178&quot; y1=&quot;354.0069&quot; y2=&quot;344.0069&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;244.13&quot; x2=&quot;372.7178&quot; y1=&quot;354.0069&quot; y2=&quot;354.0069&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;372.7178&quot; x2=&quot;372.7178&quot; y1=&quot;354.0069&quot; y2=&quot;430.8975&quot; /&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; font-weight=&quot;bold&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;41.8018&quot; x=&quot;259.13&quot; y=&quot;377.002&quot;&gt;HTPC&lt;/text&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;stroke-dasharray:1,2;&quot; x1=&quot;244.13&quot; x2=&quot;372.7178&quot; y1=&quot;380.3037&quot; y2=&quot;380.3037&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;stroke-dasharray:1,2;&quot; x1=&quot;372.7178&quot; x2=&quot;382.7178&quot; y1=&quot;380.3037&quot; y2=&quot;370.3037&quot; /&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;83.9996&quot; x=&quot;259.13&quot; y=&quot;397.2989&quot;&gt;&amp;#19968;&amp;#20123;&amp;#26381;&amp;#21153;&amp;#31243;&amp;#24207;&lt;/text&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;98.5878&quot; x=&quot;259.13&quot; y=&quot;413.5957&quot;&gt;&amp;#22914;Git Server&amp;#31561;&lt;/text&gt;&lt;/g&gt;&lt;!--entity APBedRoom1--&gt;&lt;g class=&quot;entity&quot; data-entity=&quot;APBedRoom1&quot; data-source-line=&quot;40&quot; data-uid=&quot;ent0010&quot; id=&quot;entity_APBedRoom1&quot;&gt;&lt;polygon fill=&quot;#F1F1F1&quot; points=&quot;473.75,468.0069,483.75,458.0069,610.3279,458.0069,610.3279,534.8975,600.3279,544.8975,473.75,544.8975,473.75,468.0069&quot; style=&quot;stroke:#000000;stroke-width:1;&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;600.3279&quot; x2=&quot;610.3279&quot; y1=&quot;468.0069&quot; y2=&quot;458.0069&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;473.75&quot; x2=&quot;600.3279&quot; y1=&quot;468.0069&quot; y2=&quot;468.0069&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;600.3279&quot; x2=&quot;600.3279&quot; y1=&quot;468.0069&quot; y2=&quot;544.8975&quot; /&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; font-weight=&quot;bold&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;96.5779&quot; x=&quot;488.75&quot; y=&quot;491.002&quot;&gt;&amp;#20027;&amp;#21351;86&amp;#38754;&amp;#26495;AP&lt;/text&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;stroke-dasharray:1,2;&quot; x1=&quot;473.75&quot; x2=&quot;600.3279&quot; y1=&quot;494.3037&quot; y2=&quot;494.3037&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;stroke-dasharray:1,2;&quot; x1=&quot;600.3279&quot; x2=&quot;610.3279&quot; y1=&quot;494.3037&quot; y2=&quot;484.3037&quot; /&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;54.3594&quot; x=&quot;488.75&quot; y=&quot;511.2989&quot;&gt;5G WIFI&lt;/text&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;55.9998&quot; x=&quot;488.75&quot; y=&quot;527.5957&quot;&gt;&amp;#20197;&amp;#22826;&amp;#32593;&amp;#21475;&lt;/text&gt;&lt;/g&gt;&lt;!--entity APBedRoom2--&gt;&lt;g class=&quot;entity&quot; data-entity=&quot;APBedRoom2&quot; data-source-line=&quot;46&quot; data-uid=&quot;ent0011&quot; id=&quot;entity_APBedRoom2&quot;&gt;&lt;polygon fill=&quot;#F1F1F1&quot; points=&quot;473.75,590.0069,483.75,580.0069,610.3279,580.0069,610.3279,656.8975,600.3279,666.8975,473.75,666.8975,473.75,590.0069&quot; style=&quot;stroke:#000000;stroke-width:1;&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;600.3279&quot; x2=&quot;610.3279&quot; y1=&quot;590.0069&quot; y2=&quot;580.0069&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;473.75&quot; x2=&quot;600.3279&quot; y1=&quot;590.0069&quot; y2=&quot;590.0069&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;600.3279&quot; x2=&quot;600.3279&quot; y1=&quot;590.0069&quot; y2=&quot;666.8975&quot; /&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; font-weight=&quot;bold&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;96.5779&quot; x=&quot;488.75&quot; y=&quot;613.002&quot;&gt;&amp;#27425;&amp;#21351;86&amp;#38754;&amp;#26495;AP&lt;/text&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;stroke-dasharray:1,2;&quot; x1=&quot;473.75&quot; x2=&quot;600.3279&quot; y1=&quot;616.3038&quot; y2=&quot;616.3038&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;stroke-dasharray:1,2;&quot; x1=&quot;600.3279&quot; x2=&quot;610.3279&quot; y1=&quot;616.3038&quot; y2=&quot;606.3038&quot; /&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;54.3594&quot; x=&quot;488.75&quot; y=&quot;633.2989&quot;&gt;5G WIFI&lt;/text&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;55.9998&quot; x=&quot;488.75&quot; y=&quot;649.5957&quot;&gt;&amp;#20197;&amp;#22826;&amp;#32593;&amp;#21475;&lt;/text&gt;&lt;/g&gt;&lt;!--entity APDinnerRoom--&gt;&lt;g class=&quot;entity&quot; data-entity=&quot;APDinnerRoom&quot; data-source-line=&quot;52&quot; data-uid=&quot;ent0012&quot; id=&quot;entity_APDinnerRoom&quot;&gt;&lt;polygon fill=&quot;#F1F1F1&quot; points=&quot;468.4,712.0069,478.4,702.0069,615.69,702.0069,615.69,778.8975,605.69,788.8975,468.4,788.8975,468.4,712.0069&quot; style=&quot;stroke:#000000;stroke-width:1;&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;605.69&quot; x2=&quot;615.69&quot; y1=&quot;712.0069&quot; y2=&quot;702.0069&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;468.4&quot; x2=&quot;605.69&quot; y1=&quot;712.0069&quot; y2=&quot;712.0069&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;605.69&quot; x2=&quot;605.69&quot; y1=&quot;712.0069&quot; y2=&quot;788.8975&quot; /&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; font-weight=&quot;bold&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;96.5779&quot; x=&quot;483.4&quot; y=&quot;735.002&quot;&gt;&amp;#39184;&amp;#21381;86&amp;#38754;&amp;#26495;AP&lt;/text&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;stroke-dasharray:1,2;&quot; x1=&quot;468.4&quot; x2=&quot;605.69&quot; y1=&quot;738.3038&quot; y2=&quot;738.3038&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;stroke-dasharray:1,2;&quot; x1=&quot;605.69&quot; x2=&quot;615.69&quot; y1=&quot;738.3038&quot; y2=&quot;728.3038&quot; /&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;107.29&quot; x=&quot;483.4&quot; y=&quot;755.2989&quot;&gt;2.4G &amp;amp; 5G WIFI&lt;/text&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;55.9998&quot; x=&quot;483.4&quot; y=&quot;771.5957&quot;&gt;&amp;#20197;&amp;#22826;&amp;#32593;&amp;#21475;&lt;/text&gt;&lt;/g&gt;&lt;!--entity APLivingRoom--&gt;&lt;g class=&quot;entity&quot; data-entity=&quot;APLivingRoom&quot; data-source-line=&quot;58&quot; data-uid=&quot;ent0013&quot; id=&quot;entity_APLivingRoom&quot;&gt;&lt;polygon fill=&quot;#F1F1F1&quot; points=&quot;468.4,854.0069,478.4,844.0069,615.69,844.0069,615.69,920.8975,605.69,930.8975,468.4,930.8975,468.4,854.0069&quot; style=&quot;stroke:#000000;stroke-width:1;&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;605.69&quot; x2=&quot;615.69&quot; y1=&quot;854.0069&quot; y2=&quot;844.0069&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;468.4&quot; x2=&quot;605.69&quot; y1=&quot;854.0069&quot; y2=&quot;854.0069&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;605.69&quot; x2=&quot;605.69&quot; y1=&quot;854.0069&quot; y2=&quot;930.8975&quot; /&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; font-weight=&quot;bold&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;96.5779&quot; x=&quot;483.4&quot; y=&quot;877.002&quot;&gt;&amp;#23458;&amp;#21381;86&amp;#38754;&amp;#26495;AP&lt;/text&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;stroke-dasharray:1,2;&quot; x1=&quot;468.4&quot; x2=&quot;605.69&quot; y1=&quot;880.3037&quot; y2=&quot;880.3037&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;stroke-dasharray:1,2;&quot; x1=&quot;605.69&quot; x2=&quot;615.69&quot; y1=&quot;880.3037&quot; y2=&quot;870.3037&quot; /&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;107.29&quot; x=&quot;483.4&quot; y=&quot;897.2989&quot;&gt;2.4G &amp;amp; 5G WIFI&lt;/text&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;55.9998&quot; x=&quot;483.4&quot; y=&quot;913.5957&quot;&gt;&amp;#20197;&amp;#22826;&amp;#32593;&amp;#21475;&lt;/text&gt;&lt;/g&gt;&lt;!--entity TLAC100--&gt;&lt;g class=&quot;entity&quot; data-entity=&quot;TLAC100&quot; data-source-line=&quot;64&quot; data-uid=&quot;ent0014&quot; id=&quot;entity_TLAC100&quot;&gt;&lt;polygon fill=&quot;#F1F1F1&quot; points=&quot;35.25,53.2969,45.25,43.2969,149.8643,43.2969,149.8643,79.5938,139.8643,89.5938,35.25,89.5938,35.25,53.2969&quot; style=&quot;stroke:#000000;stroke-width:1;&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;139.8643&quot; x2=&quot;149.8643&quot; y1=&quot;53.2969&quot; y2=&quot;43.2969&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;35.25&quot; x2=&quot;139.8643&quot; y1=&quot;53.2969&quot; y2=&quot;53.2969&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;139.8643&quot; x2=&quot;139.8643&quot; y1=&quot;53.2969&quot; y2=&quot;89.5938&quot; /&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; font-weight=&quot;bold&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;74.6143&quot; x=&quot;50.25&quot; y=&quot;76.292&quot;&gt;TL-AC100&lt;/text&gt;&lt;/g&gt;&lt;!--entity MacMini--&gt;&lt;g class=&quot;entity&quot; data-entity=&quot;MacMini&quot; data-source-line=&quot;67&quot; data-uid=&quot;ent0015&quot; id=&quot;entity_MacMini&quot;&gt;&lt;polygon fill=&quot;#F1F1F1&quot; points=&quot;39.97,134.1469,49.97,124.1469,145.1438,124.1469,145.1438,184.7406,135.1438,194.7406,39.97,194.7406,39.97,134.1469&quot; style=&quot;stroke:#000000;stroke-width:1;&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;135.1438&quot; x2=&quot;145.1438&quot; y1=&quot;134.1469&quot; y2=&quot;124.1469&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;39.97&quot; x2=&quot;135.1438&quot; y1=&quot;134.1469&quot; y2=&quot;134.1469&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;135.1438&quot; x2=&quot;135.1438&quot; y1=&quot;134.1469&quot; y2=&quot;194.7406&quot; /&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; font-weight=&quot;bold&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;65.1738&quot; x=&quot;54.97&quot; y=&quot;157.142&quot;&gt;MacMini&lt;/text&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;stroke-dasharray:1,2;&quot; x1=&quot;39.97&quot; x2=&quot;135.1438&quot; y1=&quot;160.4437&quot; y2=&quot;160.4437&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;stroke-dasharray:1,2;&quot; x1=&quot;135.1438&quot; x2=&quot;145.1438&quot; y1=&quot;160.4437&quot; y2=&quot;150.4437&quot; /&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;55.9998&quot; x=&quot;54.97&quot; y=&quot;177.4389&quot;&gt;&amp;#21507;&amp;#28784;&amp;#22791;&amp;#29992;&lt;/text&gt;&lt;/g&gt;&lt;!--entity TinyMonster--&gt;&lt;g class=&quot;entity&quot; data-entity=&quot;TinyMonster&quot; data-source-line=&quot;72&quot; data-uid=&quot;ent0016&quot; id=&quot;entity_TinyMonster&quot;&gt;&lt;polygon fill=&quot;#F1F1F1&quot; points=&quot;16,240.1469,26,230.1469,169.1141,230.1469,169.1141,290.7406,159.1141,300.7406,16,300.7406,16,240.1469&quot; style=&quot;stroke:#000000;stroke-width:1;&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;159.1141&quot; x2=&quot;169.1141&quot; y1=&quot;240.1469&quot; y2=&quot;230.1469&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;16&quot; x2=&quot;159.1141&quot; y1=&quot;240.1469&quot; y2=&quot;240.1469&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;159.1141&quot; x2=&quot;159.1141&quot; y1=&quot;240.1469&quot; y2=&quot;300.7406&quot; /&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; font-weight=&quot;bold&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;113.1141&quot; x=&quot;31&quot; y=&quot;263.142&quot;&gt;Windows&amp;#23567;&amp;#20027;&amp;#26426;&lt;/text&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;stroke-dasharray:1,2;&quot; x1=&quot;16&quot; x2=&quot;159.1141&quot; y1=&quot;266.4437&quot; y2=&quot;266.4437&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;stroke-dasharray:1,2;&quot; x1=&quot;159.1141&quot; x2=&quot;169.1141&quot; y1=&quot;266.4437&quot; y2=&quot;256.4437&quot; /&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;69.9997&quot; x=&quot;31&quot; y=&quot;283.4389&quot;&gt;&amp;#20027;&amp;#21147;&amp;#24320;&amp;#21457;&amp;#26426;&lt;/text&gt;&lt;/g&gt;&lt;!--entity Debian--&gt;&lt;g class=&quot;entity&quot; data-entity=&quot;Debian&quot; data-source-line=&quot;77&quot; data-uid=&quot;ent0017&quot; id=&quot;entity_Debian&quot;&gt;&lt;polygon fill=&quot;#F1F1F1&quot; points=&quot;16.56,346.0069,26.56,336.0069,168.5595,336.0069,168.5595,412.8975,158.5595,422.8975,16.56,422.8975,16.56,346.0069&quot; style=&quot;stroke:#000000;stroke-width:1;&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;158.5595&quot; x2=&quot;168.5595&quot; y1=&quot;346.0069&quot; y2=&quot;336.0069&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;16.56&quot; x2=&quot;158.5595&quot; y1=&quot;346.0069&quot; y2=&quot;346.0069&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;158.5595&quot; x2=&quot;158.5595&quot; y1=&quot;346.0069&quot; y2=&quot;422.8975&quot; /&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; font-weight=&quot;bold&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;55.3506&quot; x=&quot;31.56&quot; y=&quot;369.002&quot;&gt;Debian&lt;/text&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;stroke-dasharray:1,2;&quot; x1=&quot;16.56&quot; x2=&quot;158.5595&quot; y1=&quot;372.3037&quot; y2=&quot;372.3037&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;stroke-dasharray:1,2;&quot; x1=&quot;158.5595&quot; x2=&quot;168.5595&quot; y1=&quot;372.3037&quot; y2=&quot;362.3037&quot; /&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;111.9995&quot; x=&quot;31.56&quot; y=&quot;389.2989&quot;&gt;&amp;#26366;&amp;#32463;&amp;#30340;&amp;#20027;&amp;#21147;&amp;#26049;&amp;#36335;&amp;#30001;&lt;/text&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;40.8652&quot; x=&quot;31.56&quot; y=&quot;405.5957&quot;&gt;@PVE&lt;/text&gt;&lt;/g&gt;&lt;!--entity FreeBSD--&gt;&lt;g class=&quot;entity&quot; data-entity=&quot;FreeBSD&quot; data-source-line=&quot;83&quot; data-uid=&quot;ent0018&quot; id=&quot;entity_FreeBSD&quot;&gt;&lt;polygon fill=&quot;#F1F1F1&quot; points=&quot;37.56,468.0069,47.56,458.0069,147.5597,458.0069,147.5597,534.8975,137.5597,544.8975,37.56,544.8975,37.56,468.0069&quot; style=&quot;stroke:#000000;stroke-width:1;&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;137.5597&quot; x2=&quot;147.5597&quot; y1=&quot;468.0069&quot; y2=&quot;458.0069&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;37.56&quot; x2=&quot;137.5597&quot; y1=&quot;468.0069&quot; y2=&quot;468.0069&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;137.5597&quot; x2=&quot;137.5597&quot; y1=&quot;468.0069&quot; y2=&quot;544.8975&quot; /&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; font-weight=&quot;bold&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;67.833&quot; x=&quot;52.56&quot; y=&quot;491.002&quot;&gt;FreeBSD&lt;/text&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;stroke-dasharray:1,2;&quot; x1=&quot;37.56&quot; x2=&quot;137.5597&quot; y1=&quot;494.3037&quot; y2=&quot;494.3037&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;stroke-dasharray:1,2;&quot; x1=&quot;137.5597&quot; x2=&quot;147.5597&quot; y1=&quot;494.3037&quot; y2=&quot;484.3037&quot; /&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;69.9997&quot; x=&quot;52.56&quot; y=&quot;511.2989&quot;&gt;&amp;#23398;&amp;#20064;&amp;#23454;&amp;#39564;&amp;#29992;&lt;/text&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;40.8652&quot; x=&quot;52.56&quot; y=&quot;527.5957&quot;&gt;@PVE&lt;/text&gt;&lt;/g&gt;&lt;!--entity NetBSD--&gt;&lt;g class=&quot;entity&quot; data-entity=&quot;NetBSD&quot; data-source-line=&quot;90&quot; data-uid=&quot;ent0019&quot; id=&quot;entity_NetBSD&quot;&gt;&lt;polygon fill=&quot;#F1F1F1&quot; points=&quot;37.56,590.0069,47.56,580.0069,147.5597,580.0069,147.5597,656.8975,137.5597,666.8975,37.56,666.8975,37.56,590.0069&quot; style=&quot;stroke:#000000;stroke-width:1;&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;137.5597&quot; x2=&quot;147.5597&quot; y1=&quot;590.0069&quot; y2=&quot;580.0069&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;37.56&quot; x2=&quot;137.5597&quot; y1=&quot;590.0069&quot; y2=&quot;590.0069&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;137.5597&quot; x2=&quot;137.5597&quot; y1=&quot;590.0069&quot; y2=&quot;666.8975&quot; /&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; font-weight=&quot;bold&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;60.2793&quot; x=&quot;52.56&quot; y=&quot;613.002&quot;&gt;NetBSD&lt;/text&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;stroke-dasharray:1,2;&quot; x1=&quot;37.56&quot; x2=&quot;137.5597&quot; y1=&quot;616.3038&quot; y2=&quot;616.3038&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;stroke-dasharray:1,2;&quot; x1=&quot;137.5597&quot; x2=&quot;147.5597&quot; y1=&quot;616.3038&quot; y2=&quot;606.3038&quot; /&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;69.9997&quot; x=&quot;52.56&quot; y=&quot;633.2989&quot;&gt;&amp;#23398;&amp;#20064;&amp;#23454;&amp;#39564;&amp;#29992;&lt;/text&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;40.8652&quot; x=&quot;52.56&quot; y=&quot;649.5957&quot;&gt;@PVE&lt;/text&gt;&lt;/g&gt;&lt;!--entity OpenBSD--&gt;&lt;g class=&quot;entity&quot; data-entity=&quot;OpenBSD&quot; data-source-line=&quot;97&quot; data-uid=&quot;ent0020&quot; id=&quot;entity_OpenBSD&quot;&gt;&lt;polygon fill=&quot;#F1F1F1&quot; points=&quot;35.68,712.0069,45.68,702.0069,149.4398,702.0069,149.4398,778.8975,139.4398,788.8975,35.68,788.8975,35.68,712.0069&quot; style=&quot;stroke:#000000;stroke-width:1;&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;139.4398&quot; x2=&quot;149.4398&quot; y1=&quot;712.0069&quot; y2=&quot;702.0069&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;35.68&quot; x2=&quot;139.4398&quot; y1=&quot;712.0069&quot; y2=&quot;712.0069&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;139.4398&quot; x2=&quot;139.4398&quot; y1=&quot;712.0069&quot; y2=&quot;788.8975&quot; /&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; font-weight=&quot;bold&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;73.7598&quot; x=&quot;50.68&quot; y=&quot;735.002&quot;&gt;OpenBSD&lt;/text&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;stroke-dasharray:1,2;&quot; x1=&quot;35.68&quot; x2=&quot;139.4398&quot; y1=&quot;738.3038&quot; y2=&quot;738.3038&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;stroke-dasharray:1,2;&quot; x1=&quot;139.4398&quot; x2=&quot;149.4398&quot; y1=&quot;738.3038&quot; y2=&quot;728.3038&quot; /&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;69.9997&quot; x=&quot;50.68&quot; y=&quot;755.2989&quot;&gt;&amp;#23398;&amp;#20064;&amp;#23454;&amp;#39564;&amp;#29992;&lt;/text&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;40.8652&quot; x=&quot;50.68&quot; y=&quot;771.5957&quot;&gt;@PVE&lt;/text&gt;&lt;/g&gt;&lt;!--entity DragonflyBSD--&gt;&lt;g class=&quot;entity&quot; data-entity=&quot;DragonflyBSD&quot; data-source-line=&quot;104&quot; data-uid=&quot;ent0021&quot; id=&quot;entity_DragonflyBSD&quot;&gt;&lt;polygon fill=&quot;#F1F1F1&quot; points=&quot;17.57,834.0069,27.57,824.0069,167.5397,824.0069,167.5397,900.8975,157.5397,910.8975,17.57,910.8975,17.57,834.0069&quot; style=&quot;stroke:#000000;stroke-width:1;&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;157.5397&quot; x2=&quot;167.5397&quot; y1=&quot;834.0069&quot; y2=&quot;824.0069&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;17.57&quot; x2=&quot;157.5397&quot; y1=&quot;834.0069&quot; y2=&quot;834.0069&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;157.5397&quot; x2=&quot;157.5397&quot; y1=&quot;834.0069&quot; y2=&quot;910.8975&quot; /&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; font-weight=&quot;bold&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;109.9697&quot; x=&quot;32.57&quot; y=&quot;857.002&quot;&gt;DragonflyBSD&lt;/text&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;stroke-dasharray:1,2;&quot; x1=&quot;17.57&quot; x2=&quot;157.5397&quot; y1=&quot;860.3037&quot; y2=&quot;860.3037&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;stroke-dasharray:1,2;&quot; x1=&quot;157.5397&quot; x2=&quot;167.5397&quot; y1=&quot;860.3037&quot; y2=&quot;850.3037&quot; /&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;69.9997&quot; x=&quot;32.57&quot; y=&quot;877.2989&quot;&gt;&amp;#23398;&amp;#20064;&amp;#23454;&amp;#39564;&amp;#29992;&lt;/text&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;40.8652&quot; x=&quot;32.57&quot; y=&quot;893.5957&quot;&gt;@PVE&lt;/text&gt;&lt;/g&gt;&lt;!--entity WinDesktop--&gt;&lt;g class=&quot;entity&quot; data-entity=&quot;WinDesktop&quot; data-source-line=&quot;110&quot; data-uid=&quot;ent0022&quot; id=&quot;entity_WinDesktop&quot;&gt;&lt;polygon fill=&quot;#F1F1F1&quot; points=&quot;16,956.2969,26,946.2969,169.1141,946.2969,169.1141,982.5938,159.1141,992.5938,16,992.5938,16,956.2969&quot; style=&quot;stroke:#000000;stroke-width:1;&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;159.1141&quot; x2=&quot;169.1141&quot; y1=&quot;956.2969&quot; y2=&quot;946.2969&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;16&quot; x2=&quot;159.1141&quot; y1=&quot;956.2969&quot; y2=&quot;956.2969&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;159.1141&quot; x2=&quot;159.1141&quot; y1=&quot;956.2969&quot; y2=&quot;992.5938&quot; /&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; font-weight=&quot;bold&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;113.1141&quot; x=&quot;31&quot; y=&quot;979.292&quot;&gt;Windows&amp;#21488;&amp;#24335;&amp;#26426;&lt;/text&gt;&lt;/g&gt;&lt;!--entity TLIPC40CFocus--&gt;&lt;g class=&quot;entity&quot; data-entity=&quot;TLIPC40CFocus&quot; data-source-line=&quot;113&quot; data-uid=&quot;ent0023&quot; id=&quot;entity_TLIPC40CFocus&quot;&gt;&lt;polygon fill=&quot;#F1F1F1&quot; points=&quot;229.11,712.2969,239.11,702.2969,397.7279,702.2969,397.7279,738.5938,387.7279,748.5938,229.11,748.5938,229.11,712.2969&quot; style=&quot;stroke:#000000;stroke-width:1;&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;387.7279&quot; x2=&quot;397.7279&quot; y1=&quot;712.2969&quot; y2=&quot;702.2969&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;229.11&quot; x2=&quot;387.7279&quot; y1=&quot;712.2969&quot; y2=&quot;712.2969&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;387.7279&quot; x2=&quot;387.7279&quot; y1=&quot;712.2969&quot; y2=&quot;748.5938&quot; /&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; font-weight=&quot;bold&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;128.6179&quot; x=&quot;244.11&quot; y=&quot;735.292&quot;&gt;TP-Link&amp;#30417;&amp;#25511;&amp;#25668;&amp;#20687;&amp;#22836;&lt;/text&gt;&lt;/g&gt;&lt;!--entity TLIPC40C--&gt;&lt;g class=&quot;entity&quot; data-entity=&quot;TLIPC40C&quot; data-source-line=&quot;116&quot; data-uid=&quot;ent0024&quot; id=&quot;entity_TLIPC40C&quot;&gt;&lt;polygon fill=&quot;#F1F1F1&quot; points=&quot;229.11,793.2969,239.11,783.2969,397.7279,783.2969,397.7279,819.5938,387.7279,829.5938,229.11,829.5938,229.11,793.2969&quot; style=&quot;stroke:#000000;stroke-width:1;&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;387.7279&quot; x2=&quot;397.7279&quot; y1=&quot;793.2969&quot; y2=&quot;783.2969&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;229.11&quot; x2=&quot;387.7279&quot; y1=&quot;793.2969&quot; y2=&quot;793.2969&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;387.7279&quot; x2=&quot;387.7279&quot; y1=&quot;793.2969&quot; y2=&quot;829.5938&quot; /&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; font-weight=&quot;bold&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;128.6179&quot; x=&quot;244.11&quot; y=&quot;816.292&quot;&gt;TP-Link&amp;#30417;&amp;#25511;&amp;#25668;&amp;#20687;&amp;#22836;&lt;/text&gt;&lt;/g&gt;&lt;!--entity Chromecast--&gt;&lt;g class=&quot;entity&quot; data-entity=&quot;Chromecast&quot; data-source-line=&quot;120&quot; data-uid=&quot;ent0025&quot; id=&quot;entity_Chromecast&quot;&gt;&lt;polygon fill=&quot;#F1F1F1&quot; points=&quot;246.61,874.2969,256.61,864.2969,380.2282,864.2969,380.2282,900.5938,370.2282,910.5938,246.61,910.5938,246.61,874.2969&quot; style=&quot;stroke:#000000;stroke-width:1;&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;370.2282&quot; x2=&quot;380.2282&quot; y1=&quot;874.2969&quot; y2=&quot;864.2969&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;246.61&quot; x2=&quot;370.2282&quot; y1=&quot;874.2969&quot; y2=&quot;874.2969&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;370.2282&quot; x2=&quot;370.2282&quot; y1=&quot;874.2969&quot; y2=&quot;910.5938&quot; /&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; font-weight=&quot;bold&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;93.6182&quot; x=&quot;261.61&quot; y=&quot;897.292&quot;&gt;Chromecast&lt;/text&gt;&lt;/g&gt;&lt;!--entity SonyTV--&gt;&lt;g class=&quot;entity&quot; data-entity=&quot;SonyTV&quot; data-source-line=&quot;123&quot; data-uid=&quot;ent0026&quot; id=&quot;entity_SonyTV&quot;&gt;&lt;polygon fill=&quot;#F1F1F1&quot; points=&quot;272.42,955.2969,282.42,945.2969,354.4198,945.2969,354.4198,981.5938,344.4198,991.5938,272.42,991.5938,272.42,955.2969&quot; style=&quot;stroke:#000000;stroke-width:1;&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;344.4198&quot; x2=&quot;354.4198&quot; y1=&quot;955.2969&quot; y2=&quot;945.2969&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;272.42&quot; x2=&quot;344.4198&quot; y1=&quot;955.2969&quot; y2=&quot;955.2969&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;344.4198&quot; x2=&quot;344.4198&quot; y1=&quot;955.2969&quot; y2=&quot;991.5938&quot; /&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; font-weight=&quot;bold&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;41.9998&quot; x=&quot;287.42&quot; y=&quot;978.292&quot;&gt;&amp;#30005;&amp;#35270;&amp;#26426;&lt;/text&gt;&lt;/g&gt;&lt;!--entity DoorLock--&gt;&lt;g class=&quot;entity&quot; data-entity=&quot;DoorLock&quot; data-source-line=&quot;126&quot; data-uid=&quot;ent0027&quot; id=&quot;entity_DoorLock&quot;&gt;&lt;polygon fill=&quot;#F1F1F1&quot; points=&quot;265.42,1036.2969,275.42,1026.2969,361.4198,1026.2969,361.4198,1062.5938,351.4198,1072.5938,265.42,1072.5938,265.42,1036.2969&quot; style=&quot;stroke:#000000;stroke-width:1;&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;351.4198&quot; x2=&quot;361.4198&quot; y1=&quot;1036.2969&quot; y2=&quot;1026.2969&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;265.42&quot; x2=&quot;351.4198&quot; y1=&quot;1036.2969&quot; y2=&quot;1036.2969&quot; /&gt;&lt;line style=&quot;stroke:#000000;stroke-width:1;&quot; x1=&quot;351.4198&quot; x2=&quot;351.4198&quot; y1=&quot;1036.2969&quot; y2=&quot;1072.5938&quot; /&gt;&lt;text fill=&quot;#000000&quot; font-family=&quot;&quot; font-size=&quot;14&quot; font-weight=&quot;bold&quot; lengthAdjust=&quot;spacing&quot; textLength=&quot;55.9998&quot; x=&quot;280.42&quot; y=&quot;1059.292&quot;&gt;&amp;#26234;&amp;#33021;&amp;#38376;&amp;#38145;&lt;/text&gt;&lt;/g&gt;&lt;!--link R86S to CTModem--&gt;&lt;g class=&quot;link&quot; data-entity-1=&quot;R86S&quot; data-entity-2=&quot;CTModem&quot; data-source-line=&quot;129&quot; data-uid=&quot;lnk28&quot; id=&quot;link_R86S_CTModem&quot;&gt;&lt;path codeLine=&quot;129&quot; d=&quot;M981.81,600.0369 C981.81,588.6369 981.81,583.2369 981.81,571.8469&quot; fill=&quot;none&quot; id=&quot;R86S-to-CTModem&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;polygon fill=&quot;#181818&quot; points=&quot;981.81,565.8469,977.81,574.8469,981.81,570.8469,985.81,574.8469,981.81,565.8469&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;/g&gt;&lt;!--reverse link CMModem to R86S--&gt;&lt;g class=&quot;link&quot; data-entity-1=&quot;CMModem&quot; data-entity-2=&quot;R86S&quot; data-source-line=&quot;130&quot; data-uid=&quot;lnk30&quot; id=&quot;link_CMModem_R86S&quot;&gt;&lt;path codeLine=&quot;130&quot; d=&quot;M981.81,675.0369 C981.81,663.6369 981.81,658.2369 981.81,646.8469&quot; fill=&quot;none&quot; id=&quot;CMModem-backto-R86S&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;polygon fill=&quot;#181818&quot; points=&quot;981.81,681.0369,985.81,672.0369,981.81,676.0369,977.81,672.0369,981.81,681.0369&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;/g&gt;&lt;!--link TPLinkSG1210P to R86S--&gt;&lt;g class=&quot;link&quot; data-entity-1=&quot;TPLinkSG1210P&quot; data-entity-2=&quot;R86S&quot; data-source-line=&quot;131&quot; data-uid=&quot;lnk31&quot; id=&quot;link_TPLinkSG1210P_R86S&quot;&gt;&lt;path codeLine=&quot;131&quot; d=&quot;M861.1,623.4469 C881.06,623.4469 895.87,623.4469 914.43,623.4469&quot; fill=&quot;none&quot; id=&quot;TPLinkSG1210P-to-R86S&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;polygon fill=&quot;#181818&quot; points=&quot;920.43,623.4469,911.43,619.4469,915.43,623.4469,911.43,627.4469,920.43,623.4469&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;/g&gt;&lt;!--link TPLinkSwitch to TPLinkSG1210P--&gt;&lt;g class=&quot;link&quot; data-entity-1=&quot;TPLinkSwitch&quot; data-entity-2=&quot;TPLinkSG1210P&quot; data-source-line=&quot;132&quot; data-uid=&quot;lnk32&quot; id=&quot;link_TPLinkSwitch_TPLinkSG1210P&quot;&gt;&lt;path codeLine=&quot;132&quot; d=&quot;M604.36,423.1269 C612.06,428.5469 619.59,434.3769 626.35,440.4469 C673.09,482.4269 713.2304,535.4498 740.4204,574.8198&quot; fill=&quot;none&quot; id=&quot;TPLinkSwitch-to-TPLinkSG1210P&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;polygon fill=&quot;#181818&quot; points=&quot;743.83,579.7569,742.0069,570.0782,740.9886,575.6427,735.4242,574.6244,743.83,579.7569&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;/g&gt;&lt;!--link APBedRoom1 to TPLinkSG1210P--&gt;&lt;g class=&quot;link&quot; data-entity-1=&quot;APBedRoom1&quot; data-entity-2=&quot;TPLinkSG1210P&quot; data-source-line=&quot;133&quot; data-uid=&quot;lnk33&quot; id=&quot;link_APBedRoom1_TPLinkSG1210P&quot;&gt;&lt;path codeLine=&quot;133&quot; d=&quot;M610.64,537.3969 C635.5,550.6069 658.6227,562.8993 684.6427,576.7393&quot; fill=&quot;none&quot; id=&quot;APBedRoom1-to-TPLinkSG1210P&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;polygon fill=&quot;#181818&quot; points=&quot;689.94,579.5569,683.8725,571.7989,685.5256,577.2089,680.1157,578.862,689.94,579.5569&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;/g&gt;&lt;!--link APBedRoom2 to TPLinkSG1210P--&gt;&lt;g class=&quot;link&quot; data-entity-1=&quot;APBedRoom2&quot; data-entity-2=&quot;TPLinkSG1210P&quot; data-source-line=&quot;134&quot; data-uid=&quot;lnk34&quot; id=&quot;link_APBedRoom2_TPLinkSG1210P&quot;&gt;&lt;path codeLine=&quot;134&quot; d=&quot;M610.64,623.4469 C634.31,623.4469 655.21,623.4469 680.19,623.4469&quot; fill=&quot;none&quot; id=&quot;APBedRoom2-to-TPLinkSG1210P&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;polygon fill=&quot;#181818&quot; points=&quot;686.19,623.4469,677.19,619.4469,681.19,623.4469,677.19,627.4469,686.19,623.4469&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;/g&gt;&lt;!--link APDinnerRoom to TPLinkSG1210P--&gt;&lt;g class=&quot;link&quot; data-entity-1=&quot;APDinnerRoom&quot; data-entity-2=&quot;TPLinkSG1210P&quot; data-source-line=&quot;135&quot; data-uid=&quot;lnk35&quot; id=&quot;link_APDinnerRoom_TPLinkSG1210P&quot;&gt;&lt;path codeLine=&quot;135&quot; d=&quot;M615.96,706.6769 C639.58,694.1169 660.6429,682.9247 684.8929,670.0247&quot; fill=&quot;none&quot; id=&quot;APDinnerRoom-to-TPLinkSG1210P&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;polygon fill=&quot;#181818&quot; points=&quot;690.19,667.2069,680.3657,667.9022,685.7757,669.5551,684.1229,674.9651,690.19,667.2069&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;/g&gt;&lt;!--link APLivingRoom to TPLinkSG1210P--&gt;&lt;g class=&quot;link&quot; data-entity-1=&quot;APLivingRoom&quot; data-entity-2=&quot;TPLinkSG1210P&quot; data-source-line=&quot;136&quot; data-uid=&quot;lnk36&quot; id=&quot;link_APLivingRoom_TPLinkSG1210P&quot;&gt;&lt;path codeLine=&quot;136&quot; d=&quot;M589.91,843.8869 C602.08,832.0369 614.97,818.9969 626.35,806.4469 C667.73,760.8269 707.6974,709.8899 736.3874,672.0099&quot; fill=&quot;none&quot; id=&quot;APLivingRoom-to-TPLinkSG1210P&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;polygon fill=&quot;#181818&quot; points=&quot;740.01,667.2269,731.3875,671.9863,736.9912,671.2127,737.7648,676.8164,740.01,667.2269&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;/g&gt;&lt;!--link HTPC to TPLinkSwitch--&gt;&lt;g class=&quot;link&quot; data-entity-1=&quot;HTPC&quot; data-entity-2=&quot;TPLinkSwitch&quot; data-source-line=&quot;137&quot; data-uid=&quot;lnk37&quot; id=&quot;link_HTPC_TPLinkSwitch&quot;&gt;&lt;path codeLine=&quot;137&quot; d=&quot;M383.03,387.4469 C406.48,387.4469 426.97,387.4469 451.47,387.4469&quot; fill=&quot;none&quot; id=&quot;HTPC-to-TPLinkSwitch&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;polygon fill=&quot;#181818&quot; points=&quot;457.47,387.4469,448.47,383.4469,452.47,387.4469,448.47,391.4469,457.47,387.4469&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;/g&gt;&lt;!--link TPLinkSwitchBD to APBedRoom1--&gt;&lt;g class=&quot;link&quot; data-entity-1=&quot;TPLinkSwitchBD&quot; data-entity-2=&quot;APBedRoom1&quot; data-source-line=&quot;138&quot; data-uid=&quot;lnk38&quot; id=&quot;link_TPLinkSwitchBD_APBedRoom1&quot;&gt;&lt;path codeLine=&quot;138&quot; d=&quot;M398.16,501.4469 C423,501.4469 443.88,501.4469 467.55,501.4469&quot; fill=&quot;none&quot; id=&quot;TPLinkSwitchBD-to-APBedRoom1&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;polygon fill=&quot;#181818&quot; points=&quot;473.55,501.4469,464.55,497.4469,468.55,501.4469,464.55,505.4469,473.55,501.4469&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;/g&gt;&lt;!--link TLAC100 to TPLinkSwitchBD--&gt;&lt;g class=&quot;link&quot; data-entity-1=&quot;TLAC100&quot; data-entity-2=&quot;TPLinkSwitchBD&quot; data-source-line=&quot;139&quot; data-uid=&quot;lnk39&quot; id=&quot;link_TLAC100_TPLinkSwitchBD&quot;&gt;&lt;path codeLine=&quot;139&quot; d=&quot;M150.15,88.7269 C157.4,93.6269 164.05,99.4869 169.11,106.4469 C259.88,231.2569 143.39,320.1269 229.11,448.4469 C233.4,454.8669 234.2454,456.6935 240.1554,461.8935&quot; fill=&quot;none&quot; id=&quot;TLAC100-to-TPLinkSwitchBD&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;polygon fill=&quot;#181818&quot; points=&quot;244.66,465.8569,240.5454,456.9087,240.9062,462.554,235.2608,462.9148,244.66,465.8569&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;/g&gt;&lt;!--link WinDesktop to TPLinkSwitchBD--&gt;&lt;g class=&quot;link&quot; data-entity-1=&quot;WinDesktop&quot; data-entity-2=&quot;TPLinkSwitchBD&quot; data-source-line=&quot;140&quot; data-uid=&quot;lnk40&quot; id=&quot;link_WinDesktop_TPLinkSwitchBD&quot;&gt;&lt;path codeLine=&quot;140&quot; d=&quot;M150.12,945.8469 C157.29,940.9469 163.92,935.1869 169.11,928.4469 C237.35,840.0469 192.49,789.9469 229.11,684.4469 C247.43,631.6869 272.6884,578.7392 291.0784,542.4392&quot; fill=&quot;none&quot; id=&quot;WinDesktop-to-TPLinkSwitchBD&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;polygon fill=&quot;#181818&quot; points=&quot;293.79,537.0869,286.1544,543.3077,291.5304,541.5472,293.2909,546.9231,293.79,537.0869&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;/g&gt;&lt;!--link Debian to TPLinkSwitchBD--&gt;&lt;g class=&quot;link&quot; data-entity-1=&quot;Debian&quot; data-entity-2=&quot;TPLinkSwitchBD&quot; data-source-line=&quot;141&quot; data-uid=&quot;lnk41&quot; id=&quot;link_Debian_TPLinkSwitchBD&quot;&gt;&lt;path codeLine=&quot;141&quot; d=&quot;M168.88,421.4369 C194.72,435.8369 218.1498,448.8944 243.0198,462.7644&quot; fill=&quot;none&quot; id=&quot;Debian-to-TPLinkSwitchBD&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;polygon fill=&quot;#181818&quot; points=&quot;248.26,465.6869,242.348,457.8098,243.8932,463.2515,238.4515,464.7967,248.26,465.6869&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;/g&gt;&lt;!--link FreeBSD to TPLinkSwitchBD--&gt;&lt;g class=&quot;link&quot; data-entity-1=&quot;FreeBSD&quot; data-entity-2=&quot;TPLinkSwitchBD&quot; data-source-line=&quot;142&quot; data-uid=&quot;lnk42&quot; id=&quot;link_FreeBSD_TPLinkSwitchBD&quot;&gt;&lt;path codeLine=&quot;142&quot; d=&quot;M147.94,501.4469 C172.37,501.4469 195.76,501.4469 222.89,501.4469&quot; fill=&quot;none&quot; id=&quot;FreeBSD-to-TPLinkSwitchBD&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;polygon fill=&quot;#181818&quot; points=&quot;228.89,501.4469,219.89,497.4469,223.89,501.4469,219.89,505.4469,228.89,501.4469&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;/g&gt;&lt;!--link NetBSD to TPLinkSwitchBD--&gt;&lt;g class=&quot;link&quot; data-entity-1=&quot;NetBSD&quot; data-entity-2=&quot;TPLinkSwitchBD&quot; data-source-line=&quot;143&quot; data-uid=&quot;lnk43&quot; id=&quot;link_NetBSD_TPLinkSwitchBD&quot;&gt;&lt;path codeLine=&quot;143&quot; d=&quot;M147.94,593.1369 C178.32,576.1969 211.1189,557.9177 242.9689,540.1677&quot; fill=&quot;none&quot; id=&quot;NetBSD-to-TPLinkSwitchBD&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;polygon fill=&quot;#181818&quot; points=&quot;248.21,537.2469,238.4012,538.1341,243.8425,539.6809,242.2956,545.1222,248.21,537.2469&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;/g&gt;&lt;!--link OpenBSD to TPLinkSwitchBD--&gt;&lt;g class=&quot;link&quot; data-entity-1=&quot;OpenBSD&quot; data-entity-2=&quot;TPLinkSwitchBD&quot; data-source-line=&quot;144&quot; data-uid=&quot;lnk44&quot; id=&quot;link_OpenBSD_TPLinkSwitchBD&quot;&gt;&lt;path codeLine=&quot;144&quot; d=&quot;M149.7,702.5269 C156.45,696.6769 163.08,690.5769 169.11,684.4469 C215.56,637.3069 257.866,580.37 284.756,542.01&quot; fill=&quot;none&quot; id=&quot;OpenBSD-to-TPLinkSwitchBD&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;polygon fill=&quot;#181818&quot; points=&quot;288.2,537.0969,279.7585,542.1705,285.33,541.1911,286.3093,546.7626,288.2,537.0969&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;/g&gt;&lt;!--link DragonflyBSD to TPLinkSwitchBD--&gt;&lt;g class=&quot;link&quot; data-entity-1=&quot;DragonflyBSD&quot; data-entity-2=&quot;TPLinkSwitchBD&quot; data-source-line=&quot;145&quot; data-uid=&quot;lnk45&quot; id=&quot;link_DragonflyBSD_TPLinkSwitchBD&quot;&gt;&lt;path codeLine=&quot;145&quot; d=&quot;M153.39,823.6069 C159.06,818.1669 164.43,812.4169 169.11,806.4469 C178.14,794.9469 258.0392,620.7154 293.6592,542.6554&quot; fill=&quot;none&quot; id=&quot;DragonflyBSD-to-TPLinkSwitchBD&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;polygon fill=&quot;#181818&quot; points=&quot;296.15,537.1969,288.7747,543.7242,294.0743,541.7457,296.0528,547.0453,296.15,537.1969&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;/g&gt;&lt;!--link MacMini to TPLinkSwitchBD--&gt;&lt;g class=&quot;link&quot; data-entity-1=&quot;MacMini&quot; data-entity-2=&quot;TPLinkSwitchBD&quot; data-source-line=&quot;146&quot; data-uid=&quot;lnk46&quot; id=&quot;link_MacMini_TPLinkSwitchBD&quot;&gt;&lt;path codeLine=&quot;146&quot; d=&quot;M145.55,188.4069 C154.45,195.3069 162.83,203.3469 169.11,212.4469 C230.58,301.5269 165.65,360.7769 229.11,448.4469 C233.74,454.8369 234.8125,456.7579 240.9725,461.9779&quot; fill=&quot;none&quot; id=&quot;MacMini-to-TPLinkSwitchBD&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;polygon fill=&quot;#181818&quot; points=&quot;245.55,465.8569,241.2697,456.9867,241.7354,462.6244,236.0978,463.0901,245.55,465.8569&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;/g&gt;&lt;!--link TinyMonster to TPLinkSwitchBD--&gt;&lt;g class=&quot;link&quot; data-entity-1=&quot;TinyMonster&quot; data-entity-2=&quot;TPLinkSwitchBD&quot; data-source-line=&quot;147&quot; data-uid=&quot;lnk47&quot; id=&quot;link_TinyMonster_TPLinkSwitchBD&quot;&gt;&lt;path codeLine=&quot;147&quot; d=&quot;M151.62,301.2269 C157.97,306.5269 163.98,312.2969 169.11,318.4469 C209.9,367.2969 187.24,400.5369 229.11,448.4469 C234.64,454.7769 236.3765,456.9299 243.2065,462.2499&quot; fill=&quot;none&quot; id=&quot;TinyMonster-to-TPLinkSwitchBD&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;polygon fill=&quot;#181818&quot; points=&quot;247.94,465.9369,243.2978,457.2507,243.9954,462.8644,238.3817,463.562,247.94,465.9369&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;/g&gt;&lt;!--link TLIPC40CFocus to APDinnerRoom--&gt;&lt;g class=&quot;link&quot; data-entity-1=&quot;TLIPC40CFocus&quot; data-entity-2=&quot;APDinnerRoom&quot; data-source-line=&quot;148&quot; data-uid=&quot;lnk48&quot; id=&quot;link_TLIPC40CFocus_APDinnerRoom&quot;&gt;&lt;path codeLine=&quot;148&quot; d=&quot;M398.16,732.8369 C421.11,734.8669 439.8231,736.5213 462.1131,738.4813&quot; fill=&quot;none&quot; id=&quot;TLIPC40CFocus-to-APDinnerRoom&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;polygon fill=&quot;#181818&quot; points=&quot;468.09,739.0069,459.475,734.2339,463.1092,738.5689,458.7742,742.2032,468.09,739.0069&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;/g&gt;&lt;!--link DoorLock to APLivingRoom--&gt;&lt;g class=&quot;link&quot; data-entity-1=&quot;DoorLock&quot; data-entity-2=&quot;APLivingRoom&quot; data-source-line=&quot;149&quot; data-uid=&quot;lnk49&quot; id=&quot;link_DoorLock_APLivingRoom&quot;&gt;&lt;path codeLine=&quot;149&quot; d=&quot;M361.84,1029.2769 C373.88,1023.4669 386.57,1016.7069 397.73,1009.4469 C432.8,986.6569 464.1967,960.2109 491.2667,935.4009&quot; fill=&quot;none&quot; id=&quot;DoorLock-to-APLivingRoom&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;polygon fill=&quot;#181818&quot; points=&quot;495.69,931.3469,486.3525,934.479,492.0039,934.7252,491.7578,940.3767,495.69,931.3469&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;/g&gt;&lt;!--link SonyTV to APLivingRoom--&gt;&lt;g class=&quot;link&quot; data-entity-1=&quot;SonyTV&quot; data-entity-2=&quot;APLivingRoom&quot; data-source-line=&quot;150&quot; data-uid=&quot;lnk50&quot; id=&quot;link_SonyTV_APLivingRoom&quot;&gt;&lt;path codeLine=&quot;150&quot; d=&quot;M354.68,954.0569 C386.09,942.8269 424.9202,928.9568 462.5402,915.5068&quot; fill=&quot;none&quot; id=&quot;SonyTV-to-APLivingRoom&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;polygon fill=&quot;#181818&quot; points=&quot;468.19,913.4869,458.3687,912.7502,463.4819,915.1701,461.062,920.2833,468.19,913.4869&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;/g&gt;&lt;!--link TLIPC40C to APLivingRoom--&gt;&lt;g class=&quot;link&quot; data-entity-1=&quot;TLIPC40C&quot; data-entity-2=&quot;APLivingRoom&quot; data-source-line=&quot;151&quot; data-uid=&quot;lnk51&quot; id=&quot;link_TLIPC40C_APLivingRoom&quot;&gt;&lt;path codeLine=&quot;151&quot; d=&quot;M380.58,830.0969 C408.01,839.8969 434.2902,849.2869 462.4002,859.3369&quot; fill=&quot;none&quot; id=&quot;TLIPC40C-to-APLivingRoom&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;polygon fill=&quot;#181818&quot; points=&quot;468.05,861.3569,460.922,854.5605,463.3419,859.6736,458.2287,862.0935,468.05,861.3569&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;/g&gt;&lt;!--link Chromecast to APLivingRoom--&gt;&lt;g class=&quot;link&quot; data-entity-1=&quot;Chromecast&quot; data-entity-2=&quot;APLivingRoom&quot; data-source-line=&quot;152&quot; data-uid=&quot;lnk52&quot; id=&quot;link_Chromecast_APLivingRoom&quot;&gt;&lt;path codeLine=&quot;152&quot; d=&quot;M380.58,887.4469 C408.01,887.4469 433.94,887.4469 462.05,887.4469&quot; fill=&quot;none&quot; id=&quot;Chromecast-to-APLivingRoom&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;polygon fill=&quot;#181818&quot; points=&quot;468.05,887.4469,459.05,883.4469,463.05,887.4469,459.05,891.4469,468.05,887.4469&quot; style=&quot;stroke:#181818;stroke-width:1;&quot; /&gt;&lt;/g&gt;&lt;!--SRC=[dLHRJnf157wVNp5FVSE2KUE3CGeeDG6x4Q8FJHyGHfq0CsPPDQPfeaLjl22IcfXMRQgbOcoz9RrOqFfdTdRbNtHtPvTTO5kDl73sV9UTFNFEIQC92KeKYdXoIe99BAA4X2a1sHGcqt4nde4IbjB8JyKa4aVe34a6g4YG23lTAR4fd4WHbCr2dpiXGDDKXEFfU285XcaIGNPzgMx_KCykuIjWy20x-obVdQetHRMwfwo_KrQBd1c8HRI_37m1UiPxDOryUy2MLzMDhprFntl1IvCKSPBALRPst4eQwUwA6WGzkBivl_jrhcvVEXan8On9AXhojVky0ZUB2Huz1ysamMxJVa2W0ooVOyihSgMav0-LlGhegt-LPlYwmN8EIucf1iSciMtSnyuEsUQoPj7gu0y-q4E-gh9ysVgkPp4Xm8LwPDFagmMviglivTdQWNgypYe5m8xUXB04eqYSHQ9wkcfPz0j-b1oXDECpVBX_TrTj_r3Pl-rtrAKp1CU61eU0NFt2IYVQVRB2vnQJTiD4-NRmA9CW9aJlIvenR6gbBQrURZRjRHqX-0J-tosCPp6PhBlnwZ_IBHRk3_YyNdv7OO_nu6omI3mHmGGRk1dR_cmhfovUiD9RTVkuReZ9V8IIh8H4GpI6IPBEPTb5GRk1XYlNRsHjbrqli49HRqRJ88Z6SPmOMXxQ2cNtZrejg1-Mk5JPMUGJ0Vg4qG5BFoWYv8y63GCpTfpuz4Z-_OcTVQoTREY7DeLSEOmaIyZ31-gUJoDY2StuWSgW69-aP28zRycTYNiz30kjla6KJKbq6ZRKkt31hWjMlUkNFIG4Eho1GPgOoJh7KjqjAfjbfRZ4SWLM-kwckPzkBhOfaMPG8fwL38Nzw3IDKZ8V6xKMv5rvfUcWGKh5C4sa-2SfxojtkPlQpd5jUz5awGlH8s9FhxLiUIQDj8ovMK7ZRlHuUerz2Xhscvvjv05xRsZWlx1sDyoUSZVKdjfML5zoTfOV3JIjKGstZmRCkMqIQJHWDuGBo2VA1J0dnGNXe-02cAtkzXP75xl0vXvnGHpBmmrrjgzH3hlYm6eP8s_N6l1MQyvQLirvkrsRaBy0]--&gt;&lt;/g&gt;&lt;/svg&gt;

&lt;p&gt;2年前也写过&lt;a href=&quot;/2020/04/add-tl-ac100/&quot;&gt;文章&lt;/a&gt;提到过家里的网络拓扑，大的变化没有，只是加了一些新设备。现在在原有电信宽带的情况下，新增一条移动宽带，主要就是把接入路由器换了，原本的TP-Link R470GP只能接入一个WAN，正好目前R86S比较火，买了个最便宜的版本，先不考虑自己折腾猫棒，能双线以太网口接入就行。另外从闲鱼收了一个TP-Link SG1210P，索性把所有面板都从同一个交换机连上，情况会简单很多。&lt;/p&gt;

&lt;p&gt;TP-Link SG1210P有3种工作模式，其中VLAN模式和视频监控模式，LAN中的设备只能与上游接入设备通信，我这里客厅的HTPC要与主卧的诸多设备互通，所以要把TP-Link SG1210P切换到标准模式。&lt;/p&gt;

&lt;p&gt;剩下的工作就是把R86S配置好，顺便把原来HTPC/Debian上的科学上网工作也移到R86S上。我给R86S装了最新的Debian 11，网上看其他做软路由的文章/视频99.9%是刷OpenWRT，我为什么不用呢，有几个原因：&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;首先最重要的是，Debian是我最喜欢的Linux发行版，没有之一。从图上可以看到，客厅的HTPC，主卧的曾经的主力旁路由，都是装的Debian，我所有的VPS上也都用的Debian。&lt;/li&gt;
  &lt;li&gt;其次，我觉得OpenWRT的可玩性不如Debian好，Debian做路由系统需要自己动手做的事更多，但另一方面讲也更自由。&lt;/li&gt;
  &lt;li&gt;Debian官方仓库的软件包更多更可信，OpenWRT这方面差一点，系统和软件包的魔改版本太多，全都自己编译的话太费时费力。&lt;/li&gt;
  &lt;li&gt;最后，对OpenWRT的质量不太信任，之前&lt;a href=&quot;/2021/01/gl-inet-mt1300/&quot;&gt;买了个GL.iNet MT1300&lt;/a&gt;，刷的是厂商定制的OpenWRT，升级系统没一次是没问题的。而我这么多不同硬件环境下的Debian系统大版本升级没一次是有问题的。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;再来讲如何将Debian配置成一个路由器。我的R86S是最低配的那款，只有3个以太网口，规划好3个口的用途，将外壳上标记的eth0和eth1作为WAN口，连接运营商的光猫，eth2作为LAN口，连接屋内的交换机。&lt;/p&gt;

&lt;p&gt;首先，在sysctl中将包转发功能打开（我不使用IPv6，不实用），root打开文件&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/etc/sysctl.conf&lt;/code&gt;，顺便把BBR也打开：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-txt&quot;&gt;net.ipv4.ip_forward=1
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;再运行一下&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sysctl -p&lt;/code&gt;使其生效。&lt;/p&gt;

&lt;p&gt;然后配置网络连接，我有3个网口，分别是&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;enp1s0&lt;/code&gt;，&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;enp2s0&lt;/code&gt;，&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;enp3s0&lt;/code&gt;，前2个分别接入电信和移动宽带，第3个作为LAN，编辑&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/etc/network/interfaces&lt;/code&gt;：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-txt&quot;&gt;# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto enp1s0
iface enp1s0 inet dhcp
#iface enp1s0 inet6 dhcp

auto enp2s0
iface enp2s0 inet dhcp
#iface enp2s0 inet6 dhcp

auto enp3s0
iface enp3s0 inet static
    address 192.168.233.1
    netmask 255.255.255.0
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;如果想用IPv6，可以把&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;inet6&lt;/code&gt;那两行注释去掉，我不用，所以就注释掉了，都使用DHCP从光猫获取IP。把内网网段设为&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;192.168.233.x&lt;/code&gt;，本机作为路由器即网关，就用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;192.168.233.1&lt;/code&gt;。再设置一下iptables转发参数，运行命令：&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;iptables &lt;span class=&quot;nt&quot;&gt;-t&lt;/span&gt; nat &lt;span class=&quot;nt&quot;&gt;-A&lt;/span&gt; POSTROUTING &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; enp1s0 &lt;span class=&quot;nt&quot;&gt;-j&lt;/span&gt; MASQUERADE
iptables &lt;span class=&quot;nt&quot;&gt;-t&lt;/span&gt; nat &lt;span class=&quot;nt&quot;&gt;-A&lt;/span&gt; POSTROUTING &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; enp2s0 &lt;span class=&quot;nt&quot;&gt;-j&lt;/span&gt; MASQUERADE
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;这时已经可以上网了，比如敲个命令&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;curl www.baidu.com&lt;/code&gt;看一下，可以得到返回的内容。如果有其他设备接入enp3s0的口，并手动将IP和子网掩码，网关分别设置到&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;192.168.233.x&lt;/code&gt;，&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;255.255.255.0&lt;/code&gt;，&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;192.168.233.1&lt;/code&gt;，其中x是[2，255]间的整数。&lt;/p&gt;

&lt;p&gt;接着使用dnsmasq作为DHCP服务器。安装好后编辑配置文件&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/etc/dnsmasq.conf&lt;/code&gt;：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-txt&quot;&gt;interface=enp3s0
dhcp-range=192.168.233.200,192.168.233.250,255.255.255.0,12h
dhcp-option=option:router,192.168.233.1
dhcp-option=option:dns-server,192.168.233.1
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;内容很简单：第1行，将服务绑定到第3个网口，第2行，设定自由分由的IP地址池以及有效时间，第3行，告知客户端使用的网关IP，第4行，告知客户端使用的DNS服务器地址。还可以绑定IP和mac地址，这样可以在后续针对某个设备做些特殊的设置：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-txt&quot;&gt;dhcp-host=00:e0:4c:68:2a:5f,192.168.233.166
dhcp-host=00:e0:4c:68:2a:60,192.168.233.66
dhcp-host=00:1E:65:41:73:C2,192.168.233.16
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;这里我将本机作为DNS服务器，dnsmasq本身也是一个DNS服务器程序，但我习惯使用CoreDNS，在&lt;a href=&quot;/2019/07/coredns-no-dns-poisoning/&quot;&gt;以前的文章&lt;/a&gt;中详细讲过。&lt;/p&gt;

&lt;p&gt;最后是配置一下分流策略，我没拿双线做负载均衡和故障转移，因为我觉得电信1000M和移动200M接入以我家里平常的使用习惯，以及凭目前的服务质量可能一年都碰不到一次需要用另一根线的情况。而流量分流的话，可能在访问某一些服务器时延迟能减少几毫秒（误！我的策略很简单，如果目的IP是归属移动的，则走移动线，否则走电信线。需要分本机流量和非本机流量两种情况处理，先处理非本机的情况，从&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;https://ispip.clang.cn/&lt;/code&gt;下载归属移动的IP地址段列表，然后添加到一个ipset中，命令如下：&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;nb&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; /tmp/cmroute.txt
curl &lt;span class=&quot;nt&quot;&gt;-sSL&lt;/span&gt; https://ispip.clang.cn/cmcc_cidr.txt | &lt;span class=&quot;k&quot;&gt;while &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;read &lt;/span&gt;line
&lt;span class=&quot;k&quot;&gt;do
    &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;add cmroute &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$line&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; /tmp/cmroute.txt
&lt;span class=&quot;k&quot;&gt;done
&lt;/span&gt;ipset create cmroute &lt;span class=&quot;nb&quot;&gt;hash&lt;/span&gt;:net family inet hashsize 1024 maxelem 512
ipset restore &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; /tmp/cmroute.txt
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;然后给&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;enp3s0&lt;/code&gt;的流入流量打个标签：&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;iptables &lt;span class=&quot;nt&quot;&gt;-A&lt;/span&gt; PREROUTING &lt;span class=&quot;nt&quot;&gt;-i&lt;/span&gt; enp3s0 &lt;span class=&quot;nt&quot;&gt;-t&lt;/span&gt; mangle &lt;span class=&quot;nt&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--match-set&lt;/span&gt; cmroute dst &lt;span class=&quot;nt&quot;&gt;-j&lt;/span&gt; MARK &lt;span class=&quot;nt&quot;&gt;--set-mark&lt;/span&gt; 10
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;再给移动线建一个新的路由表（假设叫table 10）并打了标签的流量都导到这个路由上去（192.168.1.6是移动光猫分配出来的IP）：&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;ip rule add from 192.168.1.6 table 10
ip rule add fwmark 10 table 10
ip route add 192.168.1.0/24 dev enp2s0 src 192.168.1.6 table 10
ip route add default via 192.168.1.1 dev enp2s0 table 10
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;这时接入到enp3s0口的设备访问移动网络的IP时就会走移动线路了，可以打开移动官网或手机app，感觉似乎真的快了一点点呢！&lt;/p&gt;

&lt;p&gt;最后，把本机的流量也分一下，直接改主路由表就行了：&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;curl &lt;span class=&quot;nt&quot;&gt;-sSL&lt;/span&gt; https://ispip.clang.cn/cmcc_cidr.txt | &lt;span class=&quot;k&quot;&gt;while &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;read &lt;/span&gt;line
&lt;span class=&quot;k&quot;&gt;do
    &lt;/span&gt;ip route add &lt;span class=&quot;nv&quot;&gt;$line&lt;/span&gt; dev enp2s0
&lt;span class=&quot;k&quot;&gt;done&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;路由器的基本设置就完成了。另外还可以弄一下科学上网等，这是另一个话题了，暂且略过。&lt;/p&gt;</content><author><name>missdeer</name></author><category term="TP-Link" /><category term="Debian" /><category term="双WAN" /><category term="分流" /><summary type="html">鉴于移动免费送了1年200M的一条宽带，没多犹豫决定还是要用起来。经过一番折腾，基本搞好了，目前的情况大概是这样的：</summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogassets.ismisv.com/media/2022-11-03/topo.png" /></entry></feed>