<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title></title>
	<atom:link href="https://www.hu365.dev/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.hu365.dev</link>
	<description>Justin Woo（吴晓虎）的个人博客，生命不息，学习不止</description>
	<lastBuildDate>Sun, 18 Feb 2024 01:34:53 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.4.3</generator>

<image>
	<url>https://www.hu365.dev/wp-content/uploads/2022/10/cropped-logo-正矩形.blue_-32x32.png</url>
	<title></title>
	<link>https://www.hu365.dev</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>webstorm的代理设置</title>
		<link>https://www.hu365.dev/blog/2023/02/301/</link>
		
		<dc:creator><![CDATA[Justin]]></dc:creator>
		<pubDate>Sun, 05 Feb 2023 00:47:00 +0000</pubDate>
				<category><![CDATA[前端笔记]]></category>
		<category><![CDATA[JetBrains]]></category>
		<category><![CDATA[Webstorm]]></category>
		<guid isPermaLink="false">https://www.hu365.dev/?p=301</guid>

					<description><![CDATA[一：自身代理配置 官方文档：HTTP Proxy &#124; WebStorm Documentation (jetb [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">一：自身代理配置</h2>



<p>官方文档：<a href="https://www.jetbrains.com/help/webstorm/settings-http-proxy.html">HTTP Proxy | WebStorm Documentation (jetbrains.com)</a><br>影响插件、工具下载等常用请求</p>



<h2 class="wp-block-heading">二：Git代理配置</h2>



<pre class="EnlighterJSRAW" data-enlighter-language="powershell" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">#设置全局代理
git config --global http.proxy http://127.0.0.1:10811
git config --global https.proxy https://127.0.0.1:10811
git config --global http.proxy socks5://127.0.0.1:10810
git config --global https.proxy socks5://127.0.0.1:10810

#只对github.com使用代理，其他仓库不走代理
git config --global http.https://github.com.proxy socks5://127.0.0.1:10810
git config --global https.https://github.com.proxy socks5://127.0.0.1:10810
#取消github代理
git config --global --unset http.https://github.com.proxy
git config --global --unset https.https://github.com.proxy

#取消全局代理
git config --global --unset http.proxy
git config --global --unset https.proxy</pre>



<p>影响代码仓库的拉取、推送及<code>git</code>的其他请求</p>



<h2 class="wp-block-heading">三：Npm代理配置</h2>



<pre class="EnlighterJSRAW" data-enlighter-language="powershell" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">#直接代理
npm config set proxy http://127.0.0.1:18011
npm config set https-proxy https://127.0.0.1:18011

#授权代理
npm config set proxy http://username:password@127.0.0.1:18011
npm config set https-proxy https://username:password@127.0.0.1:18011

#取消代理
npm config delete proxy
npm config delete https-proxy</pre>



<p>影响<code>npm</code>下载、推送等</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Xampp MySql 不能启动记录</title>
		<link>https://www.hu365.dev/blog/2023/01/295/</link>
		
		<dc:creator><![CDATA[Justin]]></dc:creator>
		<pubDate>Tue, 31 Jan 2023 11:26:00 +0000</pubDate>
				<category><![CDATA[折腾笔记]]></category>
		<category><![CDATA[xampp]]></category>
		<guid isPermaLink="false">https://www.hu365.dev/?p=295</guid>

					<description><![CDATA[一：错误展示 过完春节回来，忽然就启动不了了，错误日志如下 二：解决办法 不会的东西就要学，搜索引擎好助手，参 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">一：错误展示</h2>



<p>过完春节回来，忽然就启动不了了，错误日志如下</p>



<pre class="EnlighterJSRAW" data-enlighter-language="prolog" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">Cannot find checkpoint record at LSN (1,0x60c9)
2023-01-31 16:47:40 0 [ERROR] mysqld.exe: Aria recovery failed. Please run aria_chk -r on all Aria tables and delete all aria_log.######## files
2023-01-31 16:47:40 0 [ERROR] Plugin 'Aria' init function returned error.
2023-01-31 16:47:40 0 [ERROR] Plugin 'Aria' registration as a STORAGE ENGINE failed.
2023-01-31 16:47:40 0 [Note] InnoDB: Mutexes and rw_locks use Windows interlocked functions
2023-01-31 16:47:40 0 [Note] InnoDB: Uses event mutexes
2023-01-31 16:47:40 0 [Note] InnoDB: Compressed tables use zlib 1.2.12
2023-01-31 16:47:40 0 [Note] InnoDB: Number of pools: 1
2023-01-31 16:47:40 0 [Note] InnoDB: Using SSE2 crc32 instructions
2023-01-31 16:47:40 0 [Note] InnoDB: Initializing buffer pool, total size = 16M, instances = 1, chunk size = 16M
2023-01-31 16:47:40 0 [Note] InnoDB: Completed initialization of buffer pool
2023-01-31 16:47:40 0 [Note] InnoDB: 128 out of 128 rollback segments are active.
2023-01-31 16:47:40 0 [Note] InnoDB: Creating shared tablespace for temporary tables
2023-01-31 16:47:40 0 [Note] InnoDB: Setting file 'C:\xampp\mysql\data\ibtmp1' size to 12 MB. Physically writing the file full; Please wait ...
2023-01-31 16:47:40 0 [Note] InnoDB: File 'C:\xampp\mysql\data\ibtmp1' size is now 12 MB.
2023-01-31 16:47:40 0 [Note] InnoDB: Waiting for purge to start
2023-01-31 16:47:41 0 [Note] InnoDB: 10.4.27 started; log sequence number 29968412; transaction id 12673
2023-01-31 16:47:41 0 [Note] InnoDB: Loading buffer pool(s) from C:\xampp\mysql\data\ib_buffer_pool
2023-01-31 16:47:41 0 [Note] Plugin 'FEEDBACK' is disabled.
2023-01-31 16:47:41 0 [ERROR] Could not open mysql.plugin table. Some plugins may be not loaded
2023-01-31 16:47:41 0 [ERROR] Failed to initialize plugins.
2023-01-31 16:47:41 0 [ERROR] Aborting</pre>



<h2 class="wp-block-heading">二：解决办法</h2>



<p>不会的东西就要学，搜索引擎好助手，参考链接：<br><a href="https://stackoverflow.com/questions/59410692/xampp-windows-mariadb-not-starting/59411279#59411279">xampp windows mariadb not starting &#8211; Stack Overflow</a></p>



<p>白话版：使用<code>mysql</code>安装目录下<code>bin</code>文件夹下的工具<code>aria_chk</code>检测修复所有数据文件<code>.MAI</code></p>



<ol>
<li>用管理员权限打开<code>cmd</code>，因为我默认安装在系统盘</li>



<li><code>cd C:\xampp\mysql\data</code>，此为<code>xampp</code>安装路径中的<code>data</code>目录</li>



<li><code>..\bin\aria_chk -r mysql\*.MAI</code>，执行检测修复</li>



<li><code>del aria_log.*</code>，删除当前目录（<code>data</code>）下所有<code>aria_log.########</code>文件</li>
</ol>



<p>重新启动即可</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>在wordpress页面中嵌入React页面应用</title>
		<link>https://www.hu365.dev/blog/2022/12/215/</link>
		
		<dc:creator><![CDATA[Justin]]></dc:creator>
		<pubDate>Mon, 19 Dec 2022 12:05:22 +0000</pubDate>
				<category><![CDATA[前端笔记]]></category>
		<category><![CDATA[React]]></category>
		<category><![CDATA[wordpress]]></category>
		<guid isPermaLink="false">https://www.hu365.dev/?p=215</guid>

					<description><![CDATA[想实现一个“技术题库”的专栏，用来收藏一些经典题型、不太熟悉的面试题/技术题，采局部React应用的方式实现  [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>想实现一个“技术题库”的专栏，用来收藏一些经典题型、不太熟悉的面试题/技术题，采局部<code>React</code>应用的方式实现</p>



<h2 class="wp-block-heading">一：XAMPP环境</h2>



<p>本地启用<code>wordpress</code>，还原现网主题与配置，启用本地测试域名</p>



<h3 class="wp-block-heading">1.1：本地wordpress</h3>



<p><code>XAMPP</code>是免费的集成安装包（<a href="https://www.apachefriends.org/">下载地址</a>），集成了<code>Apache</code>、<code>php8</code>、<code>mysql</code>、<code>phpMyAdmin</code></p>



<ul>
<li>下载<code>wordpress</code>解压到自己想要放的位置，我选择在<code>/xampp/apps/www.hu365.test</code></li>



<li>把线上使用的<code>主题</code>完整下载并在本地主题使用</li>



<li>通过<code>phpMyAdmin</code>，创建数据库并导入线上的备份数据</li>



<li>配置<code>xampp/apache/conf/extra/httpd-vhosts.conf</code>文件，添加本地测试域名：<code>www.hu365.test</code></li>



<li>本地<code>host</code>文件，将<code>www.hu365.test</code>指向<code>127.0.0.1</code></li>
</ul>



<p>此时，就可以通过<code>www.hu365.test</code>访问和线上环境一样的页面了</p>



<h3 class="wp-block-heading">1.2：wordpress页面</h3>



<p>新建页面<code>技术题库</code>，使用<code>代码编辑器</code>，引入最新的<code>react.js</code>、以及生产<code>js</code>、<code>css</code></p>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;!-- 所有额外引入的js、css -->
&lt;div>
	&lt;script src="/wp-content/apps/topic-bank/static/js/react.production.min.js" crossorigin>&lt;/script>
	&lt;script src="/wp-content/apps/topic-bank/static/js/react-dom.production.min.js" crossorigin>&lt;/script>
	&lt;script defer="defer" src="/wp-content/apps/topic-bank/static/js/main.js">&lt;/script>
	&lt;link href="/wp-content/apps/topic-bank/static/css/main.css" rel="stylesheet">
&lt;/div>
&lt;!-- 这是react渲染节点 -->
&lt;div id="react_root">&lt;/div></pre>



<ul>
<li>这里有进行<code>格式化</code>排版，实际代码为了减少多余换行，去掉了所有换行与空格</li>



<li>引入路径都是用<code>绝对路径</code>引入</li>



<li>路径<code>/wp-content/apps/topic-bank</code>是<code>react</code>指定的生产目录</li>



<li><code>main.js</code>、<code>main.css</code>为生产环境<code>不含hash</code>的最终文件，此举是为了测试，异步加载主<code>js</code></li>



<li>页面访问路径（<code>URL</code>），需在路由配置中配置为<code>basename</code>，此处配置为<code>/topic-bank</code></li>
</ul>



<h2 class="wp-block-heading">二：React应用</h2>



<p>使用<code>create-react-app</code>构建<code>react app</code>，配置生产文件名、生产路径、静态资源等</p>



<h3 class="wp-block-heading">2.1：替换index.html</h3>



<p>访问本地页面：技术题库，右键另存为页面得到<code>index.html</code>页面和资源文件夹</p>



<ul>
<li>把资源文件夹重命名：<code>static</code>，并在<code>static</code>下新建文件夹：<code>js</code>、<code>css</code></li>



<li><code>js</code>文件移动到<code>js</code>文件夹，<code>css</code>文件移动到<code>css</code>文件夹，并同步修改相关引用路径</li>



<li>下载<code>react.production.min.js</code>、<code>react-dom.production.min.js</code>到<code>js</code>文件夹</li>
</ul>



<p>此举是为了实现测试环境的样式和线上相同，方便直接使用<code>react</code>进行调试开始</p>



<h3 class="wp-block-heading">2.2：生产配置</h3>



<p>因为<code>create-react-app</code>构建应用无法直接修改webpack，这里需要安装使用<code>react-app-rewired</code>，可以同步安装<code>customize-cra</code></p>



<pre class="EnlighterJSRAW" data-enlighter-language="powershell" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">npm install react-app-rewired --save-dev</pre>



<p>创建文件<code>config-overrides.js</code>，在其中修改配置：</p>



<pre class="EnlighterJSRAW" data-enlighter-language="js" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">module.exports = function override(config, env) {
	// 仅修改生产配置
	if (env !== 'production') return config;
	const paths = require('react-scripts/config/paths');

	// 额外引入的
	// react.production.min.js、react-dom.production.min.js
	// 不参与打包
	config.externals = {
		'react': 'React',
		'react-dom': 'ReactDOM',
	}

	// 生产输出目录
	// 与"页面"中路径一致：/wp-content/apps/topic-bank
	config.output.path = "C:/xampp/apps/www.hu365.dev/wp-content/apps/topic-bank";
	paths.appBuild = "C:/xampp/apps/www.hu365.dev/wp-content/apps/topic-bank";

	// Get rid of hash for js files
	// 方便测试，脚本文件去除hash
	config.output.filename = "static/js/[name].js";
	config.output.chunkFilename = "static/js/[name].chunk.js";

	// Get rid of hash for css files
	// 方便测试，样式文件去除hash
	const miniCssExtractPlugin = config.plugins.find(element => element.constructor.name === "MiniCssExtractPlugin");
	miniCssExtractPlugin.options.filename = "static/css/[name].css";
	miniCssExtractPlugin.options.chunkFilename = "static/css/[name].css";

	// Get rid of hash for media files
	// 方便测试，其他文件去除hash
	config.module.rules[1].oneOf.forEach(oneOf => {
		if (!oneOf.options || oneOf.options.name !== "static/media/[name].[hash:8].[ext]") {
			return;
		}
		oneOf.options.name = "static/media/[name].[ext]";
	});
	return config;
}</pre>



<h3 class="wp-block-heading">2.3：添加路由</h3>



<p>新建<code>router/index.tsx</code></p>



<pre class="EnlighterJSRAW" data-enlighter-language="js" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// 列表页、和详情页
import TopicList from "../views/TopicList";
import TopicContent from "../views/TopicContent";
import {
	createBrowserRouter,
	RouterProvider,
} from "react-router-dom";

const router = createBrowserRouter([
	{
		path: "/",
		element: &lt;TopicList />,
	},
	{
		path: "/topicName",
		element: &lt;TopicContent />,
	},
], {
	// 通过环境变量配置基础路径
	basename: process.env.REACT_APP_ROUTER_BASE_NAME
});

export default function Router() {
	return (
		&lt;RouterProvider router={router} />
	)
}</pre>



<p>环境变量配置：</p>



<pre class="EnlighterJSRAW" data-enlighter-language="js" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// 测试环境：.env.development
// 随意填写
REACT_APP_ROUTER_BASE_NAME = /

// 生产环境：.env.production
// 该路径必须和"页面"访问URL相同，否则无法访问（/topic-bank）
REACT_APP_ROUTER_BASE_NAME = /topic-bank</pre>



<h3 class="wp-block-heading">2.4：配置别名</h3>



<p>正在开发中，忽然发现<code>../../*</code>的书写格式还是太丑了，赶紧把别名加上<br><code>webpack</code>的<code>alias</code>配置，同样在<code>config-override.js</code>中配置：</p>



<pre class="EnlighterJSRAW" data-enlighter-language="js" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">const path = require("node:path");

module.exports = function override(config, env) {
    // 相对路径别名
    config.resolve.alias = {
        '@': path.resolve(__dirname, 'src'),
        '@Pages': path.resolve(__dirname, 'src/pages'),
        '@Style': path.resolve(__dirname, 'src/style'),
        '@Components': path.resolve(__dirname, 'src/components'),
    };

    // 其他内容
    
    return config;
}</pre>



<p><code>TS</code>配置，<code>tsconfig.json</code>文件：</p>



<pre class="EnlighterJSRAW" data-enlighter-language="js" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">{
  "compilerOptions": {
    ...
    "paths": {
      "@/*": ["./*"],
      "@Pages/*": ["./pages/*"],
      "@Style/*": ["./style/*"],
      "@Components/*": ["./components/*"]
    }
  },
  ...
}
</pre>



<h2 class="wp-block-heading">三：开发中</h2>



<p>完成以上工作后，启动测试服务，访问的页面和线上“技术题库”页面样式一致<br>这样就可以脱离<code>wordpress</code>进行本地开发<br>待到一定阶段，需要看最终效果时；直接<code>build</code>一下，再在本地环境访问“技术题库”即可</p>



<p>好了，可以开始接下来开发工作了！</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>批量重命名工具：PowerRename</title>
		<link>https://www.hu365.dev/blog/2022/12/205/</link>
		
		<dc:creator><![CDATA[Justin]]></dc:creator>
		<pubDate>Sat, 10 Dec 2022 07:50:44 +0000</pubDate>
				<category><![CDATA[折腾笔记]]></category>
		<category><![CDATA[PowerRename]]></category>
		<category><![CDATA[PowerToys]]></category>
		<category><![CDATA[工具]]></category>
		<guid isPermaLink="false">https://www.hu365.dev/?p=205</guid>

					<description><![CDATA[参考链接： 一：Microsoft PowerToys 今天在整理音乐资源 然后发现mp3tag无法实现歌词歌 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>参考链接：</p>



<ul>
<li><a href="https://learn.microsoft.com/zh-cn/windows/powertoys/">Microsoft PowerToys | Microsoft Learn</a></li>
</ul>



<h2 class="wp-block-heading">一：Microsoft PowerToys</h2>



<p>今天在整理音乐资源</p>



<ol>
<li>使用<code><a href="https://www.mp3tag.de/en/">mp3tag</a></code>批量修改文件信息，批量修改文件名为：【歌手 &#8211; 歌曲名】</li>



<li>再用<code><a href="https://github.com/real-zony/ZonyLrcToolsX">ZonyLrcToolsX</a></code>批量获取歌词文件，以上命名方式是为了提高准确度</li>



<li>得到数据后，在有文件夹分类的情况下，想把文件名改为【歌曲名】</li>
</ol>



<p>然后发现<code>mp3tag</code>无法实现歌词歌曲同步修改（不记得上一次是怎么重命名的了）<br>于是需要再寻求一个批量重命名的方法/工具<br>结果被我发现了：<a href="https://learn.microsoft.com/zh-cn/windows/powertoys/"><code>Microsoft PowerToys</code></a></p>



<p>该工具包是微软自己维护开发的，稳定性和安全性不用质疑<br>系统要求：<code>Windows 10 v2004 (19041)</code> 及以上版本或<code>Windows 11</code><br>总算又为<code>Windows 11</code>找到一个“更香”的理由了</p>



<h2 class="wp-block-heading">二：PowerRename</h2>



<p><code>PowerRename</code>属于<code>Microsoft PowerToys</code>中的一个小工具，其他还有很多功能扩展的工具，需要自己慢慢去探索<br>就我个人而言，<code>PowerRename</code>已经满足了我对批量重命名的要求：</p>



<ul>
<li>支持文件夹、子文件夹下批量修改，可以直接在文件夹上右键启用工具</li>



<li>支持单独文件勾选，排除某些特殊情况</li>



<li>支持正则匹配，这对于编码人员来说挺友好</li>



<li>实时的预览对比，再确认修改之前可以反复尝试</li>
</ul>



<figure class="wp-block-image size-large"><a href="https://www.hu365.dev/wp-content/uploads/2022/12/2022-12-10-153836-jpg.webp"><img data-dominant-color="e0e6ec" data-has-transparency="false" style="--dominant-color: #e0e6ec;" fetchpriority="high" decoding="async" width="1024" height="586" src="https://www.hu365.dev/wp-content/uploads/2022/12/2022-12-10-153836-1024x586.webp" alt="PowerRename" class="not-transparent wp-image-206" srcset="https://www.hu365.dev/wp-content/uploads/2022/12/2022-12-10-153836-1024x586.webp 1024w, https://www.hu365.dev/wp-content/uploads/2022/12/2022-12-10-153836-300x172.webp 300w, https://www.hu365.dev/wp-content/uploads/2022/12/2022-12-10-153836-768x439.webp 768w, https://www.hu365.dev/wp-content/uploads/2022/12/2022-12-10-153836-jpg.webp 1386w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>当然，要吐槽的地方也有，那就是速度有点慢</p>



<figure class="wp-block-image size-large"><a href="https://www.hu365.dev/wp-content/uploads/2022/12/2022-12-10-154343-jpg.webp"><img data-dominant-color="e4e9ed" data-has-transparency="false" style="--dominant-color: #e4e9ed;" decoding="async" width="1024" height="586" src="https://www.hu365.dev/wp-content/uploads/2022/12/2022-12-10-154343-1024x586.webp" alt="PowerRename" class="not-transparent wp-image-207" srcset="https://www.hu365.dev/wp-content/uploads/2022/12/2022-12-10-154343-1024x586.webp 1024w, https://www.hu365.dev/wp-content/uploads/2022/12/2022-12-10-154343-300x172.webp 300w, https://www.hu365.dev/wp-content/uploads/2022/12/2022-12-10-154343-768x439.webp 768w, https://www.hu365.dev/wp-content/uploads/2022/12/2022-12-10-154343-jpg.webp 1386w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>不过我这是是在【网络位置】的【网盘】操作，受网络速度影响挺大<br>没再测试本地磁盘的速度情况了，需求实现还是很香<br></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>PVE 6.1.3 升级 7.0 记录</title>
		<link>https://www.hu365.dev/blog/2022/12/193/</link>
		
		<dc:creator><![CDATA[Justin]]></dc:creator>
		<pubDate>Thu, 08 Dec 2022 03:33:15 +0000</pubDate>
				<category><![CDATA[折腾笔记]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[PVE]]></category>
		<guid isPermaLink="false">https://www.hu365.dev/?p=193</guid>

					<description><![CDATA[参考文档： 一：升级到6.4.x 之前一直用的6.1.3，那首要任务是升级到6.4.x不过升级的过程也是困难重 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>参考文档：</p>



<ul>
<li><a href="https://pve.proxmox.com/wiki/Upgrade_from_6.x_to_7.0">Upgrade from 6.x to 7.0 &#8211; Proxmox VE</a></li>
</ul>



<h2 class="wp-block-heading">一：升级到6.4.x</h2>



<p>之前一直用的<code>6.1.3</code>，那首要任务是升级到<code>6.4.x</code><br>不过升级的过程也是困难重重</p>



<h3 class="wp-block-heading">1.1：更换软件源</h3>



<p>参考文档：<a href="https://pve.proxmox.com/wiki/Package_Repositories">Package Repositories &#8211; Proxmox VE</a></p>



<p>在执行更新时，出现未认证的错误提示，这是因为在文件<br><code>/etc/apt/sources.list.d/pve-enterprise.list</code><br>中默认使用了企业版软件源，此处需要更换为免费版软件源</p>



<pre class="EnlighterJSRAW" data-enlighter-language="powershell" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">#企业源
#deb https://enterprise.proxmox.com/debian/pve buster pve-enterprise
#非订阅源
deb http://download.proxmox.com/debian/pve buster pve-no-subscription</pre>



<h3 class="wp-block-heading">1.2：生成公钥</h3>



<p>以为换了源就万事大吉？结果又出现<br><code>the following signatures couldn’t be verified because the public key is not available</code></p>



<p>看意思是公钥失效/不存在，正好找到一个类似问题，参照问答中的方式，重建公钥<br>参考链接：<a href="https://forum.proxmox.com/threads/public-key-not-available-when-using-apt-update.112108/">[SOLVED] &#8211; Public key not available when using apt update | Proxmox Support Forum</a></p>



<pre class="EnlighterJSRAW" data-enlighter-language="powershell" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">#安装
wget https://enterprise.proxmox.com/debian/proxmox-release-bullseye.gpg -O /etc/apt/trusted.gpg.d/proxmox-release-bullseye.gpg
#验证
sha512sum -c &lt;(echo "7fb03ec8a1675723d2853b84aa4fdb49a46a3bb72b9951361488bfd19b29aab0a789a4f8c7406e71a69aabbc727c936d3549731c4659ffa1a08f44db8fdcebfa /etc/apt/trusted.gpg.d/proxmox-release-bullseye.gpg")</pre>



<p>可惜，还是同样报错···这时又找到另一个文章：<br><a href="https://chrisjean.com/fix-apt-get-update-the-following-signatures-couldnt-be-verified-because-the-public-key-is-not-available/">Fix apt-get update “the following signatures couldn’t be verified because the public key is not available” </a></p>



<pre class="EnlighterJSRAW" data-enlighter-language="powershell" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># XXXXXX 是错误提示中的公钥
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys XXXXXX</pre>



<p>具体方法、原因没来得及考究，不过问题算是解决了···</p>



<h3 class="wp-block-heading">1.3：扩容root</h3>



<p>以为万事大吉，但是更新过程却提示失败，在确认<code>root</code>剩余空间只有几百兆时，觉得这就是问题所在了<br>用指令<code><a rel="noreferrer noopener" href="https://www.daemon-systems.org/man/lvresize.8.html" target="_blank">lvresize</a></code>实现扩容<br>参考相关提问：<a href="https://forum.proxmox.com/threads/pve-root-directory-runs-out-of-space-why-and-what-should-i-do.102988/">pve-root directory runs out of space: Why and What should I do?</a><br>合并<code>local-lvm</code>、<code>swap</code>空间到<code>pve/root</code></p>



<pre class="EnlighterJSRAW" data-enlighter-language="powershell" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># 移除绑定，不影响数据
pvesm remove local-lvm

# 删除空间，会清除内容
lvremove /dev/pve/data

# 可选: 删除缓存空间，对于安装在低速介质的系统可能会影响速度
#lvremove /dev/pve/swap
# 移除启动加载
#sed -i '/ swap /d' /etc/fstab

# 增加空闲空间到 root
lvresize -l +100%FREE --resizefs /dev/pve/root</pre>



<p>在这之后，终于可以顺畅地更新了</p>



<h2 class="wp-block-heading">二：更新准备</h2>



<p>执行官方检测工具，检测升级环境</p>



<pre class="EnlighterJSRAW" data-enlighter-language="powershell" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">pve6to7 --full</pre>



<p>把所有可修复的内容都修复，包括<code>FAILURES</code>、<code>WARNINGS</code>项</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>记录jsPdf相关使用</title>
		<link>https://www.hu365.dev/blog/2022/11/184/</link>
		
		<dc:creator><![CDATA[Justin]]></dc:creator>
		<pubDate>Wed, 30 Nov 2022 13:37:30 +0000</pubDate>
				<category><![CDATA[前端笔记]]></category>
		<category><![CDATA[html2canvas]]></category>
		<category><![CDATA[JAVASCRIPT]]></category>
		<category><![CDATA[jsPDF]]></category>
		<guid isPermaLink="false">https://www.hu365.dev/?p=184</guid>

					<description><![CDATA[相关文档： 一：我的需求 浏览器接口：window.print()，可以直接调用打印，并存储为PDF文档用工具 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>相关文档：</p>



<ul>
<li><a href="https://artskydj.github.io/jsPDF/docs/jsPDF.html">jsPDF &#8211; Documentation (artskydj.github.io)</a></li>



<li><a href="https://html2canvas.hertzen.com/configuration">Options &#8211; html2canvas (hertzen.com)</a></li>
</ul>



<h2 class="wp-block-heading">一：我的需求</h2>



<p>浏览器接口：<code>window.print()</code>，可以直接调用打印，并存储为<code>PDF</code>文档<br>用工具库：<code>html2canvas</code>+<code>jsPDF</code>实现以上（类似的）<code>PDF</code></p>



<h2 class="wp-block-heading">二：我的实现</h2>



<h3 class="wp-block-heading">2.1：基础参数</h3>



<p>首先定义一个标准数据，以<code>Windows</code>下的<code>A4</code>打印为基础：</p>



<pre class="EnlighterJSRAW" data-enlighter-language="js" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// 基础参数
const printParams = {
	a4: {
		dpi: 96, // windows 下默认 dpi
		width: 210, // A4 标准宽度 mm，含边距
		height: 297, // A4 标准高度 mm， 含边距
		marginX: 10, // 默认打印左右边距，约为 10mm
		marginY: 10, // 默认打印上下边距，约为 10mm
	},
	// 以下是设置值/初始值
	dpi: 288, // 设置的打印密度，数值越大越清晰，PDF文件越大
	format: 'a4', // 打印类型，这里只有 A4
	orientation: 'portrait', // portrait | landscape
	// 以下为计算出的值，方便调用
	ratio: 1, // dpi 比例
	width: 0, // PDF 文档宽度，不含边距
	widthFull: 0, // PDF 文档完整宽度
	height: 0, // PDF 文档高度，不含边距
	heightFull: 0, // PDF 文档完整高度
	marginX: 0, // PDF 左右边距
	marginY: 0, // PDF 上下边距
}</pre>



<p>数据初始化：</p>



<pre class="EnlighterJSRAW" data-enlighter-language="js" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// 根据设置的 dpi，format，orientation 数据初始化
const { dpi: setDpi, orientation, format } = printParams;
const { dpi, width, height, marginX, marginY } = printParams[format];
printParams.ratio = setDpi/dpi;
let setWidth;
switch (orientation) {
	case 'landscape':
		printParams.width = height - 2 * marginY; // 不含边距的内容宽度
		printParams.height = width - 2 * marginX; // 不含边距的内容高度
		printParams.widthFull = height; // 整页PDF宽度
		printParams.heightFull = width; // 整页PDF高度
		printParams.marginX = marginY; // 左右单边边距
		printParams.marginY = marginX; // 上下单边边距
		setWidth = mm2px(height, dpi); // 页面宽度像素值
		break;
	case 'portrait':
	default:
		printParams.width = width - 2 * marginX;
		printParams.height = height - 2 * marginY;
		printParams.widthFull = width;
		printParams.heightFull = height;
		printParams.marginX = marginX;
		printParams.marginY = marginY;
		setWidth = mm2px(width, dpi);
}
// 设置body宽度，给 window.print 一个“最适合”的宽度
window.document.body.style.width = `${setWidth}px`;</pre>



<p>这里有用到一个<code>mm</code>/<code>px</code>的转换，把以前写过的方法拿过来：</p>



<pre class="EnlighterJSRAW" data-enlighter-language="js" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">/**
 * 工具类：mm转px
 * */
function mm2px(mm, dpi, radio) {
	if (mm == null) return 0;
	dpi = dpi || printParams.dpi;
	const ret = parseFloat(`${(mm * dpi * 10) / 254}`);
	if (radio == null || radio &lt;= 0) radio = 4;
	radio = 10 ** radio;
	return Math.floor(ret * radio) / radio;
}
/**
 * 工具类：px转mm
 * */
function px2mm(px, dpi, radio) {
	if (px == null) return 0;
	dpi = dpi || printParams.dpi;
	const ret = parseFloat(`${(px * 254) / (dpi * 10)}`);
	if (radio == null || radio &lt;= 0) radio = 4;
	radio = 10 ** radio;
	return Math.floor(ret * radio) / radio;
}</pre>



<h3 class="wp-block-heading">2.2：生成图片</h3>



<pre class="EnlighterJSRAW" data-enlighter-language="js" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// 需要用到的数据
const $pdfDom = document.getElementById('pdf');
const {
	ratio, orientation, format,
	width, height, widthFull, marginX, marginY
} = printParams;

html2canvas($pdfDom, {
	scale: window.devicePixelRatio * Math.ceil(ratio), // 缩放
	allowTaint: true,
	useCORS: true,
}).then((canvas) => {
	const canvasWidth = this.px2mm(canvas.width);
	const canvasHeight = this.px2mm(canvas.height);
	// ··· 以下是 pdf 生成
	// ···
});</pre>



<p>此处用到<code>html2canvas</code>实现绘制页面生成图片，主要影响清晰度的是参数<code>scale</code>：</p>



<figure class="wp-block-table is-style-stripes has-small-font-size"><table><tbody><tr><td width="90">scale</td><td width="280"><code>window.devicePixelRatio</code></td><td>The scale to use for rendering. Defaults to the browsers device pixel ratio.</td></tr></tbody></table></figure>



<p>默认值为<code>window.devicePixelRatio</code>，主要用于防止页面缩放导致的生成图片不清晰问题<br>为了实现更好地缩放，最好乘以一个整数值，以保证像素值的对应，就把它当作<code>windows</code>下的高分屏缩放理解就行</p>



<p>这里用<code>px2mm</code>转换成<code>mm</code>主要方便用于后面的<code>PDF</code>编辑</p>



<h3 class="wp-block-heading">2.3：生成PDF</h3>



<pre class="EnlighterJSRAW" data-enlighter-language="js" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// 得到图片数据
const pageData = canvas.toDataURL('image/jpeg', 1.0);
// 创建PDF文档对象
const PDF = new JsPDF({ orientation, format });
// 标准宽度下，图片的相对高度
const imageHeight = (width / canvasWidth) * canvasHeight;
// 考虑可能有多页的情况，用 leftHeight 循环判断
let leftHeight = imageHeight;
// 每次绘制图片的位置垂直偏移量
let position = marginY;
while (leftHeight > 0) {
	// 1：图形绘制到PDF
	PDF.addImage(pageData, 'JPEG', marginX, position, width, imageHeight);
	leftHeight -= height;
	position -= height;
	// 2：页头页脚添加，用 rect 遮罩
	PDF.setFillColor(255, 255, 255); // 填充白色，每次填充前都要定义
	PDF.rect(0, 0, widthFull, marginY, 'F');
	PDF.rect(0, height + marginY, widthFull, marginY, 'F');
	// 添加空白页
	if (leftHeight > 0) {
		PDF.addPage();
	}
}
PDF.save(`${title}.pdf`);</pre>



<p>这里有几个点，需要留意：</p>



<ol>
<li>默认PDF为单页，需要判断“图片”相对高度，超出标准高度时添加新页面</li>



<li>每次添加新页面，<code>PDF</code>绘制即“当前页”，相对位置都是相对“当前页”而言</li>



<li>绘制遵循页面标准的层级，后绘制内容会覆盖已绘制内容</li>



<li>垂直偏移<code>position</code>是图片相对“当前页”的偏移，向上偏移一个内容页的距离后，当前页绘制的就是下一页该显示的图片内容</li>



<li>页眉页脚的模拟绘制，每次都要设置填充颜色（默认为黑色），因为每次都是“不同页”，参考第<code>2</code>点</li>
</ol>



<h2 class="wp-block-heading">三：实现效果</h2>



<p>目前只需要模拟<code>A4</code>下的打印，在对比使用<code>window.print()</code>生成的<code>PDF</code>和手动生成的<code>PDF</code>之后，还是比较满意的，以后再有自定义编辑页眉页脚，到时候再说</p>



<figure class="wp-block-image size-large"><a href="https://www.hu365.dev/wp-content/uploads/2022/11/lQLPJxbsCEPoFavNBJzNCfywOBr7ZJwPYlgDg8gWt8BwAA_2556_1180-jpeg.webp"><img data-dominant-color="dbdbdb" data-has-transparency="false" style="--dominant-color: #dbdbdb;" decoding="async" width="1024" height="473" src="https://www.hu365.dev/wp-content/uploads/2022/11/lQLPJxbsCEPoFavNBJzNCfywOBr7ZJwPYlgDg8gWt8BwAA_2556_1180-1024x473.webp" alt="pdf对比" class="not-transparent wp-image-188" srcset="https://www.hu365.dev/wp-content/uploads/2022/11/lQLPJxbsCEPoFavNBJzNCfywOBr7ZJwPYlgDg8gWt8BwAA_2556_1180-1024x473.webp 1024w, https://www.hu365.dev/wp-content/uploads/2022/11/lQLPJxbsCEPoFavNBJzNCfywOBr7ZJwPYlgDg8gWt8BwAA_2556_1180-300x138.webp 300w, https://www.hu365.dev/wp-content/uploads/2022/11/lQLPJxbsCEPoFavNBJzNCfywOBr7ZJwPYlgDg8gWt8BwAA_2556_1180-768x355.webp 768w, https://www.hu365.dev/wp-content/uploads/2022/11/lQLPJxbsCEPoFavNBJzNCfywOBr7ZJwPYlgDg8gWt8BwAA_2556_1180-1536x709.webp 1536w, https://www.hu365.dev/wp-content/uploads/2022/11/lQLPJxbsCEPoFavNBJzNCfywOBr7ZJwPYlgDg8gWt8BwAA_2556_1180-2048x945.webp 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">看起来分页和边距都差不多</figcaption></figure>



<figure class="wp-block-image size-large"><a href="https://www.hu365.dev/wp-content/uploads/2022/11/lQLPJxbsCEPoFnLNBHzNCfqwF0k3xKX6TnMDg8gWwgAcAA_2554_1148-jpeg.webp"><img data-dominant-color="ededed" data-has-transparency="false" style="--dominant-color: #ededed;" loading="lazy" decoding="async" width="1024" height="460" src="https://www.hu365.dev/wp-content/uploads/2022/11/lQLPJxbsCEPoFnLNBHzNCfqwF0k3xKX6TnMDg8gWwgAcAA_2554_1148-1024x460.webp" alt="PDF对比" class="not-transparent wp-image-189" srcset="https://www.hu365.dev/wp-content/uploads/2022/11/lQLPJxbsCEPoFnLNBHzNCfqwF0k3xKX6TnMDg8gWwgAcAA_2554_1148-1024x460.webp 1024w, https://www.hu365.dev/wp-content/uploads/2022/11/lQLPJxbsCEPoFnLNBHzNCfqwF0k3xKX6TnMDg8gWwgAcAA_2554_1148-300x135.webp 300w, https://www.hu365.dev/wp-content/uploads/2022/11/lQLPJxbsCEPoFnLNBHzNCfqwF0k3xKX6TnMDg8gWwgAcAA_2554_1148-768x345.webp 768w, https://www.hu365.dev/wp-content/uploads/2022/11/lQLPJxbsCEPoFnLNBHzNCfqwF0k3xKX6TnMDg8gWwgAcAA_2554_1148-1536x690.webp 1536w, https://www.hu365.dev/wp-content/uploads/2022/11/lQLPJxbsCEPoFnLNBHzNCfqwF0k3xKX6TnMDg8gWwgAcAA_2554_1148-2048x921.webp 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">清晰度也还满意</figcaption></figure>



<p>要说有什么不满意的地方，那肯定是哪里不满意再改哪里，哪里不购加哪里<br>不过呢，有个东西肯定只会越改（加）越糟的，那就是文件大小：</p>



<figure class="wp-block-image size-full"><a href="https://www.hu365.dev/wp-content/uploads/2022/11/710AAC88-0F98-42df-8A72-A372AEEE26EA-jpeg.webp"><img data-dominant-color="f5f6f7" data-has-transparency="false" style="--dominant-color: #f5f6f7;" loading="lazy" decoding="async" width="983" height="297" src="https://www.hu365.dev/wp-content/uploads/2022/11/710AAC88-0F98-42df-8A72-A372AEEE26EA-jpeg.webp" alt="PDF文件大小对比" class="not-transparent wp-image-190" srcset="https://www.hu365.dev/wp-content/uploads/2022/11/710AAC88-0F98-42df-8A72-A372AEEE26EA-jpeg.webp 983w, https://www.hu365.dev/wp-content/uploads/2022/11/710AAC88-0F98-42df-8A72-A372AEEE26EA-300x91.webp 300w, https://www.hu365.dev/wp-content/uploads/2022/11/710AAC88-0F98-42df-8A72-A372AEEE26EA-768x232.webp 768w" sizes="(max-width: 983px) 100vw, 983px" /></a><figcaption class="wp-element-caption">2081 VS 124</figcaption></figure>



<p>Holy shit，大了整整20倍·····<br>这和生成图片时设置的缩放比（<code>scale</code>）有关，目前我测试时改值为<code>4.5</code>（<code>1.5*288/96</code>），既使变成<code>1/5</code>也还有400KB，大约4倍的差距，看来文件大小的劣势还是挺明显的</p>



<p>不过呢，现在谁还在乎这么点大小呢···谁还在乎呢···谁···</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>全局变量 window.status</title>
		<link>https://www.hu365.dev/blog/2022/11/181/</link>
		
		<dc:creator><![CDATA[Justin]]></dc:creator>
		<pubDate>Sat, 26 Nov 2022 10:28:00 +0000</pubDate>
				<category><![CDATA[前端笔记]]></category>
		<category><![CDATA[JAVASCRIPT]]></category>
		<category><![CDATA[status]]></category>
		<guid isPermaLink="false">https://www.hu365.dev/?p=181</guid>

					<description><![CDATA[参考资料： 在使用apiCloud编写手机App的项目里，有部分使用纯原生js实现的功能，在这里调试的时候，我 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>参考资料：</p>



<ul>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/API/Window/status">Window.status &#8211; Web APIs | MDN (mozilla.org)</a></li>
</ul>



<p>在使用<code>apiCloud</code>编写手机<code>App</code>的项目里，有部分使用纯原生<code>js</code>实现的功能，在这里调试的时候，我遇到了一个奇怪的问题，简单地说，他是这样的：</p>



<pre class="EnlighterJSRAW" data-enlighter-language="js" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">var status = ['111', '222'];
for (var i = 0;i &lt; status.length;i++) {
	// 处理数据
	console.log(status[i]); // 1 1 1 , 2 2 2
}</pre>



<p>我的本意是打算把<code>'111'</code>和<code>'222'</code>当作参数来处理的，但是结果却超出我的预料<br>它居然循环出了：<code>'1' '1' '1' ',' '2' '2' '2'</code>总计<code>6</code>个参数</p>



<p>看结构，它似乎是对处理的数组进行了字符串转换，但是我并没有做此操作<br>第一想法，是不是<code>appCloud</code>哪里做了特殊处理，毕竟这是在它家的平台运行，但是并没有找到相关处理</p>



<p>在寻人讨论的时候，他说了一句：你在浏览器调试试试，看有没有这个问题<br>听到这话的我，内心其实是抗拒的，这么简单的代码，看一眼就知道结果，还要跑去浏览器去调试？那不是多此一举么</p>



<p>然后我就被打脸了，浏览器的调试工具输出了一样的结果···</p>



<p>这···这···最基础的调试方法狠狠的打了一耳光</p>



<p>所以再仔细分析问题，把<code>var</code>换成<code>let</code>/<code>const</code>，打印结果如预期</p>



<pre class="EnlighterJSRAW" data-enlighter-language="js" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">const status = ['111', '222'];
for (var i = 0;i &lt; status.length;i++) {
	// 处理数据
	console.log(status[i]); // 111 222
}</pre>



<p>那么用<code>var</code>的问题，自然是全局变量的问题，那对应的全局变量就是：<code>window.status</code></p>



<p>一个早期用来显示浏览器加载状态的文本信息字段，只能用来存储<code>String</code>类型，所以用<code>var</code>定义时，实际上是在给<code>window.status</code>赋值，而且它会自动将数据进行字符串转换</p>



<p>那么，记录这次经历不是为了记下这个将被废弃的属性，而是要让自己了解到，查找问题、解决问题的思路与逻辑，一定要一丝不苟，容不得“想当然”的跳过</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>linuxserver/nginx 中添加 imagick</title>
		<link>https://www.hu365.dev/blog/2022/11/172/</link>
		
		<dc:creator><![CDATA[Justin]]></dc:creator>
		<pubDate>Thu, 10 Nov 2022 02:49:35 +0000</pubDate>
				<category><![CDATA[折腾笔记]]></category>
		<category><![CDATA[imagick]]></category>
		<category><![CDATA[wordpress]]></category>
		<guid isPermaLink="false">https://www.hu365.dev/?p=172</guid>

					<description><![CDATA[参考文档： 一：WordPress站点健康 二：安装imagick 环境：linuxserver/nginx: [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>参考文档：</p>



<ul>
<li><a href="https://registry.hub.docker.com/r/linuxserver/nginx#Versions">linuxserver/nginx &#8211; Docker Image | Docker Hub</a></li>
</ul>



<h2 class="wp-block-heading">一：WordPress站点健康</h2>



<figure class="wp-block-image size-full"><a href="https://www.hu365.dev/wp-content/uploads/2022/11/1611290602-jpeg.webp"><img data-dominant-color="f0eceb" data-has-transparency="false" style="--dominant-color: #f0eceb;" loading="lazy" decoding="async" width="480" height="175" src="https://www.hu365.dev/wp-content/uploads/2022/11/1611290602-jpeg.webp" alt="" class="not-transparent wp-image-173" srcset="https://www.hu365.dev/wp-content/uploads/2022/11/1611290602-jpeg.webp 480w, https://www.hu365.dev/wp-content/uploads/2022/11/1611290602-300x109.webp 300w" sizes="(max-width: 480px) 100vw, 480px" /></a></figure>



<h2 class="wp-block-heading">二：安装imagick</h2>



<p>环境：<code>linuxserver/nginx:latest</code> <code>[2022-11-04]</code></p>



<p>记得很久以前是不需要手动安装的，可能某一个版本之后又把这个组件移除了</p>



<p>查看更新日志：</p>



<figure class="wp-block-image size-full"><a href="https://www.hu365.dev/wp-content/uploads/2022/11/微信图片_20221110104004-jpeg.webp"><img data-dominant-color="f7f5f5" data-has-transparency="false" style="--dominant-color: #f7f5f5;" loading="lazy" decoding="async" width="822" height="471" src="https://www.hu365.dev/wp-content/uploads/2022/11/微信图片_20221110104004-jpeg.webp" alt="" class="not-transparent wp-image-174" srcset="https://www.hu365.dev/wp-content/uploads/2022/11/微信图片_20221110104004-jpeg.webp 822w, https://www.hu365.dev/wp-content/uploads/2022/11/微信图片_20221110104004-300x172.webp 300w, https://www.hu365.dev/wp-content/uploads/2022/11/微信图片_20221110104004-768x440.webp 768w" sizes="(max-width: 822px) 100vw, 822px" /></a><figcaption class="wp-element-caption"><a href="https://registry.hub.docker.com/r/linuxserver/nginx#Versions">linuxserver/nginx &#8211; Docker Image | Docker Hub</a></figcaption></figure>



<p>有明确提到移除了<code>php7-pecl-imagick</code>，并有写出自定义添加的方法：</p>



<p></p>



<figure class="wp-block-image size-full"><a href="https://www.hu365.dev/wp-content/uploads/2022/11/微信图片_20221110104253-jpg.webp"><img data-dominant-color="2e343a" data-has-transparency="false" style="--dominant-color: #2e343a;" loading="lazy" decoding="async" width="831" height="230" src="https://www.hu365.dev/wp-content/uploads/2022/11/微信图片_20221110104253-jpg.webp" alt="" class="not-transparent wp-image-175" srcset="https://www.hu365.dev/wp-content/uploads/2022/11/微信图片_20221110104253-jpg.webp 831w, https://www.hu365.dev/wp-content/uploads/2022/11/微信图片_20221110104253-300x83.webp 300w, https://www.hu365.dev/wp-content/uploads/2022/11/微信图片_20221110104253-768x213.webp 768w" sizes="(max-width: 831px) 100vw, 831px" /></a><figcaption class="wp-element-caption"><a href="https://github.com/linuxserver/docker-mods/tree/swag-imagemagick">linuxserver/docker-mods at swag-imagemagick (github.com)</a></figcaption></figure>



<p>在环境变量中添加：<code>-e DOCKER_MODS=linuxserver/mods:swag-imagemagick</code><br>或者选择用图形界面/其他方法都可以</p>



<h2 class="wp-block-heading">三：Happy Ending</h2>



<figure class="wp-block-image size-full"><a href="https://www.hu365.dev/wp-content/uploads/2022/11/微信图片_20221110104834-jpg.webp"><img data-dominant-color="f1f1f3" data-has-transparency="false" style="--dominant-color: #f1f1f3;" loading="lazy" decoding="async" width="646" height="432" src="https://www.hu365.dev/wp-content/uploads/2022/11/微信图片_20221110104834-jpg.webp" alt="" class="not-transparent wp-image-176" srcset="https://www.hu365.dev/wp-content/uploads/2022/11/微信图片_20221110104834-jpg.webp 646w, https://www.hu365.dev/wp-content/uploads/2022/11/微信图片_20221110104834-300x201.webp 300w" sizes="(max-width: 646px) 100vw, 646px" /></a></figure>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>一个前端工程启动报错的问题</title>
		<link>https://www.hu365.dev/blog/2022/10/167/</link>
		
		<dc:creator><![CDATA[Justin]]></dc:creator>
		<pubDate>Sun, 30 Oct 2022 04:08:00 +0000</pubDate>
				<category><![CDATA[折腾笔记]]></category>
		<category><![CDATA[BOM]]></category>
		<category><![CDATA[Byte order mark]]></category>
		<category><![CDATA[UTF-8]]></category>
		<guid isPermaLink="false">https://www.hu365.dev/?p=167</guid>

					<description><![CDATA[相关参考链接： 一：启动报错 在一个协作的前端工程，拉取代码之后，启动工程出现如下错误： 从错误日志看，是第一 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>相关参考链接：</p>



<ul>
<li><a href="https://zh.wikipedia.org/wiki/%E4%BD%8D%E5%85%83%E7%B5%84%E9%A0%86%E5%BA%8F%E8%A8%98%E8%99%9F">字节顺序标记 &#8211; 维基百科，自由的百科全书 (wikipedia.org)</a></li>



<li><a href="https://www.w3.org/International/questions/qa-byte-order-mark">The byte-order mark (BOM) in HTML (w3.org)</a></li>
</ul>



<h2 class="wp-block-heading">一：启动报错</h2>



<p>在一个协作的前端工程，拉取代码之后，启动工程出现如下错误：</p>



<figure class="wp-block-image size-large"><a href="https://www.hu365.dev/wp-content/uploads/2022/11/1611290602-1-jpg.webp"><img data-dominant-color="313338" data-has-transparency="false" style="--dominant-color: #313338;" loading="lazy" decoding="async" width="1024" height="365" src="https://www.hu365.dev/wp-content/uploads/2022/11/1611290602-1-1024x365.webp" alt="" class="not-transparent wp-image-178" srcset="https://www.hu365.dev/wp-content/uploads/2022/11/1611290602-1-1024x365.webp 1024w, https://www.hu365.dev/wp-content/uploads/2022/11/1611290602-1-300x107.webp 300w, https://www.hu365.dev/wp-content/uploads/2022/11/1611290602-1-768x274.webp 768w, https://www.hu365.dev/wp-content/uploads/2022/11/1611290602-1-jpg.webp 1093w" sizes="(max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">看起来是JSON转换报错</figcaption></figure>



<p>从错误日志看，是第一个字符<code>JSON</code>转换时就抛出错误</p>



<p>对比相关代码，并没有发现特殊的字符，甚至全选粘贴改成相同内容，仍然提示相同错误<br>直接替换文件，或者回退到老版本又正常</p>



<p>于是再对比差异，发现：</p>



<figure class="wp-block-image size-full"><a href="https://www.hu365.dev/wp-content/uploads/2022/11/微信图片_20221110112037-jpg.webp"><img data-dominant-color="33353b" data-has-transparency="false" style="--dominant-color: #33353b;" loading="lazy" decoding="async" width="695" height="183" src="https://www.hu365.dev/wp-content/uploads/2022/11/微信图片_20221110112037-jpg.webp" alt="" class="not-transparent wp-image-179" srcset="https://www.hu365.dev/wp-content/uploads/2022/11/微信图片_20221110112037-jpg.webp 695w, https://www.hu365.dev/wp-content/uploads/2022/11/微信图片_20221110112037-300x79.webp 300w" sizes="(max-width: 695px) 100vw, 695px" /></a></figure>



<p>编码没问题，但多出来的 BOM是什么</p>



<h2 class="wp-block-heading">二：<strong>字节顺序标记</strong></h2>



<h3 class="wp-block-heading">2.1：BOM（byte-order mark）</h3>



<blockquote class="wp-block-quote">
<p>是位于码点<code>U+FEFF</code>的统一码字符的名称。当以<code>UTF-16</code>或<code>UTF-32</code>来将<code>UCS/</code>统一码字符所组成的字符串编码时，这个字符被用来标示其字节序。它常被用来当做标示文件是以<code>UTF-8</code>、<code>UTF-16</code>或<code>UTF-32</code>编码的标记。</p>
<cite>中文维基百科</cite></blockquote>



<blockquote class="wp-block-quote">
<p>【谷歌翻译】</p>



<p>在 1993 年初引入<code>UTF-8</code>之前，传输<code>Unicode</code>文本的预期方式是使用 16 位代码单元，使用称为<code>UCS-2</code>的编码，后来扩展到<code>UTF-16</code>。16 位代码单元可以用两种方式表示为字节：最高有效字节在前（<code>big-endian</code>）或最低有效字节在前（<code>little-endian</code>）。为了传达正在使用的字节顺序，在流的开头使用了<code>U+FEFF</code>（字节顺序标记）作为幻数，该幻数在逻辑上不是流所表示的文本的一部分。</p>
<cite>W3C</cite></blockquote>



<h3 class="wp-block-heading">2.2：UTF-8 中的 BOM</h3>



<blockquote class="wp-block-quote">
<p>在<code>UTF-8</code>中，虽然在<code>Unicode</code>标准上允许字节顺序标记的存在，但实际上并不一定需要。<code>UTF-8</code>编码过的字节顺序标记则被用来标示它是<code>UTF-8</code>的文件。它只用来标示一个<code>UTF-8</code>的文件，而不用来说明字节顺序。</p>



<p>许多<code>Windows</code>程序（包含记事本）会需要添加字节顺序标记到<code>UTF-8</code>文件，否则将无法正确解析编码，而出现乱码。然而，在类<code>Unix</code>系统中，这种做法则不被建议采用。</p>



<p><code>Unicode</code>标准允许在<code>UTF-8</code>中使用<code>BOM</code>，但并不要求或推荐使用它。字节顺序在<code>UTF-8</code>中没有任何意义，所以它在<code>UTF-8</code>中的唯一用途是在开始时发出信号，表明文本流是用<code>UTF-8</code>编码的，或者表明它是从包含可选<code>BOM</code>的文本流转换到<code>UTF-8</code>的。</p>
<cite>中文维基百科</cite></blockquote>



<blockquote class="wp-block-quote">
<p>【谷歌翻译】</p>



<p>在<code>UTF-8</code>编码中，<code>BOM</code>的存在不是必需的，因为与<code>UTF-16</code>编码不同，字符中没有替代的字节序列。但是，<code>BOM</code>仍可能出现在<code>UTF-8</code>编码文本中，或者作为编码转换的副产品，或者因为它是由编辑器添加以将内容标记为<code>UTF-8</code>。在这种情况下，<code>BOM</code>通常称为<code>UTF-8</code>签名。</p>
<cite>W3C</cite></blockquote>



<h3 class="wp-block-heading">2.3：JSON 中的 BOM</h3>



<p>由于在文件前插入了不可见但又实际存在的字符（<code>\UFEFF</code>），导致<code>JSON</code>无法正常解析字符串<br>这就是问题所在</p>



<h2 class="wp-block-heading">三：解决方法</h2>



<p>本人使用<code>jetbrains</code>系列软件开发，软件中自带“添加”/“移除”<code>BOM</code>的选项<br>不过这个问题也不是很罕见的问题了，估摸着大部分编辑器应该都自带该选项功能</p>



<figure class="wp-block-image size-full"><a href="https://www.hu365.dev/wp-content/uploads/2022/11/微信图片_20221110121042-jpg.webp"><img data-dominant-color="3f3f43" data-has-transparency="false" style="--dominant-color: #3f3f43;" loading="lazy" decoding="async" width="528" height="494" src="https://www.hu365.dev/wp-content/uploads/2022/11/微信图片_20221110121042-jpg.webp" alt="" class="not-transparent wp-image-180" srcset="https://www.hu365.dev/wp-content/uploads/2022/11/微信图片_20221110121042-jpg.webp 528w, https://www.hu365.dev/wp-content/uploads/2022/11/微信图片_20221110121042-300x281.webp 300w" sizes="(max-width: 528px) 100vw, 528px" /></a></figure>



<p></p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>服务模型：IaaS、PaaS 和 SaaS</title>
		<link>https://www.hu365.dev/blog/2022/10/163/</link>
		
		<dc:creator><![CDATA[Justin]]></dc:creator>
		<pubDate>Sun, 16 Oct 2022 08:50:36 +0000</pubDate>
				<category><![CDATA[折腾笔记]]></category>
		<category><![CDATA[IAAS]]></category>
		<category><![CDATA[PAAS]]></category>
		<category><![CDATA[SAAS]]></category>
		<category><![CDATA[云服务]]></category>
		<guid isPermaLink="false">https://www.hu365.dev/?p=163</guid>

					<description><![CDATA[内容纯属搬运，相关参考链接： IaaS、PaaS、SaaS &#8211; 云服务模型概述 &#8211; 英 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>内容纯属搬运，相关参考链接：</p>



<ul><li><a href="https://www.intel.cn/content/www/cn/zh/cloud-computing/as-a-service.html">IaaS、PaaS、SaaS &#8211; 云服务模型概述 &#8211; 英特尔® (intel.cn)</a></li><li><a href="https://www.ruanyifeng.com/blog/2017/07/iaas-paas-saas.html">IaaS，PaaS，SaaS 的区别 &#8211; 阮一峰的网络日志 (ruanyifeng.com)</a></li></ul>



<h2 class="wp-block-heading">一：基础定义</h2>



<h3 class="wp-block-heading">1.1：IaaS：Infrastructure-as-a-service</h3>



<p>基础设施服务<br>云服务提供商可以拥有并管理那些运行您的软件堆栈的硬件。它包括服务器、网络和存储</p>



<h3 class="wp-block-heading">1.2：PaaS：Platform-as-a-service</h3>



<p>平台服务<br>在<code>IaaS</code>基础服务的基础上，还提供了操作系统和数据库</p>



<h3 class="wp-block-heading">1.3：SaaS：Software-as-a-service</h3>



<p>软件服务<br>在<code>PaaS</code>平台服务的基础上，还提供了应用程序、功能和数据<br>为最终用户提供了最多的支持，是所有交付模型中最简单的一种</p>



<h2 class="wp-block-heading">二：图示对比</h2>



<figure class="wp-block-image size-full"><a href="https://www.hu365.dev/wp-content/uploads/2022/10/Understanding-IaaS-SaaS-and-PaaS-cloud-service-models-jpg.webp"><img data-dominant-color="b1c8c3" data-has-transparency="false" style="--dominant-color: #b1c8c3;" loading="lazy" decoding="async" width="854" height="479" src="https://www.hu365.dev/wp-content/uploads/2022/10/Understanding-IaaS-SaaS-and-PaaS-cloud-service-models-jpg.webp" alt="" class="not-transparent wp-image-164" srcset="https://www.hu365.dev/wp-content/uploads/2022/10/Understanding-IaaS-SaaS-and-PaaS-cloud-service-models-jpg.webp 854w, https://www.hu365.dev/wp-content/uploads/2022/10/Understanding-IaaS-SaaS-and-PaaS-cloud-service-models-300x168.webp 300w, https://www.hu365.dev/wp-content/uploads/2022/10/Understanding-IaaS-SaaS-and-PaaS-cloud-service-models-768x431.webp 768w, https://www.hu365.dev/wp-content/uploads/2022/10/Understanding-IaaS-SaaS-and-PaaS-cloud-service-models-512x288.webp 512w" sizes="(max-width: 854px) 100vw, 854px" /></a></figure>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
