<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
>
<channel>
<title><![CDATA[饭粥技术分享]]></title> 
<atom:link href="https://funjoo.fun/rss.php" rel="self" type="application/rss+xml" />
<description><![CDATA[.NET全栈、Python、机器视觉相关]]></description>
<link>https://funjoo.fun/</link>
<language>zh-cn</language>
<generator>emlog</generator>

<item>
    <title>Linux shell中，怎么解压tar.xz文件</title>
    <link>https://funjoo.fun/?post=7</link>
    <description><![CDATA[<p>【ChatGPT回答】<br />
你可以使用 <code>tar</code> 命令直接解压 <code>.tar.xz</code> 文件，语法如下：</p>
<hr />
<h2>✅ 解压 <code>.tar.xz</code> 文件命令：</h2>
<pre><code class="language-bash">tar -xJvf 文件名.tar.xz</code></pre>
<hr />
<h3>📌 参数说明：</h3>
<table>
<thead>
<tr>
<th>参数</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>-x</code></td>
<td>解包（extract）</td>
</tr>
<tr>
<td><code>-J</code></td>
<td>使用 xz 解压</td>
</tr>
<tr>
<td><code>-v</code></td>
<td>显示过程（可选）</td>
</tr>
<tr>
<td><code>-f</code></td>
<td>指定文件名</td>
</tr>
</tbody>
</table>
<hr />
<h3>✅ 示例：</h3>
<p>假设你有个文件叫 <code>jdk-21_linux-x64_bin.tar.xz</code>：</p>
<pre><code class="language-bash">tar -xJvf jdk-21_linux-x64_bin.tar.xz</code></pre>
<p>会在当前目录下解出一个文件夹，比如 <code>jdk-21/</code>。</p>
<hr />
<h3>✅ 解压到指定目录（可选）：</h3>
<pre><code class="language-bash">tar -xJvf 文件名.tar.xz -C /目标路径/</code></pre>
<p>例如：</p>
<pre><code class="language-bash">tar -xJvf jdk-21_linux-x64_bin.tar.xz -C /opt/</code></pre>
<hr />
<p>如果你只想<strong>查看压缩包里都有什么文件</strong>，可以先运行：</p>
<pre><code class="language-bash">tar -tJf 文件名.tar.xz</code></pre>]]></description>
    <pubDate>Wed, 28 May 2025 21:12:16 +0800</pubDate>
    <dc:creator>FunJoo</dc:creator>
    <guid>https://funjoo.fun/?post=7</guid>
</item>
<item>
    <title>Linux shell中，怎么打包一个文件夹成一个压缩文件</title>
    <link>https://funjoo.fun/?post=6</link>
    <description><![CDATA[<p>【ChatGPT生成】<br />
在 Linux Shell 中，你可以使用 <code>tar</code> 命令将一个文件夹打包成压缩文件。下面是常用格式：</p>
<hr />
<h2>✅ 1. <strong>打包并压缩为 <code>.tar.gz</code>（最常用）</strong></h2>
<pre><code class="language-bash">tar -czvf 输出文件名.tar.gz 文件夹路径</code></pre>
<p><strong>示例：</strong></p>
<pre><code class="language-bash">tar -czvf myfolder.tar.gz myfolder/</code></pre>
<ul>
<li><code>-c</code>：创建压缩包</li>
<li><code>-z</code>：使用 gzip 压缩</li>
<li><code>-v</code>：显示详细过程（可选）</li>
<li><code>-f</code>：指定文件名</li>
</ul>
<hr />
<h2>✅ 2. <strong>打包并压缩为 <code>.tar.xz</code>（压缩率更高）</strong></h2>
<pre><code class="language-bash">tar -cJvf 输出文件名.tar.xz 文件夹路径</code></pre>
<p><strong>示例：</strong></p>
<pre><code class="language-bash">tar -cJvf myfolder.tar.xz myfolder/</code></pre>
<ul>
<li><code>-J</code>：使用 <code>xz</code> 压缩</li>
</ul>
<hr />
<h2>✅ 3. <strong>打包但不压缩（仅 <code>.tar</code>）</strong></h2>
<pre><code class="language-bash">tar -cvf 输出文件名.tar 文件夹路径</code></pre>
<hr />
<h2>✅ 4. <strong>打包为 <code>.zip</code> 格式</strong></h2>
<pre><code class="language-bash">zip -r 输出文件名.zip 文件夹路径</code></pre>
<p><strong>示例：</strong></p>
<pre><code class="language-bash">zip -r myfolder.zip myfolder/</code></pre>
<blockquote>
<p>如果 <code>zip</code> 命令不存在，可用 <code>sudo apt install zip</code> 或 <code>sudo yum install zip</code> 安装</p>
</blockquote>]]></description>
    <pubDate>Fri, 23 May 2025 15:40:09 +0800</pubDate>
    <dc:creator>FunJoo</dc:creator>
    <guid>https://funjoo.fun/?post=6</guid>
