<?xml-stylesheet href="/rss.xsl" type="text/xsl"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>潘文斌的技术文章</title><link>https://www.panwenbin.cn/</link><description>Recent content on 潘文斌的技术文章</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>2025 潘文斌</copyright><lastBuildDate>Thu, 17 Jul 2025 08:00:00 +0800</lastBuildDate><atom:link href="https://www.panwenbin.cn/index.xml" rel="self" type="application/rss+xml"/><item><title>Hugo新建模板引入Tailwind记录</title><link>https://www.panwenbin.cn/posts/hugo-new-theme-tailwind/</link><pubDate>Thu, 17 Jul 2025 08:00:00 +0800</pubDate><guid>https://www.panwenbin.cn/posts/hugo-new-theme-tailwind/</guid><description>潘文斌的技术文章 https://www.panwenbin.cn/posts/hugo-new-theme-tailwind/ -&lt;h2 id="起因">起因&lt;/h2>
&lt;blockquote>
&lt;p>为了更好的使用Hugo模板，尝试新建一个模板，从而学习和理解模板的工作方式。&lt;br>
理想情况下创建属于自己的模板。&lt;/p>&lt;/blockquote>
&lt;h2 id="环境">环境&lt;/h2>
&lt;p>&lt;code>hugo version&lt;/code>查看hugo版本&lt;/p>
&lt;pre tabindex="0">&lt;code>hugo version
hugo v0.148.1+extended linux/amd64 BuildDate=unknown
&lt;/code>&lt;/pre>&lt;h2 id="创建">创建&lt;/h2>
&lt;p>&lt;code>hugo new theme learn&lt;/code>会在目录&lt;code>themes/&lt;/code>下创建一个名为&lt;code>learn&lt;/code>的新主题，里面包含了基本的目录结构。&lt;/p>
&lt;pre tabindex="0">&lt;code>learn
├── archetypes
├── assets
├── content
├── data
├── hugo.toml
├── i18n
├── layouts
└── static
&lt;/code>&lt;/pre>&lt;h3 id="与site结构对比">与site结构对比&lt;/h3>
&lt;p>使用&lt;code>hugo new site somesite&lt;/code>生成的目录结构，除了少一个&lt;code>themes&lt;/code>目录，其他都有。&lt;br>
并且site的目录内都是空的，theme的目录内还带不少基础内容。&lt;br>
theme也可以直接用&lt;code>hugo serve&lt;/code>运行起来，非常方便theme的调试。&lt;/p>
&lt;h2 id="运行">运行&lt;/h2>
&lt;p>运行起来后，是一个有文本填充的Blog示例。有内容结构，但没有样式。&lt;br>
页面有Home、Posts、Tags，以及Post的详情页面。&lt;/p>
&lt;h2 id="引入tailwind">引入tailwind&lt;/h2>
&lt;p>根据&lt;a href="https://gohugo.io/functions/css/tailwindcss">Hudo Function css.TailwindCSS&lt;/a>，使用TailwindCSS CLI应该是最简单的方式了。&lt;/p>
&lt;p>从&lt;a href="https://github.com/tailwindlabs/tailwindcss/releases">tailwindcss github&lt;/a>下载&lt;code>tailwindcss-linux-x64&lt;/code>文件重命名为&lt;code>tailwindcss&lt;/code>，放到PATH路径下，给予执行权限。&lt;/p>
&lt;p>创建文件&lt;code>assets/css/tailwind.css&lt;/code>，这是v4的写法。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-css" data-lang="css">&lt;span style="display:flex;">&lt;span>@&lt;span style="color:#c678dd">import&lt;/span> &lt;span style="color:#63c381">&amp;#34;tailwindcss&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>创建文件&lt;code>tailwind.config.js&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-javascript" data-lang="javascript">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#c1abea">module&lt;/span>.&lt;span style="color:#c1abea">exports&lt;/span> &lt;span style="color:#c7bf54">=&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#c1abea">content&lt;/span>&lt;span style="color:#c7bf54">:&lt;/span> [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#63c381">&amp;#34;./layouts/**/*.html&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#63c381">&amp;#34;./content/**/*.md&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#c1abea">theme&lt;/span>&lt;span style="color:#c7bf54">:&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#c1abea">extend&lt;/span>&lt;span style="color:#c7bf54">:&lt;/span> {},
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#c1abea">plugins&lt;/span>&lt;span style="color:#c7bf54">:&lt;/span> [],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>创建&lt;code>layouts/_default/baseof.html&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-html" data-lang="html">&lt;span style="display:flex;">&lt;span>{{ with resources.Get &amp;#34;css/tailwind.css&amp;#34; | css.TailwindCSS | minify | fingerprint }}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;&lt;span style="color:#e06c75">link&lt;/span> &lt;span style="color:#b3d23c">rel&lt;/span>&lt;span style="color:#c7bf54">=&lt;/span>&lt;span style="color:#98c379">&amp;#34;stylesheet&amp;#34;&lt;/span> &lt;span style="color:#b3d23c">href&lt;/span>&lt;span style="color:#c7bf54">=&lt;/span>&lt;span style="color:#98c379">&amp;#34;{{ .RelPermalink }}&amp;#34;&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{{ end }}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>修改&lt;code>hugo.toml&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-toml" data-lang="toml">&lt;span style="display:flex;">&lt;span>[&lt;span style="color:#c1abea">module&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[&lt;span style="color:#c1abea">module&lt;/span>.&lt;span style="color:#c1abea">hugoVersion&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#c1abea">extended&lt;/span> = &lt;span style="color:#b756ff;font-weight:bold">true&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[&lt;span style="color:#c1abea">build&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#c1abea">writeStats&lt;/span> = &lt;span style="color:#b756ff;font-weight:bold">true&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[&lt;span style="color:#c1abea">security&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[&lt;span style="color:#c1abea">security&lt;/span>.&lt;span style="color:#c1abea">exec&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#c1abea">allow&lt;/span> = [&lt;span style="color:#98c379">&amp;#39;^tailwindcss$&amp;#39;&lt;/span>] &lt;span style="color:#8a93a5;font-style:italic"># 允许 Hugo 执行 Tailwind CLI&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>- https://www.panwenbin.cn/posts/hugo-new-theme-tailwind/ - 2025 潘文斌</description></item><item><title>Chrome138扩展被禁用怎么启用</title><link>https://www.panwenbin.cn/posts/chrome-extension-disabled/</link><pubDate>Sat, 12 Jul 2025 08:00:00 +0800</pubDate><guid>https://www.panwenbin.cn/posts/chrome-extension-disabled/</guid><description>潘文斌的技术文章 https://www.panwenbin.cn/posts/chrome-extension-disabled/ -&lt;h2 id="问题">问题&lt;/h2>
&lt;blockquote>
&lt;p>Chrome升级到138版本了，之前安装的某些扩展被禁用了，&amp;ldquo;此扩展程序不再受支持，因此已停用&amp;rdquo;，并且这次无法手动启用。&lt;/p>&lt;/blockquote>
&lt;h2 id="回答">回答&lt;/h2>
&lt;h3 id="修改策略">修改策略&lt;/h3>
&lt;p>根据&lt;a href="https://developer.chrome.com/docs/extensions/develop/migrate/mv2-deprecation-timeline?hl=zh-cn">Manifest V2 支持时间表&lt;/a>，在Chrome 139之前，可以通过修改&lt;code> ExtensionManifestV2Availability&lt;/code>策略来启用被禁用的扩展。&lt;/p>
&lt;p>Windows系统下，按&lt;code>Win + R&lt;/code>打开运行窗口，输入&lt;code>regedit&lt;/code>打开注册表编辑器，找到以下路径：&lt;/p>
&lt;pre tabindex="0">&lt;code>Software\Policies\Google\Chrome
&lt;/code>&lt;/pre>&lt;p>添加一个名为&lt;code>ExtensionManifestV2Availability&lt;/code>的DWORD值，设置为&lt;code>2&lt;/code>。如果没有此路径，可以手动创建。&lt;/p>
&lt;p>Linux系统下，打开终端，输入以下命令：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo mkdir -p /etc/opt/chrome/policies/managed
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ef8383">echo&lt;/span> &lt;span style="color:#98c379">&amp;#39;{ &amp;#34;ExtensionManifestV2Availability&amp;#34;: 2 }&amp;#39;&lt;/span> | sudo tee /etc/opt/chrome/policies/managed/manifest_v2.json
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>macOS系统下，打开终端，输入以下命令：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo mkdir -p /Library/Managed&lt;span style="color:#d26464;font-weight:bold">\ &lt;/span>Preferences/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo tee /Library/Managed&lt;span style="color:#d26464;font-weight:bold">\ &lt;/span>Preferences/com.google.Chrome.plist &amp;gt;/dev/null &lt;span style="color:#98c379">&amp;lt;&amp;lt;EOF
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#98c379">&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#98c379">&amp;lt;!DOCTYPE plist PUBLIC &amp;#34;-//Apple//DTD PLIST 1.0//EN&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#98c379"> &amp;#34;http://www.apple.com/DTDs/PropertyList-1.0.dtd&amp;#34;&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#98c379">&amp;lt;plist version=&amp;#34;1.0&amp;#34;&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#98c379">&amp;lt;dict&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#98c379"> &amp;lt;key&amp;gt;ExtensionManifestV2Availability&amp;lt;/key&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#98c379"> &amp;lt;integer&amp;gt;2&amp;lt;/integer&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#98c379">&amp;lt;/dict&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#98c379">&amp;lt;/plist&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#98c379">EOF&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>重启Chrome浏览器。打开&lt;code>chrome://policy/&lt;/code>，可以看到&lt;code>ExtensionManifestV2Availability&lt;/code>的值已经设置为&lt;code>2&lt;/code>。这样就可以正常使用扩展了。&lt;/p>
&lt;h3 id="未打包扩展">未打包扩展&lt;/h3>
&lt;p>打开&lt;code>chrome://flags/&lt;/code>，搜索manifest，找到&lt;code>Allow legacy extension manifest versions&lt;/code>，默认是Default，改为Enabled。
然后会提示重启浏览器，重启后并不能直接使用，此选项只是开启了加载未打包的开发版本的选项。&lt;/p>
&lt;p>然后打开&lt;code>chrome://extensions/&lt;/code>，开启右上角的开发者模式，点击左上角的&lt;code>加载未打包的扩展程序&lt;/code>，选择扩展所在目录即可正常添加扩展。&lt;/p>
&lt;p>至于扩展的未打包版本，需要找到扩展的开源代码，通常是Github上，下载源代码自己编译。
或者直接下载打包好的crx文件，后缀改为zip，解压后放到某个目录，然后加载未打包的扩展程序选择此目录即可。&lt;/p>- https://www.panwenbin.cn/posts/chrome-extension-disabled/ - 2025 潘文斌</description></item><item><title>HTTP中的chunked是什么</title><link>https://www.panwenbin.cn/posts/http-chunked/</link><pubDate>Thu, 10 Jul 2025 08:00:00 +0800</pubDate><guid>https://www.panwenbin.cn/posts/http-chunked/</guid><description>潘文斌的技术文章 https://www.panwenbin.cn/posts/http-chunked/ -&lt;h2 id="问题">问题&lt;/h2>
&lt;blockquote>
&lt;p>HTTP/1.1中，响应头中的&lt;code>Transfer-Encoding: chunked&lt;/code>是什么意思？&lt;/p>&lt;/blockquote>
&lt;h2 id="回答">回答&lt;/h2>
&lt;p>在HTTP/1.1中，&lt;code>Transfer-Encoding: chunked&lt;/code>是一种传输编码方式，用于在响应中分块传输数据。这种方式允许服务器在不知道内容长度的情况下发送响应，适用于动态生成的内容或流式数据。&lt;/p>
&lt;p>对于HTML内容，使用&lt;code>chunked&lt;/code>编码时，可以提高响应速度，浏览器可以在接收到第一个数据块后立即开始渲染页面，而不必等待整个响应完成。这对于需要实时更新或逐步加载的内容非常有用。&lt;/p>
&lt;p>对于动态生成的内容，可能不知道最后的数据大小，更适合使用&lt;code>chunked&lt;/code>编码。尽早把生成的内容发送出去，还能节省服务器内存占用。&lt;/p>
&lt;h2 id="格式">格式&lt;/h2>
&lt;pre tabindex="0">&lt;code>长度\r\n
内容\r\n
长度\r\n
内容\r\n
长度(0)\r\n
内容(空)\r\n
&lt;/code>&lt;/pre>&lt;p>例如:&lt;/p>
&lt;pre tabindex="0">&lt;code>4\r\n
Wiki\r\n
5\r\n
pedia\r\n
E\r\n
in\r\n
\r\n
chunks.\r\n
0\r\n
\r\n
&lt;/code>&lt;/pre>&lt;h2 id="废弃">废弃&lt;/h2>
&lt;p>在 HTTP/2 中，Transfer-Encoding: chunked 被废弃，因为 HTTP/2 引入了更先进的 帧（frame）机制 和 流（stream）控制，已经内建了流式传输能力，无需使用传统的 chunked 编码，并且还支持多路复用。&lt;/p>- https://www.panwenbin.cn/posts/http-chunked/ - 2025 潘文斌</description></item><item><title>Linux终端如何显示彩色文字</title><link>https://www.panwenbin.cn/posts/linux-console-color-text/</link><pubDate>Mon, 07 Jul 2025 08:00:00 +0800</pubDate><guid>https://www.panwenbin.cn/posts/linux-console-color-text/</guid><description>潘文斌的技术文章 https://www.panwenbin.cn/posts/linux-console-color-text/ -&lt;h2 id="问题">问题&lt;/h2>
&lt;blockquote>
&lt;p>Linux终端如何显示彩色文字？&lt;/p>&lt;/blockquote>
&lt;h2 id="回答">回答&lt;/h2>
&lt;p>打印彩色文字需要使用ANSI转义序列。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ef8383">echo&lt;/span> -e &lt;span style="color:#63c381">&amp;#34;\033[31m红色文字\033[0m&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>其中&amp;quot;\033&amp;quot;也可以用&amp;quot;\x1b&amp;quot;，是ASCII码的ESC字符，&amp;ldquo;31&amp;quot;表示红色，&amp;ldquo;0&amp;quot;表示重置颜色。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>代码&lt;/th>
&lt;th>颜色&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>30&lt;/td>
&lt;td>黑色&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>31&lt;/td>
&lt;td>红色&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>32&lt;/td>
&lt;td>绿色&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>33&lt;/td>
&lt;td>黄色&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>34&lt;/td>
&lt;td>蓝色&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>35&lt;/td>
&lt;td>紫色&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>36&lt;/td>
&lt;td>青色&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>37&lt;/td>
&lt;td>白色&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>1&lt;/td>
&lt;td>加粗&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>4&lt;/td>
&lt;td>下划线&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>更多颜色代码可以参考&lt;a href="https://en.wikipedia.org/wiki/ANSI_escape_code#Colors">ANSI escape code&lt;/a>。&lt;/p>- https://www.panwenbin.cn/posts/linux-console-color-text/ - 2025 潘文斌</description></item><item><title>Kodi如何重置所有配置</title><link>https://www.panwenbin.cn/posts/kodi-reset/</link><pubDate>Sun, 06 Jul 2025 08:00:00 +0800</pubDate><guid>https://www.panwenbin.cn/posts/kodi-reset/</guid><description>潘文斌的技术文章 https://www.panwenbin.cn/posts/kodi-reset/ -&lt;h2 id="问题">问题&lt;/h2>
&lt;blockquote>
&lt;p>Kodi配置和插件搞乱了，如何重置所有配置？&lt;/p>&lt;/blockquote>
&lt;h2 id="回答">回答&lt;/h2>
&lt;p>只要删除配置目录即可。以下是Kodi在不同操作系统上的配置目录：&lt;/p>
&lt;pre tabindex="0">&lt;code>Android - Android/data/org.xbmc.kodi/files/.kodi
iOS - /private/var/mobile/Library/Preferences/Kodi
LibreELEC - /storage/.kodi
Linux - ~/.kodi
OSMC - /home/osmc/.kodi
Mac - /Users/&amp;lt;your_user_name&amp;gt;/Library/Application Support/Kodi
Windows - %APPDATA%\Kodi
Windows UWP - %LOCALAPPDATA%\Packages\XBMCFoundation.Kodi_4n2hpmxwrvr6p\LocalCache\Roaming\Kodi\
&lt;/code>&lt;/pre>- https://www.panwenbin.cn/posts/kodi-reset/ - 2025 潘文斌</description></item><item><title>Linux如何使用iSCSI挂载NAS远程磁盘</title><link>https://www.panwenbin.cn/posts/linux-use-iscsi/</link><pubDate>Sun, 06 Jul 2025 08:00:00 +0800</pubDate><guid>https://www.panwenbin.cn/posts/linux-use-iscsi/</guid><description>潘文斌的技术文章 https://www.panwenbin.cn/posts/linux-use-iscsi/ -&lt;h2 id="问题">问题&lt;/h2>
&lt;blockquote>
&lt;p>使用NAS磁盘时体验最接近本地盘的是iSCSI，那么如何在Linux上使用iSCSI挂载NAS远程磁盘呢？&lt;/p>&lt;/blockquote>
&lt;h2 id="回答">回答&lt;/h2>
&lt;p>安装iSCSI相关软件包：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get install open-iscsi
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>发现服务&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo iscsiadm -m discovery -t sendtargets -p &amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>登录&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo iscsiadm -m node -T &amp;lt;target&amp;gt; -p &amp;lt;host&amp;gt;:&amp;lt;port&amp;gt; --login
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>此时可以发现已经有新添加的/dev/sdX设备了。像本地磁盘一样使用就行。&lt;/p>
&lt;p>不用了，登出&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo iscsiadm -m node -T &amp;lt;target&amp;gt; -p &amp;lt;host&amp;gt;:&amp;lt;port&amp;gt; --logout
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>- https://www.panwenbin.cn/posts/linux-use-iscsi/ - 2025 潘文斌</description></item><item><title>JS匿名函数直接执行怎么写</title><link>https://www.panwenbin.cn/posts/js-anonymous-function/</link><pubDate>Fri, 04 Jul 2025 08:00:00 +0800</pubDate><guid>https://www.panwenbin.cn/posts/js-anonymous-function/</guid><description>潘文斌的技术文章 https://www.panwenbin.cn/posts/js-anonymous-function/ -&lt;h2 id="问题">问题&lt;/h2>
&lt;blockquote>
&lt;p>Javascript中匿名函数直接执行怎么写？&lt;br>
&lt;code>function(){}()&lt;/code>这种写法为什么会报错？&lt;/p>&lt;/blockquote>
&lt;h2 id="回答">回答&lt;/h2>
&lt;p>常规写法，最通用，ES5支持，最外层的括号使得function识别为表达式，如果没有括号会被识别为函数声明。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-javascript" data-lang="javascript">&lt;span style="display:flex;">&lt;span>(&lt;span style="color:#c678dd">function&lt;/span> () {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#c1abea">console&lt;/span>.&lt;span style="color:#c1abea">log&lt;/span>(&lt;span style="color:#98c379">&amp;#39;IIFE 1&amp;#39;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>})();
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>箭头函数写法，最简短，ES6支持。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-javascript" data-lang="javascript">&lt;span style="display:flex;">&lt;span>(() =&amp;gt; {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#c1abea">console&lt;/span>.&lt;span style="color:#c1abea">log&lt;/span>(&lt;span style="color:#98c379">&amp;#39;IIFE 2&amp;#39;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>})();
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>前操作符写法，不太常用，ES5支持。同样可以防止识别为函数声明。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-javascript" data-lang="javascript">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#c7bf54">!&lt;/span>&lt;span style="color:#c678dd">function&lt;/span> () { &lt;span style="color:#c1abea">console&lt;/span>.&lt;span style="color:#c1abea">log&lt;/span>(&lt;span style="color:#98c379">&amp;#39;IIFE 3&amp;#39;&lt;/span>); }();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#c7bf54">+&lt;/span>&lt;span style="color:#c678dd">function&lt;/span> () { &lt;span style="color:#c1abea">console&lt;/span>.&lt;span style="color:#c1abea">log&lt;/span>(&lt;span style="color:#98c379">&amp;#39;IIFE 3&amp;#39;&lt;/span>); }();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#c7bf54">-&lt;/span>&lt;span style="color:#c678dd">function&lt;/span> () { &lt;span style="color:#c1abea">console&lt;/span>.&lt;span style="color:#c1abea">log&lt;/span>(&lt;span style="color:#98c379">&amp;#39;IIFE 3&amp;#39;&lt;/span>); }();
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>总结：如果function外没有括号或者前操作符，function会被识别为函数声明，而不作为匿名函数来执行。&lt;/p>- https://www.panwenbin.cn/posts/js-anonymous-function/ - 2025 潘文斌</description></item><item><title>Git命令方便的Alias</title><link>https://www.panwenbin.cn/posts/git-alias/</link><pubDate>Wed, 02 Jul 2025 08:00:00 +0800</pubDate><guid>https://www.panwenbin.cn/posts/git-alias/</guid><description>潘文斌的技术文章 https://www.panwenbin.cn/posts/git-alias/ -&lt;h2 id="起因">起因&lt;/h2>
&lt;blockquote>
&lt;p>Git命令很多，不说不常用的完全记不住。就算常用的，也略显太长了，用起来不方便。&lt;/p>&lt;/blockquote>
&lt;h2 id="git别名">Git别名&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8a93a5;font-style:italic"># 树形 log（简洁视图）&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git config --global alias.lg &lt;span style="color:#63c381">&amp;#34;log --oneline --graph --decorate --all&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8a93a5;font-style:italic"># Git 仓库根目录&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git config --global alias.root &lt;span style="color:#98c379">&amp;#39;rev-parse --show-toplevel&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8a93a5;font-style:italic"># 状态 + 简洁信息&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git config --global alias.st &lt;span style="color:#63c381">&amp;#34;status -sb&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8a93a5;font-style:italic"># 简洁的 diff（侧边-by-side + 颜色增强）&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git config --global alias.df &lt;span style="color:#63c381">&amp;#34;diff --color-words&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8a93a5;font-style:italic"># 快速 amend（修改上次提交）&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git config --global alias.amend &lt;span style="color:#63c381">&amp;#34;commit --amend --no-edit&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8a93a5;font-style:italic"># 当前分支推送并设置上游&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git config --global alias.pushup &lt;span style="color:#63c381">&amp;#34;push --set-upstream origin HEAD&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>之后就可以使用&lt;code>git lg&lt;/code>查看树形日志等操作，简短好记。&lt;/p>- https://www.panwenbin.cn/posts/git-alias/ - 2025 潘文斌</description></item><item><title>Linux安装VNC服务器</title><link>https://www.panwenbin.cn/posts/linux-vnc-server/</link><pubDate>Thu, 26 Jun 2025 08:00:00 +0800</pubDate><guid>https://www.panwenbin.cn/posts/linux-vnc-server/</guid><description>潘文斌的技术文章 https://www.panwenbin.cn/posts/linux-vnc-server/ -&lt;blockquote>
&lt;p>Linux服务器通常是不安装桌面的，如果自用的，安装桌面环境后，使用VNC连接当云电脑使用。&lt;/p>&lt;/blockquote>
&lt;h2 id="安装软件包">安装软件包&lt;/h2>
&lt;p>这边使用xfce作为桌面，使用lightdm作为桌面管理器，使用TigerVNC作为VNC服务器。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get update
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo apt-get install xfce4 lightdm tigervnc-standalone-server
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="使用">使用&lt;/h2>
&lt;p>输入&lt;code>vncserver&lt;/code>就可以启动VNC服务器，第一次运行会提示设置密码，但是默认设置启动的是监听到&lt;code>127.0.0.1&lt;/code>的，远程无法连接&lt;/p>
&lt;h3 id="配置vnc">配置VNC&lt;/h3>
&lt;p>修改&lt;code>.vnc/config&lt;/code>，写入如下配置&lt;/p>
&lt;pre tabindex="0">&lt;code>session=xfce
localhost=no
alwaysshared
&lt;/code>&lt;/pre>&lt;p>设置使用xfce桌面，不监听到localhost，alwaysshared允许x2vnc等用来键鼠控制。&lt;/p>
&lt;p>使用&lt;code>vncserver -kill :1&lt;/code>关闭之前打开的session，再次运行&lt;code>vncserver&lt;/code>，这次就可以远程连接了，默认端口是5901。&lt;/p>
&lt;h2 id="xorg">xorg&lt;/h2>
&lt;p>上面的方式启动的VNC都是虚拟桌面的，如果要使用物理显示器的桌面，需要使用xorg扩展。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sdudo apt-get install tigervnc-xorg-extension
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="配置xorg-extension">配置xorg-extension&lt;/h3>
&lt;p>新建&lt;code>/etc/X11/xorg.conf.d/10-vnc.conf&lt;/code>文件，内容如下&lt;/p>
&lt;pre tabindex="0">&lt;code>Section &amp;#34;Module&amp;#34;
Load &amp;#34;vnc&amp;#34;
EndSection
Section &amp;#34;Screen&amp;#34;
Identifier &amp;#34;Screen0&amp;#34;
Option &amp;#34;UserPasswdVerifier&amp;#34; &amp;#34;VncAuth&amp;#34;
Option &amp;#34;PasswordFile&amp;#34; &amp;#34;/home/&amp;lt;user&amp;gt;/.vnc/passwd&amp;#34;
EndSection
&lt;/code>&lt;/pre>&lt;p>把&lt;code>&amp;lt;user&amp;gt;&lt;/code>替换成实际的用户名。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo systemctl restart lightdm
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>重启lightdm服务后，就可以&lt;code>5900&lt;/code>端口，连接到物理显示器的桌面了。&lt;/p>- https://www.panwenbin.cn/posts/linux-vnc-server/ - 2025 潘文斌</description></item><item><title>Linux下怎么查看进程的环境变量</title><link>https://www.panwenbin.cn/posts/linux-process-env/</link><pubDate>Mon, 23 Jun 2025 08:00:00 +0800</pubDate><guid>https://www.panwenbin.cn/posts/linux-process-env/</guid><description>潘文斌的技术文章 https://www.panwenbin.cn/posts/linux-process-env/ -&lt;h2 id="问题">问题&lt;/h2>
&lt;blockquote>
&lt;p>Linux下怎么查看进程的环境变量？&lt;/p>&lt;/blockquote>
&lt;h2 id="回答">回答&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cat /proc/&amp;lt;pid&amp;gt;/environ | tr &lt;span style="color:#98c379">&amp;#39;\0&amp;#39;&lt;/span> &lt;span style="color:#98c379">&amp;#39;\n&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>- https://www.panwenbin.cn/posts/linux-process-env/ - 2025 潘文斌</description></item></channel></rss>