<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title><![CDATA[咱的测试笔记]]></title> 
<description><![CDATA[The World Is Fantastic.]]></description>
<link>https://note.test.manshaoco.com/</link>
<language>zh-cn</language>
<generator>www.baidu.com</generator>
<item>
    <title>CasaOS 文件共享 设置 SMB 账号密码</title>
    <link>https://note.test.manshaoco.com/post-14.html</link>
    <description><![CDATA[<p>最近给自己的 NAS 从原本的 TrueNAS Scale 系统更换成了 Debian + CasaOS 的方案。<strong>因为 CasaOS 对系统资源占用比 TrueNAS Scale 低很多，所以 4G 内存开机后也只占用 13% 左右</strong>，终于可以在上面部署 Docker 项目了。<br />
但是随之而来的，<strong>就是 CasaOS 基本功能不如 TrueNAS Scale 完善的问题</strong>。首当其冲的就是 CasaOS 的文件管理是自带了 SMB 文件共享功能，但只能以游客形式访问，无法设置 SMB 的账户和密码。好在 CasaOS 这一共享功能就是使用 samba 原版应用，因此我们可以通过调用 samba 应用和修改 <strong>/etc/samba/smb.conf</strong> 文件，实现为 SMB 共享设置访问权限的想法。</p>
<h2>设置 SMB 共享账户</h2>
<p>使用 SSH 连接到机器后，切换至 root 账户操作，如 Debian 12 需要使用</p>
<pre><code>su
# 输入 root 账户的密码</code></pre>
<p>接着执行命令创建 SMB 共享账户，并设置密码，这里以创建一个名为 Share 的账户为例</p>
<pre><code>smbpasswd -a Share
# 创建一个新的 SMB 共享账户，如果权限不够，在前面加上 sudo 提权
# 然后根据终端提示输入密码即可</code></pre>
<h2>修改 samba 配置文件</h2>
<p>在执行这一步操作前，你需要先在 CasaOS 自带的文件管理中，对着需要进行 SMB 共享的目录右键，将其设置为共享目录。<br />
然后使用 SSH 连接到机器，切换至 root 账户操作，接着修改配置文件 <strong>/etc/samba/smb.conf</strong><br />
如果是 Debian 可以使用 nano 编辑器，如果是其他 Linux 可使用 vim 编辑器，这里以 nano 为例：</p>
<pre><code>sudo nano /etc/samba/smb.conf</code></pre>
<p>然后可以看到 CasaOS 在文件开头处写了警告信息，这里我们忽略，直接看到下方的 <strong>[global]</strong> 处，在它的下方有很多子条目，咱们在最后仿照着新增一条，以关闭全局 SMB 游客访问设置：</p>
<pre><code>   security = user</code></pre>
<p>增加完毕后，nano 编辑器需要 <strong>使用 Ctrl+X、按 Y、按回车</strong> 才能保存。<br />
不要着急，我们可以在 <strong>smb.conf</strong> 原始的最后一行看到它提到了 <strong>smb.casa.conf</strong>，我们最好还是看看这里面写了什么。继续执行</p>
<pre><code>sudo nano /etc/samba/smb.casa.conf</code></pre>
<p>可以看到这里面是我们在 CasaOS 自带的文件管理中，添加的共享文件夹。我们可以把每一个中括号括起来的子条目“<strong>guest ok = Yes</strong>”改成“<strong>guest ok = No</strong>”，然后保存。</p>
<h2>验证</h2>
<p>重新访问 SMB 共享路径，系统会提示你需要输入账号密码，使用上方设置的 <strong>Share</strong> 账户即可完成登录，enjoy~</p>]]></description>
    <pubDate>Fri, 23 Feb 2024 00:30:00 +0800</pubDate>
    <author>Fotink</author>
    <guid>https://note.test.manshaoco.com/post-14.html</guid>
