<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>技术 on 小凡的博客</title><link>https://www.rvp.cc/categories/%E6%8A%80%E6%9C%AF/</link><description>Recent content in 技术 on 小凡的博客</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Fri, 06 Nov 2026 16:10:26 +0800</lastBuildDate><atom:link href="https://www.rvp.cc/categories/%E6%8A%80%E6%9C%AF/index.xml" rel="self" type="application/rss+xml"/><item><title>用 frp 实现内网 SSH 穿透：从搭建到排障</title><link>https://www.rvp.cc/posts/frp-ssh-tunnel/</link><pubDate>Fri, 06 Nov 2026 16:10:26 +0800</pubDate><guid>https://www.rvp.cc/posts/frp-ssh-tunnel/</guid><description>&lt;p&gt;家里的电脑、公司的开发机，或者实验环境中的虚拟机，经常没有固定公网 IP。人已经离开现场，但又想临时 SSH 登录回去，这时就需要把内网服务安全地“映射”到一个有公网 IP 的服务器上。frp 正是用于解决这类问题的反向代理工具。&lt;/p&gt;&#10;&lt;p&gt;本文将基于 Linux 和 systemd，使用 frp 将内网机器的 SSH 端口映射到云服务器，并给出验证、排障和基本的安全建议。&lt;/p&gt;</description></item><item><title>RabbitMQ在Python中的安装配置和使用</title><link>https://www.rvp.cc/posts/rabbitmq-python/</link><pubDate>Thu, 10 Aug 2023 16:18:43 +0800</pubDate><guid>https://www.rvp.cc/posts/rabbitmq-python/</guid><description>&lt;p&gt;RabbitMQ是一个免费开源的消息队列应用，应用非常广泛，本文主要介绍RabbitMQ的安装使用和Python+pika的简单调用.&lt;/p&gt;</description></item><item><title>PHP设计模式之——依赖注入</title><link>https://www.rvp.cc/posts/php-dependency-injection/</link><pubDate>Thu, 08 Jun 2023 17:03:44 +0800</pubDate><guid>https://www.rvp.cc/posts/php-dependency-injection/</guid><description>&lt;p&gt;依赖注入(dependency injection)是实现控制反转的一种技术，顾名思义，就是将依赖(被调用者)注入给依赖对象(调用者)。&lt;/p&gt;&#10;&lt;p&gt;用户类&lt;code&gt;User&lt;/code&gt;有一个注册方法，我们需要实现一个功能，在注册成功后，给用户发送一封邮件通知。我们先写一个发送邮件的类：&lt;/p&gt;&#10;&lt;div class="code-block-wrap"&gt;&#10; &lt;div class="code-toolbar"&gt;&#10; &lt;span class="code-language" aria-hidden="true"&gt;php&lt;/span&gt;&#10; &lt;button class="code-copy" type="button" aria-label="复制代码" title="复制代码" data-code-copy hidden&gt;&#10; &lt;span class="code-copy-icon" aria-hidden="true"&gt;&#10; &lt;svg class="copy-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" focusable="false"&gt;&lt;rect x="8" y="8" width="12" height="12" rx="2"/&gt;&lt;path d="M16 8V6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h2"/&gt;&lt;/svg&gt;&#10; &lt;svg class="check-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" focusable="false"&gt;&lt;path d="m20 6-11 11-5-5"/&gt;&lt;/svg&gt;&#10; &lt;/span&gt;&#10; &lt;span data-copy-label&gt;复制&lt;/span&gt;&#10; &lt;/button&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block" tabindex="0" data-language="php"&gt;&lt;code class="language-php"&gt;class EmailClass&#10;{&#10; public function sendEmail($username, $email)&#10; {&#10; print_r(&amp;#34;send register email to:&amp;#34; . $email . PHP_EOL);&#10; }&#10;}&lt;/code&gt;&lt;/pre&gt;&#10; &lt;/div&gt;&lt;p&gt;然后在用户注册方法中实例化一个邮件类：&lt;/p&gt;&#10;&lt;div class="code-block-wrap"&gt;&#10; &lt;div class="code-toolbar"&gt;&#10; &lt;span class="code-language" aria-hidden="true"&gt;php&lt;/span&gt;&#10; &lt;button class="code-copy" type="button" aria-label="复制代码" title="复制代码" data-code-copy hidden&gt;&#10; &lt;span class="code-copy-icon" aria-hidden="true"&gt;&#10; &lt;svg class="copy-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" focusable="false"&gt;&lt;rect x="8" y="8" width="12" height="12" rx="2"/&gt;&lt;path d="M16 8V6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h2"/&gt;&lt;/svg&gt;&#10; &lt;svg class="check-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" focusable="false"&gt;&lt;path d="m20 6-11 11-5-5"/&gt;&lt;/svg&gt;&#10; &lt;/span&gt;&#10; &lt;span data-copy-label&gt;复制&lt;/span&gt;&#10; &lt;/button&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block" tabindex="0" data-language="php"&gt;&lt;code class="language-php"&gt;class User&#10;{&#10; private $username;&#10; private $password;&#10; private $mobile;&#10; private $email;&#10;&#10; public function register()&#10; {&#10; // 注册逻辑&#10; // .........&#10;&#10; // 发送邮件逻辑&#10; $emailClass = new EmailClass();&#10; $emailClass-&amp;gt;sendEmail($this-&amp;gt;username, $this-&amp;gt;email);&#10; }&#10;}&lt;/code&gt;&lt;/pre&gt;&#10; &lt;/div&gt;&lt;p&gt;这时候又来一个需求，需要在注册成功之后给用户发送短信，于是又要在注册方法里面实例化一个发送短信的类。或者这个时候我们要改一下邮件内容，要把注册密码发给用户，于是我们要给&lt;code&gt;EmailClass::sendEmail&lt;/code&gt;加一个password参数。经过长期迭代和添油加醋，我们需要频繁的去修改核心注册逻辑，最终的注册方法将变得极为臃肿且难以维护。&lt;/p&gt;</description></item><item><title>Symfony Cache报错Cache key 'xxx:xxx' contains reserved characters解决办法</title><link>https://www.rvp.cc/posts/symfony-cache-reserved-characters/</link><pubDate>Fri, 02 Jun 2023 14:57:04 +0800</pubDate><guid>https://www.rvp.cc/posts/symfony-cache-reserved-characters/</guid><description>&lt;p&gt;今天在使用Symfony Cache时遇到一个报错：&lt;code&gt;Symfony\Component\Cache\Exception\InvalidArgumentException: Cache key &amp;quot;xxx:xxx&amp;quot; contains reserved characters &amp;quot;{}()/\@:&amp;quot;&lt;/code&gt;，经过排查发现我的缓存key带有冒号。&lt;/p&gt;</description></item><item><title>一次诡异的PHP浮点运算精度丢失以及打印问题</title><link>https://www.rvp.cc/posts/php-floating-point-precision/</link><pubDate>Wed, 31 May 2023 15:46:51 +0800</pubDate><guid>https://www.rvp.cc/posts/php-floating-point-precision/</guid><description>&lt;p&gt;项目开发时发现几个小数组成的数组进行求和的结果不对，第一反应就觉得是精度问题，于是做了实验：&lt;/p&gt;&#10;&lt;div class="code-block-wrap"&gt;&#10; &lt;div class="code-toolbar"&gt;&#10; &lt;span class="code-language" aria-hidden="true"&gt;php&lt;/span&gt;&#10; &lt;button class="code-copy" type="button" aria-label="复制代码" title="复制代码" data-code-copy hidden&gt;&#10; &lt;span class="code-copy-icon" aria-hidden="true"&gt;&#10; &lt;svg class="copy-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" focusable="false"&gt;&lt;rect x="8" y="8" width="12" height="12" rx="2"/&gt;&lt;path d="M16 8V6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h2"/&gt;&lt;/svg&gt;&#10; &lt;svg class="check-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" focusable="false"&gt;&lt;path d="m20 6-11 11-5-5"/&gt;&lt;/svg&gt;&#10; &lt;/span&gt;&#10; &lt;span data-copy-label&gt;复制&lt;/span&gt;&#10; &lt;/button&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block" tabindex="0" data-language="php"&gt;&lt;code class="language-php"&gt;$array = [0.4, 0.4, 0.2, 0.4, 0.4, 0.2];&#10;$arraySum = array_sum($array);&#10;var_dump($arraySum);&#10;var_dump(intval($arraySum));&#10;var_export($arraySum);&lt;/code&gt;&lt;/pre&gt;&#10; &lt;/div&gt;&lt;p&gt;猜猜以上代码运行的结果是什么？&lt;/p&gt;</description></item><item><title>MySQL8无法使用root账户在外部登录的解决办法</title><link>https://www.rvp.cc/posts/mysql8-root-remote-login/</link><pubDate>Tue, 30 May 2023 10:29:18 +0800</pubDate><guid>https://www.rvp.cc/posts/mysql8-root-remote-login/</guid><description>&lt;p&gt;新安装的最新版本MySQL，可以在服务器终端登录root账户，但是外部始终登录不上，报连接拒绝错误&lt;/p&gt;&#10;&lt;div class="code-block-wrap"&gt;&#10; &lt;div class="code-toolbar"&gt;&#10; &lt;span class="code-language" aria-hidden="true"&gt;&lt;/span&gt;&#10; &lt;button class="code-copy" type="button" aria-label="复制代码" title="复制代码" data-code-copy hidden&gt;&#10; &lt;span class="code-copy-icon" aria-hidden="true"&gt;&#10; &lt;svg class="copy-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" focusable="false"&gt;&lt;rect x="8" y="8" width="12" height="12" rx="2"/&gt;&lt;path d="M16 8V6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h2"/&gt;&lt;/svg&gt;&#10; &lt;svg class="check-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" focusable="false"&gt;&lt;path d="m20 6-11 11-5-5"/&gt;&lt;/svg&gt;&#10; &lt;/span&gt;&#10; &lt;span data-copy-label&gt;复制&lt;/span&gt;&#10; &lt;/button&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="code-block" tabindex="0"&gt;&lt;code&gt;mysqli::real_connect(): (hy000/1698): access denied for user &amp;#39;root&amp;#39;@&amp;#39;localhost&amp;#39;&lt;/code&gt;&lt;/pre&gt;&#10; &lt;/div&gt;</description></item><item><title>VSCode+MarkdownImage实现md文档插入图片</title><link>https://www.rvp.cc/posts/vscode-markdown-image/</link><pubDate>Mon, 22 May 2023 14:41:27 +0800</pubDate><guid>https://www.rvp.cc/posts/vscode-markdown-image/</guid><description>&lt;p&gt;写博客时遇到了上传图片的需求，于是找到了&lt;code&gt;markdown-image&lt;/code&gt;这个VSCode插件，可以直接把剪切板图片存入本地指定目录(也可以根据自己需求上传到其他云服务器，详情可见插件文档说明)，并自动生成md引用图片的语法。&lt;/p&gt;</description></item><item><title>最新的Let's Encrypt免费https证书配置</title><link>https://www.rvp.cc/posts/lets-encrypt-certificate/</link><pubDate>Fri, 19 May 2023 13:54:57 +0800</pubDate><guid>https://www.rvp.cc/posts/lets-encrypt-certificate/</guid><description>&lt;p&gt;&lt;code&gt;Let's Encrypt&lt;/code&gt;是一个数字证书认证机构，为网站提供免费的TLS证书。&lt;/p&gt;</description></item></channel></rss>