</item>
<item>
    <title>深度学习里，决定项目成功的关键步骤是哪个？</title>
    <link>https://funjoo.fun/?post=5</link>
    <description><![CDATA[<p>【ChatGPT回答】<br />
这个问题非常关键！在 YOLO（或任何深度学习目标检测项目）中，<strong>所有环节都重要，但决定项目成败的核心因素，90% 的时候都在</strong>：</p>
<blockquote>
<p><strong>📌 标注质量 + 数据集构建与划分策略</strong></p>
</blockquote>
<p>我们可以把你列出的这些步骤，<strong>按照对最终模型质量的影响力从高到低排序</strong>，并逐一解释原因：</p>
<hr />
<h2>🥇 <strong>1. 标注质量</strong>（决定性）</h2>
<ul>
<li>❗ 错标、漏标、抖动、不一致 —— 是目标检测项目失败的第一杀手</li>
<li>模型学到的就是你喂它的标注，它永远不会“更聪明”</li>
<li><strong>小目标</strong>、<strong>遮挡目标</strong>、<strong>模糊目标</strong> 要不要标，标多大，是否有一致性 —— 都会直接影响 recall 和 precision</li>
</ul>
<p>📌 成功秘诀：</p>
<ul>
<li>标准统一</li>
<li>使用辅助工具或 QA 流程审查</li>
<li>细化标注规范（如最小目标标注策略）</li>
</ul>
<hr />
<h2>🥈 <strong>2. 数据集划分策略</strong>（泛化能力关键）</h2>
<ul>
<li>类别不均、划分不合理（如按文件夹分而不是打乱）、同一场景同时出现在训练和验证中 —— 都会造成过拟合或低 mAP</li>
<li>小目标、长尾类、极端场景要不要出现在训练集或验证集中？比例要平衡</li>
</ul>
<p>📌 成功秘诀：</p>
<ul>
<li>分布均衡，覆盖多样性（光照、角度、尺度）</li>
<li>避免“数据泄漏”</li>
<li>验证集 &gt;5% 且充分代表数据场景</li>
</ul>
<hr />
<h2>🥉 <strong>3. 训练配置和策略</strong></h2>
<ul>
<li>包括 batch size、学习率调度、epoch 数、优化器、增强方式（Mosaic、CopyPaste）、loss 加权等</li>
<li>很多项目“调不动”模型，其实是训练配置没调对，而不是模型结构不行</li>
</ul>
<p>📌 成功秘诀：</p>
<ul>
<li>用 warmup + cosine lr</li>
<li>避免 batch size 太小或 augmentation 过激</li>
<li>使用 pretrained 权重初始化</li>
</ul>
<hr />
<h2>🔧 其次重要的步骤（同样不能忽视）：</h2>
<table>
<thead>
<tr>
<th>步骤</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>✅ <strong>预处理</strong></td>
<td>像素归一化、resize 到 32 倍数、padding 都需一致</td>
</tr>
<tr>
<td>✅ <strong>预测设置</strong></td>
<td>合理设置 <code>conf</code> 和 <code>iou</code> 阈值</td>
</tr>
<tr>
<td>✅ <strong>后处理</strong></td>
<td>NMS 正确实现，适配小目标保留策略</td>
</tr>
</tbody>
</table>
<hr />
<h2>🧠 结论总结（重点思维图）：</h2>
<pre><code class="language-text">项目成功 = 标注质量↑ × 数据构建合理性↑ × 训练策略优化↑
         × 预处理一致性 × 合理后处理 × 预测参数调优</code></pre>
<ul>
<li>✅ 标注好 + 数据集构建对 = 模型有东西可学</li>
<li>✅ 训练策略好 = 模型能学进去</li>
<li>✅ 验证 &amp; 后处理 = 评估/部署有的放矢</li>
</ul>]]></description>
    <pubDate>Fri, 23 May 2025 15:30:26 +0800</pubDate>
    <dc:creator>FunJoo</dc:creator>
    <guid>https://funjoo.fun/?post=5</guid>