</item>
<item>
    <title>Git 的基本使用</title>
    <link>https://note.test.manshaoco.com/post-13.html</link>
    <description><![CDATA[<p>最近在做一个小项目，需要和队友一块儿交接代码，遂决定使用 Git<br />
但 GitHub 直连不太稳定，Gitee 这些平台限制又比较多，所以自己用 Gitea 搭建了一个轻量的 Git 平台。<br />
然后就是推送代码了，这里我习惯用命令行操作，所以记录一下基本的推送方式。</p>
<pre><code class="language-bash"># cd 至统一存放项目的目录
# git init      # 初始化 Git
# git checkout -b main  # 切换本地分支至 main
git clone &lt;仓库地址&gt; # 首先将仓库中的文件克隆到本地
# 然后在本地进行修改
git add .       # 将所有文件推送至本地分支 main
git commit -m "注释内容"    # 添加推送的注释
# git remote add origin &lt;仓库地址&gt;  # 添加远程仓库地址
git push -u origin main     # 将本地分支推送至远程仓库</code></pre>
<p>中途还遇到了一些 bug，比如在移动硬盘上，似乎 exFAT 格式的磁盘的目录无法写入文件所属权，所以 Git 会报错。我尝试添加到了白名单，依旧报错，所以只好将代码目录转移至了本地硬盘上才解决。<br />
此外，http 有上传文件的大小限制，我刚开始传了好几次，始终报错，最后换了 ssh 方式才上传成功。</p>]]></description>
    <pubDate>Fri, 18 Aug 2023 10:05:38 +0800</pubDate>
    <author>Fotink</author>
    <guid>https://note.test.manshaoco.com/post-13.html</guid>
</item>
<item>
    <title>写一个创建备份文件的批处理脚本</title>
    <link>https://note.test.manshaoco.com/post-12.html</link>
    <description><![CDATA[<p>最近在写 Electron 程序，作为一个严谨的程序员，完成每一个阶段性的功能后，都想着做一份备份<br />
原本我是手动选中项目文件夹下，需要备份的文件夹和文件，然后创建 zip 的压缩包，再将其放入 backups 文件夹中<br />
但操作了几次之后，发觉步骤实在是繁琐，所以想着用自动化的工具来实现这一目的。秉持着<strong>越简单越好</strong>的原则，我选择使用<strong>批处理文件</strong>来完成这一操作<br />
好处是代码量很小，且不需要打包；坏处是没法在 macOS 和 Linux 上运行，但 Unix 应该也可以编写 Bash 一类的脚本来实现同样的效果</p>
<h2>代码</h2>
<p>将以下文件保存为 <strong>备份.bat</strong> 并放入项目文件夹即可</p>
<pre><code class="language-bash">@echo off
title 项目备份工具

:begin_input
set /p backup_name=请输入备份的备注信息：

:get_date
for /F "skip=1 delims=" %%F in ('
    wmic PATH Win32_LocalTime GET Day^,Month^,Year /FORMAT:TABLE
') do (
    for /F "tokens=1-3" %%L in ("%%F") do (
        set CurrDay=%%L
        set CurrMonth=%%M
        set CurrYear=%%N
    )
)
set filename=backups_%CurrYear%-%CurrMonth%-%CurrDay%_%backup_name%

:create_backup_file
"C:\Program Files\7-Zip\7z.exe" a -tzip .\backups\%filename%.zip .\html\ -i!.\js\ -i!.\assets\ -i!.\package.json

:finish_done
echo 已完成操作！</code></pre>
<h2>一些说明</h2>
<p>1.上述文件 <strong>备份.bat</strong> 务必要保存为 ANSI 编码格式，因为如今大部分文本编辑器（包括 Windows 的记事本）保存文件的默认编码均为 UTF-8，而 <strong>.bat</strong> 文件在 <strong>cmd.exe</strong> 中执行时，只能解析 ANSI 编码的文本，如以 UTF-8 编码保存，执行时中文字符<strong>会以乱码的形式展现</strong>。<br />
2.执行时，首先需要<strong>输入备份的备注信息</strong>，接着将会<strong>获取备份当天的日期</strong>，并将日期、备注信息拼接为新的字符串 <strong>filename</strong> ；例如我输入“<strong>基本框架搭建完成</strong>”，那么 <strong>filename</strong> 的值为 “<strong>backups_2023_8_10_基本框架搭建完成</strong>”。你可以根据自己的需求修改这些字符串拼接方法。<br />
3.上述文件调用了 7-Zip 这一压缩软件，且安装路径为&quot;C:\Program Files\7-Zip\7z.exe&quot;，如果你没有安装 7-Zip，或者安装到了其它路径，又或者想要调用其它压缩软件，<strong>请修改这一行命令</strong>。这行命令依次将 <strong>\html</strong>、<strong>\js</strong>、<strong>\assets</strong>、<strong>\package.json</strong> 几个文件夹和文件打包进了位于 <strong>backups</strong> 文件夹的备份文件中。<br />
4.如果你想让它在最后执行完时，不自动关闭命令行窗口，那么你可以在文件的最后加上</p>
<pre><code class="language-bash">pause&gt;nul</code></pre>
<p>即可实现窗口的停留，并按任意键关闭窗口</p>]]></description>
    <pubDate>Thu, 10 Aug 2023 15:58:07 +0800</pubDate>
    <author>Fotink</author>
    <guid>https://note.test.manshaoco.com/post-12.html</guid>
