<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
    <channel>
        <title>考拉的工作日志</title>
        <link>https://coala.top</link>
            <description>热嘎嘎嘎嘎嘎嘎嘎嘎高高挂</description>
        <language>zh-CN</language>
                <item>
                    <title>
                        <![CDATA[
                            2026年1月7日 记
                        ]]>
                    </title>
                    <link>https://coala.top/archives/2026%E5%B9%B41%E6%9C%887%E6%97%A5%E8%AE%B0</link>
                    <content:encoded>
                        <![CDATA[
                                <p>两眼一睁，首先是奶牛快传发来公告，还有3天倒闭，让大家赶紧转移数据。<br />
看它挣扎了一月，心里五味杂陈。</p>
<p>然后就是淘宝的退货到了，消费者用顺丰寄的赶紧签收下了。</p>
<p>然后一个货的货源方过来了问，你是不是在网上低价卖了？</p>
<p>想起来昨天在闲鱼买到了假固态和假电源， 还没处理完。</p>
<p>昨天忙的内容电商，内容也没做出来几个。</p>
<p>小孩还是老婆，都想和他们吵一架。</p>
<p>新年的产品要赶紧测品。</p>
<p>钱钱钱！</p>
<p>难难难！</p>

                        ]]>
                    </content:encoded>
                    <pubDate>Jan 7, 2026 5:34:14 AM</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[
                            脱离工作的第四个月，谈谈生活
                        ]]>
                    </title>
                    <link>https://coala.top/archives/%E8%84%B1%E7%A6%BB%E5%B7%A5%E4%BD%9C%E7%9A%84%E7%AC%AC%E5%9B%9B%E4%B8%AA%E6%9C%88%E8%B0%88%E8%B0%88%E7%94%9F%E6%B4%BB</link>
                    <content:encoded>
                        <![CDATA[
                                <h2 id="为什么停止工作">为什么停止工作？</h2>
<p>4 个月前，直接原因是小宝宝 6 个月大，同时老婆的产假结束，急需要一个合适的人选带小孩，中途又出了很多意外，索性决定自己带到 1 岁多再去上班。</p>
<p>其他原因比较多，很久之前看 《肖申克的救赎》，有一幕是一个老头在监狱呆久了后，出狱后很不适应外面的生活，而选择自杀。</p>
<blockquote>
<p><strong>监狱是怪地方，起初你恨它，然后习惯它，更久后，你离不开它，这就叫体制化。</strong></p>
</blockquote>
<p>人的本质是一切社会关系的总和，把工作比作监狱好像也不合适，但是这本身也是种体制化。 有时也能感受到自己离不开工作，甚至说，对于工作这些年上心的有些变态，说工作是生活的 100% 有点夸张，但笔记本电脑基本是不离身的，经常到哪里都背着双肩包。</p>
<p>... 除了我想试试离开工作的感觉，还有原因是最近两年有一大半时间都是居家办公的，这种感觉很矛盾... 怎么说呢， 一方面，自由，时间，压力，人性化这些是很好，但是我认为办公室环境还是非常的有意义的，毕竟我不是个自驱能力强的人。</p>
<p>还有...  居家办公真的更高效这个事我是保持怀疑的，还有工作上的原因，最近两年的工作可以说是很酷的，接触了新的语言，还有一些新鲜的Java Web 开发之外的东西，同事的水平也很好，可是我们做的事情总体上是完全失败的，可能有很多原因，这是我第一次尝试到失败的滋味。 尽管最开始我也意识到了这种风险，但是我还是尝试了，最后失败的感觉很不好，让人沮丧，毫无意义..  就像这段车轱辘话一样，毫无意义...</p>
<p>行情也变差了，火爆的就业市场熄灭了，这都很正常，其实都在预期之中，但是失败来临了，饱和来临了，还是非常的沮丧和痛苦。</p>
<p>我觉得我需要时间，去想通很多事情，或者就是想逃避，我也不清楚，总之我需要时间。</p>
<h2 id="停止工作前的经济考量">停止工作前的经济考量</h2>
<ol>
<li>我没有负债</li>
<li>有一定存款</li>
<li>有失业金拿</li>
<li>省去了找人带小孩的费用</li>
<li>老婆虽然工资不高，但保持工作还是很有意义的，人是社会关系的总和嘛</li>
<li>房子，水电这些 0 负担</li>
</ol>
<p>理性评估是可以脱离的一段时间的。</p>
<h2 id="停止工作期间的状态变化">停止工作期间的状态变化</h2>
<p>一开始有时白天不小心睡着了，会惊醒，有种恐惧感，是因为离开工作的，但是整体问题不大。</p>
<p>后来开始跑步了，目的是心理健康和身体健康，工作这些年胖太多了，跑步可以分泌点东西，心情也好了非常多，但是也仅仅如此，毕竟不会解决问题，这是跑跑步而已。 现在能跑 3 公里了， 目标是 5 - 10 公里， 这个还是非常有意义的，成功的投资。</p>
<h2 id="圆缺失的梦">圆缺失的梦</h2>
<p>我补完了很多遗憾，基本都是 2018 年之前想的事情，那是搞编程之前的我，看完了之前买的漫画和书，有 火之鸟、风之谷、少女终末旅行、摩托日记等等等。</p>
<p>也看了很多剧和电影，很久很久没看了啊，唉！</p>
<p>游戏方面，趁着炉石回归，打了好几百小时炉石，上了传说。期间也结束了几个游戏 合金装备5 使命召唤 4、6、7、8、9、10、11、12 13、14。</p>
<p>也玩了黑神话悟空，甚至拿了白金奖杯。</p>
<p>也装了台电脑，很贵，但是也算圆梦。</p>
<p>遗憾补完对我还是有意义的，总惦记是不好的。</p>
<h2 id="回到编程">回到编程</h2>
<p>一开始还是挺有热情的，小程序开发，前端，浏览器插件开发看了个遍，AI 和 电商之类的业务也狠狠了解了下，但是热情很快就熄火了，我还是不太相信 AI，我还是认为她只是个信息检索工具，电商也好像不适合我，我找不到意义和热情，对于卖东西这件事，我还是喜欢创造一些。</p>
<p>圆梦花了很多时间，但是应该快结束了，梦想还是有限哈哈哈，运动，烹饪，带娃每天都要消耗不少时间，花到编程上的时间简直太少了。</p>
<p>从理性上分析，也没几个月的时间可以随便浪费了，我能好好利用吗?</p>
<p>整体时间还是浪费了非常多，非常多，很多工作的机会也没有抓住，可能是我的原因，也可能是运气用尽了吧...</p>
<p>真是太过丧气了！ ——  2024/11/23 03:47</p>

                        ]]>
                    </content:encoded>
                    <pubDate>Nov 22, 2024 6:50:12 PM</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[
                            用了 5 年笔记本后，为自己装个台式
                        ]]>
                    </title>
                    <link>https://coala.top/archives/%E7%94%A8%E4%BA%865%E5%B9%B4%E7%AC%94%E8%AE%B0%E6%9C%AC%E5%90%8E%E4%B8%BA%E8%87%AA%E5%B7%B1%E8%A3%85%E4%B8%AA%E5%8F%B0%E5%BC%8F</link>
                    <content:encoded>
                        <![CDATA[
                                <p>工作以来，一直用的笔记本，的确完美符合我的办公需求，游戏则用 PS5 来代替。</p>
<p>可是自己总是有个台式梦，学生时代靠着捡二手配件装的电脑总是有遗憾和妥协，这种对硬件热爱的遗憾需要补全。</p>
<p>处于补偿心理，来装台真正的新电脑吧~！</p>
<h3 id="cpu-锐龙-7800x3d">CPU: 锐龙 7800X3D</h3>
<p><img src="https://coala.top/upload/2024/10/P20240623-104419%20(1)-78dea96834384d079dcab26145371c07.jpg" alt="P20240623104419 1.jpg" /></p>
<p><img src="https://coala.top/upload/2024/10/P20240623-105214-31b55762b0e648319fb8825577ea72f8.jpg" alt="P20240623105214.jpg" /></p>
<h3 id="主板七彩虹-b650m">主板：七彩虹 B650M</h3>
<p><img src="https://coala.top/upload/2024/10/P20240623-104339-181696a64ee84bf0b7f39f965efe5440.jpg" alt="P20240623104339.jpg" /></p>
<p><img src="https://coala.top/upload/2024/10/P20240623-104949-d5ecd875c3fb4a57ba7f1ff616694477.jpg" alt="P20240623104949.jpg" /></p>
<h3 id="显卡rx-7800-xt">显卡：RX 7800 XT</h3>
<blockquote>
<p>比我的键盘都大点，散热器多少有点离谱了。</p>
</blockquote>
<p><img src="https://coala.top/upload/2024/10/P20241026-113807-828b25d72111404085b69384ed5a8794.jpg" alt="P20241026113807.jpg" /></p>
<p><img src="https://coala.top/upload/2024/10/P20241026-113711-daf6da0b153c4fce930d0a16423e203c.jpg" alt="P20241026113711.jpg" /></p>
<h3 id="内存与硬盘">内存与硬盘</h3>
<p><img src="https://coala.top/upload/2024/10/P20240623-104455%20(1)-a9aa33ad7a6f45f38de6c1f232582ea6.jpg" alt="P20240623104455 1.jpg" /></p>
<h3 id="电源">电源</h3>
<p>迫于有颗祖传的海韵，这个就没买新的了。</p>
<p><img src="https://coala.top/upload/2024/10/P20240623-104530-ce8e7da82e8145ec8856ceef6d3896c3.jpg" alt="P20240623104530.jpg" /></p>
<h3 id="滴血认亲">滴血认亲</h3>
<p>装散热器的时候刮到手了，这下血盟了，有机魂了。</p>
<p><img src="https://coala.top/upload/2024/10/P20240623-112742-f67e95e91a5a4d85af24cadce30163ff.jpg" alt="P20240623112742.jpg" /></p>
<h3 id="整机">整机</h3>
<blockquote>
<p>无需理线，内部乱乱的就挺好。</p>
</blockquote>
<p><img src="https://coala.top/upload/2024/10/Image_1730139245536-85c96e0f0b4a42618386e6aefe187fea.jpg" alt="Image_1730139245536.jpg" /></p>
<blockquote>
<p>安静的呆在角落，就是她的任务。</p>
</blockquote>
<p><img src="https://coala.top/upload/2024/10/P20241028-220258-361d5c40f93c4e5ba8fe0d9fd74133bc.jpg" alt="P20241028220258.jpg" /></p>
<p><img src="https://coala.top/upload/2024/10/P20241029-023535-591983abc218466a81fc369894b72b45.jpg" alt="P20241029023535.jpg" /></p>
<h1 id="怀旧-2016-06-22">怀旧 2016-06-22</h1>
<blockquote>
<p>这一天，价值 1200 元，全部由二手配件组装完成的电脑工作起来了，从此拥有了自己的电脑。</p>
</blockquote>
<p>很快，2016年6月28日，我成年了，18岁，从此可以合法出入网吧，但却很少去了...</p>
<p>就像今日满足自己而装的这台主机，价格与强悍性能之间的完美平衡，我拥有了，但却很少用了...</p>
<p><img src="https://coala.top/upload/2024/10/DSC_0067-58d0900dafb944679c900b05f5eac56a.jpg" alt="DSC_0067.jpg" /></p>
<p><img src="https://coala.top/upload/2024/10/2016-06-22%20173737-cd720bc923ae437b9f982cec4ef264f9.jpg" alt="20160622 173737.jpg" /></p>

                        ]]>
                    </content:encoded>
                    <pubDate>Oct 28, 2024 5:48:57 PM</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[
                            itextpdf （8.0.3）  中文、html2pdf、和 SpringBoot 中的最佳实践
                        ]]>
                    </title>
                    <link>https://coala.top/archives/itextpdf803%E4%B8%AD%E6%96%87html2pdf%E5%92%8Cspringboot%E4%B8%AD%E7%9A%84%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5</link>
                    <content:encoded>
                        <![CDATA[
                                <h2 id="废话一堆">废话一堆</h2>
<p>如此简单的需求， 中文社区 和 AI 却没有给我答案。</p>
<p>Why?</p>
<p>其实 itextpdf 本身已经做的很好了，或许英文文档也很好，只是我阅读困难，英语还是不得不练啊！ 唉 ~</p>
<h2 id="快速实战">快速实战</h2>
<h3 id="依赖的导入">依赖的导入</h3>
<p>itext-core 为核心依赖，注意 Type 为 pom，也就意味的导入了多个 Jar。</p>
<p>html2pdf 就是字面意思，用代码写 PDF，实在是太痛苦了，HTML 对于大家来说会轻松不少，并且 itextpdf 对 HTML5 也有支持，相信能满足你不小的需求。</p>
<pre><code>   &lt;dependency&gt;
            &lt;groupId&gt;com.itextpdf&lt;/groupId&gt;
            &lt;artifactId&gt;itext-core&lt;/artifactId&gt;
            &lt;version&gt;8.0.3&lt;/version&gt;
            &lt;type&gt;pom&lt;/type&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;com.itextpdf&lt;/groupId&gt;
            &lt;artifactId&gt;html2pdf&lt;/artifactId&gt;
            &lt;version&gt;5.0.4&lt;/version&gt;
        &lt;/dependency&gt;
</code></pre>
<h3 id="核心逻辑">核心逻辑</h3>
<pre><code>    public void convertHtmlToPdf(String htmlContent, String pdfFileName) {
        try {
            ConverterProperties properties = new ConverterProperties();
            FontProvider fontProvider = new FontProvider();
            // 常用字体程序及对应编码
            fontProvider.addFont(&quot;STSongStd-Light&quot;, &quot;UniGB-UCS2-H&quot;);
            properties.setFontProvider(fontProvider);
            // 将HTML字符串转换为PDF
            try (var pdfStream = new FileOutputStream(pdfFileName);) {
                HtmlConverter.convertToPdf(htmlContent, pdfStream, properties);
            }
            System.out.println(&quot;PDF created successfully.&quot;);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
</code></pre>
<p>这段代码并不复杂， 就是 HTML to PDF。</p>
<p>核心只有一行</p>
<blockquote>
<p>HtmlConverter.convertToPdf(htmlContent, pdfStream, properties);</p>
</blockquote>
<p>重点关注的只有 properties 中的 fontProvider， 为什么是 &quot;STSongStd-Light&quot;, &quot;UniGB-UCS2-H&quot; ？</p>
<p>答案在这里：</p>
<p><img src="https://coala.top/upload/2024/6/image-8a1b098147be4eccbfb2a924b8b6599d.png" alt="image.png" /></p>
<p>可以看到 itextpdf（8.0.3）的依赖中，已经支持了中文字体。</p>
<p><strong>你并不需要手动导入字体，或者去弄其他的 Jar 依赖。</strong></p>
<h2 id="html-模板对象填充文件下载">HTML 模板、对象填充、文件下载</h2>
<p>我认为直接见码更容易理解。</p>
<p>完整的例子写在了这里：</p>
<blockquote>
<p><a href="https://github.com/qq418745/itextpdf-example">https://github.com/qq418745/itextpdf-example</a></p>
</blockquote>
<p>这是生成的 PDF 的效果：</p>
<p><img src="https://coala.top/upload/2024/6/image-c5a9c9e39ef641d0bad46c8ffa152924.png" alt="image.png" /></p>

                        ]]>
                    </content:encoded>
                    <pubDate>Jun 3, 2024 4:29:39 PM</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[
                            SpringAI 实现流式调用效果， 最小与最佳实践
                        ]]>
                    </title>
                    <link>https://coala.top/archives/springai%E5%AE%9E%E7%8E%B0%E6%B5%81%E5%BC%8F%E8%B0%83%E7%94%A8%E6%95%88%E6%9E%9C%E6%9C%80%E5%B0%8F%E4%B8%8E%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5</link>
                    <content:encoded>
                        <![CDATA[
                                <p><strong>本文专注于最佳流式调用实现，所以与模型对话采用一问一答的方式。</strong></p>
<h2 id="开们见山">开们见山</h2>
<pre><code>@RestController
@AllArgsConstructor
@RequestMapping(&quot;/simple&quot;)
public class SimpleController {

    private final StreamingChatClient streamingChatClient;

    @GetMapping(value = &quot;/stream&quot;)
    public Flux&lt;String&gt; stream(String message) {
        return streamingChatClient.stream(message);
    }# 
}
</code></pre>
<p>这是一个实现流式调用的最小例子， 直接返回 Flux<String>， SpringMVC 目前是支持这样的写法，完全的异步。</p>
<p><strong>查看下响应头：</strong></p>
<p><img src="https://coala.top/upload/2024/5/image-f4ff5ac71f8c4db4b0ce8507a406fbb0.png" alt="image.png" /></p>
<p>可以看到 content-type 为 text/plain,</p>
<p>但没有关系，你依然可以采用流式读取，在前端实现打字机效果。</p>
<pre><code>const response = await fetch(url, options);
if (response.ok) {
    const reader = response.body.getReader();
    let receivedLength = 0;
    while (true) {
      const { done, value } = await reader.read();
      if (done) {
          console.log('Data fully received');
          break;
      }
      const chunk = new TextDecoder(&quot;utf-8&quot;).decode(value);
      console.log(&quot;Chunk received: &quot; + chunk);
      receivedLength += value.length;
    }
} 
</code></pre>
<p>但是这样的写法并不是太好，content-type 让人看上去的第一眼下意识认为是同步的请求，也没有指定字符集和更多的信息。</p>
<p>用 WebSocket 来实现，又显得过于复杂，只能来参考 SSE 实现了。</p>
<p><strong>server-sent_events</strong></p>
<blockquote>
<p><a href="https://www.ruanyifeng.com/blog/2017/05/server-sent_events.html">https://www.ruanyifeng.com/blog/2017/05/server-sent_events.html</a></p>
</blockquote>
<p>首先设置 正确的响应头，声明这是个流式返回</p>
<pre><code>    private final HttpServletResponse response;

    /**
     * 给当前请求设置响应头
     */
    public void setResponseHeader() {
        // Set the content type to text/event-stream
        response.setContentType(MediaType.TEXT_EVENT_STREAM_VALUE + &quot;; charset=UTF-8&quot;);
        response.addHeader(&quot;cache-control&quot;, &quot;no-cache&quot;);
        response.addHeader(&quot;connection&quot;, &quot;keep-alive&quot;);
    }

</code></pre>
<p>然后 Spring 会认为这是个 SEE 响应， 会按照 SSE 标准报文去封装你的响应。</p>
<p>这样：</p>
<blockquote>
<p>data:  message\n\n</p>
</blockquote>
<p><img src="https://coala.top/upload/2024/5/image-3469e596e13b48719bf9c93f252e4a26.png" alt="image.png" /></p>
<p>SSE 格式的报文，对于实现流式会话来说，似乎有些臃肿，因为会话模型基本一次只返回一个词，并且报文格式对于对话来说并未卵用。</p>
<p>并且，SSE 协议规定只能用 GET 请求，但是想实现会话效果的话，很明显，需要 Body 传递报文信息。</p>
<p>但.</p>
<p><strong>POST 请求难道不能流式返回吗？</strong></p>
<p><strong>当然可以！</strong></p>
<p>第一个例子中 content-type 为 text/plain，你依然可以流式读取响应，只不过没有对返回数据的格式进行声明，这总是不太好的。</p>
<p><strong>POST + 流式返回，已经没有完全遵守 SSE 协议了，再加个自定义报文格式又如何？</strong></p>
<p>想要完全异步的，再 SpringMVC 中实现自定义响应内容， 你可以使用 ResponseBodyEmitter 。</p>
<pre><code>  @PostMapping(value = &quot;/async/stream&quot;)
    public ResponseBodyEmitter stream2(@RequestBody MessageHistory messageHistory) {

        sessionService.setResponseHeader();

        final ResponseBodyEmitter emitter = new ResponseBodyEmitter();

        // 模型名称, 按需处理
        String model = messageHistory.getModel();

        Message[] messages = sessionService.getMessages(messageHistory);
        streamingChatClient.stream(messages)
                .subscribe(
                        message -&gt; {
                            try {
                                // emitter.send(&quot;data:&quot; + message + &quot;\n\n&quot;); 这是遵守 SSE 规范的写法.这里不遵守。
                                emitter.send(message);
                            } catch (IOException e) {
                                emitter.completeWithError(e);
                            }
                        },
                        error -&gt; emitter.completeWithError(error),
                        () -&gt; emitter.complete()
                );

        return emitter;
    }
</code></pre>
<p>简单又直接的返回报文...  我觉得这很好。</p>
<p><img src="https://coala.top/upload/2024/5/image-212a216b27e249b9a3d2c0fac2d75834.png" alt="image.png" /></p>
<p>这里是完整的示例代码</p>
<blockquote>
<p><a href="https://github.com/qq418745/spring-ai-example">https://github.com/qq418745/spring-ai-example</a></p>
</blockquote>

                        ]]>
                    </content:encoded>
                    <pubDate>May 8, 2024 3:29:41 PM</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[
                            初探 SpringAI， 一次漫长的 Debug 之旅
                        ]]>
                    </title>
                    <link>https://coala.top/archives/%E5%88%9D%E6%8E%A2springai%E4%B8%80%E6%AC%A1%E6%BC%AB%E9%95%BF%E7%9A%84debug%E4%B9%8B%E6%97%85</link>
                    <content:encoded>
                        <![CDATA[
                                <p>Spring Al 项目为开发 AI 应用程序提供了一个 Spring 友好的 API 和抽象。</p>
<blockquote>
<p><a href="https://github.com/spring-projects/spring-ai">https://github.com/spring-projects/spring-ai</a></p>
</blockquote>
<p>阿里通义也提供了抽象的实现和 Demo：</p>
<blockquote>
<p><a href="https://github.com/alibaba/spring-cloud-alibaba/tree/2023.x/spring-cloud-alibaba-examples/spring-cloud-ai-example">https://github.com/alibaba/spring-cloud-alibaba/tree/2023.x/spring-cloud-alibaba-examples/spring-cloud-ai-example</a></p>
</blockquote>
<p>对话想实现一个个字蹦出来的，一般要用到 SSE， 对应的 OpenAI 接口：</p>
<pre><code>curl https://api.openai.com/v1/chat/completions \
  -H &quot;Content-Type: application/json&quot; \
  -H &quot;Authorization: Bearer $OPENAI_API_KEY&quot; \
  -d '{
    &quot;model&quot;: &quot;No models available&quot;,
    &quot;messages&quot;: [
      {
        &quot;role&quot;: &quot;system&quot;,
        &quot;content&quot;: &quot;You are a helpful assistant.&quot;
      },
      {
        &quot;role&quot;: &quot;user&quot;,
        &quot;content&quot;: &quot;Hello!&quot;
      }
    ],
    &quot;stream&quot;: true
  }'

</code></pre>
<p>这里比较重要的是 &quot;stream&quot;: true，决定了响应是流式调用。</p>
<p>因为无法抗拒的网络问题，我选使用代理服务去访问 api.openai.com，测试的时候，先用 OpenAI Node 成功的进行了测试。</p>
<blockquote>
<p><a href="https://github.com/openai/openai-node">https://github.com/openai/openai-node</a></p>
</blockquote>
<p>然后就是 Spring AI 上了，结果却遇到了问题。</p>
<p>Spring AI 中接收 OpenAI 接口响应的 Body 中， 多出了个 &quot;data：&quot;， 转换JSON 报错：</p>
<p><img src="https://coala.top/upload/2024/5/1714703064284-9ba94f5ead0443f4a229ad749f697a02.jpg" alt="1714703064284.jpg" /></p>
<p>我的第一反应是 Spring AI 是不是有些问题，即使使用了代理服务， OpenAI Node 中可以正常工作。</p>
<p>带着这个疑问，开始了漫长的 Debug 之路...</p>
<p>首先， 响应的 body 中 &quot;data：&quot; 是没有问题的， SSE 规范就是这样，然后 Spring AI 使用了 Spring WebFlux 去发送这个请求，WebFlux 针对 SSE 请求会自动处理掉 &quot;data：&quot;， 但是这里为什么还是收到了 &quot;data：&quot; ?</p>
<p>疑问很快转移到了 Spring WebFlux， 经过 Debug 发现了比较关键的代码：</p>
<blockquote>
<p>org.springframework.http.codec.ServerSentEventHttpMessageReader</p>
</blockquote>
<p><img src="https://coala.top/upload/2024/5/image-51dc975f27c64f10844a687a47ab5af3.png" alt="image.png" /></p>
<p>这里处理了 SSE 请求的 &quot;data: &quot;， 遂先关注这里，测试发现正常 SSE 的请求的确会走这里，但是我使用的这个代理站的返回却没走到这里。</p>
<p>这里基本确认了没处理 &quot;data: &quot; 的原因。 但是为什么没有走到这里？</p>
<p>随后在 Spring WebFlux 中的：</p>
<blockquote>
<p>org.springframework.web.reactive.function.BodyExtractors#readWithMessageReaders</p>
</blockquote>
<p><img src="https://coala.top/upload/2024/5/image-e01fb4c98d7c4d02a8e49357054b40c7.png" alt="image.png" /></p>
<p>这里的逻辑是根据 content-type，去找到合适的 HttpMessageReader 读 Body. Debug 信息中显示里面有足足 15 个 Reader。</p>
<p>经过跟踪发现出现问题的请求响应进了：</p>
<blockquote>
<p>org.springframework.http.codec.DecoderHttpMessageReader</p>
</blockquote>
<p>ServerSentEventHttpMessageReader 和 DecoderHttpMessageReader 都是 org.springframework.http.codec.HttpMessageReader 接口的实现。</p>
<p><img src="https://coala.top/upload/2024/5/image-4bc0ba346aac479fa47fce0f6b7bd84f.png" alt="image.png" /></p>
<p>没有进 ServerSentEventHttpMessageReader 是因为代理服务器返回的</p>
<p>&quot;content-type: text/plain; charset=utf-8&quot;，而不是正确的 &quot;content-typ: text/event-stream&quot; 。</p>
<p><img src="https://coala.top/upload/2024/5/image-57be2ad124ed40ff80a4572fb05ca06d.png" alt="image.png" /></p>
<p>最后的问题，为什么 OpenAI Node 可以呢？</p>
<p>我是懒得再 Debug 了，但是我觉得 Spring 的这个实现也是没有问题的，毕竟发错了响应头。</p>

                        ]]>
                    </content:encoded>
                    <pubDate>May 3, 2024 2:14:03 AM</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[
                            正确的访问 Nacos  
                        ]]>
                    </title>
                    <link>https://coala.top/archives/%E6%AD%A3%E7%A1%AE%E7%9A%84%E8%AE%BF%E9%97%AEnacos%E4%B8%8D%E8%83%BD%E6%9A%B4%E9%9C%B2%E5%9C%A8%E5%85%AC%E7%BD%91%E7%9A%84%E5%86%85%E9%83%A8%E6%9C%8D%E5%8A%A1</link>
                    <content:encoded>
                        <![CDATA[
                                <p>Nacos 和一些工具，有 Web 控制台，但不适合暴露在公网，毕竟很容易出现较大的安全风险，如果正确的，简单的去访问呢？</p>
<p>如此简单的问题，有个跳板机（堡垒机）不就好了？</p>
<p>可是小公司，还真没有跳板机，毕竟也是要钱的，一方面能省则省，一方面只有几个人用，想访问 Web又要带图形化，得是带宽高的机子。</p>
<p>最合适的方案可能是搭建 VPN 网络， 但是这个也是一样的，要台服务器。<br />
可能公司稍大本身就有 VPN 网络办公机制， 但是小公司还是那个问题， 没有。</p>
<p>在 Local 访问服务器上某个端口， 利用 SSH 隧道就好 （SSH Tunnel），</p>
<p>我用的还是 MobaXterm。</p>
<p>SSH Tunnel 不在默认的 List 中， 你得自己调出来。</p>
<p><img src="https://coala.top/upload/2024/3/image-601bae7803a34f688652e82f27e89e86.png" alt="image.png" /></p>
<p><img src="https://coala.top/upload/2024/3/image-ea663a64ea654e79a41f44a039d814e0.png" alt="image.png" /></p>
<p><img src="https://coala.top/upload/2024/3/image-1902e31f03084d5ab73d103f182ab30e.png" alt="image.png" /></p>
<p>很简单的办法是吧？</p>
<p>但是搜索 &quot;nacos 外网怎么访问&quot; 之类的，却没有人提，难道的是我的需求太小众了?</p>
<p>还有很多人没有安全意识，直接说安全组放行，这是非常危险的！</p>
<p>我也是测试环境为了方便，直接公网放行了 Nacos，很快就被人扫到了，利用漏洞进来了。</p>
<p>我这边用的是 2.0.3 的版本， 可以说是安全毫无保障。</p>
<p>并且从修复历史来看， Nacos 基本可以说没考虑安全的事情， 一定别暴露在公网！</p>
<p>相关漏洞：<br />
<a href="https://github.com/SexyBeast233/SecBooks/blob/main/%E3%80%90%E5%85%AC%E4%BC%97%E5%8F%B7%E6%96%87%E7%AB%A0%E3%80%91bugs/Nacos%E6%9D%83%E9%99%90%E7%BB%95%E8%BF%87.md">https://github.com/SexyBeast233/SecBooks/blob/main/%E3%80%90%E5%85%AC%E4%BC%97%E5%8F%B7%E6%96%87%E7%AB%A0%E3%80%91bugs/Nacos%E6%9D%83%E9%99%90%E7%BB%95%E8%BF%87.md</a></p>
<p><a href="https://github.com/alibaba/nacos/issues/4593">https://github.com/alibaba/nacos/issues/4593</a></p>
<p>不得不吐槽一句，即使不暴露在公网，内网中的人可以通过扫描的方式，找到内网中的 Nacos，然后轻易的进入 Nacos。</p>
<p>大公司内网也有完整的鉴权吧，或许可以规避，可是开源出来，用户使用上并感知不到这些安全问题，也没有任何的提示...</p>
<p>唉！</p>

                        ]]>
                    </content:encoded>
                    <pubDate>Mar 5, 2024 4:17:58 PM</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[
                            2024/1/19 我的年终总结
                        ]]>
                    </title>
                    <link>https://coala.top/archives/2024119%E6%88%91%E7%9A%84%E5%B9%B4%E7%BB%88%E6%80%BB%E7%BB%93</link>
                    <content:encoded>
                        <![CDATA[
                                <p>又一年过去，我即将 26 周岁，昨天称了体重，是 86 KG， 这很重。</p>
<p>2019 年 6 月，我拿到了第一个月的工资，体重大约是 60 KG。</p>
<p>感觉又要到了一个需要抉择的时间，我竟然要奔3了， 不敢想象。</p>
<p>大约 2018 年 11 月之前， 我的生活大概完全属于自己，睡觉，电子游戏，还是发呆，唯一的问题就是生活太拮据了，并且 19 年需要毕业。</p>
<p>货币是财富的索取权。</p>
<p>我需要货币，需要搞钱，经历了痛苦的抉择，决定了趁着互联网行业还热乎，赶紧去喝口汤。</p>
<p>我所有的信息都来自互联网，现实世界中没任何渠道，任何人能帮助我，还是非常感谢互联网提供了非常多的免费的信息。</p>
<p>18 年 12 月开始发力学习编程，这段时间房租和吃饭，简直消耗光了我的钱，似乎容不得半点失误。19 年 6 月拿到毕业证，一切事情都按照着我的计划，我拿到了毕业证，也准备好了面试，入职了公司。</p>
<p>编程工作对我来说是极好的。</p>
<p>办公室工作，双休，8 小时工作制，是当时的我无法理解的，</p>
<p>自卑之人无法理解平常人的权力，这句话或许可以改改，对口专业是工厂的人的确是无法理解双休和 8 小时工作制的。</p>
<p>父母也只会问包吃住吗？ 多少钱？</p>
<p>花了一段时间，我也 “适应” 了常人的权力，同时工作的 1 - 3 年， 是我的成长期，工作技能还是钱，都是快速的成长了。</p>
<p>当然，也伴随了变态多的加班时常。</p>
<p>一个月能挣一两万，是我认知之外的，但是的确做到了，自己都觉得惊讶，同时也觉得世界荒谬，是自己的能力吗？还是幸运，还是认知的改变，我到现在也没有搞清楚，货币到底是怎么分配到每个人头上的。</p>
<p>工作的第三年， 也就是 22 年，我选择放弃了买房，因为买房意味着贷款，贷款就是借钱，借钱就意味着利息，我可不想成为银行的优质资产。</p>
<p>我想先借钱给银行，先这样再说，</p>
<p>借钱给银行就是存款。</p>
<p>22 年中旬到现在的工作，做的内容可以说不仅仅是 Web Java 开发，接触了非常多的东西，痛苦也有趣。</p>
<p>工作，家庭，生活，体重，</p>
<p>有很多书和漫画没看，很多游戏没打，英语也没学。</p>
<p>也想休息。</p>
<p>23年有什么好总结的呢？</p>
<p>我想不出来自己完成了什么必须的重要的事，</p>
<p>虽然我很确认，编码工作这块我依然有长进，是值得的一年。</p>
<p>多挣钱是好的，但是再往上又到了我的认知之外，似乎无路可走。</p>
<p>把时间全还给自己吗？</p>
<p>却总伴随着一种焦虑...</p>
<p>为什么休息会让人不安？</p>
<p>我好像需要更多的时间，想清楚各种为什么。</p>
<p>总之</p>
<p>保持热爱...</p>

                        ]]>
                    </content:encoded>
                    <pubDate>Jan 19, 2024 6:26:23 AM</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[
                            Electron app： 制作 macOS Windows Linux 下的图标
                        ]]>
                    </title>
                    <link>https://coala.top/archives/electronforge%E5%88%B6%E4%BD%9Cmacwindowslinux%E4%B8%8B%E7%9A%84%E5%9B%BE%E6%A0%87</link>
                    <content:encoded>
                        <![CDATA[
                                <p>我使用的打包工具是：Electron Forge</p>
<p>这是推荐的图标格式和像素。</p>
<blockquote>
<p><a href="https://www.electronforge.io/guides/create-and-add-icons">https://www.electronforge.io/guides/create-and-add-icons</a></p>
</blockquote>
<p><img src="https://coala.top/upload/2023/11/image-3318694ad69d4d64a620c0ede8a98a9f.png" alt="image.png" /></p>
<p>设计的图标先转为了 SVG 格式，因为 SVG 可以转换成任意像素。</p>
<p>然后将图标转为了 256x256 和 512x512 px 的 .png。</p>
<p>512x512 的 .png 为 Linux 使用。</p>
<blockquote>
<p><a href="https://ezgif.com/svg-to-png/">https://ezgif.com/svg-to-png/</a></p>
</blockquote>
<p>256x256 的 .png转成 .ico ， Windows 使用。</p>
<blockquote>
<p><a href="https://cloudconvert.com/png-to-ico">https://cloudconvert.com/png-to-ico</a></p>
</blockquote>
<p>macOS 的稍稍麻烦。</p>
<p>macOS 的设计标准：</p>
<p><img src="https://coala.top/upload/2023/11/image-0222a688a2754a3e8f71e2bd364c89b8.png" alt="image.png" /></p>
<p>蓝色部分为透明的，如果没有外围这一圈，部分屏幕上图标会比别的 app 大一圈。</p>
<p>512x512 的 .png，需要转换成 .icns。</p>
<blockquote>
<p><a href="https://cloudconvert.com/png-to-icns">https://cloudconvert.com/png-to-icns</a></p>
</blockquote>
<p>.icns 格式， Windows 又要找软件才看查看， 我用的 XnShell。</p>
<p>我没有制作 @2x ，测试貌似默认大小即可满足大部分情况。</p>
<p>参考：</p>
<p><a href="https://developer.apple.com/design/resources/">https://developer.apple.com/design/resources/</a></p>
<p><a href="https://stackoverflow.com/questions/71118094/why-is-my-app-icon-bigger-than-the-others-in-the-macos-dock">https://stackoverflow.com/questions/71118094/why-is-my-app-icon-bigger-than-the-others-in-the-macos-dock</a></p>
<p><a href="https://www.figma.com/file/46cgcXKEQWqcdDRjonKUGc/macOS-Big-Sur-icon-template-(Community)?type=design&amp;node-id=37-2&amp;mode=design&amp;t=0jrMMoK5KCutXwm5-0">https://www.figma.com/file/46cgcXKEQWqcdDRjonKUGc/macOS-Big-Sur-icon-template-(Community)?type=design&amp;node-id=37-2&amp;mode=design&amp;t=0jrMMoK5KCutXwm5-0</a></p>

                        ]]>
                    </content:encoded>
                    <pubDate>Nov 22, 2023 8:04:21 AM</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[
                            HTTPS? 坚守 HTTP 协议面临的问题与解决方案 
                        ]]>
                    </title>
                    <link>https://coala.top/archives/https%E5%9D%9A%E5%AE%88http%E5%8D%8F%E8%AE%AE%E9%9D%A2%E4%B8%B4%E7%9A%84%E9%97%AE%E9%A2%98%E4%B8%8E%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88</link>
                    <content:encoded>
                        <![CDATA[
                                <p>HTTPS 可能即将胜利，但 HTTP 的需求依然客观存在，在 2023 年使用 HTTP ，分享一些经验和问题。</p>
<p>迫于 Google Chrome （Edge）极高的市场占有率，交付标准以 Chrome 为准。</p>
<h2 id="appdev-等域名无法使用-http强制-https">.app、.dev 等域名无法使用 HTTP，强制 HTTPS。</h2>
<p>这是个无解的问题，你必须避开这些域名。 Chrome 会针对这些域名，直接 307 到 HTTPS。<br />
下图就是例子，而这与 HSTS 有关。</p>
<p><img src="https://coala.top/upload/2023/11/image-8896832df80c4458aa7109e201509862.png" alt="image.png" /></p>
<h2 id="hsts">HSTS</h2>
<p>简而言之，只要域名在 HSTS 列表中，就会由浏览器直接 HTTP -&gt; HTTPS，这是硬编码在浏览器中的。这其中又会有两种情况，像 .app、.dev 这种是整个顶级域名必须 HTTPS， 其他历史悠久的顶级域名 .com、.cn、.org 这种，则是通过响应头的方式，才会被收录到 HSTS 中， 并且一旦被收录，只有在设置的不短的有效时间过期后，才能重新 HTTP 访问。</p>
<p>你可以在这里检查域名的 HSTS 情况：</p>
<p><a href="https://hstspreload.org/">https://hstspreload.org/</a></p>
<h2 id="chrome-307-internal-redirect">Chrome &quot;307 Internal Redirect&quot;</h2>
<p>&quot;307 Temporary Redirect&quot; 是正常的307。</p>
<p>“307 Internal Redirect” 是 Chrome 内部的行为，一个假请求。</p>
<p>这时你需要关注响应头 <strong>Non-Authoritative-Reason</strong>。</p>
<p><strong>“Non-Authoritative-Reason: HSTS”</strong> 代表 域名在 HSTS列表中，也就是别做 HTTP 访问的美梦。</p>
<p>使用 cloudflare 时， 部分地区出现了 “307 Internal Redirect” “Non-Authoritative-Reason: DNS” 。</p>
<p><img src="https://coala.top/upload/2023/11/image-f362ee9a9c71495db0fb7a95d03fd9be.png" alt="image.png" /></p>
<p>代表了什么？ 我弄不清楚原因，总之我测试的结果， 一些 DNS 在 Chrome 中会导致 &quot;307 Internal Redirect&quot; “Non-Authoritative-Reason: DNS”。</p>
<p>火狐中没有强制 HTTPS 的现象。</p>
<p>Chrome 中现象是访问出现本地磁盘缓存的 &quot;307 Internal Redirect&quot; 重定向到 HTTPS， 即使 HTTPS 上没有任何东西。但挂 VPN 访问则又可直接 HTTP 访问，可是域名并不在 HSTS 中，Chrome 为什么要这么做 ？</p>
<p>想解决只能不使用 cloudflare 了吧。</p>
<p>花了很多时间，找了很多资料， 为什么会 &quot;307 Internal Redirect&quot; “Non-Authoritative-Reason: DNS” 想的我是睡不着啊....</p>
<h2 id="避开无处不在的升级">避开无处不在的升级</h2>
<p>浏览器地址栏 和 一些软件的跳转中，HTTP 自动升级到 HTTPS 无处不在。<br />
很要必须把 HTTPS 重定向到 HTTP，避免一些潜在问题，同时一定要避开 HSTS 和 Google DNS HTTPS Records。</p>
<p>参考：</p>
<p><a href="https://docs.google.com/document/d/1k461sRbddjDGj7Q8f-ZKHZvmB-ENUWSdX_3Fpp2dmXQ/edit">https://docs.google.com/document/d/1k461sRbddjDGj7Q8f-ZKHZvmB-ENUWSdX_3Fpp2dmXQ/edit</a></p>
<p><a href="https://hstspreload.org/#tld">https://hstspreload.org/#tld</a></p>
<p><a href="https://stackoverflow.com/questions/50258202/how-does-google-force-https-on-their-app-tld">https://stackoverflow.com/questions/50258202/how-does-google-force-https-on-their-app-tld</a></p>
<p><a href="https://community.cloudflare.com/t/subdomain-with-ssl-off-redirects-too-many-times/436036">https://community.cloudflare.com/t/subdomain-with-ssl-off-redirects-too-many-times/436036</a></p>
<p><a href="https://serverfault.com/questions/1067229/list-of-top-level-domains-tlds-that-require-https-connections-like-dev">https://serverfault.com/questions/1067229/list-of-top-level-domains-tlds-that-require-https-connections-like-dev</a></p>
<p><a href="https://stackoverflow.com/questions/70705778/chrome-redirects-and-makes-2-requests-of-the-same-page-307-internal-redirect">https://stackoverflow.com/questions/70705778/chrome-redirects-and-makes-2-requests-of-the-same-page-307-internal-redirect</a></p>
<p><a href="https://stackoverflow.com/questions/27945501/307-redirect-when-loading-analytics-js-in-chrome">https://stackoverflow.com/questions/27945501/307-redirect-when-loading-analytics-js-in-chrome</a></p>
<p><a href="https://www.cnblogs.com/Don/p/12192420.html">https://www.cnblogs.com/Don/p/12192420.html</a></p>

                        ]]>
                    </content:encoded>
                    <pubDate>Nov 16, 2023 3:40:17 AM</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[
                            ROS Docker 下使用的一点小得。 
                        ]]>
                    </title>
                    <link>https://coala.top/archives/rosdocker%E4%B8%8B%E4%BD%BF%E7%94%A8%E7%9A%84%E4%B8%80%E7%82%B9%E5%BF%83%E5%BE%97</link>
                    <content:encoded>
                        <![CDATA[
                                <p><img src="https://coala.top/upload/2023/8/image-9d600ec83e204430b2345ec83fe9db6f.png" alt="image.png" /></p>
<p>最近经常需要轻度使用下 ROS，ros2 和 ros1 都要用，我本身又用惯了 Windows，所以用 Docker 是比较好的解决方案， 桌面需求用 Web-vnc 解决。</p>
<p>所使用项目：</p>
<pre><code>//ros2
https://github.com/Tiryoh/docker-ros2-desktop-vnc

//ros
https://github.com/Tiryoh/docker-ros-desktop-vnc
</code></pre>
<p>Tiryoh 提供了几乎所有版本的，多平台的 Base Image，所以我这里相当是提供了个具体的使用经验分享。</p>
<p>用 ROS2:humble 版本为例子。</p>
<p>源：</p>
<blockquote>
<p><a href="https://github.com/Tiryoh/docker-ros2-desktop-vnc/blob/master/humble">https://github.com/Tiryoh/docker-ros2-desktop-vnc/blob/master/humble</a></p>
</blockquote>
<p>由 DockerFile 可以看到作者是按 ubuntu:jammy-20230804 作为基础镜像， 一点点装ROS进去的，同时也装了 Tigervnc， 因为有很清晰的 <strong><a href="https://github.com/Tiryoh/docker-ros2-desktop-vnc/blob/master/humble/Dockerfile">DockerFile</a></strong> 和 <strong><a href="https://github.com/Tiryoh/docker-ros2-desktop-vnc/blob/master/humble/entrypoint.sh">entrypoint.sh</a></strong>， 你也可以自己定制一个 Image。</p>
<p>例如在镜像中装上 bridge ：</p>
<pre><code>FROM tiryoh/ros2-desktop-vnc:humble

RUN apt-get update

RUN apt-get install ros-humble-foxglove-bridge -y

RUN apt-get install ros-humble-rosbridge-server -y
</code></pre>
<p>使用中遇到的一个问题：</p>
<p>有的环境下（例如比较老的CentOS），VNC会启动异常，导致无法进入 Desktop， 这个问题的解决重点在 <strong><a href="https://github.com/Tiryoh/docker-ros2-desktop-vnc/blob/master/humble/entrypoint.sh">entrypoint.sh</a></strong> 中</p>
<p><img src="https://coala.top/upload/2023/8/image-429bab7e1f644c1b99d17c0f9dba15bc.png" alt="image.png" /></p>
<p><strong>Supervisor 是个进程管理工具，可以看到是在这一步中启动的VNC</strong></p>
<p>gosu '$USER', 是转换成当前用户执行，如果你的VNC启动出现问题，可以试着用root启动试试。</p>

                        ]]>
                    </content:encoded>
                    <pubDate>Aug 26, 2023 9:09:33 AM</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[
                            K8S 中 AWS ECR 自动登录（更新 Token）
                        ]]>
                    </title>
                    <link>https://coala.top/archives/k8s%E4%B8%ADawsecr%E8%87%AA%E5%8A%A8%E7%99%BB%E5%BD%95%E6%9B%B4%E6%96%B0token</link>
                    <content:encoded>
                        <![CDATA[
                                <p>AWS 容器注册表(ECR) 主要为 Docker 容器提供镜像仓库服务。</p>
<p>但是，ECR Docker 凭据每12小时过期一次。</p>
<p>也就是每12小时就要重新登录一次，真是反人类的设定。</p>
<p><strong>利用 Kubernetes 的 jobs，定时任务去更新这个 Token</strong>，可以解决这个麻烦。</p>
<p>想要获取 Token，又必须依赖 AWS 的 eksctl，也就是说，跑 Job 任务的容器中必须要安装 eksctl，也必须安装 kubectl。</p>
<ol>
<li>eksctl 获取到 Token</li>
<li>kubectl 去把 Token 更新到 K8S 的 Secret 中。</li>
</ol>
<p>真是恶心的事，自己做是太麻烦了，找了挺久才找到一个项目去做这些，</p>
<p>项目地址：</p>
<blockquote>
<p><a href="https://github.com/nabsul/k8s-ecr-login-renew">https://github.com/nabsul/k8s-ecr-login-renew</a></p>
</blockquote>
<p>作者提供了两种方式：</p>
<ol>
<li>helm chart，这种最方便，但是我想用 yalm 的形式保存在仓库中，所以选择了第二种。</li>
<li>yalm 文件， kubectl apply 执行。</li>
</ol>
<h2 id="使用-yaml-文件更新ecr-token">使用 YAML 文件更新ECR Token</h2>
<h3 id="前提条件">前提条件</h3>
<p>创建一个 Secret，用来保存 AWS 的凭据，这里为 k8s-ecr-login-renew-aws-secret.yaml</p>
<pre><code>apiVersion: v1
kind: Secret
metadata:
  name: k8s-ecr-login-renew-aws-secret
data:
  AWS_ACCESS_KEY_ID: Your keyId （记得Base64编码）
  AWS_SECRET_ACCESS_KEY: Your aceessId （记得Base64编码）
</code></pre>
<h3 id="开始">开始</h3>
<p>创建 k8s-ecr-login-renew-aws-secret.yaml</p>
<pre><code>---
# ServiceAccount
apiVersion: v1
kind: ServiceAccount
metadata:
  name: k8s-ecr-login-renew-account
  namespace: default
---
# ClusterRole 
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: k8s-ecr-login-renew-role
rules:
  - apiGroups: [&quot;&quot;]
    resources:
      - namespaces
    verbs:
      - list
  - apiGroups: [&quot;&quot;]
    resources:
      - secrets
      - serviceaccounts
      - serviceaccounts/token
    verbs:
      - 'delete'
      - 'create'
      - 'patch'
      - 'get'
---
# ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: k8s-ecr-login-renew-binding
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: k8s-ecr-login-renew-role
subjects:
  - kind: ServiceAccount
    name: k8s-ecr-login-renew-account
    namespace: default
---
# CronJob 重点在这里
apiVersion: batch/v1
kind: CronJob
metadata:
  name: k8s-ecr-login-renew-cron
  namespace: default
spec:
  schedule: &quot;* */6 * * *&quot;
  successfulJobsHistoryLimit: 3
  failedJobsHistoryLimit: 5
  jobTemplate:
    spec:
      template:
        metadata:
        spec:
          serviceAccountName: k8s-ecr-login-renew-account
          terminationGracePeriodSeconds: 0
          restartPolicy: Never
          containers:
          - name: k8s-ecr-login-renew
            imagePullPolicy: IfNotPresent
            image: nabsul/k8s-ecr-login-renew:v1.7.1
            env:
            # 这里引用了上一步创建的Secret，保存AWS的凭据的Secret。
            - name: AWS_ACCESS_KEY_ID
              valueFrom:
                secretKeyRef:
                  name: k8s-ecr-login-renew-aws-secret
                  key: AWS_ACCESS_KEY_ID
            - name: AWS_SECRET_ACCESS_KEY
              valueFrom:
                secretKeyRef:
                  name: k8s-ecr-login-renew-aws-secret
                  key: AWS_SECRET_ACCESS_KEY
            # region name，切换为你的账户的。
            - name: AWS_REGION
              value: cn-north-1
            # 最终生成的Secret， kubectl get Secrets可以看到。
            - name: DOCKER_SECRET_NAME
              value: dg-ecr-pull
            - name: TARGET_NAMESPACE
              value: default
            # 我这里是AWS中国 地址是amazonaws.com.cn，记得切换为你的。
            - name: DOCKER_REGISTRIES
              value: https://123456789.dkr.ecr.cn-north-1.amazonaws.com.cn

</code></pre>
<h3 id="apply-job">Apply Job</h3>
<pre><code>kubectl apply k8s-ecr-login-renew-aws-secret.yaml
</code></pre>
<h3 id="测试-job">测试 Job</h3>
<p>创建一个 Test 的 Job， （此 pod 可随意删除）</p>
<pre><code>kubectl create job --from=cronjob/k8s-ecr-login-renew-cron k8s-ecr-login-renew-cron-manual-1
</code></pre>
<pre><code>kubectl get secret
</code></pre>
<p>如果能看到 dg-ecr-pull，就是 OK 的啦！</p>
<p><img src="https://coala.top/upload/2023/8/image-a7c36db4064d49fd8b2d83c06acd71f4.png" alt="image.png" /></p>
<h2 id="使用-secret-登录">使用 Secret 登录</h2>
<p>deployment.yaml 中，配置 imagePullSecrets 属性就好。</p>
<pre><code>    spec:
      imagePullSecrets:
        - name: dg-ecr-pull
</code></pre>

                        ]]>
                    </content:encoded>
                    <pubDate>Aug 2, 2023 3:00:55 PM</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[
                            Docker 下运行 Emqx，数据卷挂载提示权限不足解决。
                        ]]>
                    </title>
                    <link>https://coala.top/archives/docker%E4%B8%8B%E8%BF%90%E8%A1%8Cemqx%E6%95%B0%E6%8D%AE%E5%8D%B7%E6%8C%82%E8%BD%BD%E6%8F%90%E7%A4%BA%E6%9D%83%E9%99%90%E4%B8%8D%E8%B6%B3%E8%A7%A3%E5%86%B3</link>
                    <content:encoded>
                        <![CDATA[
                                <p>错误:  mkdir: cannot create directory ‘/opt/emqx/data/configs’: Permission denied</p>
<p>错误: ERROR: emqx.conf is not found in /opt/emqx/etc</p>
<p>按照 EMQX 文档启动，默认是不带目录挂载的。</p>
<blockquote>
<p><a href="https://www.emqx.io/docs/en/v5.1/deploy/install-docker.html">https://www.emqx.io/docs/en/v5.1/deploy/install-docker.html</a></p>
</blockquote>
<pre><code>docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083  emqx:5.1.3
</code></pre>
<p>5.1.3 版本需要挂载出来以下目录才能持久化：</p>
<ul>
<li>/opt/emqx/data</li>
<li>/opt/emqx/etc</li>
<li>/opt/emqx/log</li>
</ul>
<p>但是启动加上 -v 挂载后， 会报错：</p>
<blockquote>
<p><strong>mkdir: cannot create directory ‘/opt/emqx/data/configs’: Permission denied</strong></p>
</blockquote>
<p>原因很简单，EMQX 的镜像内 Linux 用户为 emqx，组为 emqx，并非 root 用户。</p>
<p>-v 创建目录时候默认用的一般是 root 用户，这时候 emqx 在 root 下的目录创建文件自然就权限不足。</p>
<p>这一点进入容器中可以看到。</p>
<blockquote>
<p>sudo docker exec -it emqx /bin/bash<br />
ls -l</p>
</blockquote>
<p><img src="https://coala.top/upload/2023/8/image-9158ed572be247e08bae2746238e6791.png" alt="image.png" /></p>
<p><strong>EMQX 不使用 root 应该有他的原因</strong>，现在重点是怎么解决这个问题。</p>
<p><strong>一种思路是宿主机也创建 emqx 这个用户，并且保持用户 id 和容器内部的一致</strong>，然后先创建好要挂载的目录，这样就可以跳过权限问题。</p>
<p>我觉得这个方法很麻烦，容器居然还要依赖环境...</p>
<p><strong>我读了 Docker 的卷挂载相关的内容，发现匿名卷和具名卷可以兼容权限问题。</strong></p>
<p>匿名卷可读性不好，建议创建具名卷。</p>
<p>创建一个具名卷</p>
<pre><code>docker volume create emqx-data
</code></pre>
<p>启动加上  -v emqx-data:/opt/emqx/</p>
<pre><code>sudo docker run -d --name emqx -v emqx-data:/opt/emqx/ -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083  emqx/emqx:5.1.3
</code></pre>
<p><strong>这里我偷了懒， 多挂载了几个文件夹出来，但是也无所谓吧，单机 Docker 启动 EMQX 一般都是用于测试...</strong></p>
<p>补充：</p>
<p>查看具名卷：</p>
<pre><code>sudo docker volume list
</code></pre>
<p>查看具名卷详情：</p>
<pre><code>sudo docker volume inspect emqx-data
//  可以看到详细的目录。
[
    {
        &quot;CreatedAt&quot;: &quot;2023-07-31T06:01:13Z&quot;,
        &quot;Driver&quot;: &quot;local&quot;,
        &quot;Labels&quot;: null,
        &quot;Mountpoint&quot;: &quot;/var/lib/docker/volumes/emqx-data/_data&quot;,
        &quot;Name&quot;: &quot;emqx-data&quot;,
        &quot;Options&quot;: null,
        &quot;Scope&quot;: &quot;local&quot;
    }
]

</code></pre>

                        ]]>
                    </content:encoded>
                    <pubDate>Aug 1, 2023 9:02:28 AM</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[
                            威联通 NAS  TS-464C 
                        ]]>
                    </title>
                    <link>https://coala.top/archives/%E8%81%94%E9%80%9Anasts-464c</link>
                    <content:encoded>
                        <![CDATA[
                                <p>自己想装台 ITX NAS，想弄好点还是挺费钱，不如直接上成品了。</p>
<p>所以就用上了威联通。</p>
<p>TS-464C 啥都挺好，就是抽奖内存，我这台没抽中不能加内存，固定8G。</p>
<p><img src="https://coala.top/upload/2023/7/P30629-214933-73499e25adb74c21af2abb0b2b0e8dc6.jpg" alt="P30629-214933" /></p>
<p>配件一览，主要就是几包螺丝和充电器。</p>
<p><img src="https://coala.top/upload/2023/7/P30629-215519-c4ae4b022819467ab28c0205a9a8f4b7.jpg" alt="P30629-215519" /></p>
<p>正面主要各种指示灯，开关，一键复制按钮， 和一个USB。</p>
<p><img src="https://coala.top/upload/2023/7/P30629-215404-0f094625bcea4a92b99e88d2bb57c422.jpg" alt="P30629-215404" /></p>
<p>屁股两个网口都是2.5G的。</p>
<p><img src="https://coala.top/upload/2023/7/P30629-215420-42b8e74b24da4076b7e1b794ab16e7ee.jpg" alt="P30629-215420" /></p>
<p>简单的配置说明。</p>
<p><img src="https://coala.top/upload/2023/7/P30629-215347-6cb876ddee4149a4aee8649cad835789.jpg" alt="P30629-215347" /></p>
<p>电源是航嘉的，要是电源能内置就好了，外置电源总是有点麻烦。</p>
<p><img src="https://coala.top/upload/2023/7/P30629-215613-a693293271b0400aa9c705bdb639e47a.jpg" alt="P30629-215613" /></p>
<p>硬盘选的东芝的两个企业盘，12T。</p>
<p><img src="https://coala.top/upload/2023/7/P30629-220701-9855c1cffc84439c842154f426b98b73.jpg" alt="P30629-220701" /></p>
<p><img src="https://coala.top/upload/2023/7/P30629-220707-a8f307ae3f9141b0a5c11532d00fd201.jpg" alt="P30629-220707" /></p>
<p>上机，还是挺小巧的，RAID10，好好工作，未来5年就靠你了。</p>
<p><img src="https://coala.top/upload/2023/7/P30719-064633-bb1a8239e1144ada9410c9c1ca2b52ec.jpg" alt="P30719-064633" /></p>

                        ]]>
                    </content:encoded>
                    <pubDate>Jul 18, 2023 10:26:09 PM</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[
                            说说我的家庭网络和家居自动化
                        ]]>
                    </title>
                    <link>https://coala.top/archives/%E8%AF%B4%E8%AF%B4%E6%88%91%E7%9A%84%E5%AE%B6%E5%B1%85%E8%87%AA%E5%8A%A8%E5%8C%96%E5%92%8C%E5%AE%B6%E5%BA%AD%E7%BD%91%E7%BB%9C</link>
                    <content:encoded>
                        <![CDATA[
                                <p>多数房子入住时，可以用家徒四壁来形容，打的柜子往往难用，打的桌子不留线槽家常便饭，装修更是一个巨坑，妥协妥协再妥协。</p>
<p>幸好，我对生活的要求并不高，我只是单纯的懒，懒得关灯和永远找不到遥控器开空调。同时，我又希望家里所有角落都有网，好让我随时在某个位置瘫痪。</p>
<p>并且，要省钱。</p>
<h1 id="家庭网络篇">家庭网络篇</h1>
<h2 id="运营商">运营商</h2>
<p>首先，我选择电信网络，因为我需要动态公网 IP 服务，并且对延迟敏感，偶而还是玩玩网络游戏的。目前是 200M 的网络。</p>
<h2 id="路由器">路由器</h2>
<p>我用了两个华硕路由器 RT-AC68U。</p>
<p><img src="https://coala.top/upload/2023/7/image-775a9eed99684276b973eea9e8e6f6a8.png" alt="image.png" /></p>
<h2 id="组网方案">组网方案</h2>
<p>户型图：（来自扫地机器人，所有会有一些空隙）</p>
<p><img src="https://coala.top/upload/2023/7/image-3c22087eac2f41a1befaac61d1c6f324.png" alt="image.png" /></p>
<p>用两个路由器，是因为 WIFI 功率的限制，一个路由器很难覆盖这个房子，总有地方信号不好。</p>
<p>绿色房间算是书房（<del>机房或者工作室更合适吧</del>），我将主路由器（接千兆口）放在了这里，附路由器放在了客厅电视柜（蓝色大房间）。</p>
<p>我用了华硕的 AiMesh 功能，无线桥接。</p>
<p><img src="https://coala.top/upload/2023/7/image-654403db17a749aa821bd2157bfd4e22.png" alt="image.png" /></p>
<p>Q：<strong>为什么非要用无线桥接，有线不是更稳定吗？</strong></p>
<p>A：因为光猫只有一个千兆口，客厅和书房都是各通了一根网线，我走有线只能接到光猫百兆口，200M网络都跑不满。</p>
<p>Q：<strong>光猫是只有一个千兆口，主路由器塞进光纤入户箱塞，副路由器接到主路由器不就好了？</strong></p>
<p>A：狭小的光纤入户箱塞不进去路由器，可恶啊！</p>
<p>Q：<strong>塞不进去，买个小号的千兆交换机好了？</strong></p>
<p>A：这不是又要加钱，干脆无线桥接好了！</p>
<h1 id="小米全家桶的智能家居体验">小米全家桶的智能家居体验</h1>
<p>所谓智能，离不开语音识别，和小爱同学对话，很蠢，但是 <strong>很香</strong>。</p>
<h2 id="小爱音响">小爱音响</h2>
<p>我为了体验不同型号的区别，买了3款</p>
<ol>
<li>小爱音响 Play，最便宜的一款。</li>
<li>小爱音响 Play 增强版，加了红外遥控。</li>
<li>小爱AI音响，特点是唤醒率高。</li>
</ol>
<p>小爱AI音响蛮好的，唤醒率很高，如果有红外需求可以上红外遥控版的音响。</p>
<p>音响和各种设备都可以设置好摆放位置，这样比如打开空调，小爱会优先直接唤醒本房间的。</p>
<h2 id="空调伴侣">空调伴侣</h2>
<p><img src="https://coala.top/upload/2023/7/image-7941abfd574e4b95bfe313b1195f4db0.png" alt="image.png" /></p>
<p>空调伴侣可以控制空调开关，查看统计电量，设置任务定时开关，也不用到处找遥控器，用小爱同学打开空调，<strong>很香</strong>。</p>
<h2 id="扫地机">扫地机</h2>
<p>我用的石头的 T8 Plus，体验良好，扫地从我伺候地面变成了伺候扫地机。缺点是无法完成厕所，厨房这种重油污清理。</p>
<p><img src="https://coala.top/upload/2023/7/image-fd7b9b22a9624810a6227f5c3e061d88.png" alt="image.png" /></p>
<p><img src="https://coala.top/upload/2023/7/image-8474813d48654d0083e57da481593e32.png" alt="image.png" /></p>
<h2 id="灯">灯</h2>
<p>吸顶灯，或者智能插座全套搞下来挺贵了，并且装修风格很少，一般都是白色，和我这边风格不搭，暂时放弃了，目前使用了都是小米的台灯，桌面补光和睡前台灯。</p>
<h1></h1>
<p>其他的都是些个性化的需求 指纹门锁，摄像头，智能插座，风扇，空气净化器，红外设备之类的，没有必要赘述。米家方案也有不少的缺点，依赖网络，有些设备必须买小米生态的之类，有空了继续探索。</p>

                        ]]>
                    </content:encoded>
                    <pubDate>Jul 18, 2023 8:12:08 PM</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[
                            把字刻在石头上！
                        ]]>
                    </title>
                    <link>https://coala.top/archives/%E6%8A%8A%E5%AD%97%E5%88%BB%E5%9C%A8%E7%9F%B3%E5%A4%B4%E4%B8%8A</link>
                    <content:encoded>
                        <![CDATA[
                                <blockquote>
<p>想要长久保存电子资料，也就是保存大量的 0 和 1，除了刻在石头上，似乎也没有太好的办法了...</p>
</blockquote>
<p>事情得从我得到几张 20 年前的 VCD 说起，整整 20 年，2003 的 CD，其中两张还可以正常读取，两张不识别， 但状态看上去不错，找了个光盘修复算是导出了数据。</p>
<p><img src="https://coala.top/upload/2023/6/P30625-172507-f8a8db6c20614ef8a331cadb81a97f01.jpg" alt="P30625-172507" /></p>
<p>接下来就是数据保存的问题，因为光盘 CD 是我爹的，内容是 700MB * 4，我觉得起码能找个能保存个 50 年的介质吧。</p>
<p>U盘、固态、机械硬盘自然是统统不达标，感觉最古老的手段反而更持旧...</p>
<p>在纸上打孔大概是能保存最久的办法了，但是家用存储不便，读取太慢，自然只是玩笑。</p>
<p>比较靠谱就是磁带和光盘，磁带的读取设备偏贵，并且保存条件要求高，家用最合适的应该就是光盘，光盘也是分很多中的，像我们能自己刻录的，用激光刻在有机物上，这种并不能保存 50 年，一般在 20 年左右，有机物毕竟不稳定，大量复制批量生产的光盘 压盘这种应该能保存更久，但是家里也没有条件生产。</p>
<p>我选择了 M-DISC 千年光盘， M-DISC 光盘，寿命久到离谱，介质稳定，温度，湿度要求较低，基本不氧化，材料应该比较特殊，大多数普通光驱就可刻录，因为这是2009的技术，原理大概就是把字刻在石头片上。</p>
<p>我在市面上只看到两家在售卖 M-DISC 光盘，台湾的 威宝 和 铼德， 我分别购买了这两个牌子的 DVD 光盘。</p>
<p><img src="https://coala.top/upload/2023/6/P30627-174719-b9dac4b1a06b4a5ea211d648b7a0751b.jpg" alt="P30627-174719" /></p>
<p><img src="https://coala.top/upload/2023/6/P30627-165958-cb824deec4624e75829842e52da50653.jpg" alt="P30627-165958" /></p>
<p>其中威宝已经停产 DVD 的 M-DISC 光盘了，只售卖蓝光的，我买到的是存货， 真是时代的变迁啊，DVD 似乎慢慢的也要消失了，以后可能全是蓝光标准了。</p>
<p>CD 只能存储 700MB 的数据， 20 年前的存储真是宝贵， 4 个小时的低分辨率视频整整存了 4 个盘， 我只需要用 1 张 DVD 就可以保存，一张DVD可以放4.7G 的数据，然后我会同时刻录两份，分别是威宝 和 铼德 品牌的 M-DISC 光盘，增加可靠性。</p>
<p>刻录机就是一个华硕的普通刻录机， 一百多元， DVD 也是很便宜的，M-DISC 光盘大概 15 一张。</p>
<p><img src="https://coala.top/upload/2023/6/P30627-174803-21f7f71a61cc4c679d33fd6284415720.jpg" alt="P30627-174803" /></p>
<p><img src="https://coala.top/upload/2023/6/P30627-174910-5d9319de850f48bcaa9e0f341b0eeddf.jpg" alt="P30627-174910" /></p>
<p>刻录好后就可以交付了，任务完成。</p>
<p>剩下的盘我也会自己刻录点东西吧，几十年后拿出来，可能也是难得保存下来的东西呢。</p>

                        ]]>
                    </content:encoded>
                    <pubDate>Jun 25, 2023 9:19:48 AM</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[
                            办一场婚礼需要多少钱？ 我来开源一份结婚预算。
                        ]]>
                    </title>
                    <link>https://coala.top/archives/%E5%8A%9E%E4%B8%80%E5%9C%BA%E5%A9%9A%E7%A4%BC%E9%9C%80%E8%A6%81%E5%A4%9A%E5%B0%91%E9%92%B1%E6%88%91%E6%9D%A5%E5%BC%80%E6%BA%90%E6%88%91%E7%9A%84%E7%BB%93%E5%A9%9A%E8%AE%A1%E5%88%92</link>
                    <content:encoded>
                        <![CDATA[
                                <p>目前这个时代，婚礼宴作为上一代人精神需求和收回人情成本的必要流程，似乎是年轻人逃不掉的劫。</p>
<p>虽然家族这个概念在我们这个时代开始消失。</p>
<p>苦于大多数人只能经历一次，所谓的档次更是更多来自身边的对比，如何准确的找到自己的需求和预算呢？</p>
<p>希望我的经历给你一些小小的帮助。</p>
<p>注： 信息具有时效性，仅供参考。</p>
<p>WARING：不适合家中有矿人士阅读。</p>
<h2 id="婚纱照">婚纱照</h2>
<p>严格来说，这不是婚礼宴的一环，但是婚礼一般需要播放照片，也就是在办婚礼晚宴前，需要拍好婚纱照。</p>
<h3 id="拍摄流程">拍摄流程</h3>
<p>一般摄像工作室的工作流程是这样的：</p>
<ol>
<li>女方需要化妆，时间 1 ~ 3 小时，男方约 10 分钟，不得不说他们这个行业也是高度分工的，女方的化妆师只给女性化妆。</li>
<li>然后需要摄影师，摄影助理，一位负责协调 | 补妆的人士等， 3 到 4 人协助完成室内和外景的拍摄。</li>
<li>一天时间，基本会忙到天黑，后期就是修图，选照片，打相框这些后期流程。</li>
</ol>
<h3 id="工作室挑选">工作室挑选</h3>
<p>本地找个口碑较好的工作室，最好尝试在各种社区寻找大量真实的评价选择， 一般价格在 8000 - 15000 不等，我觉得选便宜的就好，因为一天时间就那么多，加钱也无法拍到更多的照片，除非对方愿意给你拍两天。</p>
<p>如果想去外地拍摄，比如青岛，云南，直接找目的城市的本地工作室，价格应该还是类似的，想去外地拍，直接连着休息几天去，岂不美哉？异地拍摄如果你找同城的工作室去外地拍摄，则会贵了非常多，毕竟工作室需要付出时间和交通费用。</p>
<p>拍摄时间定在工作日是最好的，因为工作日外景人少，很好拍，还有就是工作人员工作日上班肯定是比较开心的，因为大量的人都想在周末。</p>
<h3 id="照片冲印">照片冲印</h3>
<p>也就是 “洗照片”， 首先摄影工作室肯定会有相册相框之类的，但是其实淘宝打印照片和带木框的很便宜，7 寸的摆台只要几十元。 网上你可选的种类比摄影工作室提供的丰富的多。</p>
<p>安利一家照片打印店： 富士冲印，打印 6 寸的照片只需要 1 元一张，效果比摄影工作室给的打印效果好多了，也可能是我这家工作室找的冲印商不太行。</p>
<h2 id="烟-酒-糖">烟 酒 糖</h2>
<h3 id="糖腻">糖腻</h3>
<p>糖的大头是巧克力，包装，感觉还是看需求，有人觉得无所谓，有人就是想弄好的，单份价格一般到 10 元以上就是非常好的了，控制在 10 元以下也是可行的。</p>
<h3 id="酒苦">酒苦</h3>
<p>白酒，红酒，啤酒</p>
<p>啤酒价格便宜，大家也似乎不怎么挑剔。</p>
<p>红酒的水很深啊，我觉得红酒就是外国人的啤酒，莫不要趟浑水，15 元一瓶不要吃惊， 40 元一瓶也不是不行，上百那就是妥妥智商税了。而且会喝的人也很少，比如我这片区域就是干红配雪碧喝，完全无醒酒这种概念。</p>
<p>白酒还是依据长辈精神需求选择合适的档次吧，我的价格参考渠道是京东一年内的历史最低价，拿这个价位去和线下的店去谈。江苏地区这边直接化身洋河酒厂粉丝，海天梦、海天梦。</p>
<p>小知识：酒摆在柜台上，有个东西叫陈列费，酒厂是要给钱，才会摆在好位置的，也算是一种广告吧。</p>
<h3 id="烟呛">烟呛</h3>
<p>烟，这件事似乎各地的选择出奇的一致：华子，华子，还他妈是华子。</p>
<p>正常情况还是选择硬盒中华，零售价：45/包，如财力雄厚那就应该是软华子。本地区也会搭配几条红双喜香烟，各个地方不知是否有不同。</p>
<p>香烟价格按条买都有优惠，我拿到的华子价格是 415/条。</p>
<p>推荐一个香烟价格查询网站，这里你甚至能看到批发价，我觉得参考性挺不错的。</p>
<blockquote>
<p><a href="https://www.cnxiangyan.com/">https://www.cnxiangyan.com/</a></p>
</blockquote>
<h2 id="餐标">餐标</h2>
<p>餐标指的是一餐一桌的价格，一般 10 人一桌，餐标为 2000，就是 200元/人 了。</p>
<p>餐标肯定不同地区有较大的差异（人力，场地成本，当地经济水平）。</p>
<p>评价标准就是好吃和价格，好吃吗这个问题，你如果附近吃的少，只能多问问人，参考大量的评价。价格上的评价主要是看菜单，但是看菜单也是个技术活。很遗憾，我没有做好这件事，或者说我没有主导饭店的选择，也没有摸到如何确定底价。</p>
<h2 id="婚礼策划">婚礼策划</h2>
<p>婚礼策划，也就是婚庆公司，是当天体验比较重要的一环，装饰和节奏把控都由婚庆公司负责。</p>
<p>人上就是所谓4大金刚，主持，化妆，摄影，摄像。值得注意的是 500 元一天的主持也有，2000 元一天的也有，其他人同理， 一定小心婚礼策划在人力环节缩水，婚礼策划可是很贵的一环。</p>
<p>餐标和婚礼策划我都没有找到如何确定底价的方法，而且也有点面向女方销售的意味在其中。</p>
<p>只能建议是都多看几家，有的城市比如南京，据说奇贵无必，甚至不如你去附近的城市找，包车票回来都比南京的便宜...</p>
<p>不要过早做决定，多看！多看！</p>
<p>另外我觉得最好对婚礼当天的跟拍和照片不要有太多期待，</p>
<p>拍照的要诀是什么？</p>
<p><strong>光线，光线，还是他妈的光线！</strong></p>
<p>可是，吃饭的地方采光是不够的，你也没有时间摆姿势，也没办法去选景。</p>
<h2 id="酒店住宿">酒店住宿</h2>
<p>如有外地朋友需要住宿，我参考的是美团价格。要知道，美团这种垄断地位的企业，抽成是绝对不会少的，20% 30% 也不要惊讶，试着让酒店方吐出这个抽成变成优惠也不是难事。</p>
<h2 id="费用清单">费用清单</h2>
<p>杂乱无章的费用清单，不含盖所有费用，参考价值有限。</p>
<p><img src="https://coala.top/upload/2023/6/image-8c043873d91748e48f7b80558aee1a08.png" alt="image.png" /></p>

                        ]]>
                    </content:encoded>
                    <pubDate>Jun 6, 2023 10:24:03 AM</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[
                            魅族20
                        ]]>
                    </title>
                    <link>https://coala.top/archives/%E9%AD%85%E6%97%8F20</link>
                    <content:encoded>
                        <![CDATA[
                                <p><del>本文具有强烈的主观倾向，并且恬不知耻，脸皮极厚无比！</del></p>
<p>处理器是骁龙 8 Gen2，3年官方保修，期望用个两年吧！</p>
<p>煤油落泪。</p>
<p>这个长棒棒包装盒子就是一股子果味，拍照拍不出那种味， 唉！</p>
<p><img src="https://coala.top/upload/2023/6/IMG_20230529_205247-0a4400b01e534de487ebf11035b05ecb.jpg" alt="IMG_20230529_205247" /></p>
<p>配置一览</p>
<p><img src="https://coala.top/upload/2023/6/IMG_20230529_205257-f7a62566af2f48b48727facab6d2a681.jpg" alt="IMG_20230529_205257" /></p>
<p>为啥说有果味，这个上盖打开的阻尼感，刚刚好，太果了！</p>
<p><img src="https://coala.top/upload/2023/6/IMG_20230529_210036-697b69c634df48afb22348a8bef594e0.jpg" alt="IMG_20230529_210036" /></p>
<p>废纸一堆！</p>
<p><img src="https://coala.top/upload/2023/6/IMG_20230529_205636-960a3c99520a498a8aa18b41cf7e6877.jpg" alt="IMG_20230529_205636" /></p>
<p>送了膜，出厂就贴了。送了壳，不用买了。</p>
<p><img src="https://coala.top/upload/2023/6/IMG_20230529_205921-ebc45c485ea64ebe84d674396671c049.jpg" alt="IMG_20230529_205921" /></p>
<p>魅族的摄像没啥说的，就是扫码很快。</p>
<p><img src="https://coala.top/upload/2023/6/IMG_20230529_210114-2eeeeb34cfe2462eac9b0df3de63ac6b.jpg" alt="IMG_20230529_210114" /></p>
<p>这个手感整体上，<strong>温润如玉</strong>。</p>
<p><img src="https://coala.top/upload/2023/6/IMG_20230529_210158-dd91172dfbbd4b069ba1d408954f1d44.jpg" alt="IMG_20230529_210158" /></p>
<p>魅族的传统是一键root，换机过来直接用。</p>
<p><img src="https://coala.top/upload/2023/6/IMG_20230529_210611-c176143f672645c9bc604d6619249b13.jpg" alt="IMG_20230529_210611" /></p>

                        ]]>
                    </content:encoded>
                    <pubDate>May 31, 2023 8:38:52 AM</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[
                            动态公网 IP & DDNS 外部访问家庭网络指北
                        ]]>
                    </title>
                    <link>https://coala.top/archives/%E5%8A%A8%E6%80%81%E5%85%AC%E7%BD%91ipddns%E5%A4%96%E9%83%A8%E8%AE%BF%E9%97%AE%E5%AE%B6%E5%BA%AD%E7%BD%91%E7%BB%9C%E6%8C%87%E5%8C%97</link>
                    <content:encoded>
                        <![CDATA[
                                <h2 id="谈谈我的家用服务器">谈谈我的家用服务器</h2>
<p>我组装的二手服务器已经平稳运行了 2 年有于。</p>
<p>详见：<a href="https://coala.top/archives/%E5%B9%B4%E8%BD%BB%E4%BA%BA%E7%9A%84%E7%AC%AC%E4%B8%80%E5%8F%B0%E5%8F%8C%E8%B7%AF%E6%9C%8D%E5%8A%A1%E5%99%A8#装机">年轻人的第一台双路服务器</a>。</p>
<p>去年下半年搬家 + 忙于新的工作 + 适应新环境，外网环境一直没有恢复，最近整好了网络，故分享下当前的网络情况。</p>
<h2 id="动态公网-ip">动态公网 IP</h2>
<h3 id="什么是动态公网-ip">什么是动态公网 IP</h3>
<p>动态公网 IP 功能，即一个随时会变化的公网 IP，可外部直接利用 IP 访问，直通到家庭网络中。</p>
<p>众所周知， IPV4 资源枯竭（或许），家用宽带网络默认没有公网 IP。</p>
<p>国内最大固网运营商，中国电信，相比联通移动，拥有较多的 IP 资源。</p>
<p>如此，电信申请动态公网 IP 还是比较容易的，我个人实践下在江苏省 南通，南京，通过微信公众号 “江苏电信”，人工客服渠道可轻易获取到公网 IP。</p>
<h3 id="如何判断自己拿到了公网-ip">如何判断自己拿到了公网 IP？</h3>
<p>一般情况下，通过 <a href="http://192.168.1.1/">http://192.168.1.1/</a> 访问你的光猫，在 高级 -&gt; 网关信息中的 WAN IP信息若为外网 IP，则获得了外网 IP，反之为局域网 IP。</p>
<p><img src="https://coala.top/upload/2023/4/image-6b7ea5c6324446d8a2025585ffa506ec.png" alt="image.png" /></p>
<p>若不清楚公网/内网 IP 具体划分端。 访问 <a href="https://jsonip.com/">https://jsonip.com/</a> 会直接返回你的外网 IP， 若此 IP 和光猫的 WAN IP 一致，则为获取到了公网 IP。</p>
<p>例：</p>
<blockquote>
<p>{<br />
&quot;ip&quot;: &quot;114.232.104.12&quot;,<br />
&quot;country&quot;: &quot;CN&quot;,<br />
&quot;geo-ip&quot;: &quot;<a href="https://getjsonip.com/#plus">https://getjsonip.com/#plus</a>&quot;,<br />
&quot;API Help&quot;: &quot;<a href="https://getjsonip.com/#docs">https://getjsonip.com/#docs</a>&quot;<br />
}</p>
</blockquote>
<h2 id="ddns">DDNS</h2>
<p>DDNS（Dynamic Domain Name Server，动态域名服务）</p>
<p>你现在拥有了一个公网 IP，可他是会变化的或者说动态的，你需要稳定的地址去访问家庭网络，这时自然就需要一个域名，域名是固定的地址，绑定到这个 IP 上。</p>
<p>然后再添加一段逻辑：每当公网 IP 发生变化时，便修改域名绑定的IP。</p>
<p>路由器可以帮你完成这段逻辑。</p>
<p>当然，自己完成也可以。</p>
<h3 id="路由器的-ddns-服务">路由器的 DDNS 服务</h3>
<p>最简单的方式，当然是使用华硕的路由器（其他很多品牌可能也有 DDNS 功能）。<br />
我使用的路由器是华硕的 RT-AC68U，在 外部网络 -&gt; DDNS 页面中即可轻松设置，并且拿到一个华硕提供的域名。</p>
<p><img src="https://coala.top/upload/2023/4/image-e6b4297a394f468fbf8b979299e7637a.png" alt="image" /></p>
<p>当然，这个域名必须是 asuscomm.com 的子域名，并且会很长。</p>
<p>如果你想拥有一个性化的，短的域名，那就得购买域名和使用域名服务商的 DDNS 服务了。</p>
<h3 id="域名服务商的-ddns-服务">域名服务商的 DDNS 服务</h3>
<p>我的域名是在万网购买的，也就是阿里云，所以参考了阿里云的 <a href="https://help.aliyun.com/document_detail/431629.html">动态域名解析</a>，完成了授权。</p>
<p>参考了 Java 的 SDK 实现了程序，部署在了我的家庭网络中的服务器上。</p>
<blockquote>
<p><a href="https://github.com/qq418745/Ali-DDNS">https://github.com/qq418745/Ali-DDNS</a></p>
</blockquote>
<p>这段代码的逻辑很简单，轮询获取当前的公网 IP，若发生变化，便调用阿里云的 API 修改域名绑定的 IP。</p>
<h2 id="端口映射">端口映射</h2>
<p>家庭带宽 80、443 端口不可用，同时尽量避开 22、8080等常用的端口使用。</p>
<p>拥有了动态公网 IP 和 DDNS 服务后的域名后。</p>
<p>例如访问 home.coala.top:8097 当然要经过光猫和路由器的允许，在猫中配置端口的转发路径，转发给你的局域网地址。</p>
<p><img src="https://coala.top/upload/2023/4/image-9c5d1e047bec45f4ab9c09a20085bc59.png" alt="image.png" /></p>
<h2 id="好奇宝宝篇">好奇宝宝篇</h2>
<h3 id="ipv4-真的不够用了吗">IPV4 真的不够用了吗？</h3>
<p>我的印象里，接收到的媒体资料都是 “IP资源枯竭”、“IPv4是非常宝贵的资源”。</p>
<p>但是在这几年的工作中，阿里云几百块钱购买个云服务器也能轻易拿到一个免费的公网 IP。</p>
<p>可用的 IPv4 地址数为约 42.94 亿个。中国有多少个 IP 呢？ 又在谁的手里？</p>
<p><img src="https://coala.top/upload/2023/4/image-f8f3db2e79604f1cad7f9a09fc878bb2.png" alt="image.png" /></p>
<p>找到的统计数据里大部分 IP 都在电信移动联通手里。</p>
<p>家庭宽带下利用 NAT 技术，一栋楼甚至一个小区，只用一个公网 IP 就可满足需求，主动去申请动态公网 IP 的人少之又少。</p>
<p>数亿的 IP，真的如此匮乏吗？ 要知道我们的大部分设备都是在家庭带宽网络中的，就算有几亿户，几千万 IP 大概也能满足家庭需求。企业真的有那么大的需求用掉数亿的 IP 吗？</p>
<p>配合上 IPV6 的缓慢推进，再我看来，IPV4 资源紧张，但远没有到火烧屁股的地步，远远达不到 “枯竭” 、“宝贵”这种用词的地步。</p>
<h3 id="参考">参考：</h3>
<blockquote>
<p>全中国一共有多少IP地址： <a href="https://www.51cto.com/article/693790.html">https://www.51cto.com/article/693790.html</a></p>
</blockquote>
<blockquote>
<p>科学上网不完全指北： <a href="https://stackia.notion.site/2369da8fe56d416d87569c50cd8bbb7d#051e064434ff4420b187c3e886621cd3">https://stackia.notion.site/2369da8fe56d416d87569c50cd8bbb7d#051e064434ff4420b187c3e886621cd3</a></p>
</blockquote>

                        ]]>
                    </content:encoded>
                    <pubDate>Apr 5, 2023 5:41:47 AM</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[
                            2022年12月22日杂谈
                        ]]>
                    </title>
                    <link>https://coala.top/archives/2022%E5%B9%B412%E6%9C%8822%E6%97%A5%E6%9D%82%E8%B0%88</link>
                    <content:encoded>
                        <![CDATA[
                                <h3 id="序">序</h3>
<p>今日晚，现在是什么心情?</p>
<p>问自己，大概烦躁占了 80%，茫然占了 19% 还有 1% 是什么? 我自己也不清楚。</p>
<p>今日与主动一位网友斗了嘴，不该做这种事，很久没做了吧，争吵又没有意义，真是愚蠢。</p>
<p>恍然间，3年多了，博客是和做开发这件事一起开始的。</p>
<p>初写博客功利主义更多点，为面试时多点展示自己。然后就是有趣，拥有自己的网站是很酷的。</p>
<p>买台便宜的无源音箱是有趣的，收各种电子破烂 &quot;Electronic Scavenger&quot; 有趣的，买 Switch 是有趣的，好玩的，PS5 也消磨了我几百小时时间。</p>
<p>写代码，有趣的。前端有趣、后端有趣、运维也有趣。</p>
<p>不喜欢折腾安卓手机了，不喜欢看动画片了，漫画买了放着也不看，做个 Electronic Scavenger 觉得是浪费时间。</p>
<p>前端麻烦，反正前后端分离，不写了，最近4个月Code写的很少。最近用了 K8S，SpringDoc，好用，都好用。</p>
<p>想做资料收集站，东方同人音乐? 书籍收集? 还想做桌宠，这个想法很久了，<br />
没有开工，迟迟不肯开工。</p>
<p>3 年多了，似乎对开发的兴趣渐渐减少，写代码入迷的时候还是会笑的，这是有趣的事。可是意义却越来越少了，感觉不到 &quot;价值&quot;，没有价值是讨厌的。</p>
<h2 id="谈谈工作">谈谈工作</h2>
<p>我在今年做了重大决定，离开了南京，生活和买房这件事是讨厌的。</p>
<p>本地的，一个月的工作经历很有归宿感，走的时候甚至有点不舍，大家都很好，很近，或许可以做朋友，钱是少点，觉得值得。</p>
<p>不值得，我要走。</p>
<p>人走茶凉。</p>
<p>幸运的住在小城找到了一份半远程工作。一周去两三次上海，是辛苦的，<br />
也是满意的。</p>
<p>大家来自五湖四海，</p>
<p>或许没有海，只有陆。</p>
<p>满意的... 生活吗?</p>
<p>我不知道。</p>
<h2 id="建政与心情影响的研究">建政与心情影响的研究</h2>
<p>最近看了什么? 技术书籍很多，没有去啃。</p>
<p>看了吴思的 《潜规则》《血酬定律》《冯军旗：中县干部》，看 睡前消息 好几年了，也刷刷知乎。</p>
<p>什么感想?</p>
<p>感想就是黑，真黑啊，悖论，无解，世界上没有办法的事情太多。</p>
<p>悲观者往往正确，乐观者往往成功。</p>
<p>乐观者不一定成功，但悲观的确价值不大。</p>
<p>生活和人的存在有意义吗? 没有意义，若按唯物主义那一套。看上去还是信上帝比较轻松。</p>
<p>很喜欢《瑞克和莫蒂》，我生活的时代，虚无主义的胜利? 极简主义的胜利。</p>
<p>但是啊，也很喜欢刘慈欣，中学时网络文学看腻的时候，在出版文学科幻类中读到了他的作品，惊为天人。刘的小说里有种气节，或者说气质，是骄傲，理想，充满了力量。</p>
<h2></h2>
<p>懒得写代码，不想玩游戏，泡在电脑上，读写乱七八糟的东西，英语也学的很痛苦。</p>
<p>恼人。</p>
<p>唉!!</p>

                        ]]>
                    </content:encoded>
                    <pubDate>Dec 22, 2022 1:20:15 PM</pubDate>
                </item>
    </channel>
</rss>