</item>
<item>
    <title>【Minecraft】【我的世界】关于JAVA自建服务器的一些问答</title>
    <link>https://funjoo.fun/?post=3</link>
    <description><![CDATA[<h2>Q1 在ssh连接的linux主机，运行server.jar之后，直接退出ssh工具，minecraft服务器还会继续运行吗</h2>
<p>A1（答案由ChatGPT4生成）<br />
当你通过SSH连接到Linux主机并启动了Minecraft服务器（或任何其他应用程序）后，如果你直接关闭SSH会话，由该会话启动的进程通常也会被终止。这是因为当SSH会话关闭时，它会发送一个SIGHUP信号到Shell会话中运行的所有进程，通常这会导致这些进程的终止。</p>
<p>为了保持Minecraft服务器在关闭SSH会话后继续运行，你可以使用如<code>nohup</code>、<code>screen</code>、或<code>tmux</code>等工具来启动你的Minecraft服务器。</p>
<h3>使用nohup</h3>
<p><code>nohup</code>命令可以用来忽略所有的SIGHUP信号，使得运行的进程在退出SSH会话后继续运行。</p>
<pre><code class="language-bash">nohup java -Xmx1024M -Xms1024M -jar server.jar nogui &amp;</code></pre>
<p><code>&amp;</code>符号会使得该命令在后台运行。</p>
<h3>使用screen或tmux</h3>
<p><code>screen</code>和<code>tmux</code>都是终端复用器，它们允许你从一个SSH会话中断开，然后重新连接回来。</p>
<h4>使用screen</h4>
<pre><code class="language-bash">screen -S minecraft
java -Xmx1024M -Xms1024M -jar server.jar nogui</code></pre>
<p>然后你可以按<code>Ctrl-A</code>然后按<code>D</code>来断开。之后即使你退出SSH，进程也会继续运行。重新连接回来时，你可以使用<code>screen -r minecraft</code>来重新连接到你的会话。</p>
<h4>使用tmux</h4>
<pre><code class="language-bash">tmux new -s minecraft
java -Xmx1024M -Xms1024M -jar server.jar nogui</code></pre>
<p>你可以按<code>Ctrl-B</code>然后按<code>D</code>来断开。重新连接回来时，你可以使用<code>tmux attach -t minecraft</code>来重新连接到你的会话。</p>
<p>这些方法都可以让你在退出SSH会话后保持Minecraft服务器运行。选择哪一个取决于你的个人偏好和系统上已经安装的工具。</p>
<h2>Q2 如果使用了<code>nohup java -Xmx1024M -Xms1024M -jar server.jar nogui &amp;</code> 那么我要如何回到这个命令的操作，我需要输入stop来停止服务器并且保存</h2>
<p>A2（答案由ChatGPT4生成）<br />
如果你使用<code>nohup</code>在后台启动了Minecraft服务器，并且你已经退出了SSH会话，你将无法直接重新连接到服务器的控制台来输入<code>stop</code>命令。</p>
<p><code>nohup</code>命令会将程序的输出重定向到一个名为<code>nohup.out</code>的文件中，除非你指定了其他文件。你不能通过这个文件来发送命令到服务器。在这种情况下，你可能需要采取其他方法来停止服务器并确保数据完整。</p>
<h3>方法1：使用<code>kill</code>命令</h3>
<p>你可以通过查找Java进程的进程ID（PID）并使用<code>kill</code>命令来安全地停止Minecraft服务器。</p>
<ol>
<li>
<p>使用<code>ps</code>命令找到Minecraft服务器的进程ID：</p>
<pre><code class="language-bash">ps aux | grep java</code></pre>
</li>
<li>
<p>找到类似于<code>java -Xmx1024M -Xms1024M -jar server.jar nogui</code>的行，记录下该行最前面的数字（这是进程ID）。</p>
</li>
<li>
<p>发送<code>SIGTERM</code>信号到Java进程：</p>
<pre><code class="language-bash">kill -15 &lt;进程ID&gt;</code></pre>
<p>请将<code>&lt;进程ID&gt;</code>替换为你在步骤2中找到的进程ID。</p>
<p><code>SIGTERM</code>信号会让Java进程优雅地关闭，这应该会触发Minecraft服务器的停止序列，从而保存世界数据。</p>
</li>
</ol>
<h3>方法2：使用<code>screen</code>或<code>tmux</code></h3>
<p>为了防止这种情况在未来再次发生，你可以考虑使用<code>screen</code>或<code>tmux</code>来运行你的Minecraft服务器。这样即使你退出了SSH会话，你也可以重新连接回服务器的控制台，并输入<code>stop</code>来安全地关闭服务器。</p>
<p>例如，使用<code>screen</code>：</p>
<ol>
<li>
<p>启动一个新的<code>screen</code>会话：</p>
<pre><code class="language-bash">screen -S minecraft</code></pre>
</li>
<li>
<p>启动你的Minecraft服务器：</p>
<pre><code class="language-bash">java -Xmx1024M -Xms1024M -jar server.jar nogui</code></pre>
</li>
<li>
<p>如果你需要断开连接，可以使用<code>Ctrl-A</code>然后<code>D</code>。</p>
</li>
<li>
<p>你可以使用<code>screen -r minecraft</code>重新连接到会话。</p>
</li>
</ol>
<p>在<code>screen</code>或<code>tmux</code>会话中，你可以随时输入<code>stop</code>来安全地停止Minecraft服务器。</p>]]></description>
    <pubDate>Mon, 23 Oct 2023 18:02:00 +0800</pubDate>
    <dc:creator>FunJoo</dc:creator>
    <guid>https://funjoo.fun/?post=3</guid>