</item>
<item>
    <title>Electron 写一个 点击按钮打开新窗口 的 Demo</title>
    <link>https://note.test.manshaoco.com/post-11.html</link>
    <description><![CDATA[<h2>背景</h2>
<p>Electron 依赖 Chromium 的更新迭代，很多功能用法都在不断地变更<br />
比如我在 bilibili 学习 <a href="https://www.bilibili.com/video/BV1xd4y1J7dB/" title="Electron入门到精通（有可能是全站最好的electron课程）">Electron入门到精通（有可能是全站最好的electron课程）</a> 的时候，发现网上的教程清一色都是使用 remote 进行进程间通信<br />
而 Electron 早在 14 版本就<strong>移除了 remote 模块</strong>，官方推荐的方法是使用 ipcMain 和 ipcRender 进行进程间通信（详细请看<a href="https://www.electronjs.org/zh/docs/latest/tutorial/ipc" title="官方文档">官方文档</a>）<br />
虽然也有办法继续使用 remote 模块，但这显然不是一个长久之计。所以咱们最好还是学着用 ipcMain 和 ipcRender</p>
<h2>进程通信</h2>
<p>可以参考上述官方文档，实现进程间简单的消息的发送和接受<br />
那么该如何实现<strong>点击按钮创建一个新窗口</strong>的目的呢？很简单<br />
思路之一是，在主进程的 main.js 中预编写一段可以与其它进程通信的代码，当收到其它进程的特定通信内容时，咱们就执行这段代码，创建一个新窗口，就跟上一篇创建 Hello World 的主窗口是一样的~<br />
这里写了一个<strong>点击主界面中的设置按钮，打开设置窗口，再点击一次关闭设置窗口</strong>的 Demo，各部分代码如下</p>
<h3>main.js</h3>
<pre><code class="language-javascript">const { app, BrowserWindow, ipcMain } = require('electron')
// 主进程需使用 ipcMain ↑

const createWindow = () =&gt; {
  const win = new BrowserWindow({
    width: 800,
    height: 600,
    autoHideMenuBar: true,  // 隐藏菜单栏
    webPreferences: {
      nodeIntegration: true,
      contextIsolation: false
    }
  })
  win.loadFile('./html/index.html')
}

const controlSettingsWindow = () =&gt; {
  if (!settingsWin) {
    settingsWin = new BrowserWindow({
      width: 500,
      height: 300,
      autoHideMenuBar: true,  // 隐藏菜单栏
      webPreferences: {
        nodeIntegration: true,
        contextIsolation: false
      }
    });
    settingsWin.loadFile('./settings.html');    // 加载 settings.html
  } else {
    settingsWin.destroy();      // 再次点击时关闭该窗口
    settingsWin = null;
  }
}

// 进程间通信开始↓
// 创建设置窗口（settings）
let settingsWin = null;
ipcMain.on('settings-window', () =&gt; {
  controlSettingsWindow();  // 调用设置窗口创建和关闭的函数
});
// 进程间通信结束↑

app.whenReady().then(() =&gt; {
  createWindow()
  app.on('activate', () =&gt; {
    if (BrowserWindow.getAllWindows().length === 0) {
      createWindow()
    }
  })
})

app.on('window-all-closed', () =&gt; {
  if (process.platform !== 'darwin') {
    app.quit()
  }
})</code></pre>
<h3>index.html</h3>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;head&gt;
    &lt;meta charset="UTF-8" /&gt;
    &lt;meta
      http-equiv="Content-Security-Policy"
      content="default-src 'self'; script-src 'self'"
    /&gt;
    &lt;meta
      http-equiv="X-Content-Security-Policy"
      content="default-src 'self'; script-src 'self'"
    /&gt;
    &lt;title&gt;Electron Test Demo&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;h1&gt;👋你好啊&lt;/h1&gt;
    &lt;button id="open-settings-btn"&gt;点击打开设置窗口&lt;/button&gt;
    &lt;script src="./index.js"&gt;&lt;/script&gt;
    &lt;p id="info"&gt;&lt;/p&gt;
  &lt;/body&gt;
&lt;/html&gt;</code></pre>
<h3>index.js</h3>
<pre><code class="language-javascript">const { ipcRenderer } = require('electron')
// 子进程（渲染进程）中使用 ipcRender

window.addEventListener('DOMContentLoaded', () =&gt; {
    const sBtn = document.getElementById('open-settings-btn')
    sBtn.addEventListener('click', () =&gt; {
        // 调用主进程中，预编写的函数实现打开窗口
        ipcRenderer.send('settings-window');
    })
})</code></pre>
<h3>settings.html</h3>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
    &lt;meta charset="UTF-8"&gt;
    &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
    &lt;title&gt;设置页面 | Electron Test Demo&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;h1&gt;这里是设置页面~&lt;/h1&gt;
    &lt;script src="./settings.js"&gt;&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<h3>settings.js</h3>
<pre><code class="language-javascript">const { ipcRenderer } = require('electron')

window.addEventListener('DOMContentLoaded', () =&gt; {
    // 拦截点击该窗口关闭按钮执行的动作
    window.onbeforeunload = function () {
        ipcRenderer.send('settings-window');
        // 由主进程 main.js 进行该窗口的 destroy() 关闭操作，否则会因为该窗口不为 null 而无法进行第二次打开窗口的操作
    }
})</code></pre>
<h2>写在结尾</h2>
<p>因为我也是刚开始学 Electron 编写桌面端应用，且我并不擅长 JavaScript，所以关于这个 Demo 如果你有更好的方式方法，欢迎留言告诉我~</p>]]></description>
    <pubDate>Thu, 10 Aug 2023 10:12:40 +0800</pubDate>
    <author>Fotink</author>
    <guid>https://note.test.manshaoco.com/post-11.html</guid>