</item>
<item>
    <title>使用Rust写C#能用的动态链接库</title>
    <link>https://funjoo.fun/?post=2</link>
    <description><![CDATA[<p>（以下内容由ChatGPT4生成）<br />
要使用 Rust 创建一个 C# 能调用的动态链接库 (DLL)，你需要遵循以下步骤：</p>
<ul>
<li>
<p>编写Rust代码：<br />
使用libc crate 为导出的函数提供 C 兼容的接口。例如，你可以创建一个简单的函数，该函数接收两个整数并返回它们的和。</p>
</li>
<li>
<p>使用C#进行互操作：<br />
使用C#的P/Invoke来调用Rust创建的DLL。</p>
</li>
</ul>
<p>下面是具体的步骤：</p>
<h3><strong>1. Rust</strong></h3>
<p>Cargo.toml:</p>
<pre><code>[package]
name = "rust_to_csharp"
version = "0.1.0"
edition = "2018"

[lib]
crate-type = ["cdylib"]

[dependencies]
libc = "0.2"</code></pre>
<p>src/lib.rs:</p>
<pre><code>extern crate libc;
use libc::{c_int};

#[no_mangle]
pub extern "C" fn add(a: c_int, b: c_int) -&gt; c_int {
    a + b
}</code></pre>
<p>编译Rust项目为DLL:</p>
<pre><code class="language-bash">cargo build --release</code></pre>
<p>编译完成后，你可以在 target/release 目录下找到 rust_to_csharp.dll。</p>
<h3><strong>2. C#</strong></h3>
<p>创建一个新的C#项目，并将上面生成的 rust_to_csharp.dll 复制到C#项目的输出目录。<br />
然后在C#代码中：</p>
<pre><code class="language-csharp">using System.Runtime.InteropServices;

class Program
{
    const string DllPath = "rust_to_csharp.dll";

    [DllImport(DllPath, CallingConvention = CallingConvention.Cdecl)]
    public static extern int add(int a, int b);

    static void Main()
    {
        int result = add(2, 3);
        Console.WriteLine($"2 + 3 = {result}");
    }
}</code></pre>
<p>现在，当你运行C#程序时，它会调用Rust创建的DLL并打印2 + 3 = 5。</p>
<p>注意：确保C#项目的平台目标与Rust项目匹配。例如，如果你使用64位Rust工具链编译的DLL，确保C#项目也设置为x64。</p>]]></description>
    <pubDate>Tue, 08 Aug 2023 09:25:00 +0800</pubDate>
    <dc:creator>FunJoo</dc:creator>
    <guid>https://funjoo.fun/?post=2</guid>
</item>
</channel>
</rss>