</item>
<item>
    <title>Electron 写一个 Hello World</title>
    <link>https://note.test.manshaoco.com/post-9.html</link>
    <description><![CDATA[<h2>写在开始</h2>
<p>编写第一个 Hello World 程序，建议阅读官方文档（<a href="https://www.electronjs.org/zh/docs/latest/tutorial/tutorial-first-app" title="创建您的第一个应用程序">创建您的第一个应用程序</a>），官方文档写的还比较清晰易懂，这里仅做一个归纳概括</p>
<h2>环境配置</h2>
<p>首先需要安装 <strong>Node.js</strong>，针对 Windows 和 macOS 系统，前往<a href="https://nodejs.org/zh-cn/download" title="官网">官网</a>下载安装 LTS（长期维护版） 版本即可；如想在 Linux 上安装，需要自行构建，这里不多叙述<br />
如果有能力科学上网，建议<strong>首先给终端开启代理</strong>，并将代理工具改为全局模式，<strong>这能有效避免连接 npm 源出错的问题</strong>；也可在安装好 Node.js 后更改 npm 源为国内的淘宝镜像等</p>
<h2>开始安装</h2>
<p>新建一个文件夹，在终端中打开它<br />
依次输入</p>
<pre><code class="language-bash">mkdir electron-hello-world
# 建立一个新文件夹
cd electron-hello-world
# 切换至该文件夹
npm init
# 开始初始化项目</code></pre>
<p>接下来，跟着终端的提示，创建项目的 package.json 的基本内容即可<br />
<strong>注意，entry point: (index.js)</strong> 这一项请填写 <strong>main.js</strong><br />
然后执行下列命令安装 Electron</p>
<pre><code class="language-bash">npm install electron --save-dev</code></pre>
<p>安装完成后，咱们修改 package.json，增加 scripts 的 start 那一行，给予一个开始运行的位置。修改完后的 package.json 大致如下所示</p>
<pre><code class="language-json">{
  "name": "electron-hello-world",
  "version": "1.0.0",
  "description": "Hello World!",
  "main": "main.js",
  "scripts": {
    "start": "electron .",
    "test": "echo \"Error: no test specified\" &amp;&amp; exit 1"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "electron": "^25.3.2"
  }
}</code></pre>
<p>接着新建并编写 main.js 文件，咱们想让这个 electron 运行之后，加载一个写有 Hello World! 的网页（index.html），故需要在 main.js 中写入下列内容</p>
<pre><code class="language-javascript">const { app, BrowserWindow } = require('electron')

// 创建窗口的函数
const createWindow = () =&gt; {
  const win = new BrowserWindow({
    width: 800,
    height: 600
  })
  // 让这个窗口加载 index.html
  win.loadFile('index.html')
}

// 下面的 app.on 是为了适配 macOS 的系统习惯
app.whenReady().then(() =&gt; {
  createWindow()

  app.on('activate', () =&gt; {
    if (BrowserWindow.getAllWindows().length === 0) {
      createWindow()
    }
  })
})

app.on('window-all-closed', () =&gt; {
  if (process.platform !== 'darwin') {
    app.quit()
  }
})</code></pre>
<p>然后新建一个 index.html，写入下列内容</p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;head&gt;
    &lt;meta charset="UTF-8" /&gt;
    &lt;!-- https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP --&gt;
    &lt;meta
      http-equiv="Content-Security-Policy"
      content="default-src 'self'; script-src 'self'"
    /&gt;
    &lt;meta
      http-equiv="X-Content-Security-Policy"
      content="default-src 'self'; script-src 'self'"
    /&gt;
    &lt;title&gt;Electron Test Project&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;h1&gt;Hello World!&lt;/h1&gt;
    &lt;p&gt;👋&lt;/p&gt;
  &lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>完成上面的这些代码编辑任务后，在终端中执行</p>
<pre><code class="language-bash">npm run start</code></pre>
<p>即可看到写有 Hello World! 的 Electron 程序了</p>]]></description>
    <pubDate>Thu, 10 Aug 2023 09:30:01 +0800</pubDate>
    <author>Fotink</author>
    <guid>https://note.test.manshaoco.com/post-9.html</guid>
</item>
<item>
    <title>Conda 的安装和使用小结</title>
    <link>https://note.test.manshaoco.com/post-7.html</link>
    <description><![CDATA[<h1>简介</h1>
<p>Conda 是一个开源软件包管理系统和环境管理系统，说人话就是：它能用来创建多个 Python 的环境，每一个环境安装的 Python 的版本和第三方库可以是不同的<br />
有什么用呢？首先，相比直接安装 Python，使用 Conda 能创建多个共存的 Python 环境。比如有的第三方库对新版本的 Python 兼容性不好，那我们就可以给这个库配一个它专用的 Python 环境（3.8），除此之外，平时写代码写着玩儿，咱就用最新的 Python 环境（3.11）；此外，诸如在使用 PyInstaller 打包程序时，很可能会遇到将不必要的库也打包进程序，造成程序体积过大，此时就可以用 Conda 专门为其创建一个全新的环境<br />
Conda 分为 Miniconda 和 Anaconda 两种，前者仅包含 Conda 和 Python，后者还包含了一些用于数据科学、机器学习的模块，以及一个图形化管理界面（Anaconda Navigator）。当然，这两种版本所占用的空间差别也挺大<br />
大家根据自己的需求选择即可，如果你不知道该选择什么，那么使用 Miniconda 即可</p>
<h1>下载地址</h1>
<p>Miniconda：<a href="https://docs.conda.io/en/latest/miniconda.html">https://docs.conda.io/en/latest/miniconda.html</a><br />
Anaconda：<a href="https://www.anaconda.com/download#downloads">https://www.anaconda.com/download#downloads</a></p>
<h1>安装步骤</h1>
<p>下载后按照流程安装即可，勾选项无需修改，可以修改安装目录到自己熟悉的路径（比如我是安装到&quot;C:\Users\用户名\Program\Conda&quot;），因为后期调用 Conda 的环境时，大概率是需要自己手动选择路径的，所以这里选个熟悉的，对自己来说比较方便</p>
<h1>配置环境</h1>
<p>安装成功后，使用 Windows 的同学，在开始菜单中找到“Miniconda3 → Anaconda Prompt (miniconda3)”或者“Anaconda3 → Anaconda Prompt”即可打开带有 Conda 的命令行窗口<br />
然后，可以看到命令行输入区的开头有一个 (base) 的标记，这就是 Conda 的默认 Python 环境<br />
<img src="https://img.manshaoco.com/i/2023/07/19/1689735062.webp" alt="Conda 默认命令行" title="Conda 默认命令行" /><br />
咱们重新创建一个新的环境，名字叫 py38Env，版本为 Python 3.8</p>
<pre><code class="language-python">conda create -n py38Env python=3.8</code></pre>
<p>执行命令后，等待对应的环境文件下载配置完成后，可以看到屏幕上提示启用和取消该环境的命令<br />
咱们执行</p>
<pre><code class="language-python">conda activate py38Env</code></pre>
<p>即可看到，原来的 (base) 变成了 (py38Env)，此时，在此命令行下，执行 pip 的命令安装第三方库，均是安装在了 py38Env 的环境中</p>
<h1>常用命令</h1>
<pre><code class="language-python">conda env list  # 列出所有环境
conda activate {name}   # 启用指定的环境
conda create -n {name} python={version} # 创建指定版本的环境
conda remove -n {name} --all    # 删除指定的环境
conda deactivate        # 退出当前环境</code></pre>
<h1>开始使用</h1>
<p>环境创建好了，该如何使用呢？<br />
在 VSCode 中，安装好 Python 的支持扩展后，可在 VSCode 的右下角选择解释器，然后点击“输入解释器路径”，之后选择“安装目录 → envs → {环境名} → python.exe”即可<br />
<img src="https://img.manshaoco.com/i/2023/07/19/1689736186.webp" alt="VSCode 配置 Conda" title="VSCode 配置 Conda" /><br />
如果使用 PyCharm，操作步骤也是类似，同样选择上述路径或文件夹即可</p>]]></description>
    <pubDate>Wed, 19 Jul 2023 10:13:41 +0800</pubDate>
    <author>Fotink</author>
    <guid>https://note.test.manshaoco.com/post-7.html</guid>
</item>
<item>
    <title>Windows 定时更换指定壁纸</title>
    <link>https://note.test.manshaoco.com/post-6.html</link>
    <description><![CDATA[<p>我在 macOS 上使用的壁纸是某位大佬制作的 苹果式 HEIF 动态壁纸。更换了 Windows 作为主力系统后，一直想要实现类似的定时更换指定壁纸的效果。<br />
网上没能找到合适的工具，考虑到这个需求难度并不高，所以我尝试使用 Python 将其实现，并使用 PyInstaller 封装成了一个 exe 可执行文件</p>
<p>我将其发布在了 GitHub，你可以在这里查看源代码和封装好后的压缩包(内附我在原神游戏中的截图，因不太擅长调整视角，截的不好还请见谅)<br />
<a href="https://github.com/manshaoco/changeWallpaperRegularly">https://github.com/manshaoco/changeWallpaperRegularly</a></p>
<p>目前的 1.2 版本的代码已经支持自定义时刻和对应壁纸，请在打包前，确保电脑上的 Python 3 环境已经安装了所需的第三方库</p>
<p>PS:后来发现 macOS 上的实现原理远比我想象的复杂，并不是按照固定时间来更换壁纸，而是加入了对高度角和方位角的计算，以尽可能真实地还原相对用户而言的动态切换体验，详情可查看：<a href="https://zhuanlan.zhihu.com/p/548657463">https://zhuanlan.zhihu.com/p/548657463</a></p>]]></description>
    <pubDate>Sat, 03 Dec 2022 20:08:53 +0800</pubDate>
    <author>Fotink</author>
    <guid>https://note.test.manshaoco.com/post-6.html</guid>
</item>
<item>
    <title>Python 的初步学习结束啦</title>
    <link>https://note.test.manshaoco.com/post-5.html</link>
    <description><![CDATA[<p>今天把嵩天老师的《Python语言程序设计》课程最后的一点内容学完啦。耗时二十多天，但收获满满。<br />
其实这门课，我在两年前(刚好整整两年，2020年7月)就开始学习了。但因复读原因，所以只学了个开头，约等于没学。<br />
七月初，我重新开始学这门课。再次接触，有了C的底子，再来理解Python的命令和用法，就感觉非常滴简单了。<br />
听到很多人说过，Python本身就不难；同时编程语言很多地方的逻辑都是一样的，有异曲同工之妙。编程语言的学习，很多时候也都只是理解。能理解，也就掌握的差不多了。</p>
<h3>同时，对比C和Python，我有几点感触：</h3>
<p>1、<strong>Python真的太友善了</strong>。“人生苦短，我学Python”不是说着玩儿的。因为Python相比C，离我们更近(面向对象)，所以它本身就提供了很多符合我们直觉用法的参数，比C更好上手。<br />
为了实现某些功能，C可能需要写一个完整的自定义的函数，而Python直接一行代码，调用自带的函数即可完成。<br />
2、<strong>C语言的课程中</strong>，老师所教授的内容，离不开stdio.h、math.h、string.h这三个自带的函数库，我们只需要一个C的环境，即可完成课程所学的这些C语言的基本内容。<br />
<strong>而Python不同</strong>。例如嵩天老师的这门课，在开始部分教完Python的基本语法和自带的turtle库之后，就开始教我们用pip安装第三方的库，并使用。我觉得课程中有一句话很适合概括Python的特点：我们要学习的是站在巨人的肩膀上，学会利用Python强大的计算生态的第三方库。很多Python第三方库都有自己的用法，我们只需在需要使用时，当场学习它们的用法，善于运用这些第三方库来解决实际需求，即可让Python为我们服务。<br />
3、学习C的时候，我所想的，无非就是尽快完成老师布置的作业，再就是优化一下自己的代码的解法(还不能说是算法)。而现在学习Python时，我所想的内容，能更加发散。比如利用Qt5重写当年用VB做的“天之抉子”这个随机点名的软件、针对博客图床的API设计一个自动转换图片为WebP并上传获取链接的程序。所以Python能够更好地融入咱们的生活，是一个便于解决实际需求的利器。尽管严格意义上来讲，Python的效率不如C，但解决日常生活需求，Python足够了。</p>
<p>以上便是这些天我初步学习Python的一点感受。文中难免有些观点可能很幼稚，不严谨，还请大佬指正!</p>
<p>接下来，就是专项学习一下Python爬虫相关的知识了，继续加油！</p>]]></description>
    <pubDate>Wed, 27 Jul 2022 20:18:08 +0800</pubDate>
    <author>Fotink</author>
    <guid>https://note.test.manshaoco.com/post-5.html</guid>
</item>
<item>
    <title>Python 猜数程序</title>
    <link>https://note.test.manshaoco.com/post-4.html</link>
    <description><![CDATA[<p>学了引用随机库 Random 之后，想起来之前学习 C 的时候，做过一个猜数小游戏，还有些玩头。所以咱也准备用 Python 来实现一遍<br />
因此写了这么一个简单的小程序，效果如图<br />
<img src="https://img.manshaoco.com/i/2022/07/16/62d232be5237f.webp" alt="猜数效果图" title="猜数效果图" /><br />
代码如下</p>
<pre><code># 猜数小游戏
import random
resultNumber = random.randint(1,100)
print("============猜数============")
print("将会生成一个1-100之间的随机整数，\n你可以多次尝试猜数，\n猜中后，程序将展示你使用的次数。")
guessNumber = eval(input("请开始猜数："))
count = 1
while guessNumber != resultNumber:
    if guessNumber &gt; resultNumber:
        print("你猜的数大了，再试一次吧.")
    elif guessNumber &lt; resultNumber:
        print("你猜的数小了，再试一次吧.")
    guessNumber = eval(input("请开始猜数："))
    count += 1
print("恭喜你猜中了，随机整数为",resultNumber,",你共使用",count,"次就猜中了!不愧是你!")</code></pre>]]></description>
    <pubDate>Sat, 16 Jul 2022 11:35:54 +0800</pubDate>
    <author>Fotink</author>
    <guid>https://note.test.manshaoco.com/post-4.html</guid>
</item>
<item>
    <title>用 Python 的基础库 Turtle 画一个校徽</title>
    <link>https://note.test.manshaoco.com/post-3.html</link>
    <description><![CDATA[<p>前几天初学 Python 的时候，按照 中国大学MOOC 的 嵩天 老师的课程，学习了使用 Python 自带的基础库 Turtle 绘制图形。于是，按照整活的惯例，俺也画了幅图——中国民航大学的校徽<br />
因为校徽里面的文字似乎没有对应的电脑字体，故这幅图只是画了一个校徽，然后使用了系统自带的字体 Trebuchet MS<br />
成品如图<br />
<img src="https://img.manshaoco.com/i/2022/07/16/62d23178afbf2.webp" alt="校徽效果图" /><br />
代码如下，仅做记录和参考<br />
尽可能按照1:1来还原，但很多地方属实能力不够，只好使用肉眼来还原成大概的样子</p>
<pre><code># 航大Logo，使用Python Turtle库完成
import turtle as t
t.pensize(5)
t.pencolor('#0089d2')
t.penup()
t.fd(260)
t.seth(90)
t.pendown()
t.circle(260)
# 绘制外侧边线 End
t.pencolor('#afe4fb')
t.penup()
t.seth(180)
t.fd(50)
t.seth(90)
t.pensize(95)
t.pendown()
t.circle(210)
# 绘制外圈淡蓝色 End
t.seth(180)
t.penup()
t.fd(47)
t.pencolor('#0089d2')
t.seth(90)
t.pensize(5)
t.pendown()
t.circle(162)
# 绘制内圈边线 End
t.seth(180)
t.fd(40)
# 绘制右侧中心线 End
t.pencolor('#00a1ec')
t.penup()
t.goto(28,107)
t.pensize(35)
t.seth(-80)
t.pendown()
t.fd(50)
t.seth(-30)
t.fd(80)
t.seth(-90)
t.fd(70)
t.seth(160)
t.fd(80)
t.seth(-90)
t.fd(80)
# 绘制右半边小飞机 End
t.penup()
t.goto(-28,107)
t.pensize(35)
t.seth(-100)
t.pendown()
t.fd(50)
t.seth(-150)
t.fd(80)
t.seth(-90)
t.fd(70)
t.seth(20)
t.fd(80)
t.seth(-90)
t.fd(80)
# 绘制左半边小飞机 End
t.penup()
t.goto(-160,0)
t.seth(0)
t.pensize(5)
t.pencolor('#0089d2')
t.pendown()
t.fd(35)
t.penup()
t.seth(90)
t.goto(0,0)
t.goto(0,-230)
t.write("C A U C",align="center",font=("Trebuchet MS",40,"normal"))
t.hideturtle()
# 绘制左侧中心线和底部文字 End
t.done()</code></pre>]]></description>
    <pubDate>Sat, 16 Jul 2022 11:09:19 +0800</pubDate>
    <author>Fotink</author>
    <guid>https://note.test.manshaoco.com/post-3.html</guid>
</item></channel>
</rss>