<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Oeo&#39;s Blog</title>
    <link>https://ooe.ooo/</link>
    <description>Recent content on Oeo&#39;s Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Sat, 21 Sep 2024 17:16:53 +0800</lastBuildDate>
    
	<atom:link href="https://ooe.ooo/index.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>Git Commit日志风格指南</title>
      <link>https://ooe.ooo/posts/git-commit%E6%97%A5%E5%BF%97%E9%A3%8E%E6%A0%BC%E6%8C%87%E5%8D%97/</link>
      <pubDate>Sat, 21 Sep 2024 17:16:53 +0800</pubDate>
      
      <guid>https://ooe.ooo/posts/git-commit%E6%97%A5%E5%BF%97%E9%A3%8E%E6%A0%BC%E6%8C%87%E5%8D%97/</guid>
      <description>在进行代码提交时，良好的提交风格可以帮助我们保持项目的可读性和维护性。为了确保提交记录易于理解和管理，建议遵循以下 Git 提交风格指南。
提交消息结构 每个提交消息应包含三个部分：
 标题（subject）: 用简洁的方式描述改动内容。 正文（optional body）: 更详细地说明为什么进行该修改。 脚注（optional footer）: 可以用于关闭某些 issues 或者备注重要事项。
&amp;lt;type&amp;gt;[optional scope]: &amp;lt;description&amp;gt; [optional body] [optional footer(s)]   1. 标题部分  必须包含改动的 类型（type），可以是以下几种类型：
 feat: 新功能 fix: 修复 bug docs: 仅文档更新 style: 代码格式更改（不影响逻辑的改动，如空格、格式、缺少分号等） refactor: 代码重构（既不修复 bug 也不添加功能） test: 添加或修改测试 chore: 修改构建过程或辅助工具的变动 perf: 提升性能的改动  范围（scope） 用于描述影响的模块或功能。若范围不明确可以省略。
 描述（subject） 使用简洁明了的动词开头，描述改动内容，限制在50个字符以内。
  2. 正文部分（可选）  提供更多的背景信息和修改动机。 每行不超过 72 个字符。  3. 页脚部分（可选）  如果提交关闭了某个 issue 或做了特殊处理，可以在页脚注明。 例如：Closes #123 或 Relates to #456。  结构字段说明    字段 说明 示例     type 提交类型，表示改动的目的。 feat, fix, docs, style, refactor, test, chore, perf   scope 可选，描述此次改动的影响范围。 auth, api, db, ui   subject 简洁描述改动，50字符以内。 add user login feature, fix navbar bug   body 可选，详细说明修改的原因、背景信息，每行不超过 72 字符。 This commit adds the login feature for user authentication.</description>
    </item>
    
    <item>
      <title>在PVE中创建软路由虚拟机</title>
      <link>https://ooe.ooo/posts/%E5%9C%A8pve%E4%B8%AD%E5%88%9B%E5%BB%BA%E8%BD%AF%E8%B7%AF%E7%94%B1%E8%99%9A%E6%8B%9F%E6%9C%BA/</link>
      <pubDate>Sat, 06 Jul 2024 14:44:45 +0800</pubDate>
      
      <guid>https://ooe.ooo/posts/%E5%9C%A8pve%E4%B8%AD%E5%88%9B%E5%BB%BA%E8%BD%AF%E8%B7%AF%E7%94%B1%E8%99%9A%E6%8B%9F%E6%9C%BA/</guid>
      <description>配置主机网桥 我的主机有2个自带网口, 我加了一个USB网口, 总共3个网口, 将USB网口作为WAN口, 两个自带网口作为LAN口
在网桥中WAN口是PVE系统默认的vmbr0, 需要再新建一个LAN口网桥vmbrlan, 桥接网卡为enp1s0 enp2s0
修改完后检查/etc/network/interfaces文件, 确保修改已生效
auto lo iface lo inet loopback iface enp1s0 inet manual iface enp2s0 inet manual iface wlp3s0 inet manual iface enxc8xxxxxxxx inet manual auto vmbr0 iface vmbr0 inet static address 192.168.1.111/24 gateway 192.168.1.1 bridge-ports enxc8xxxxxxxx bridge-stp off bridge-fd 0 auto vmbrlan iface vmbrlan inet manual bridge-ports enp1s0 enp2s0 bridge-stp off bridge-fd 0 #两个LAN网口  配置虚拟机 创建虚拟机 https://pycvala.de/blog/proxmox/create-your-own-debian-12-cloud-init-template/
根据上面的博客配置虚拟机, 将IP地址设置为静态192.</description>
    </item>
    
    <item>
      <title>Debian通过LVM创建与恢复快照</title>
      <link>https://ooe.ooo/posts/debian%E9%80%9A%E8%BF%87lvm%E5%88%9B%E5%BB%BA%E4%B8%8E%E6%81%A2%E5%A4%8D%E5%BF%AB%E7%85%A7/</link>
      <pubDate>Wed, 03 Jul 2024 21:13:10 +0800</pubDate>
      
      <guid>https://ooe.ooo/posts/debian%E9%80%9A%E8%BF%87lvm%E5%88%9B%E5%BB%BA%E4%B8%8E%E6%81%A2%E5%A4%8D%E5%BF%AB%E7%85%A7/</guid>
      <description>什么是LVM? LVM（Logical Volume Manager，逻辑卷管理器）是一种用于Linux系统的存储管理技术。它提供了一种灵活的方式来管理磁盘存储，允许管理员动态调整存储卷的大小和配置，而无需中断系统运行。LVM的主要功能和优势包括：
 动态调整卷大小 LVM允许在不停止系统的情况下动态调整逻辑卷的大小。这对于需要频繁调整存储空间的环境非常有用。
 创建快照 LVM支持创建卷的快照（snapshot），这对于备份和恢复操作非常有用。快照可以在某一时刻捕获卷的状态，允许在不影响正常操作的情况下进行备份。
 聚合存储设备 LVM可以将多个物理存储设备（如硬盘或分区）聚合成一个或多个逻辑卷组（Volume Group，VG），然后在这些卷组上创建逻辑卷（Logical Volume，LV）。这使得存储管理更加灵活和高效。
 提高存储利用率 通过将多个物理存储设备合并为一个逻辑卷组，LVM可以更有效地利用存储空间，减少碎片化问题。
 简化存储管理 LVM提供了一套命令行工具，使得存储管理任务（如创建、删除、调整卷大小等）更加简单和直观。
  LVM的基本概念  物理卷（Physical Volume，PV）：LVM管理的基本存储单元，可以是整个硬盘、硬盘分区或RAID设备。
 卷组（Volume Group，VG）：由一个或多个物理卷组成的存储池。逻辑卷从卷组中分配空间。
 逻辑卷（Logical Volume，LV）：从卷组中分配的存储单元，类似于传统分区，可以格式化并挂载到文件系统。
 物理扩展（Physical Extent，PE）：卷组中的最小分配单元，所有的物理卷都被划分为大小相等的PE。
  创建系统快照  检查现有的卷组和逻辑卷
sudo vgdisplay sudo lvdisplay  创建逻辑卷快照
sudo lvcreate --size 4G --snapshot --name root_snap /dev/vg0/root  --size 1G指定了快照的大小，--snapshot表示创建快照，--name root_snap是快照的名称，/dev/vg0/root是要快照的逻辑卷, 一般是快照整个系统/对应的逻辑卷是/dev/??/root
  查看逻辑卷列表 sudo lvs  检查快照内容(可选) 如果你需要访问快照中的数据，可以将其挂载到文件系统中。例如，将快照挂载到/mnt/snapshot：
mkdir /mnt/snapshot mount /dev/vg0/root_snap /mnt/snapshot  现在你可以在/mnt/snapshot目录中访问快照中的数据。你可以进行备份或其他操作。</description>
    </item>
    
    <item>
      <title>PVE添加Nvidia显卡直通</title>
      <link>https://ooe.ooo/posts/pve%E6%B7%BB%E5%8A%A0nvidia%E6%98%BE%E5%8D%A1%E7%9B%B4%E9%80%9A/</link>
      <pubDate>Thu, 30 May 2024 21:46:35 +0800</pubDate>
      
      <guid>https://ooe.ooo/posts/pve%E6%B7%BB%E5%8A%A0nvidia%E6%98%BE%E5%8D%A1%E7%9B%B4%E9%80%9A/</guid>
      <description>本教程建议结合下文给出的官方文档来操作
 启用 PCIe 直通 https://pve.proxmox.com/wiki/PCI(e)_Passthrough
启用IOMMU  打开GRUB配置文件进行编辑
vim /etc/default/grub
 找到包含GRUB_CMDLINE_LINUX_DEFAULT的行，并在引号内添加iommu=pt intel_iommu=on参数。例如：
GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;quiet splash iommu=pt intel_iommu=on&amp;quot;
 更新GRUB配置
update-grub
  添加内核模块 # 编辑模块配置 vim /etc/modules # 添加以下模块 vfio vfio_iommu_type1 vfio_pci # 刷新initramfs update-initramfs -u -k all # 重启系统 reboot # 检查模块是否加载, 输出结果应包含上面的3个模块 lsmod | grep vfio # 检查是否启用PCIe直通 dmesg | grep -e DMAR -e IOMMU -e AMD-Vi # 输出结果应该包含以下内容 1. DMAR: IOMMU enabled - 这表明IOMMU（输入输出内存管理单元）已经启用，这是PCIe直通的必要条件。 2.</description>
    </item>
    
    <item>
      <title>人格优势量表VIA</title>
      <link>https://ooe.ooo/posts/%E4%BA%BA%E6%A0%BC%E4%BC%98%E5%8A%BF%E9%87%8F%E8%A1%A8via/</link>
      <pubDate>Tue, 23 Apr 2024 19:36:55 +0800</pubDate>
      
      <guid>https://ooe.ooo/posts/%E4%BA%BA%E6%A0%BC%E4%BC%98%E5%8A%BF%E9%87%8F%E8%A1%A8via/</guid>
      <description>About 问卷地址: https://www.authentichappiness.sas.upenn.edu/zh-hans/questionnaires/%E6%80%A7%E6%A0%BC%E4%BC%98%E7%82%B9%E7%9A%84%E8%B0%83%E6%9F%A5-0
以下是你在“价值实践VIA突显优点调查”的得分。请参考&amp;lt;&amp;lt;真正的快乐&amp;gt;&amp;gt; Authentic Happiness一书，以助分析得分。各项优点的等级排列，反映了你在此调查中２４项优点的整体分数，以及在每项优点中的能力。你最突出的五项优点，特别是那些被列为突显优点的，都是值得你留意，并加以利用。
Result 1. 你的顶级优势 - 对世界的好奇和兴趣 你对所有事物都充满好奇。你总是在提问，你发现所有的主题和话题都令人着迷。你喜欢探索和发现。
2. 你的第二优势 - 对美和卓越的欣赏 你注意到并欣赏生活中所有领域的美，卓越和/或熟练的表现，从自然到艺术，到数学，到科学，到日常体验。
3. 判断力，批判性思维和开放心态 深思熟虑并从各个方面检查事物是你的重要特质。你不会草率下结论，你只依赖于坚实的证据来做出决定。你能够改变你的想法。
4. 公平，公正和正义 公平对待所有人是你的坚定原则。你不会让你的个人感情影响你对其他人的决定。你给每个人一个机会。
5. 诚实，真实和真诚 你是一个诚实的人，不仅通过说出真相，而且通过真实和真诚的方式生活。你脚踏实地，没有做作；你是一个&amp;rdquo;真实&amp;rdquo;的人。
6. 创造力，独创性和原创性 想出新的做事方式是你的重要部分。如果有更好的方式，你永远不会满足于传统的方式。
7. 热爱学习 你热爱学习新事物，无论是在课堂上还是自己。你一直热爱学校，阅读和博物馆-任何地方和任何地方都有学习的机会。
8. 幽默和玩心 你喜欢笑和戏弄。给其他人带来笑容对你来说很重要。你试图看到所有情况的轻松一面。
9. 宽恕和怜悯 你原谅那些对你做错事的人。你总是给人们第二次机会。你的指导原则是怜悯而不是报复。
10. 谨慎，审慎和谨慎 你是一个谨慎的人，你的选择总是审慎的。你不会说或做你可能会后悔的事情。
11. 感恩 你意识到你身上发生的好事，你从不把它们当作理所当然。你的朋友和家人知道你是一个感恩的人，因为你总是花时间表达你的感谢。
12. 自我控制和自我调节 你有意识地调节你的感觉和你的行为。你是一个有纪律的人。你控制你的欲望和你的情绪，而不是反过来。
13. 公民身份，团队合作和忠诚 你作为一个团队的成员表现出色。你是一个忠诚和敬业的队友，你总是尽你的份额，你为你的团队的成功而努力工作。
14. 透视智慧 虽然你可能不认为自己是明智的，但你的朋友对你有这样的看法。他们珍视你对事物的看法，并向你寻求建议。你看待世界的方式对其他人和你自己都有意义。
15. 热情，热情和精力 无论你做什么，你都充满了兴奋和精力。你从不半途而废或半心半意。对你来说，生活就是一场冒险。
16. 希望，乐观和未来导向 你期待未来的最好，你努力实现它。你相信未来是你可以控制的。
ChatGPT推荐工作 根据这些人格特质，以下是一些可能适合这个人的工作领域建议：
 研究和开发：
 科学研究员（如生物学、物理学、化学等领域） 社会科学研究（如心理学、社会学、人类学） 新产品研究与开发，特别是那些需要创新和创造性思维的  教育和学术：</description>
    </item>
    
    <item>
      <title>电脑族如何保护眼睛和皮肤</title>
      <link>https://ooe.ooo/posts/%E7%94%B5%E8%84%91%E6%97%8F%E5%A6%82%E4%BD%95%E4%BF%9D%E6%8A%A4%E7%9C%BC%E7%9D%9B%E5%92%8C%E7%9A%AE%E8%82%A4/</link>
      <pubDate>Sun, 18 Feb 2024 01:48:57 +0800</pubDate>
      
      <guid>https://ooe.ooo/posts/%E7%94%B5%E8%84%91%E6%97%8F%E5%A6%82%E4%BD%95%E4%BF%9D%E6%8A%A4%E7%9C%BC%E7%9D%9B%E5%92%8C%E7%9A%AE%E8%82%A4/</guid>
      <description> 蓝光的危害 现在科技的便利已经使工作内容离不开智能设备, 人们每天要进行8小时的久坐和持续面对电脑/手机屏幕发出的蓝光, 而蓝光是一种对皮肤和眼睛造成伤害的主要因子. 蓝光是可见光中波长最短、能量最高的光线，这种光的波长与紫外线 (UV) 非常接近，可能会对我们的皮肤造成长期损害。过多的蓝光照射会对人体造成以下伤害：
 视觉疲劳：长时间看电脑、手机等电子产品，会让眼睛感到疲劳、干涩、视力模糊等。 眼部疾病：长期暴露在蓝光中，可能会增加患黄斑变性等眼部疾病的风险。 睡眠质量下降：蓝光会抑制人体产生褪黑素的能力，褪黑素是控制人的睡眠节律的重要激素，因此，晚上接触蓝光可能会导致失眠、睡眠质量下降。 皮肤伤害：一些研究还显示，蓝光可能对皮肤造成伤害，如加速皮肤老化等。  如何保护眼睛  将智能设备亮度调至柔和不刺眼的程度 打开&amp;rdquo;夜间模式&amp;rdquo;, 可以过滤掉大部分蓝光, 现在PC和手机上都有这种功能 给智能设备贴防蓝光保护膜 佩戴防蓝光眼睛 不要长时间面对屏幕, 每隔半个小时站起身走一走 睡前一个小时不要玩手机, 睡觉时将手机放在可触及的范围外  如何保护皮肤  最简单的干预措施是限制设备发出的蓝光量。打开设备的&amp;rdquo;夜间模式&amp;rdquo;功能，可以营造出更温暖的屏幕色调。将标准 LED 灯泡更换为蓝光较少的版本。 含有氧化铁的矿物防晒霜是蓝光防护的黄金标准。氧化铁已被证明比单独的氧化锌和二氧化钛更能抵抗可见光。 手机比马桶座圈脏10倍。了解我们触摸屏幕的频率后，我们的设备会导致痤疮发作也就不足为奇了。 “当我的病人一侧脸上的痤疮更严重时，我首先询问的是手机的使用（我询问的第二件事是更换他们的枕套）” 但除此之外，使用耳机或免提电话尽可能避免将手机放在皮肤上。  </description>
    </item>
    
    <item>
      <title>Ubuntu 软路由全套折腾指南（转）</title>
      <link>https://ooe.ooo/posts/ubuntu-%E8%BD%AF%E8%B7%AF%E7%94%B1%E5%85%A8%E5%A5%97%E6%8A%98%E8%85%BE%E6%8C%87%E5%8D%97%E8%BD%AC/</link>
      <pubDate>Fri, 16 Feb 2024 10:36:59 +0800</pubDate>
      
      <guid>https://ooe.ooo/posts/ubuntu-%E8%BD%AF%E8%B7%AF%E7%94%B1%E5%85%A8%E5%A5%97%E6%8A%98%E8%85%BE%E6%8C%87%E5%8D%97%E8%BD%AC/</guid>
      <description>原文地址 转发自恩山无线论坛 &amp;gt; 用户gladys
原始地址: https://www.right.com.cn/forum/thread-8255448-1-1.html
写在前面 折腾过不少路由系统，从一开始的老毛子，到后来的各家定制固件，再到官方固件、自己编译固件，发现可玩性都不够高。还好自己有一点点折腾服务器的经验，于是干脆一步到位，使用自己常用的Linux发行版Ubuntu作为底层系统，通过非侵入、最小化修改的方式实现一套路由器解决方案 整理的内容可能有疏漏，欢迎大家交流补充，在此提前谢各位大佬轻喷之恩。
选择Ubuntu作为路由器的理由 本节内容可能引起您的不适，请谨慎阅读。
 足够稳定可靠，性能不差
目前自己使用过的x86软路由，从J1900开始，到现在的J4125，性能都严重过剩，跑个Ubuntu服务器版，顺带跑个千兆网络乃至2.5G都没有一点问题。
Ubuntu作为使用较为广泛的Linux发行版，除了预装些私货以外，在几年VPS的使用经历来看没有什么大问题，运行比较稳定。
 配置管理标准化
这个需求可能有的人没法理解。自己手里很多服务器，包括虚拟或者实体的都以Debian系为主，很多系统和软件配置，也都是依据Debian系的系统和软件进行编写维护的。使用完全不同的Linux发行版不利于配置的精细化管理和重用，尤其是需要配置的软件超过20个、配置文件数量超过100项以后。目前个人的配置文件不得不使用git进行仓库化和版本管理，并通过自己写的配置管理工具进行配置项的同步分发。
举个简单的例子。在我用OpenWRT的时候，OpenWRT的系统服务还是采用init.d，而Debian系的服务配置全部使用systemd。这就意味着就服务配置文件一项而言，就需要多维护20个适用于init.d的系统服务配置文件用于适配OpenWRT，且对应的配置管理工具需要增加逻辑以适配OpenWRT，无疑大大增加了工作量。然而这只是一项，还有例如OpenSSH与DropBox，opkg与dpkg等许多例子。如此种种让配置管理维护成本激增，于是最终决定将网关系统也改为Debian系的操作系统。 通过操作系统的统一，路由器就可作为具有路由功能的服务器所对待，无需针对不同操作系统进行配置的适配，大大降低配置的创建、分发和维护成本。其他服务器上运行良好的服务也可以最少的改动移植到路由器中。
 可定制性高
有的人用OpenWRT可能只是习惯在UI上点点点，觉得每次系统重置就重新点一遍就行了，大不了再记一下笔记。有的人可能稍微有心一些，定期把配置下载备份。然而这些是建立在对程序深度定制没要求的用户，但凡需求高一些的用户，这些方法都是行不通的。 一个很明显的例子，开发者提供的很多默认配置选项或功能存在各种问题，要么存在缺陷、或是不符合自己的要求，或是和其它程序存在冲突的情况。例如同时对iptables修改出现冲突的问题，三年前我用OpenClash的时候，它搞崩OpenWRT的iptables导致没法上网的情况我已经数不清了。要么放弃OpenClash，要么就要自己动手丰衣足食。当然，这也不全是OpenClash的锅，因为作者也不知道用户到底在用什么可能与OpenClash不兼容的程序。
假设你决定继续用OpenClash，那么只能尝试修改OpenClash的某些默认配置（例如其内置的一些运行脚本），以保证它的运行同你现在使用的程序兼容。如果你运气好，发现了OpenClash的问题，添加了相关逻辑修复了问题，然后希望给作者发个PR。结果作者可能会拒绝掉，理由是这个情况太小众。但对你不是啊，因为和它冲突的软件虽然大家不用，但你用的非常频繁。那OpenClash还要自动更新吗？如果要的话，你的修改可能会被覆盖掉；否则，没法及时获得最新的bug修复，可能会出现其他问题，而且手动更新也很麻烦。那只有自己在每次自动更新以后覆盖patch了。也许一两个程序、一两个文件的patch手动还能解决，但是如果patch文件太多呢？如果几个，甚至十几个软件都要这样呢？问题就很大了。
  设置方法及注意事项 固定网卡名称 设置方法 ☮  将配置文件（custom-devices.rules）放置于/etc/udev/rules.d/目录下； ATTR{address}后面的MAC地址修改为自己设备对应的网卡MAC地址（可通过ifconfig -a命令获得）‘’ 对应的NAME后面修改为自己喜欢的网卡别名； 配置文件示例在下面给出。
# Located in /etc/udev/rules.d/custom-devices.rules # Network Interface Card # 格式：SUBSYSTEM==&amp;quot;net&amp;quot;, ACTION==&amp;quot;add&amp;quot;, DRIVERS==&amp;quot;?*&amp;quot;, ATTR{address}==&amp;quot;（替换为MAC地址）&amp;quot;, ATTR{dev_id}==&amp;quot;0x0&amp;quot;, ATTR{type}==&amp;quot;1&amp;quot;, NAME=&amp;quot;（替换的网卡名称）&amp;quot; # 举例：将MAC地址为 11:22:33:44:55:66:77 的网卡名称改为 eth1，每行设置一个网卡 SUBSYSTEM==&amp;quot;net&amp;quot;, ACTION==&amp;quot;add&amp;quot;, DRIVERS==&amp;quot;?*&amp;quot;, ATTR{address}==&amp;quot;11:22:33:44:55:66:77&amp;quot;, ATTR{dev_id}==&amp;quot;0x0&amp;quot;, ATTR{type}==&amp;quot;1&amp;quot;, NAME=&amp;quot;eth1&amp;quot;   补充说明 ☸ 之前手里有一台3965U，安装系统后6个网卡的名称出现了enp*s0和eth*混用的情况，因此通过udev将所有网卡统一名称。非必需步骤，强迫症患者福音。</description>
    </item>
    
    <item>
      <title>GnuPG学习笔记</title>
      <link>https://ooe.ooo/posts/gnupg%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</link>
      <pubDate>Sat, 06 Jan 2024 12:10:16 +0800</pubDate>
      
      <guid>https://ooe.ooo/posts/gnupg%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</guid>
      <description>什么是GnuPG? GPG，全称GNU Privacy Guard，是一种加密技术，它可以用来确保你的文件和通信的安全。GPG是一个自由的、兼容OpenPGP(RFC4880)的公钥加密体系。它没有任何依赖专利或专有实现的算法，这意味着它可以在任何地方自由使用。
GPG不仅提供加密，还提供认证，这意味着你可以用它验证一个文件是否是由特定的人发送的，或者一个程序是否是由特定的公司发布的。这是通过使用公钥和私钥来实现的。公钥用于加密文件或验证签名，而私钥用于解密文件或创建签名。
密钥类型 共有四种类型的密钥，对应的缩写如下：
   类型 全名 缩写     主公钥 Public Key pub   子公钥 Public Subkey sub   主私钥 Secret Key sec   子私钥 Secret Subkey ssb    用途（Usage） 每个密钥可以用不同的用途，下表是不同用途的含义：
   缩写 全名 用途     C Certificating 认证，如子密钥或证书，类似根证书的作用。   S Signing 签名，如文件数字签名、邮件签名、Git 提交。   A Authenticating 身份验证，如登录。   E Encrypting 加密，如文件和文本。    具有 C 的密钥是主密钥，只有这个密钥可以用于：</description>
    </item>
    
    <item>
      <title>区块链黑暗森林自救手册</title>
      <link>https://ooe.ooo/posts/%E5%8C%BA%E5%9D%97%E9%93%BE%E9%BB%91%E6%9A%97%E6%A3%AE%E6%9E%97%E8%87%AA%E6%95%91%E6%89%8B%E5%86%8C/</link>
      <pubDate>Sat, 06 Jan 2024 12:06:57 +0800</pubDate>
      
      <guid>https://ooe.ooo/posts/%E5%8C%BA%E5%9D%97%E9%93%BE%E9%BB%91%E6%9A%97%E6%A3%AE%E6%9E%97%E8%87%AA%E6%95%91%E6%89%8B%E5%86%8C/</guid>
      <description>区块链黑暗森林自救手册 掌握这些，掌握你的加密货币安全
作者：余弦@慢雾
https://darkhandbook.io/CN-Blockchain-dark-forest-selfguard-handbook-V1.1.pdf
https://github.com/evilcos/darkhandbook
如何拥有一个安全的Windows系统, 可以参考我之前写的文章: 传送门
有一段精准预测了Ledger硬件钱包被黑事件所利用的供应链漏洞, 🐂
... 前端安全里我最在意的点是：我怎么知道我在这个前端页面里的交互对象就是我以为的智能合约？造成这种不安全感主要是因为以下这两种风险： · 内部作恶 · 第三方作恶 ... 第三方作恶，主要指的是两种： · 一种是供应链作恶，比如前端依赖的第三方模块被植入了后门，随着打包发布一起被直接带入目标前端页面了。如 SushiSwap（仅仅举例子，并不代表截图里的项目有发生这个问题）： ...  摘要  安全这东西，无知者无畏、知者敬畏，许多点是细思恐极的。所以对于存有重要资产的钱包，我的安全原则也简单：不做轻易更新，够用就好。
 这绝对是个经典案例，黑客为了盗币，动用了 BGP 劫持，真是杀鸡用了牛刀。之后也出现过几起类似的案例，这里就不提了。这里对于用户来说实际上只需要注意一点，当你真的要用网页钱包或玩相关 DApp 时，一定要注意：当目标页面出现 HTTPS 错误证书提醒时，就立即停止继续访问、关闭页面，那么你什么事都不会有。
 小心反常识签名！
还没结束，我还想特别提一种风险：反常识风险。 什么是反常识，比如你已经特别熟悉以太坊了，各种 DeFi、NFT 玩得小白们直呼你大佬。此时你去玩 Solana，同样也遇到了各种钓鱼网站，你可不畏惧，轻蔑一笑：“这些在以太坊系列生态里都麻了，我怎么可能上当？” 不好意思，黑客笑了，你确实上当了。因为出现了个反常识流程，人都是有惯性或惰性，这导致你大意了，没有闪。好，让我们来看看这个反常识真实案例。 2022.3.5，一个安全预警：Solana 上的授权钓鱼残忍多了，攻击者批量给用户空投NFT(图1) ，用户通过空投 NFT 描述内容里的链接(www_officialsolanarares_net)进入目标网站，连接钱包(图 2)，点击页面上的“Mint”，出现批准提示框(图 3)。注意，此时的批准提示框并没有什么特别提示，当批准后，该钱包里的所有 SOL 都会被转走。 该恶意合约的功能最终就是发起“SOL Transfer”，将用户的 SOL 几乎全部转走。从链上信息来看，该钓鱼行为已经持续了几天，中招者在不断增加。 这里面有两个坑，需要注意的： 1. 恶意合约在用户批准(Approve)后，可以转走用户的原生资产(这里是SOL)，这点在以太坊上是不可能的，以太坊的授权钓鱼钓不走以太坊的原生资产(ETH)，但可以钓走其上的Token。于是这里就存在“常识违背”现象，导致用户容易掉以轻心。 2. Solana 最知名的钱包 Phantom 在“所见即所签”安全机制上存在缺陷(其他钱包没测试)，没有给用户完备的风险提醒。这非常容易造成安全盲区，导致用户丢币。  一些高级攻击方式
高级攻击方式其实真很多，大多在大众视角下无非就是：我被钓鱼了。但这钓鱼可真高级了，比如： https://twitter.com/Arthur_0x/status/1506167899437686784 黑客通过邮件发送钓鱼，邮件里附带的文档是：A Huge Risk of Stablecoin(Protected).</description>
    </item>
    
    <item>
      <title>理解CIDR无类别域间路由表示法</title>
      <link>https://ooe.ooo/posts/%E7%90%86%E8%A7%A3cidr%E6%97%A0%E7%B1%BB%E5%88%AB%E5%9F%9F%E9%97%B4%E8%B7%AF%E7%94%B1%E8%A1%A8%E7%A4%BA%E6%B3%95/</link>
      <pubDate>Thu, 14 Dec 2023 10:15:00 +0800</pubDate>
      
      <guid>https://ooe.ooo/posts/%E7%90%86%E8%A7%A3cidr%E6%97%A0%E7%B1%BB%E5%88%AB%E5%9F%9F%E9%97%B4%E8%B7%AF%E7%94%B1%E8%A1%A8%E7%A4%BA%E6%B3%95/</guid>
      <description>什么是CIDR CIDR是Classless Inter-Domain Routing的缩写，它是一种用来替代传统的基于类的IP地址的方案。在一个IP地址中, 总共有32位(二进制表示), CIDR通过一个斜线和一个数字来表示网络的大小，例如192.168.1.0/24，其中192.168.1.0是网络地址，24表示网络地址占了IP地址的24位，也就是前三个数字。
在CIDR中，一个IP地址可以被分为“网络地址”和“主机地址”两部分。
 网络地址部分用于标识特定的网络。在同一个网络中，所有设备的网络地址部分都是相同的。
 主机地址部分用于标识网络中的特定设备。在同一个网络中，每个设备的主机地址都是唯一的。
  前24位表示网络地址, 后8位表示主机地址, 所以192.168.1.0/24的网络地址是192.168.1.0, 表示的IP范围是192.168.1.0-192.168.1.255。通常来说，子网中的第一个地址都保留用于引用网络本身，而最后一个地址用作广播地址用于网络；实际可用于主机的地址数量减少2个。
这个子网的详细信息如下：
 子网掩码：255.255.255.0 网络地址：192.168.1.0 广播地址：192.168.1.255 可用IP地址范围：192.168.1.1 - 192.168.1.254 可用IP地址数量：254个  什么是子网掩码 子网掩码是一串二进制位，用于标识IP地址中的网络地址部分和主机地址部分。子网掩码中，网络部分的二进制位都是1，主机部分的二进制位都是0。例如，一个常见的子网掩码是255.255.255.0，它的二进制形式是11111111.11111111.11111111.00000000。
通过将IP地址和子网掩码进行逻辑AND运算，我们可以得到网络地址。例如，如果我们有一个IP地址192.168.1.100和子网掩码255.255.255.0，那么网络地址就是192.168.1.0。
子网掩码的作用是帮助路由器和其他网络设备确定哪些IP地址属于同一个网络。当一个数据包需要被发送到一个特定的IP地址时，路由器会使用子网掩码来决定这个IP地址是否在本地网络中。如果是，数据包就直接发送到目的地；如果不是，数据包就被发送到网络的默认网关，然后由默认网关路由到目的地。
详解CIDR 例如这个CIDR: 192.168.1.1/8
在CIDR表示法中，/后面的数字表示网络地址中的网络部分的位数。例如，/8表示网络地址的前8位是网络部分，后24位是主机部分。
/8表示子网掩码是255.0.0.0，在二进制中，255可以表示为11111111，0可以表示为00000000。所以，255.0.0.0在二进制中就是11111111 00000000 00000000 00000000。这就意味着前8位是网络地址，后24位是主机地址。所以，/8表示的子网掩码是255.0.0.0。
子网掩码是用来确定一个IP地址的哪些位标识网络地址，哪些位标识主机地址。子网掩码中的每一位都与IP地址中的对应位进行AND运算，结果就是网络地址。在AND运算中，只有两个输入都为1时，结果才为1。
255. 0. 0. 0 = 11111111.00000000.00000000.00000000 192.168. 1. 1 = 11000000.10101000.00000001.00000001 AND运算 = 11000000.00000000.00000000.00000000 (网络地址 = 192.0.0.0)  后24位表示主机地址, 所以192.168.1.0/8的网络地址是192.0.0.0, 表示的IP范围是192.0.0.0-192.255.255.255。
示例 192.168.1.100/0 0.0.0.0- 255.255.255.255 192.168.1.100/8 192.0.0.0- 192.255.255.255 192.168.1.100/16 192.</description>
    </item>
    
    <item>
      <title>Prompt提示工程</title>
      <link>https://ooe.ooo/posts/prompt%E6%8F%90%E7%A4%BA%E5%B7%A5%E7%A8%8B/</link>
      <pubDate>Mon, 11 Dec 2023 12:08:11 +0800</pubDate>
      
      <guid>https://ooe.ooo/posts/prompt%E6%8F%90%E7%A4%BA%E5%B7%A5%E7%A8%8B/</guid>
      <description>少样本提示Few-shot USER: 计算以下结果: 0提示: Add 2+2: 单次提示: Add 3+3: 6 Add 2+2: 少量提示: Add 3+3: 6 Add 5+5: 10 Add 2+2:  少样本提示超越了零样本提示，通过在提示中添加模型期望的“示例”；如上所述。除了任务描述，我们还提供了几个正确的输入-输出对的例子。通过将这个上下文添加到提示中，我们可以为语言模型提供更具体的关于期望输出的细节。这种技术在GPT-3中流行起来，语言模型首次被证明在上下文学习中具有很高的能力。简单地说，模型可以从这些示例中学习，并随着提供的示例越来越多，准确性也会提高。
角色提示和指令提示 精心制定指令是一种高效且节省代币的提示技术。然而，并非所有的语言模型都是好的指令执行者。例如，预训练（基础）的LLMs并不自然地具有遵循详细指令的能力。许多现代的LLM（例如，GPT-4）非常可控（即，擅长遵循详细的指令），使得指令提示成为与这些模型合作的最有效的技术之一，如下文所示。
SYSTEM: 你是一个设计用来回答用户问题的聊天机器人。首先，向用户提供信息。如果你没有所需的信息，通过输出字符串[搜索请求]后跟所需信息的简洁描述来搜索这些信息。 USER: 谁是2023年NBA最好的球队？ GPT: [搜索请求] 2023年NBA最好的球队  提示的结构 存在各种各样的提示技术，但是这些技术都使用了（相对）常见的结构。
 格式：用于组织和构造提示的不同组件的文本标签。推荐Markdown格式 上下文：可能对LLM有用的任何额外上下文（例如，从向量数据库检索的信息块）。 示例：输入-输出示例，演示了正确解决所需问题的方法。 指令：LLM预期行为的详细文本描述。 输入数据：由LLM处理的输入数据。 值得注意的是，编写提示时并非所有这些组件都是必需的。本概述中探讨的几种技术只会使用上述组件的一部分，但是在必要时，每一种都可以用来为LLM提供额外的有用信息。
USER: ## 指令 给定一个用户提供的存储图像元数据的XML文档，以下条目将会出现： - source：描述文档来源的字符 - url：存储图像网址的字符串 - height：描述图像高度的整数 - width：描述图像宽度的整数 从文档中提取这些条目，并将它们作为保留原始键值对的python字典输出。 如果上述任何字段不存在，就在python字典中留空。 ## 示例 {{重新格式化的例子}} ## 上下文 {{检索到的额外上下文}} ## 输入数据 &amp;lt;root&amp;gt; &amp;lt;source&amp;gt;upload&amp;lt;/source&amp;gt; &amp;lt;url&amp;gt;www.myimgurl.com&amp;lt;/url&amp;gt; &amp;lt;height&amp;gt;100&amp;lt;/height&amp;gt; &amp;lt;width&amp;gt;200&amp;lt;/width&amp;gt; &amp;lt;/root&amp;gt; ## 输出数据 GPT: {&#39;source&#39;: &#39;upload&#39;, &#39;url&#39;: &#39;www.</description>
    </item>
    
    <item>
      <title>Windows10闲置时间后睡眠失效</title>
      <link>https://ooe.ooo/posts/windows10%E9%97%B2%E7%BD%AE%E6%97%B6%E9%97%B4%E5%90%8E%E7%9D%A1%E7%9C%A0%E5%A4%B1%E6%95%88/</link>
      <pubDate>Wed, 22 Nov 2023 15:21:45 +0800</pubDate>
      
      <guid>https://ooe.ooo/posts/windows10%E9%97%B2%E7%BD%AE%E6%97%B6%E9%97%B4%E5%90%8E%E7%9D%A1%E7%9C%A0%E5%A4%B1%E6%95%88/</guid>
      <description>重现 在电源和睡眠选项中,设置在接通电源/使用电池的情况下,经过以下时间后关闭,到了指定时间没有执行睡眠/休眠/息屏
修复 其中一种原因是,使用无线键盘/鼠标的情况下,这些设备会向操作系统发送Ping指令,导致系统无法进入睡眠模式
 在设备管理器中 找到键盘子项,选中其中的设备 按右键属性-电源管理 取消选中允许此设备唤醒计算机  对所有无线键鼠设备进行此操作</description>
    </item>
    
    <item>
      <title>Linux更新Python版本</title>
      <link>https://ooe.ooo/posts/linux%E6%9B%B4%E6%96%B0python%E7%89%88%E6%9C%AC/</link>
      <pubDate>Wed, 08 Nov 2023 08:05:05 +0800</pubDate>
      
      <guid>https://ooe.ooo/posts/linux%E6%9B%B4%E6%96%B0python%E7%89%88%E6%9C%AC/</guid>
      <description>Debian/Ubuntu 在Debian上安装Python最新版本并设置为默认版本，你可以按照以下步骤操作
更新系统 sudo apt-get update sudo apt-get upgrade  安装依赖项 Python的编译需要一些依赖项，你可以使用以下命令安装：
sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \ libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \ xz-utils tk-dev libffi-dev liblzma-dev git  安装pyenv pyenv是一个Python版本管理器，可以让你在同一系统中安装和管理多个Python版本。
使用以下命令安装pyenv：
curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash  配置环境变量 打开你的bash配置文件（如~/.bashrc），然后在文件末尾添加以下行：
# Pyenv Path export PATH=&amp;quot;~/.pyenv/bin:$PATH&amp;quot; eval &amp;quot;$(pyenv init -)&amp;quot; eval &amp;quot;$(pyenv virtualenv-init -)&amp;quot;  然后，保存并关闭文件。为了让这些改动生效，你需要重新加载bash配置文件，使用以下命令：
source ~/.bashrc  安装Python 现在你可以使用pyenv安装Python的最新版本了。首先，查看可用的Python版本：
pyenv install --list  找到你想要的版本，然后使用以下命令安装（以Python 3.</description>
    </item>
    
    <item>
      <title>Docker实用脚本</title>
      <link>https://ooe.ooo/posts/docker%E5%AE%9E%E7%94%A8%E8%84%9A%E6%9C%AC/</link>
      <pubDate>Tue, 19 Sep 2023 23:13:24 +0800</pubDate>
      
      <guid>https://ooe.ooo/posts/docker%E5%AE%9E%E7%94%A8%E8%84%9A%E6%9C%AC/</guid>
      <description> 推送所有image到registry #!/bin/bash # 运行脚本前先登录registry # 定义你的registry地址 REGISTRY=registry.domain.com # 获取本地所有的docker镜像 IMAGES=$(docker images --format &amp;quot;{{.Repository}}:{{.Tag}}&amp;quot;) # 遍历所有的docker镜像 for IMAGE in $IMAGES do # 获取镜像的名称和标签 REPO=$(echo $IMAGE | cut -d: -f1) TAG=$(echo $IMAGE | cut -d: -f2) # 为镜像添加新的标签，新的标签包含registry地址 NEW_TAG=$REGISTRY/$REPO:$TAG docker tag $IMAGE $NEW_TAG # 将新标签的镜像推送到registry docker push $NEW_TAG # 清理已推送的标签 docker rmi $NEW_TAG done  </description>
    </item>
    
    <item>
      <title>Docker安装与加固指南</title>
      <link>https://ooe.ooo/posts/docker%E5%AE%89%E8%A3%85%E4%B8%8E%E5%8A%A0%E5%9B%BA%E6%8C%87%E5%8D%97/</link>
      <pubDate>Tue, 19 Sep 2023 14:17:59 +0800</pubDate>
      
      <guid>https://ooe.ooo/posts/docker%E5%AE%89%E8%A3%85%E4%B8%8E%E5%8A%A0%E5%9B%BA%E6%8C%87%E5%8D%97/</guid>
      <description>安装Docker https://docs.docker.com/engine/install
以非root用户身份管理Docker https://docs.docker.com/engine/install/linux-postinstall
为Docker启用Linux user namespace https://docs.docker.com/engine/security/userns-remap https://medium.com/@kasunmaduraeng/docker-namespace-and-cgroups-dece27c209c7
# Create a user called &amp;quot;dremap&amp;quot; sudo adduser --no-create-home --disabled-password --disabled-login dremap # Setup subuid and subgid sudo sh -c &#39;echo dremap:400000:65536 &amp;gt; /etc/subuid&#39; sudo sh -c &#39;echo dremap:400000:65536 &amp;gt; /etc/subgid&#39; sudo vim /etc/docker/daemon.json { &amp;quot;userns-remap&amp;quot;: &amp;quot;dremap&amp;quot; } # Restart Docker sudo systemctl restart docker # Test 输出如下成功 docker run -d --rm ubuntu sleep 100 ps -ef|grep sleep #out: 400000 4981 4961 2 14:40 ?</description>
    </item>
    
    <item>
      <title>VSCode设置Python模块目录</title>
      <link>https://ooe.ooo/posts/vscode%E8%AE%BE%E7%BD%AEpython%E6%A8%A1%E5%9D%97%E7%9B%AE%E5%BD%95/</link>
      <pubDate>Sat, 02 Sep 2023 11:13:42 +0800</pubDate>
      
      <guid>https://ooe.ooo/posts/vscode%E8%AE%BE%E7%BD%AEpython%E6%A8%A1%E5%9D%97%E7%9B%AE%E5%BD%95/</guid>
      <description>注意事项 模块目录中的模块必须是标准格式,必须有__init__.py文件
示例:
./src |modules |__init__.py |module1 |__init__.py |module1.py |module2.py  VSCode配置文件 全局生效配置  打开配置文件
CTRL+SHIFT+P输入open user settings(json)按下回车.
 添加配置
在setting.json中添加3项配置:
{ // 添加 PYTHONPATH,Python运行时会从目录中寻找模块 &amp;quot;terminal.integrated.env.linux&amp;quot;: { &amp;quot;PYTHONPATH&amp;quot;: &amp;quot;${env:PYTHONPATH}:./src/modules1:./src/modules2&amp;quot;, }, // 启用VSCode代码自动补全功能 &amp;quot;python.autoComplete.extraPaths&amp;quot;: [ &amp;quot;./src/modules1&amp;quot;, &amp;quot;./src/modules2&amp;quot; ], &amp;quot;python.analysis.extraPaths&amp;quot;: [ &amp;quot;./src/modules1&amp;quot;, &amp;quot;./src/modules2&amp;quot; ], }   有多种方式添加PYTHONPATH,也可在launch.json配置文件中指定,实现不同启动配置加载不同的模块目录
重新打开VSCode以使配置生效.
单项目生效配置 在工作区添加上述配置,移动到项目根目录:
vim .vscode/setting.json  添加:
{ // 添加 PYTHONPATH,Python运行时会从目录中寻找模块 &amp;quot;terminal.integrated.env.linux&amp;quot;: { &amp;quot;PYTHONPATH&amp;quot;: &amp;quot;${env:PYTHONPATH}:./src/modules1:./src/modules2&amp;quot;, }, // 启用VSCode代码自动补全功能 &amp;quot;python.autoComplete.extraPaths&amp;quot;: [ &amp;quot;./src/modules1&amp;quot;, &amp;quot;./src/modules2&amp;quot; ], &amp;quot;python.</description>
    </item>
    
    <item>
      <title>VMVirtualBox安装增强功能启用双向复制</title>
      <link>https://ooe.ooo/posts/vmvirtualbox%E5%AE%89%E8%A3%85%E5%A2%9E%E5%BC%BA%E5%8A%9F%E8%83%BD%E5%90%AF%E7%94%A8%E5%8F%8C%E5%90%91%E5%A4%8D%E5%88%B6/</link>
      <pubDate>Fri, 25 Aug 2023 21:43:54 +0800</pubDate>
      
      <guid>https://ooe.ooo/posts/vmvirtualbox%E5%AE%89%E8%A3%85%E5%A2%9E%E5%BC%BA%E5%8A%9F%E8%83%BD%E5%90%AF%E7%94%A8%E5%8F%8C%E5%90%91%E5%A4%8D%E5%88%B6/</guid>
      <description> 如果直接在设备-共享粘贴板启用粘贴板是不起作用的,需要依次为宿主机和虚拟机安装增强功能
宿主机安装增强功能(windows)  在https://download.virtualbox.org/virtualbox找到使用的版本
 下载Oracle_VM_VirtualBox_Extension_Pack-xx.xx.vbox-extpack
 下载之后,双击文件进行安装
  虚拟机安装增强功能(debian)  打开Debian虚拟机并登陆,点击设备-共享粘贴板选择共享模式.
 依次点击VirtualBox的设备-&amp;gt;安装增强功能,此时驱动器已经挂载到Debian系统中了
 打开我的电脑或者文件,点击VBox_GAs_x.x.xx加载软盘,在空白处右键选择在终端打开
 执行sudo ./VBoxLinuxAdditions.run
 关闭所有VM VirtualBox进程并重新打开.
  </description>
    </item>
    
    <item>
      <title>Docker使用Restic容器备份文件</title>
      <link>https://ooe.ooo/posts/docker%E4%BD%BF%E7%94%A8restic%E5%AE%B9%E5%99%A8%E5%A4%87%E4%BB%BD%E6%96%87%E4%BB%B6/</link>
      <pubDate>Mon, 07 Aug 2023 19:40:45 +0800</pubDate>
      
      <guid>https://ooe.ooo/posts/docker%E4%BD%BF%E7%94%A8restic%E5%AE%B9%E5%99%A8%E5%A4%87%E4%BB%BD%E6%96%87%E4%BB%B6/</guid>
      <description> 创建存储库 docker run -it --rm \ -v /mnt/disk/backupData/restic-repo:/srv/restic-repo \ -e RESTIC_REPOSITORY=&#39;/srv/restic-repo&#39; \ -e RESTIC_PASSWORD=&amp;quot;pass&amp;quot; \ restic init  备份数据 https://restic.readthedocs.io/en/latest/040_backup.html
restic不带定时备份功能,需要通过其他方式实现(crontab,systemctl等)
docker run -it --rm \ -v /mnt/disk/backupData/restic-repo:/srv/restic-repo \ -v /usr/local/dockerContainerConf:/dockerContainerConf:ro \ -e RESTIC_REPOSITORY=&#39;/srv/restic-repo&#39; \ -e RESTIC_PASSWORD=&amp;quot;pass&amp;quot; \ restic backup /dockerContainerConf  查看已备份数据 docker run -it --rm \ -v /mnt/disk/backupData/restic-repo:/srv/restic-repo \ -e RESTIC_REPOSITORY=&#39;/srv/restic-repo&#39; \ -e RESTIC_PASSWORD=&amp;quot;pass&amp;quot; \ restic snapshots  恢复数据 https://restic.readthedocs.io/en/latest/050_restore.html
docker run -it --rm \ -v /mnt/disk/backupData/restic-repo:/srv/restic-repo \ -v /mnt/disk/backupData/test:/data \ -e RESTIC_REPOSITORY=&#39;/srv/restic-repo&#39; \ -e RESTIC_PASSWORD=&amp;quot;pass&amp;quot; \ restic restore 8fcef08d --target /data  </description>
    </item>
    
    <item>
      <title>Docker运行或编译容器时使用代理</title>
      <link>https://ooe.ooo/posts/docker%E8%BF%90%E8%A1%8C%E6%88%96%E7%BC%96%E8%AF%91%E5%AE%B9%E5%99%A8%E6%97%B6%E4%BD%BF%E7%94%A8%E4%BB%A3%E7%90%86/</link>
      <pubDate>Sun, 06 Aug 2023 23:20:48 +0800</pubDate>
      
      <guid>https://ooe.ooo/posts/docker%E8%BF%90%E8%A1%8C%E6%88%96%E7%BC%96%E8%AF%91%E5%AE%B9%E5%99%A8%E6%97%B6%E4%BD%BF%E7%94%A8%E4%BB%A3%E7%90%86/</guid>
      <description>在使用docker build编译go文件时,因墙原因导致编译失败.需要添加代理解决,解决方案就是在build或者run时添加环境变量
在CLI命令中添加代理 命令行上build时添加--build-arg设置环境变量，运行容器时使用--env设置
docker build \ --build-arg HTTP_PROXY=&amp;quot;http://proxy.example.com:3128&amp;quot; \ --build-arg HTTPS_PROXY=&amp;quot;http://proxy.example.com:3128&amp;quot; \ . docker run \ --env HTTP_PROXY=&amp;quot;http://proxy.example.com:3128&amp;quot; \ --env HTTPS_PROXY=&amp;quot;http://proxy.example.com:3128&amp;quot; \ redis # or (编译Go文件时请使用上面的方式) docker build --build-arg ALL_PROXY=&amp;quot;socks5://proxy.example.com:3128&amp;quot; . docker run --env ALL_PROXY=&amp;quot;socks5://proxy.example.com:3128&amp;quot; redis  进阶版 可以添加一个Alias(通过函数实现),更方便的使用上述命令
在~/.bashrc尾部添加以下内容
docker_proxy() { if [ &amp;quot;$1&amp;quot; = &amp;quot;build&amp;quot; ]; then docker build \ --build-arg HTTP_PROXY=&amp;quot;http://proxy.example.com:3128&amp;quot; \ --build-arg HTTPS_PROXY=&amp;quot;http://proxy.example.com:3128&amp;quot; \ &amp;quot;${@:2}&amp;quot; elif [ &amp;quot;$1&amp;quot; = &amp;quot;run&amp;quot; ]; then docker run \ --env HTTP_PROXY=&amp;quot;http://proxy.</description>
    </item>
    
    <item>
      <title>清理Docker未使用容器、缓存、镜像等文件</title>
      <link>https://ooe.ooo/posts/%E6%B8%85%E7%90%86docker%E6%9C%AA%E4%BD%BF%E7%94%A8%E5%AE%B9%E5%99%A8%E7%BC%93%E5%AD%98%E9%95%9C%E5%83%8F%E7%AD%89%E6%96%87%E4%BB%B6/</link>
      <pubDate>Mon, 10 Jul 2023 10:06:34 +0800</pubDate>
      
      <guid>https://ooe.ooo/posts/%E6%B8%85%E7%90%86docker%E6%9C%AA%E4%BD%BF%E7%94%A8%E5%AE%B9%E5%99%A8%E7%BC%93%E5%AD%98%E9%95%9C%E5%83%8F%E7%AD%89%E6%96%87%E4%BB%B6/</guid>
      <description>服务器的磁盘越来越小，发现是docker的overlay2文件夹占用空间比较大，使用以下命令清理
可以使用单独的命令对每一项进行清理
https://docs.docker.com/config/pruning/
或者使用下面命令清理所有对象，运行以下命令前确保你知道自己在做什么！
docker system prune --volumes # 警告！这将删除： # - 所有已停止的容器 # - 所有未被至少一个容器使用的网络 # - 所有未被至少一个容器使用的卷 # - 所有悬空的镜像 # - 所有悬空的构建缓存 # 因为清理对象比较多，时间可能会很长  </description>
    </item>
    
    <item>
      <title>安装Clickhous进行基准测试</title>
      <link>https://ooe.ooo/posts/%E5%AE%89%E8%A3%85clickhous%E8%BF%9B%E8%A1%8C%E5%9F%BA%E5%87%86%E6%B5%8B%E8%AF%95/</link>
      <pubDate>Sat, 08 Jul 2023 01:09:49 +0800</pubDate>
      
      <guid>https://ooe.ooo/posts/%E5%AE%89%E8%A3%85clickhous%E8%BF%9B%E8%A1%8C%E5%9F%BA%E5%87%86%E6%B5%8B%E8%AF%95/</guid>
      <description>测试环境  使用Docker容器运行Clickhouse, 预计会有10%的性能损耗 CPU: Intel&amp;reg; Core&amp;trade; i7-6700K CPU @ 4.00GHz 内存: 4G  测试结果    硬盘类型 写入速度 写1千行 写1万行 写10万行 读1千行 读1万行 读10万行 读40万行     固态硬盘 900MB/s 5ms 25ms 230ms 5ms 13ms 90ms 450ms   机械硬盘 300MB/s 5ms 23ms 205ms 5ms 11ms 90ms 400ms    写入速度使用以下命令测得
dd if=/dev/zero of=./test.img bs=100M count=30 oflag=dsync  什么是Clickhouse? https://clickhouse.com/docs/zh
ClickHouse是一个用于联机分析（OLAP）的列式数据库管理系统（DBMS）。它以列式存储方式存储数据，适用于读取大量行但只提取部分列的查询场景。ClickHouse通过减少I/O消耗、压缩数据、提高系统缓存利用率和执行向量化操作等方式提供高效的数据处理能力。它在处理分析查询方面比传统的行式数据库系统更加适用，并且具有高吞吐量和低延迟的特点。
下面是ClickHouse和MySQL之间的一些主要差异的表格列举：
   特性 ClickHouse MySQL     存储方式 列式存储 行式存储   查询性能 高吞吐量、低延迟 低吞吐量、较高延迟   数据压缩 支持高效的数据压缩 有限的数据压缩支持   数据更新 适用于批量插入和追加，不支持实时数据更新 支持实时数据更新和事务处理   数据一致性 低一致性要求，不支持数据修改 高一致性要求，支持数据修改   数据类型 支持广泛的数据类型，包括日期、时间、IP地址等 支持常见的数据类型   查询语言 支持SQL查询语言 支持SQL查询语言   高级功能 支持复杂的分布式查询和聚合操作 提供较为基本的查询和聚合功能   扩展性 易于水平扩展，可处理大规模数据 相对较易于垂直扩展，处理中小规模数据   适用场景 适用于大规模数据分析和OLAP场景 适用于事务处理和常规的OLTP场景    请注意，上述表格列举的差异是一般性的概括，并不涵盖所有方面。具体的差异可能因版本、配置和使用情况而有所不同。</description>
    </item>
    
    <item>
      <title>搭建Docker仓库Registry2</title>
      <link>https://ooe.ooo/posts/%E6%90%AD%E5%BB%BAdocker%E4%BB%93%E5%BA%93registry2/</link>
      <pubDate>Wed, 05 Jul 2023 08:30:55 +0800</pubDate>
      
      <guid>https://ooe.ooo/posts/%E6%90%AD%E5%BB%BAdocker%E4%BB%93%E5%BA%93registry2/</guid>
      <description># 搭建portainer docker run -d --restart always --name portainer \ --net caddy-network \ -v /var/run/docker.sock:/var/run/docker.sock -v $dockerVolume/portainer:/data portainer/portainer-ee:latest # 创建密码 mkdir -p $dockerVolume/registry/auth docker run \ --entrypoint htpasswd \ httpd:2 -Bbn username password &amp;gt; $dockerVolume/registry/auth/htpasswd # 搭建registry docker run -d --restart always --name registry \ --net caddy-network \ -v $dockerVolume/registry/data:/var/lib/registry \ -v $dockerVolume/registry/auth:/auth \ -e &amp;quot;REGISTRY_AUTH=htpasswd&amp;quot; \ -e &amp;quot;REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm&amp;quot; \ -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \ registry:2  </description>
    </item>
    
    <item>
      <title>在Docker中运行Veracrypt</title>
      <link>https://ooe.ooo/posts/%E5%9C%A8docker%E4%B8%AD%E8%BF%90%E8%A1%8Cveracrypt/</link>
      <pubDate>Sun, 25 Jun 2023 05:23:24 +0800</pubDate>
      
      <guid>https://ooe.ooo/posts/%E5%9C%A8docker%E4%B8%AD%E8%BF%90%E8%A1%8Cveracrypt/</guid>
      <description>目前VeraCrypt对于Debian系统所支持的最新版本是Debian11
https://www.veracrypt.fr/en/Downloads.html
docker run -dit --name veracrypt --privileged debian:11 docker exec -it veracrypt bash apt install wget # 到官网找到最新版本文件链接 wget https://launchpad.net/veracrypt/trunk/1.25.9/+download/veracrypt-console-1.25.9-Debian-11-amd64.deb apt install ./veracrypt-console-1.25.9-Debian-11-amd64.deb veracrypt --help veracrypt -m=nokernelcrypto volume.hc /media/veracrypt1  主要是--privileged这个参数，提升容器特权
运行veracrypt时添加-m=nokernelcrypto参数表示不用内核加密服务否则报错
Dockerfile FROM debian:11 # 替换清华源，服务器在国外可删除此项 RUN sed -i &#39;s/deb.debian.org/mirrors.tuna.tsinghua.edu.cn/g&#39; /etc/apt/sources.list \ # 安装需要的包 &amp;amp;&amp;amp; apt update &amp;amp;&amp;amp; apt install -y vim locales python3 ipython3 wget \ &amp;amp;&amp;amp; wget https://launchpad.net/veracrypt/trunk/1.25.9/+download/veracrypt-console-1.25.9-Debian-11-amd64.deb \ &amp;amp;&amp;amp; apt install -y ./veracrypt-console-1.25.9-Debian-11-amd64.deb \ # 加载 https://github.</description>
    </item>
    
    <item>
      <title>我的科学上网方案</title>
      <link>https://ooe.ooo/posts/%E6%88%91%E7%9A%84%E7%A7%91%E5%AD%A6%E4%B8%8A%E7%BD%91%E6%96%B9%E6%A1%88/</link>
      <pubDate>Thu, 22 Jun 2023 06:32:53 +0800</pubDate>
      
      <guid>https://ooe.ooo/posts/%E6%88%91%E7%9A%84%E7%A7%91%E5%AD%A6%E4%B8%8A%E7%BD%91%E6%96%B9%E6%A1%88/</guid>
      <description>科学上网节点 2023    服务器/节点 流量(GB)/月 价格(元)/月 年花费总计     AWSLightsail 1000 35    咸蛋转发3倍率 100 5    广港IEPL转发 100 20    NordVPN ∞ 15       700    2024    服务器/节点 流量(GB)/月 价格(元)/月 年花费总计     AWSLightsail 1000 50    NNR转发3倍率 300 25    广港IEPL转发 100 20    NordVPN ∞ 5       1000    流媒体解锁 落地机使用Docker运行NordVPN流媒体节点共享Socks5给V2ray</description>
    </item>
    
    <item>
      <title>使用gVisor为Docker容器增加沙箱隔离</title>
      <link>https://ooe.ooo/posts/%E4%BD%BF%E7%94%A8gvisor%E4%B8%BAdocker%E5%AE%B9%E5%99%A8%E5%A2%9E%E5%8A%A0%E6%B2%99%E7%AE%B1%E9%9A%94%E7%A6%BB/</link>
      <pubDate>Wed, 21 Jun 2023 17:13:56 +0800</pubDate>
      
      <guid>https://ooe.ooo/posts/%E4%BD%BF%E7%94%A8gvisor%E4%B8%BAdocker%E5%AE%B9%E5%99%A8%E5%A2%9E%E5%8A%A0%E6%B2%99%E7%AE%B1%E9%9A%94%E7%A6%BB/</guid>
      <description> 当前（23年6月）kata containers3.x最新版无法与Docekr兼容，在此尝试另一种解决方案gVisor
Kata、gVisor、RunC的性能对比 https://gvisor.dev/docs/architecture_guide/performance/
https://medium.com/coccoc-engineering-blog/secure-container-runtime-cb4eb75e9dcf
安装gVisor https://gvisor.dev/docs/user_guide/install/
使用 docker run --rm --runtime=runsc hello-world  运行下面命令，输出不同内核版本表示成功。
docker run --rm --runtime=runsc busybox uname -a uname -a  </description>
    </item>
    
    <item>
      <title>Docker为运行中容器添加端口映射</title>
      <link>https://ooe.ooo/posts/docker%E4%B8%BA%E8%BF%90%E8%A1%8C%E4%B8%AD%E5%AE%B9%E5%99%A8%E6%B7%BB%E5%8A%A0%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84/</link>
      <pubDate>Fri, 02 Dec 2022 10:39:50 +0800</pubDate>
      
      <guid>https://ooe.ooo/posts/docker%E4%B8%BA%E8%BF%90%E8%A1%8C%E4%B8%AD%E5%AE%B9%E5%99%A8%E6%B7%BB%E5%8A%A0%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84/</guid>
      <description>将当前容器commit成镜像，重新使用-p命令映射端口 增加一个网络，通过nginx反代实现端口映射，无需重启容器 通过修改配置实现，需要重启docker服务和容器，本文使用此方法  获取容器ID docker inspect &amp;lt;容器名&amp;gt; | grep Id # &amp;quot;Id&amp;quot;: &amp;quot;22132e73736a5700dd5b4215a122310220fc3192b19754917caa1b83ecb89dd3&amp;quot;,  停止目标容器和Docker docker stop &amp;lt;容器名&amp;gt; service docker stop  修改配置文件 修改hostconfig.json sudo vim /var/lib/docker/containers/&amp;lt;容器Id&amp;gt;/hostconfig.json  对如下内容进行修改
{ &amp;quot;PortBindings&amp;quot;:{ &amp;quot;22/tcp&amp;quot;:[{&amp;quot;HostIp&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;HostPort&amp;quot;:&amp;quot;10112&amp;quot;}], &amp;quot;5901/tcp&amp;quot;:[{&amp;quot;HostIp&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;HostPort&amp;quot;:&amp;quot;10113&amp;quot;}], // 在这里增加映射端口，示例： // &amp;quot;4438/tcp&amp;quot;:[{&amp;quot;HostIp&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;HostPort&amp;quot;:&amp;quot;4438&amp;quot;}], // &amp;quot;443/tcp&amp;quot;:[{&amp;quot;HostIp&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;HostPort&amp;quot;:&amp;quot;443&amp;quot;}], // ... }, }  修改config.json sudo vim /var/lib/docker/containers/&amp;lt;容器Id&amp;gt;/config.v2.json  对如下内容进行修改
{ &amp;quot;ExposedPorts&amp;quot;:{ &amp;quot;22/tcp&amp;quot;:{}, &amp;quot;5901/tcp&amp;quot;:{}, // 在这里增加映射端口，需与hostconfig.json中的修改对应，示例： // &amp;quot;4438/tcp&amp;quot;:{}, // &amp;quot;443/tcp&amp;quot;:{} // ... } }  重启Docker服务 重启Docker服务</description>
    </item>
    
    <item>
      <title>Docker安装MySQL</title>
      <link>https://ooe.ooo/posts/docker%E5%AE%89%E8%A3%85mysql/</link>
      <pubDate>Thu, 01 Dec 2022 10:23:19 +0800</pubDate>
      
      <guid>https://ooe.ooo/posts/docker%E5%AE%89%E8%A3%85mysql/</guid>
      <description>创建mysql网络 docker network create mysql-network  运行mysql docker run --network mysql-network --name mysql-service -d --restart always -e MYSQL_ROOT_PASSWORD=password -v /mnt/e/MySQL/data:/var/lib/mysql -v /mnt/e/MySQL/conf:/etc/mysql/conf.d --user 1000:1000 -p 3306:3306 mysql  -e MYSQL_ROOT_PASSWORD=password 设置Root用户密码
-v /mnt/e/MySQL/data:/var/lib/mysql 映射数据目录至宿主机
-v /mnt/e/MySQL/conf:/etc/mysql/conf.d 映射配置目录至宿主机
--user 1000:1000 如果使用WSL子系统，则必须加此项，否则因权限问题报错</description>
    </item>
    
    <item>
      <title>V2Ray任意门Dokodemo-door代理转发</title>
      <link>https://ooe.ooo/posts/v2ray%E4%BB%BB%E6%84%8F%E9%97%A8dokodemo-door%E4%BB%A3%E7%90%86%E8%BD%AC%E5%8F%91/</link>
      <pubDate>Sun, 27 Nov 2022 17:48:21 +0800</pubDate>
      
      <guid>https://ooe.ooo/posts/v2ray%E4%BB%BB%E6%84%8F%E9%97%A8dokodemo-door%E4%BB%A3%E7%90%86%E8%BD%AC%E5%8F%91/</guid>
      <description>客户端配置 老姨子的配置，可以在官网找到
{ &amp;quot;policy&amp;quot;: null, &amp;quot;log&amp;quot;: { &amp;quot;access&amp;quot;: &amp;quot;/var/log/v2ray/Vaccess.log&amp;quot;, &amp;quot;error&amp;quot;: &amp;quot;/var/log/v2ray/Verror.log&amp;quot;, &amp;quot;loglevel&amp;quot;: &amp;quot;error&amp;quot; }, &amp;quot;inbounds&amp;quot;: [ { &amp;quot;tag&amp;quot;: &amp;quot;SocksProxy&amp;quot;, &amp;quot;port&amp;quot;: 1080, &amp;quot;listen&amp;quot;: &amp;quot;0.0.0.0&amp;quot;, &amp;quot;protocol&amp;quot;: &amp;quot;socks&amp;quot;, &amp;quot;sniffing&amp;quot;: { &amp;quot;enabled&amp;quot;: true, &amp;quot;destOverride&amp;quot;: [ &amp;quot;http&amp;quot;, &amp;quot;tls&amp;quot; ] }, &amp;quot;settings&amp;quot;: { &amp;quot;auth&amp;quot;: &amp;quot;noauth&amp;quot;, &amp;quot;udp&amp;quot;: true, &amp;quot;ip&amp;quot;: null, &amp;quot;address&amp;quot;: null, &amp;quot;clients&amp;quot;: null }, &amp;quot;streamSettings&amp;quot;: null }, { &amp;quot;tag&amp;quot;: &amp;quot;dokodemo_door_netflix&amp;quot;, &amp;quot;protocol&amp;quot;: &amp;quot;dokodemo-door&amp;quot;, &amp;quot;port&amp;quot;: 8082, &amp;quot;listen&amp;quot;: &amp;quot;127.0.0.1&amp;quot;, &amp;quot;settings&amp;quot;: { &amp;quot;address&amp;quot;: &amp;quot;free-sg-01.unblocknetflix.cf&amp;quot;, //老姨子address &amp;quot;port&amp;quot;: 443, &amp;quot;network&amp;quot;: &amp;quot;tcp,udp&amp;quot; } } ], &amp;quot;outbounds&amp;quot;: [ { &amp;quot;tag&amp;quot;: &amp;quot;NetflixProxy&amp;quot;, // 这段是老姨子的配置，注意其中address和port指向dokodemo_door_netflix的地址和端口 &amp;quot;protocol&amp;quot;: &amp;quot;vmess&amp;quot;, &amp;quot;settings&amp;quot;: { &amp;quot;vnext&amp;quot;: [ { &amp;quot;address&amp;quot;: &amp;quot;127.</description>
    </item>
    
    <item>
      <title>使用Xargs命令实现Wget并行下载</title>
      <link>https://ooe.ooo/posts/%E4%BD%BF%E7%94%A8xargs%E5%91%BD%E4%BB%A4%E5%AE%9E%E7%8E%B0wget%E5%B9%B6%E8%A1%8C%E4%B8%8B%E8%BD%BD/</link>
      <pubDate>Mon, 21 Nov 2022 18:52:48 +0800</pubDate>
      
      <guid>https://ooe.ooo/posts/%E4%BD%BF%E7%94%A8xargs%E5%91%BD%E4%BB%A4%E5%AE%9E%E7%8E%B0wget%E5%B9%B6%E8%A1%8C%E4%B8%8B%E8%BD%BD/</guid>
      <description>wget并行下载 cat url.txt | xargs -P5 -t wget -c -t 10 -nv  -P表示并行下载的线程数，可以在wget后面加上-q不输出详情，加上-b在后台下载（不要加-b，后台下载会覆盖掉xargs的-P参数）
url.txt的格式为一行一组参数（在不为xargs添加-n的情况下），可以如下
https://download/a.zip https://download/b.zip ...(等同-n1) Or https://download/a.zip -O &#39;a.zip&#39; https://download/b.zip -O &#39;b.zip&#39; ...(等同-n3)  xargs 参数 https://www.runoob.com/linux/linux-comm-xargs.html
-a file 从文件中读入作为 stdin -e flag ，注意有的时候可能会是-E，flag必须是一个以空格分隔的标志，当xargs分析到含有flag这个标志的时候就停止。 -p 当每次执行一个argument的时候询问一次用户。 -n num 后面加次数，表示命令在执行的时候一次用的argument的个数，默认是用所有的。 -t 表示先打印命令，然后再执行。 -i 或者是-I，这得看linux支持了，将xargs的每项名称，一般是一行一行赋值给 {}，可以用 {} 代替。 -r no-run-if-empty 当xargs的输入为空的时候则停止xargs，不用再去执行了。 -s num 命令行的最大字符数，指的是 xargs 后面那个命令的最大命令行字符数。 -L num 从标准输入一次读取 num 行送给 command 命令。 -l 同 -L。 -d delim 分隔符，默认的xargs分隔符是回车，argument的分隔符是空格，这里修改的是xargs的分隔符。 -x exit的意思，主要是配合-s使用。。 -P 修改最大的进程数，默认是1，为0时候为as many as it can ，这个例子我没有想到，应该平时都用不到的吧。  wget 参数 https://wangchujiang.</description>
    </item>
    
    <item>
      <title>Docker构造VSCodeRemote容器</title>
      <link>https://ooe.ooo/posts/docker%E6%9E%84%E9%80%A0vscoderemote%E5%AE%B9%E5%99%A8/</link>
      <pubDate>Sun, 20 Nov 2022 11:08:21 +0800</pubDate>
      
      <guid>https://ooe.ooo/posts/docker%E6%9E%84%E9%80%A0vscoderemote%E5%AE%B9%E5%99%A8/</guid>
      <description>创建Docker容器，然后将VSCode连接到容器远程开发
创建SSH密钥 ssh-keygen.exe -t ed25519 -f $env:USERPROFILE/dev_container cat $env:USERPROFILE/dev_container.pub # 输出公钥 # ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEQpLeOBJxOg0zOSD1XBuRX0ekYqbZjmnq04pialxzZK ... echo $env:USERPROFILE\dev_container # C:\Users\user\dev_container # 私钥路径  复制输出的公钥内容，替换以下内容中公钥，记住私钥路径，之后要用到
Dockerfile 新建文件Dockerfile, 写入以下内容
FROM debian:latest # 将以下内容替换成你的公钥 ARG PUB_KEY=&amp;quot;ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIG/GUogbNpPiGz4XHeg6ROoqdNtWpTJnErHN7REzUhs6 Docker-Container&amp;quot; WORKDIR /root RUN \ # 替换Debian源，服务器在国外可删除此项 sed -i &#39;s/deb.debian.org/mirrors.ustc.edu.cn/g&#39; /etc/apt/sources.list.d/debian.sources &amp;amp;&amp;amp; \ # 安装需要的包 apt update &amp;amp;&amp;amp; apt install -y openssh-server curl locales vim git \ # vim基础配置文件 &amp;amp;&amp;amp; curl -L https://p.wrr.fr/https://raw.githubusercontent.com/amix/vimrc/master/vimrcs/basic.vim &amp;gt; .vimrc \ # 修复中文显示乱码 &amp;amp;&amp;amp; sed -i &#39;/en_US.</description>
    </item>
    
    <item>
      <title>在Windows10 WSL子系统中安装Docker</title>
      <link>https://ooe.ooo/posts/%E5%9C%A8windows10-wsl%E5%AD%90%E7%B3%BB%E7%BB%9F%E4%B8%AD%E5%AE%89%E8%A3%85docker/</link>
      <pubDate>Fri, 18 Nov 2022 11:02:33 +0800</pubDate>
      
      <guid>https://ooe.ooo/posts/%E5%9C%A8windows10-wsl%E5%AD%90%E7%B3%BB%E7%BB%9F%E4%B8%AD%E5%AE%89%E8%A3%85docker/</guid>
      <description>开始前使用wsl -l -v检测下自己的WSL版本确保是WSL2
本内容适合Ubuntu子系统，其他系统请参阅此教程
配置系统 # 替换国内源 sudo sed -i &amp;quot;s@http://.*archive.ubuntu.com@https://mirrors.tuna.tsinghua.edu.cn@g&amp;quot; /etc/apt/sources.list sudo sed -i &amp;quot;s@http://.*security.ubuntu.com@https://mirrors.tuna.tsinghua.edu.cn@g&amp;quot; /etc/apt/sources.list # 切换旧版防火墙 选择 iptables-legacy sudo update-alternatives --config iptables # 配置DNSd echo -e &amp;quot;[network]\ngenerateResolvConf = false\n&amp;quot; | sudo tee -a /etc/wsl.conf # 启用systemctl，但是目前支持并不完善，可跳过这条 # echo -e &amp;quot;[boot]\nsystemd = true\n&amp;quot; | sudo tee -a /etc/wsl.conf sudo unlink /etc/resolv.conf &amp;amp;&amp;amp; echo &#39;nameserver 223.5.5.5&#39; | sudo tee /etc/resolv.conf # 设置时区 sudo rm /etc/localtime &amp;amp;&amp;amp; sudo ln /usr/share/zoneinfo/Asia/Shanghai /etc/localtime # 设置sudo免密码 sudo vim /etc/sudoer # 在%sudo ALL=(ALL:ALL) ALL 下面添加如下内容，将ubuntu改为你的用户名 # ubuntu ALL=(ALL) NOPASSWD:ALL # 保存时使用 wq!</description>
    </item>
    
    <item>
      <title>Docker安装Caddy</title>
      <link>https://ooe.ooo/posts/docker%E5%AE%89%E8%A3%85caddy/</link>
      <pubDate>Tue, 15 Nov 2022 16:02:46 +0800</pubDate>
      
      <guid>https://ooe.ooo/posts/docker%E5%AE%89%E8%A3%85caddy/</guid>
      <description>将caddy安装在docker内，与需要用到caddy服务的其他容器共享网络
安装Docker https://docs.docker.com/engine/install/
准备工作 # 最高权限 sudo su # 创建caddy配置文件 DAC=/usr/local/etc/dockerAppsConfig/caddy mkdir -p $DAC # 下载Caddyfile配置 wget https://raw.githubusercontent.com/caddyserver/dist/master/config/Caddyfile -nc -O $DAC/Caddyfile # 若国内服务器无法连接Github，可在URL前追加https://p.ooe.ooo/代理下载 # https://p.ooe.ooo/https://raw.githubusercontent.com/caddyserver/dist/master/config/Caddyfile  运行容器 使用bridge网络（推荐） docker network create caddy-network docker run -it -d --restart always --name caddy-service -p 80:80 -p 443:443 --network caddy-network -v ${DAC}:/etc/caddy -v ${DAC}/data:/data caddy  使用host网络 --network host 表示使用宿主机网络，除非特殊需求，否则不推荐
docker run -it -d --restart always --name caddy-service --network host -v ${DAC}:/etc/caddy -v ${DAC}/data:/data caddy  映射端口范围 默认docker会为每个映射端口启动一个进程，如果分配过多端口会造成非常大的内存占用，可在dockered守护进程增加--userland-proxy=false禁用此功能。即使关闭此项后Docker还是会为每个port在iptables里添加一条规则，如果端口范围很大还是会造成麻烦。端口范围取500个以下比较合适。</description>
    </item>
    
    <item>
      <title>Hugo简码实现文章中包含HTML文件</title>
      <link>https://ooe.ooo/posts/hugo%E7%AE%80%E7%A0%81%E5%AE%9E%E7%8E%B0%E6%96%87%E7%AB%A0%E4%B8%AD%E5%8C%85%E5%90%ABhtml%E6%96%87%E4%BB%B6/</link>
      <pubDate>Fri, 21 Oct 2022 11:30:45 +0800</pubDate>
      
      <guid>https://ooe.ooo/posts/hugo%E7%AE%80%E7%A0%81%E5%AE%9E%E7%8E%B0%E6%96%87%E7%AB%A0%E4%B8%AD%E5%8C%85%E5%90%ABhtml%E6%96%87%E4%BB%B6/</guid>
      <description> 想为博客添加一个自定义页面，通过简码的方式可以更优雅的实现上述需求
创建一个空白页模板 在themes/your_theme/layouts/_default中创建文件includeTemplate.html
如果想在网页中继承博客的header和footer，可以复制同目录中single.html的内容进行修改
&amp;lt;!-- &amp;lt;header&amp;gt; --&amp;gt; {{ .Content }} &amp;lt;!-- &amp;lt;footer&amp;gt; --&amp;gt;  在网页中显示文章的内容部分
创建简码 在layouts/shortcodes中创建文件include-html
{{ $file := .Get 0 }} {{ $file | readFile | safeHTML }}  第一行的作用是读取传入的第一个参数并赋值给$file变量
第二行将$file传递给readFile以读取文件，之后通过管道符把内容传递给safeHTML以将内容声明为安全HTML
创建自定义页面 在content文件夹创建一个html文件simple.html
&amp;lt;p style=&amp;quot;color: red;&amp;quot;&amp;gt;simple html&amp;lt;/p&amp;gt;  在content文件夹创建一篇文章simple.md
--- title: &amp;quot;simple&amp;quot; layout: &amp;quot;includeTemplate&amp;quot; url: /simple --- {{&amp;lt; include-html &amp;quot;content/simple.html&amp;quot; &amp;gt;}}  layout 表示使用的模板，这里使用我们创建的includeTemplate模板
url 属性给这篇文章设置一个url
此时可通过https://domain.com/simple访问
参考链接  https://xa1.at/hugo-include-html/  </description>
    </item>
    
    <item>
      <title>搭建Tiny Tiny RSS服务</title>
      <link>https://ooe.ooo/posts/%E6%90%AD%E5%BB%BAtiny-tiny-rss%E6%9C%8D%E5%8A%A1/</link>
      <pubDate>Sat, 03 Sep 2022 10:16:53 +0800</pubDate>
      
      <guid>https://ooe.ooo/posts/%E6%90%AD%E5%BB%BAtiny-tiny-rss%E6%9C%8D%E5%8A%A1/</guid>
      <description>一直使用的feedly免费版本，体验蛮好，不过免费版只能添加3个文件夹，订阅源一多，分类就不够用了，无奈只能利用闲置服务器搭建一个，对比了几个开源RSS服务，觉得Tiny Tiny RSS挺不错，就是功能有点多，所以需要调教一下。最好使用国外服务器搭建，国内服务器可能因为墙的原因导致有些订阅地址无法更新。本文记录一下搭建过程。
使用docker镜像搭建 有热心网友已经整理好了镜像，使用docker搭建非常简单，感谢Awesome TTRSS
1. 安装docker和docker-compose # 安装docker curl -fsSL https://get.docker.com/ | sh # 启动docker sudo systemctl start docker  # 安装docker-compose最新版本 curl -s https://api.github.com/repos/docker/compose/releases/latest | grep -Pio &amp;quot;https.*$(uname -s)-$(uname -m)(?=\&amp;quot;$)&amp;quot; | wget -O /usr/local/bin/docker-compose -qi - # 赋予执行权限 chmod +x /usr/local/bin/docker-compose # 检查版本 docker-compose --version  2. 安装Tiny Tiny RSS # 创建目录 mkdir ttrss &amp;amp;&amp;amp; cd ttrss # 下载docker-compose配置文件 wget -q https://raw.githubusercontent.com/HenryQW/Awesome-TTRSS/main/docker-compose.yml # 编辑配置文件 vim docker-compose.yml  version: &amp;quot;3&amp;quot; services: service.</description>
    </item>
    
    <item>
      <title>Ubuntu服务器安装Jupyterlab</title>
      <link>https://ooe.ooo/posts/ubuntu%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%AE%89%E8%A3%85jupyterlab/</link>
      <pubDate>Thu, 07 Apr 2022 11:08:57 +0800</pubDate>
      
      <guid>https://ooe.ooo/posts/ubuntu%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%AE%89%E8%A3%85jupyterlab/</guid>
      <description>安装JupyterLab # 安装jupyterlab pip install jupyterlab # 安装中文语言包 pip install jupyterlab-language-pack-zh-CN # 启动Jupyterlab，如果以root用户运行，需要加上 --allow-root 参数 jupyter-lab  配置远程访问 # 设置密码，生成登录密钥，复制生成的密钥内容 python3 -c &#39;from notebook.auth import passwd;print(passwd())&#39; # 生成jupyter配置文件 jupyter notebook --generate-config # 更改配置文件名 mv ~/.jupyter/jupyter_notebook_config.py ~/.jupyter/jupyter_server_config.py # 修改配置文件 vim ~/.jupyter/jupyter_server_config.py # 在文件末尾添加以下内容 c.ServerApp.allow_remote_access = True # 允许远程访问 c.ServerApp.allow_root = True # 允许root权限 c.ServerApp.ip = &#39;*&#39; # 允许任意IP访问 c.ServerApp.port = 8888 # 监听端口 c.ServerApp.password = &#39;argon2:$...&#39; # 粘贴上面生成的密钥 c.ServerApp.open_browser = False # 启动时打开浏览器 # 启动jupyterlab，后台常驻 nohup jupyter-lab &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;  访问服务器地址+端口，例如127.</description>
    </item>
    
    <item>
      <title>Ubuntu安装配置Postgresql远程访问</title>
      <link>https://ooe.ooo/posts/ubuntu%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AEpostgresql%E8%BF%9C%E7%A8%8B%E8%AE%BF%E9%97%AE/</link>
      <pubDate>Wed, 06 Apr 2022 17:54:31 +0800</pubDate>
      
      <guid>https://ooe.ooo/posts/ubuntu%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AEpostgresql%E8%BF%9C%E7%A8%8B%E8%AE%BF%E9%97%AE/</guid>
      <description>安装Postgresql # 创建文件存储库配置 sudo sh -c &#39;echo &amp;quot;deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main&amp;quot; &amp;gt; /etc/apt/sources.list.d/pgdg.list&#39; # 导入存储库签名密钥 wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - sudo apt-get update # 安装最新版本的 PostgreSQL # 如果你想要一个特定的版本，使用 &#39;postgresql-12&#39; 或类似的而不是 &#39;postgresql&#39; sudo apt-get -y install postgresql  修改密码 # 登录 sudo -u postgres psql # 修改密码，密码需要用引号包裹 ALTER USER postgres WITH PASSWORD &#39;password&#39;; # 退出Postgresql \q  开放远程访问 Postgresql的配置文件在/etc/postgresql/14/main/
修改监听地址
sudo vim /etc/postgresql/14/main/postgresql.conf # 将 #listen_addresses=&#39;localhost&#39; # 修改为 listen_addresses=&#39;*&#39;  配置用户访问权限</description>
    </item>
    
    <item>
      <title>Hugo显示文章最后更新日期</title>
      <link>https://ooe.ooo/posts/hugo%E6%98%BE%E7%A4%BA%E6%96%87%E7%AB%A0%E6%9C%80%E5%90%8E%E6%9B%B4%E6%96%B0%E6%97%A5%E6%9C%9F/</link>
      <pubDate>Mon, 04 Apr 2022 09:51:16 +0800</pubDate>
      
      <guid>https://ooe.ooo/posts/hugo%E6%98%BE%E7%A4%BA%E6%96%87%E7%AB%A0%E6%9C%80%E5%90%8E%E6%9B%B4%E6%96%B0%E6%97%A5%E6%9C%9F/</guid>
      <description>实现原理 Hugo有一个.GitInfo变量，会返回最后一次commit的hash、时间等数据
模板集成 找到如下文件，添加或修改其内容
config.toml
enableGitInfo = true # 启用GitInfo支持 [frontmatter] lastmod = [&amp;quot;lastmod&amp;quot;, &amp;quot;:git&amp;quot;, &amp;quot;date&amp;quot;] # 按顺序依次获取，直到返回结果  single.html
&amp;lt;time datetime=&amp;quot;{{ .Page.Lastmod.Format &amp;quot;2006-01-02 15:04:05 MST&amp;quot; }}&amp;quot; class=&amp;quot;post-date&amp;quot;&amp;gt; Last Updated {{ .Page.Lastmod.Format &amp;quot;2006-01-02&amp;quot; }} {{ with .GitInfo }} By {{ .AbbreviatedHash }} {{ end }} &amp;lt;/time&amp;gt;  遇到问题 .GitInfo变量返回&amp;lt;nil&amp;gt;，并且这种问题只出现在以中文命名的.md文件中，猜测与编码有关
解决方法 个人电脑 使用git config core.quotePath false修改Git配置，禁止使用反斜杠转义字符
Vercel  进入项目主页 导航到settings -&amp;gt; general -&amp;gt; Build &amp;amp; Development Settings 在INSTALL COMMAND中输入git config core.</description>
    </item>
    
    <item>
      <title>使用Pangu.js自动在中英文之间添加空格</title>
      <link>https://ooe.ooo/posts/%E4%BD%BF%E7%94%A8pangu.js%E8%87%AA%E5%8A%A8%E5%9C%A8%E4%B8%AD%E8%8B%B1%E6%96%87%E4%B9%8B%E9%97%B4%E6%B7%BB%E5%8A%A0%E7%A9%BA%E6%A0%BC/</link>
      <pubDate>Sun, 27 Mar 2022 10:47:10 +0800</pubDate>
      
      <guid>https://ooe.ooo/posts/%E4%BD%BF%E7%94%A8pangu.js%E8%87%AA%E5%8A%A8%E5%9C%A8%E4%B8%AD%E8%8B%B1%E6%96%87%E4%B9%8B%E9%97%B4%E6%B7%BB%E5%8A%A0%E7%A9%BA%E6%A0%BC/</guid>
      <description>为什么 默认的网页排版中，中西文之间没有空格，显得不美观。而如果想要实现带空格的效果，一般做法是在写文章的时候手动在中文和英文之间添加空格，这种方式效率极低并且需要对以往没有添加空格的文章进行更新，所以如果有一种方法可以自动在中英文之间添加空格，对于写作者来说可谓是非常省心的了。pangu.js这个项目就是对应这种需求
為什麼你們就是不能加個空格呢？
如何添加 在网页&amp;lt;head&amp;gt;...&amp;lt;/head&amp;gt;中添加如下内容
全局模式 &amp;lt;script src=&amp;quot;https://cdn.jsdelivr.net/npm/pangu@4.0.7/dist/browser/pangu.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script&amp;gt; document.addEventListener(&#39;DOMContentLoaded&#39;, () =&amp;gt; { pangu.spacingPageBody(); }) &amp;lt;/script&amp;gt;  指定元素模式 &amp;lt;script src=&amp;quot;https://cdn.jsdelivr.net/npm/pangu@4.0.7/dist/browser/pangu.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script&amp;gt; document.addEventListener(&#39;DOMContentLoaded&#39;, () =&amp;gt; { pangu.spacingElementById(&#39;main&#39;); pangu.spacingElementByClassName(&#39;comment&#39;); pangu.spacingElementByTagName(&#39;p&#39;); }) &amp;lt;/script&amp;gt;  效果 &amp;quot;當你凝視著bug，bug也凝視著你&amp;quot;
&amp;ldquo;當你凝視著bug，bug也凝視著你&amp;rdquo;</description>
    </item>
    
    <item>
      <title>修改Windows10任务栏颜色</title>
      <link>https://ooe.ooo/posts/%E4%BF%AE%E6%94%B9windows10%E4%BB%BB%E5%8A%A1%E6%A0%8F%E9%A2%9C%E8%89%B2/</link>
      <pubDate>Sun, 20 Mar 2022 16:29:32 +0800</pubDate>
      
      <guid>https://ooe.ooo/posts/%E4%BF%AE%E6%94%B9windows10%E4%BB%BB%E5%8A%A1%E6%A0%8F%E9%A2%9C%E8%89%B2/</guid>
      <description> 遇到问题 在个性化设置里面，&amp;quot;开始&amp;quot;菜单、任务栏和操作中心单选框处于灰色且无法点击的状态
解决方案  按Windows徽标键+R，输入regedit打开注册表 找到HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize项 双击ColorPrevalence将数字修改为2，单击确定  此时任务栏已经变成了主题色，在个性化设置中也能看到&amp;quot;开始&amp;quot;菜单、任务栏和操作中心已经被选中并生效
或者复制以下内容，保存到txt文件，修改文件名为ColorPrevalence.reg，双击运行，会得到与上面一样的效果
Windows Registry Editor Version 5.00 [HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize] &amp;quot;ColorPrevalence&amp;quot;=dword:00000002  参考链接  https://zh.freax.be/how-change-accent-color-only-taskbar-windows-10
 https://answers.microsoft.com/zh-hans/windows/forum/all/%E5%BC%80%E5%A7%8B%E8%8F%9C%E5%8D%95%E4%BB%BB/055f5de1-2758-4da8-b236-9d9a80669a2b
  </description>
    </item>
    
    <item>
      <title>V2Ray代理链式转发</title>
      <link>https://ooe.ooo/posts/v2ray%E4%BB%A3%E7%90%86%E9%93%BE%E5%BC%8F%E8%BD%AC%E5%8F%91/</link>
      <pubDate>Sat, 19 Mar 2022 08:54:14 +0800</pubDate>
      
      <guid>https://ooe.ooo/posts/v2ray%E4%BB%A3%E7%90%86%E9%93%BE%E5%BC%8F%E8%BD%AC%E5%8F%91/</guid>
      <description>中转相比直接使用机场，有何差异？ 优势
 提升稳定性和速度，取决于你所中转的机场 落地 IP 可以随意，因为流量已经在墙外了，所以即使被墙的 IP 都可以 机场 IP 比较多，理论上一个机场 IP 被墙后可以马上切换到另一个 隐私，如果直接用机场，机场能记录你的访问信息，比如你何时访问了 Twitter  劣势
 双倍流量，比如看视频花了 1G 则机场损耗 1G，落地鸡损耗 1G  如何配置 V2Ray支持代理转发，直接修改客户端配置即可
{ &amp;quot;inbounds&amp;quot;: [ { &amp;quot;port&amp;quot;: 1080, &amp;quot;listen&amp;quot;: &amp;quot;0.0.0.0&amp;quot;, &amp;quot;protocol&amp;quot;: &amp;quot;socks&amp;quot;, &amp;quot;sniffing&amp;quot;: { &amp;quot;enabled&amp;quot;: true, &amp;quot;destOverride&amp;quot;: [ &amp;quot;http&amp;quot;, &amp;quot;tls&amp;quot; ] }, &amp;quot;settings&amp;quot;: { &amp;quot;auth&amp;quot;: &amp;quot;noauth&amp;quot;, &amp;quot;udp&amp;quot;: false } } ], &amp;quot;outbounds&amp;quot;: [ { &amp;quot;protocol&amp;quot;: &amp;quot;vmess&amp;quot;, &amp;quot;settings&amp;quot;: { // settings 的根据实际情况修改 &amp;quot;vnext&amp;quot;: [ { &amp;quot;address&amp;quot;: &amp;quot;1.</description>
    </item>
    
    <item>
      <title>Requests模块访问网页速度慢的原因及解决方案</title>
      <link>https://ooe.ooo/posts/requests%E6%A8%A1%E5%9D%97%E8%AE%BF%E9%97%AE%E7%BD%91%E9%A1%B5%E9%80%9F%E5%BA%A6%E6%85%A2%E7%9A%84%E5%8E%9F%E5%9B%A0%E5%8F%8A%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/</link>
      <pubDate>Tue, 15 Feb 2022 11:26:49 +0800</pubDate>
      
      <guid>https://ooe.ooo/posts/requests%E6%A8%A1%E5%9D%97%E8%AE%BF%E9%97%AE%E7%BD%91%E9%A1%B5%E9%80%9F%E5%BA%A6%E6%85%A2%E7%9A%84%E5%8E%9F%E5%9B%A0%E5%8F%8A%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/</guid>
      <description>问题描述 用python requests，urllib访问网页速度非常慢，但是用postman等其他应用访问是正常的
问题重现 import requests url = &#39;https://www.example.com&#39; %time requests.get(url) Wall time: 20 s  分析原因 默认requests会使用IPv6进行连接，如果IPv6超时再使用IPv4请求，可以给请求添加一个timeout=5来进行检查，其原理是设置很低的timeout迫使requests在更短的时间内切换到IPv4
%time requests.get(url, timeout=5) Wall time: 300 ms  如果成功返回，则说明问题出在IPv6上面，其中一种解决方法是禁用本机的IPv6
解决方案 方法1. 禁用Windows10的IPv6  右键单击右下角托盘区域的 网络 图标 单击 打开网路和Internet设置 单击 更改适配器选项 右键你当前使用的网卡名称，我这里是 以太网 单击 属性 取消选中 Internet 协议版本 6(TCP/IPv6) 单击 确定 保存更改  方法2. 强制requests使用IPv4 在文件开头引入下面内容
import socket import urllib3.util.connection as urllib3_cn def allowed_gai_family(): &amp;quot;&amp;quot;&amp;quot; https://github.com/shazow/urllib3/blob/master/urllib3/util/connection.py &amp;quot;&amp;quot;&amp;quot; family = socket.AF_INET if urllib3_cn.HAS_IPV6: family = socket.</description>
    </item>
    
    <item>
      <title>Python安装模块报错MV C&#43;&#43; 14.2 or Greater Is Required</title>
      <link>https://ooe.ooo/posts/python%E5%AE%89%E8%A3%85%E6%A8%A1%E5%9D%97%E6%8A%A5%E9%94%99mv-c-14.2-or-greater-is-required/</link>
      <pubDate>Sat, 15 Jan 2022 11:28:52 +0800</pubDate>
      
      <guid>https://ooe.ooo/posts/python%E5%AE%89%E8%A3%85%E6%A8%A1%E5%9D%97%E6%8A%A5%E9%94%99mv-c-14.2-or-greater-is-required/</guid>
      <description>1. 报错内容 $ python setup.py install Building pywin32 3.10.303.1 Windows 10 SDK version 10.0.16299.0 is preferred, but that&#39;s not installed Installed versions are [&#39;10.0.17763.0&#39;, &#39;10.0.19041.0&#39;] Using 10.0.17763.0 running install running build running build_py running build_ext error: Microsoft Visual C++ 14.2 or greater is required. Get it with &amp;quot;Microsoft C++ Build Tools&amp;quot;: https://visualstudio.microsoft.com/visual-cpp-build-tools/  2. 解决方案  在 此处 下载安装 Microsoft C++ 生成工具 ，选中 使用C++的桌面开发 进行安装
# 更新setuptools工具至最新版本 pip install --upgrade setuptools # 此时应该可以正常安装之前报错的包 pip install &amp;lt;name&amp;gt;  如果包的setup.</description>
    </item>
    
    <item>
      <title>树莓派从SSD启动</title>
      <link>https://ooe.ooo/posts/%E6%A0%91%E8%8E%93%E6%B4%BE%E4%BB%8Essd%E5%90%AF%E5%8A%A8/</link>
      <pubDate>Fri, 18 Jun 2021 20:01:32 +0800</pubDate>
      
      <guid>https://ooe.ooo/posts/%E6%A0%91%E8%8E%93%E6%B4%BE%E4%BB%8Essd%E5%90%AF%E5%8A%A8/</guid>
      <description>入手树莓派4B有一段时间了，之前使用SSD启动成功过，再次尝试，发现有价值的教程不太好找，记录一下操作过程
可能遇到的坑：
 USB3.0接口供电不足？（确定跟电源有关，换了电源后此问题再没有出现过）
之前接入3.0接口之后，SSD硬盘出现卡顿，掉线的问题，怀疑跟供电有关，这次上了红米的3A快充，目前没出现问题。（之前使用的是购买时店家附赠的3.5A充电器，怀疑是不是质量太差）
  准备：内存卡，SSD，树莓派4B，rufus
SD卡安装树莓派系统  使用rufus将树莓派系统写入内存卡 等待写入完成后，在根目录创建一个名为ssh的文件 树莓派断电，将SD卡插入树莓派，启动树莓派 等待载入系统，找到树莓派IP，使用ssh工具连接，默认账号pi 密码raspberry 修改树莓派源
# 编辑 `/etc/apt/sources.list` 文件，删除原文件所有内容，用以下内容取代： deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib rpi deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib rpi # 编辑 `/etc/apt/sources.list.d/raspi.list` 文件，删除原文件所有内容，用以下内容取代： deb http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ buster main ui  更新系统与固件
sudo apt update sudo apt-get upgrade -y sudo apt full-upgrade sudo rpi-update sudo reboot # 等待重启... sudo rpi-eeprom-update -d -a #BOOTLOADER: up to date #CURRENT: Thu 29 Apr 16:11:25 UTC 2021 (1619712685) # LATEST: Thu 29 Apr 16:11:25 UTC 2021 (1619712685) #RELEASE: default (/lib/firmware/raspberrypi/bootloader/default) # Use raspi-config to change the release.</description>
    </item>
    
    <item>
      <title>Caddy2入门</title>
      <link>https://ooe.ooo/posts/caddy2%E5%85%A5%E9%97%A8/</link>
      <pubDate>Wed, 02 Jun 2021 16:37:06 +0800</pubDate>
      
      <guid>https://ooe.ooo/posts/caddy2%E5%85%A5%E9%97%A8/</guid>
      <description>什么是Caddy  Caddy服务器是一个开源的，使用 Golang 编写，支持 HTTP/2 的 Web 服务端。它使用Golang 标准库提供HTTP 功能。 Caddy 一个显著的特性是默认启用HTTPS。它是第一个无需额外配置即可提供HTTPS 特性的Web 服务器。
 安装Caddy v2 官方文档：https://caddyserver.com/docs/install
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl -1sLf &#39;https://dl.cloudsmith.io/public/caddy/stable/gpg.key&#39; | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg curl -1sLf &#39;https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt&#39; | sudo tee /etc/apt/sources.list.d/caddy-stable.list sudo apt update sudo apt install caddy  caddy version # v2.4.1 h1:kAJ0JB5Xk5gPdTH/27S5cyoMGqD5lBAe9yZ8zTjVJa0= # 返回以上内容表示安装成功  使用Caddy 官方文档：https://caddyserver.com/docs/getting-started
caddy常用命令 caddy run # 以守护进程方式启动 caddy starat # 在后台运行 caddy stop # 停止运行 caddy reload # 重新加载配置文件 caddy help # 返回帮助内容  通过api配置Caddy 新建caddy.</description>
    </item>
    
    <item>
      <title>Ubuntu安全设置指南</title>
      <link>https://ooe.ooo/posts/ubuntu%E5%AE%89%E5%85%A8%E8%AE%BE%E7%BD%AE%E6%8C%87%E5%8D%97/</link>
      <pubDate>Wed, 02 Jun 2021 12:08:49 +0800</pubDate>
      
      <guid>https://ooe.ooo/posts/ubuntu%E5%AE%89%E5%85%A8%E8%AE%BE%E7%BD%AE%E6%8C%87%E5%8D%97/</guid>
      <description>测试环境：Ubuntu 20.04
更新系统 sudo apt update &amp;amp;&amp;amp; sudo apt upgrade -y  启用防火墙 安装 UFW 防火墙 sudo apt install ufw # 安装ufw防火墙 sudo ufw default deny incoming sudo ufw default allow outgoing # 载入拒绝传入和允许传出的默认策略 sudo ufw enable # 启用防火墙  添加/删除规则 sudo ufw allow 22 # 开放22端口 sudo ufw status # 查看规则 sudo ufw status numbered # 查看规则及规则id sudo ufw delete 1 # 删除id为1的规则  添加非Root用户 创建非Root用户 要在ubuntu系统中添加一个新用户，你可以按照以下步骤进行操作：
 打开终端并以root用户身份执行以下命令来创建新用户：</description>
    </item>
    
    <item>
      <title>Ubuntu搭建V2Ray代理服务器WebSocket&#43;TLS&#43;Web</title>
      <link>https://ooe.ooo/posts/ubuntu%E6%90%AD%E5%BB%BAv2ray%E4%BB%A3%E7%90%86%E6%9C%8D%E5%8A%A1%E5%99%A8websocket-tls-web/</link>
      <pubDate>Wed, 02 Jun 2021 10:13:34 +0800</pubDate>
      
      <guid>https://ooe.ooo/posts/ubuntu%E6%90%AD%E5%BB%BAv2ray%E4%BB%A3%E7%90%86%E6%9C%8D%E5%8A%A1%E5%99%A8websocket-tls-web/</guid>
      <description>测试环境：Ubuntu 20.04
前置条件：拥有一个域名、一台服务器、把域名解析到服务器IP
 安装V2Ray 官方文档：https://guide.v2fly.org/prep/install.html
sudo apt update sudo apt install curl curl -O https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh sudo bash install-release.sh  v2ray -version # V2Ray 4.39.2 (V2Fly, a community-driven edition of V2Ray.) Custom (go1.16.4 linux/amd64) # A unified platform for anti-censorship. # 返回以上内容表示安装成功  安装Caddy v2  Caddy服务器是一个开源的，使用 Golang 编写，支持 HTTP/2 的 Web 服务端。它使用Golang 标准库提供HTTP 功能。 Caddy 一个显著的特性是默认启用HTTPS。它是第一个无需额外配置即可提供HTTPS 特性的Web 服务器。
 官方文档：https://caddyserver.com/docs/install#debian-ubuntu-raspbian
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl -1sLf &#39;https://dl.</description>
    </item>
    
    <item>
      <title>Windows10安全设置指南</title>
      <link>https://ooe.ooo/posts/windows10%E5%AE%89%E5%85%A8%E8%AE%BE%E7%BD%AE%E6%8C%87%E5%8D%97/</link>
      <pubDate>Mon, 31 May 2021 09:28:18 +0800</pubDate>
      
      <guid>https://ooe.ooo/posts/windows10%E5%AE%89%E5%85%A8%E8%AE%BE%E7%BD%AE%E6%8C%87%E5%8D%97/</guid>
      <description>如何打造一个安全的 Windows10 系统 ，分享一下我目前使用的方案
重装系统 需要准备：存储空间大于等于 4G 的 U盘 一个
使用微软提供的工具制作U盘启动盘 下载地址：https://www.microsoft.com/zh-cn/software-download/windows10
下载后打开，按提示操作，选择为另一台电脑创建安装介质，选择目标 U盘，写入，等待写入完成
写入完成后U盘就成了U盘启动盘，可以使用此U盘重装系统
装机软件 杀毒软件 要知道杀毒软件不是万能的，保持安全的系统环境最重要最重要的就是不要随意打开或安装任何陌生文件
 非必要软件不要安装，不要打开任何未知文件 不要在第三方网站下载软件，如需安装请在官方下载 对于一次性使用的软件，我会在Windows沙盒中运行  卡巴斯基 卡巴斯基文件顾问 卡巴斯基是老牌杀软，各方面表现一直都很优异，我个人比较喜欢的一个功能是卡巴斯基文件顾问，只是需要这个功能，我才会选择安装卡巴斯基，如果您没有此需求，Windows10 自带的反病毒软件已经够用了
每次下载文件之后我都会使用这个功能检测一下，通过此功能可以判断出文件是否安全
一般来讲，受信任、使用人数越多、首次出现时间越早的文件越安全
禁止非必要程序联网 在卡巴斯基中可以禁止程序联网，建议将无需联网的程序禁止联网，以下演示将XMind禁止联网
首页-更多工具-管理应用程序-应用程序控制-右上角搜索XMind-将网络设置为禁止
虚拟机 Hyper-V 这是微软官方推出的虚拟机,可以无缝集成到Windows环境中,有很棒的性能和安全性,可以在Windows功能中打开,建议同时启用Windows 沙盒
启用Windows Hyper-V的步骤如下  在“程序和功能”下，点击“打开或关闭Windows功能”。
 在弹出的窗口中，找到并勾选“Hyper-V”和“Windows 沙盒”。
 点击“确定”。系统将开始安装Hyper-V，这可能需要一些时间。
 安装完成后，系统可能会提示你重启电脑。如果是这样，点击“现在重启”。
 重启电脑后，Hyper-V应该已经启用。
  注意：你的电脑需要支持硬件虚拟化，并且在BIOS中启用这个功能，才能使用Hyper-V。如果你的电脑不支持硬件虚拟化，或者没有在BIOS中启用这个功能，你将无法启用Hyper-V。
Windows沙盒 Windows沙盒需要Hyper-V的支持,所以要使用沙盒需先启用Hyper-V虚拟机
Windows沙盒（Windows Sandbox）是Windows 10(11)中的一个新功能，它提供了一个隔离的环境，让用户可以在其中运行未知或者不信任的应用程序，而不会影响主系统。
如果你下载了一个新的应用程序或者文件，但是不确定它是否安全，你可以把它放在沙盒中打开进行测试。如果它包含恶意软件或者病毒，那么这些恶意行为将被限制在沙盒中，不会影响你的主系统。
密码管理器 1Password 假如你有这个需求（真的很好用，推荐所有人使用），那么推荐 1Password、LastPass，1Password 可以试用一个月，对于第一次使用密码管理器的人可以体验一下
关于密码管理器原理，请参见这篇文章：1Password 安全工作原理
网络浏览器 Chrome网络浏览器 Google 出品，目前主流浏览器大多使用 Google 开源的 Chromium 内核</description>
    </item>
    
    <item>
      <title>树莓派安装Selenium Chromium Driver</title>
      <link>https://ooe.ooo/posts/%E6%A0%91%E8%8E%93%E6%B4%BE%E5%AE%89%E8%A3%85selenium-chromium-driver/</link>
      <pubDate>Sat, 27 Mar 2021 10:23:32 +0000</pubDate>
      
      <guid>https://ooe.ooo/posts/%E6%A0%91%E8%8E%93%E6%B4%BE%E5%AE%89%E8%A3%85selenium-chromium-driver/</guid>
      <description>安装环境 直接使用apt命令安装浏览器和驱动🎈
sudo apt update &amp;amp;&amp;amp; sudo apt upgrade -y sudo apt install chromium-browser chromium-chromedriver sudo apt install python3-pip pip3 install selenium  如何使用 使用无头模式启动 无头模式（&amp;ndash;headless）不会弹出浏览器窗口🎈
from selenium import webdriver from selenium.webdriver.chrome.options import Options driver_path = &#39;/usr/lib/chromium-browser/chromedriver&#39; chrome_options = Options() chrome_options.add_argument(&#39;--headless&#39;) chrome = webdriver.Chrome(driver_path, options=chrome_options) chrome.get(&#39;https://www.baidu.com&#39;) print(chrome.page_source)  为浏览器添加代理 此方法只能一次切换一个ip，需要chrome.quit()销毁浏览器后重新创建以切换下一个ip🎈
chrome_options = Options() chrome_options.add_argument(&#39;--headless&#39;) chrome_options.add_argument(&#39;--proxy-server=http://1.1.1.1:1080&#39;) chrome = webdriver.Chrome(driver_path, options=chrome_options) chrome.get(&#39;http://httpbin.org/ip&#39;) print(chrome.page_source)  其他 chrome_options.add_argument(&#39;user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.</description>
    </item>
    
    <item>
      <title>从零开始搭建Hugo博客</title>
      <link>https://ooe.ooo/posts/%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E6%90%AD%E5%BB%BAhugo%E5%8D%9A%E5%AE%A2/</link>
      <pubDate>Sat, 06 Mar 2021 11:20:56 +0800</pubDate>
      
      <guid>https://ooe.ooo/posts/%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E6%90%AD%E5%BB%BAhugo%E5%8D%9A%E5%AE%A2/</guid>
      <description>通过VSCode撰写博客&amp;ndash;&amp;gt;Push到Github仓库&amp;ndash;&amp;gt;仓库收到Push后触发Actions&amp;ndash;&amp;gt;生成静态网站
VSCode篇 安装VSCode  Visual Studio Code是一款由微软开发且跨平台的免费源代码编辑器。轻量级IDE，依托其庞大的社区，有无数开发者开发的插件可供安装
 下载地址：https://code.visualstudio.com/
安装插件 使用 Ctrl+Shift+X 搜索以下插件进行安装
 Markdown Preview Enhanced  VSCode本身支持Markdown预览，使用此插件可以丰富其功能 🎈
 在4K屏下mermaid缩放有问题，Ctrl+Shift+P输入mpemermaid，打开mermaid配置，添加以下内容
MERMAID_CONFIG = { startOnLoad: false, flowchart:{ useMaxWidth:true, htmlLabels:false } }  配置插件，Ctrl+Shift+P输入打开设置json，打开全局设置，添加以下内容
&amp;quot;markdown-preview-enhanced.breakOnSingleNewLine&amp;quot;: false, /* 禁用单个换行符换行 */ &amp;quot;markdown-preview-enhanced.enableLinkify&amp;quot;: false, /* 禁用把貌似url的文本转换成链接 */  markdownlint
  Markdown语法检查，如果你的写Markdown格式不规范此插件会提示修正
 vscode-icons  可选，安装后会替换默认icons，更美观
配置Git  Git是一个分布式管理控制软件
 安装Git 下载地址：https://git-scm.com/downloads
下载对应平台安装包进行安装
安装完成后在桌面或者资源管理器窗口按鼠标右键会有Git Bash Here
单击此项会弹出Git命令行窗口，安装成功
添加代理 有SS或者V2的最好配置一下代理，国内访问Github速度很慢！
git config --global http.</description>
    </item>
    
    <item>
      <title>如何计算排列和组合</title>
      <link>https://ooe.ooo/posts/%E5%A6%82%E4%BD%95%E8%AE%A1%E7%AE%97%E6%8E%92%E5%88%97%E5%92%8C%E7%BB%84%E5%90%88/</link>
      <pubDate>Tue, 22 Dec 2020 12:32:47 +0000</pubDate>
      
      <guid>https://ooe.ooo/posts/%E5%A6%82%E4%BD%95%E8%AE%A1%E7%AE%97%E6%8E%92%E5%88%97%E5%92%8C%E7%BB%84%E5%90%88/</guid>
      <description>原文来自知乎：https://zhuanlan.zhihu.com/p/41855459
看完本篇文章，保证你彻底理解「排列」「组合」这两个相爱相杀的概念到底有何区别。
排列英文名叫 Arrangement 或者 Permutation，本文采用更 fancy 的 Permutation来表示排列，下文统称为 P。
组合英文名叫 Combination，下文统称为 C。
P 和 C 的本质区别在于：决策的顺序对结果有没有影响。
下面举例说明
现在有8个人，他们的名字分别为：
 Alice Bob Catherine Donald Elizabeth Floria Gates Hinton  现在有 3 个奖杯，本别为 Golden 金牌，Silver 银牌，Bronze 铜牌。
我们的任务是：将这 3 个奖牌颁发给 8 个人中的 3 个，先颁发金牌，再颁发银牌，再颁发铜牌。问颁发奖牌的不同方式总共有哪些？
那么很明显，这是一个 Permutation 排列的问题，因为把金牌先颁给 Alice，再把银牌颁给 Bob，跟把金牌先颁给 Bob，再把银牌颁给 Alice 这是两种不同的颁奖方式。
好了，现在假设我们先把金牌颁发给 Alice，再把银牌颁发给 Bob，再把铜牌颁发给 Catherine：
第一步：颁发金牌 ️，可以在8个人中任选一个，有8种选择。A可以被替换为 B C D E F G H中的任何一个。
第二步：颁发银牌 ，可以在除去已经获得金牌的人之外的7个人中任选一个，有7种选择。
第三步：颁发铜牌 ，在已经获得金牌、银牌的两个人之外的6个人中任选一个，有6种选择。
那么很明显，总共的颁奖方式有
8 * 7 * 6 种</description>
    </item>
    
    <item>
      <title>Raspberry设置开机自启</title>
      <link>https://ooe.ooo/posts/raspberry%E8%AE%BE%E7%BD%AE%E5%BC%80%E6%9C%BA%E8%87%AA%E5%90%AF/</link>
      <pubDate>Tue, 22 Dec 2020 08:40:08 +0000</pubDate>
      
      <guid>https://ooe.ooo/posts/raspberry%E8%AE%BE%E7%BD%AE%E5%BC%80%E6%9C%BA%E8%87%AA%E5%90%AF/</guid>
      <description>启用rc-local服务 编辑/lib/systemd/system/rc-local.service，在文件尾部添加以下内容
[Install] WantedBy=multi-user.target Alias=rc-local.service  创建/etc/rc.local文件并输入以下内容
#!/bin/sh # # rc.local # # This script is executed at the end of each multiuser runlevel. # Make sure that the script will &amp;quot;exit 0&amp;quot; on success or any other # value on error. # # In order to enable or disable this script just change the execution # bits. # # By default this script does nothing. # 在此输入开机运行的命令 date &amp;gt;&amp;gt; /tmp/test.</description>
    </item>
    
    <item>
      <title>国内环境下载加速与镜像源</title>
      <link>https://ooe.ooo/posts/%E5%9B%BD%E5%86%85%E7%8E%AF%E5%A2%83%E4%B8%8B%E8%BD%BD%E5%8A%A0%E9%80%9F%E4%B8%8E%E9%95%9C%E5%83%8F%E6%BA%90/</link>
      <pubDate>Fri, 13 Nov 2020 08:09:21 +0000</pubDate>
      
      <guid>https://ooe.ooo/posts/%E5%9B%BD%E5%86%85%E7%8E%AF%E5%A2%83%E4%B8%8B%E8%BD%BD%E5%8A%A0%E9%80%9F%E4%B8%8E%E9%95%9C%E5%83%8F%E6%BA%90/</guid>
      <description>通过国内网络环境下载一些东西速度会十分慢，着实让人抓狂，在此记录一下可用的镜像源与方法，以备不时之需。
下载镜像 Python Node.js NPM Electron等
https://npm.taobao.org/mirrors
Linux源 清华大学 Ubuntu: https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu
Debian: https://mirrors.tuna.tsinghua.edu.cn/help/debian
CentOS: https://mirrors.tuna.tsinghua.edu.cn/help/centos
Raspbian:https://mirrors.tuna.tsinghua.edu.cn/help/raspbian
阿里云 https://developer.aliyun.com/mirror
PyPI源 # 升级 pip 到最新的版本 (&amp;gt;=10.0.0) 后进行配置 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pip -U # 设置清华源为默认 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple # 设置阿里源为默认 pip config set global.index-url https://mirrors.aliyun.com/pypi/simple  GitHub 推荐使用Cloudflare Workers搭建加速服务，项目地址
我搭建的服务地址是 https://p.ooe.ooo
代码:
function getTargetUrl(url) { const re = new RegExp(&#39;^https?:\/\/.+?\/(?:https?:\/\/)?(.+$)&#39;); return url.replace(re, &#39;https://$1&#39;); } // location返回相对地址的情况 https://httpbin.org/redirect/10 function urlMerge(origin, path) { try { const url = new URL(path); return url.</description>
    </item>
    
    <item>
      <title>V2ray使非TLS协议不走代理</title>
      <link>https://ooe.ooo/posts/v2ray%E4%BD%BF%E9%9D%9Etls%E5%8D%8F%E8%AE%AE%E4%B8%8D%E8%B5%B0%E4%BB%A3%E7%90%86/</link>
      <pubDate>Thu, 01 Oct 2020 06:52:04 +0000</pubDate>
      
      <guid>https://ooe.ooo/posts/v2ray%E4%BD%BF%E9%9D%9Etls%E5%8D%8F%E8%AE%AE%E4%B8%8D%E8%B5%B0%E4%BB%A3%E7%90%86/</guid>
      <description>{ &amp;quot;inbounds&amp;quot;: [ { &amp;quot;port&amp;quot;: 1080, &amp;quot;listen&amp;quot;: &amp;quot;0.0.0.0&amp;quot;, &amp;quot;protocol&amp;quot;: &amp;quot;socks&amp;quot;, &amp;quot;sniffing&amp;quot;: { &amp;quot;enabled&amp;quot;: true, &amp;quot;destOverride&amp;quot;: [ &amp;quot;http&amp;quot;, &amp;quot;tls&amp;quot; ] }, &amp;quot;settings&amp;quot;: { &amp;quot;auth&amp;quot;: &amp;quot;noauth&amp;quot;, &amp;quot;udp&amp;quot;: false } } ], &amp;quot;outbounds&amp;quot;: [ // 出站配置 { 先找匹配的路由规则，假如没有则走第一个配置，假如存在，则走路由指定的tag } { // 这里贴上你的可信任的v2ray配置,默认走这个代理，这个必须在上 // 如果没有可信任代理，这里可以设置成直连，如果使用直连，请把下面两行注释取消 // &amp;quot;protocol&amp;quot;: &amp;quot;freedom&amp;quot;, // &amp;quot;settings&amp;quot;: {} }, { // 这里贴上你机场的v2ray配置,tls协议走这个，这个必须在下 &amp;quot;tag&amp;quot;: &amp;quot;tlsTag&amp;quot; } ], &amp;quot;routing&amp;quot;: { // 路由配置 &amp;quot;domainStrategy&amp;quot;: &amp;quot;AsIs&amp;quot;, &amp;quot;rules&amp;quot;: [ { &amp;quot;type&amp;quot;: &amp;quot;field&amp;quot;, &amp;quot;protocol&amp;quot;: [ // 支持协议：tls,http,bittorrent &amp;quot;tls&amp;quot; ], &amp;quot;outboundTag&amp;quot;: &amp;quot;tlsTag&amp;quot; // 此路由规则走的代理，与outbounds中tag对应 } ] } }  官方文档：https://www.</description>
    </item>
    
    <item>
      <title>Ubuntu使用密钥登陆</title>
      <link>https://ooe.ooo/posts/ubuntu%E4%BD%BF%E7%94%A8%E5%AF%86%E9%92%A5%E7%99%BB%E9%99%86/</link>
      <pubDate>Sat, 26 Sep 2020 10:36:44 +0000</pubDate>
      
      <guid>https://ooe.ooo/posts/ubuntu%E4%BD%BF%E7%94%A8%E5%AF%86%E9%92%A5%E7%99%BB%E9%99%86/</guid>
      <description> 生成登陆密钥 可以使用两种方法生成登陆密钥
1.使用putty-gen生成密钥 打开putty-gen（与putty一同安装，在同目录下），点击Generate按钮，生成密钥对，Save private key保存私钥，记住位置，之后需要使用这个私钥进行登陆。
复制生成的public key，就是上面框框中的那一串字符，复制全部内容。在服务器终端里输入下面命令。
vim ~/.ssh/authorized_keys  把复制的公钥粘贴进去，注意文件名authorized_keys不能变
2.在终端中使用ssh-keygen生成密钥 ssh-keygen # 三次回车 cd ~/.ssh/ # id_rsa 是私钥 id_rsa.pub是公钥 mv id_rsa.pub authorized_keys sudo chmod -R 700 ~/.ssh cat id_rsa # 复制私钥，保存到客户端PC，之后使用此私钥登陆  如果使用putty登陆，则推荐使用方法1
使用密钥登陆 Windows: 使用PuTTY登录 打开putty，输入Host Name、Port，在Saved Sessions给这个服务器设定个名字；
点击左边菜单SSH、Auth，单击Browse...，在弹出窗口中找到你刚才保存的私钥文件，双击文件；
点击左侧Connection、Data，在auto-login username中输入登陆用户名；
点击左侧菜单Session，点击Save保存。点击Open或者双击保存的Session进行登陆。
Linux: 使用ssh命令登录 需要注意的是，若使用ssh命令登录，则不能用putty生成的密钥对，需要用ssh-keygen命令生成
cd ~/.ssh/ # 写入服务器端生成的私钥 vim name_rsa sudo chmod -R 700 ~/.ssh # 登录 ssh user@host:port -i ~/.ssh/name_rsa  </description>
    </item>
    
    <item>
      <title>Numpy中的形状Shape和轴Axis</title>
      <link>https://ooe.ooo/posts/numpy%E4%B8%AD%E7%9A%84%E5%BD%A2%E7%8A%B6shape%E5%92%8C%E8%BD%B4axis/</link>
      <pubDate>Sat, 01 Aug 2020 08:43:07 +0000</pubDate>
      
      <guid>https://ooe.ooo/posts/numpy%E4%B8%AD%E7%9A%84%E5%BD%A2%E7%8A%B6shape%E5%92%8C%E8%BD%B4axis/</guid>
      <description>shape.形状 创建一个数组
np.arange(10).reshape((5,2)) Out: array([[0, 1], [2, 3], [4, 5], [6, 7], [8, 9]])  reshape(5,2) 可以理解为一个二维数组，这个二维数组中有5个长度为2的一维数组，5是一维数组的个数，2是一维数组的长度，假如reshape为(2,5)则表示一个二维数组里面有2个长度为5的一维数组:[[0,1,2,3,4],[5,6,7,8,9]]。
下面一个4维数组:
np.arange(16).reshape((2,2,2,2)) Out: array([[[[ 0, 1], [ 2, 3]], [[ 4, 5], [ 6, 7]]], [[[ 8, 9], [10, 11]], [[12, 13], [14, 15]]]])  shape为(2,2,2,2) tuple的长度是数组的维度，这里是长度4是4维，这个数组可以理解为
当shape=(2,2,2,2)时，表示这是个四维数组，其中三维数组的个数=2，二维数组的个数=2x2，一维数组的个数=2x2x2，size=2x2x2x2
一个ndarray数组的shape就是这个数组的形状
axis.轴 理解了shape，axis就很容易了
拿上面的4维数组来举例
四维数组求和 t = np.arange(16).reshape(2,2,2,2) np.sum(t, axis=0) array([[[ 8, 10], [12, 14]], [[16, 18], [20, 22]]]) np.sum(t, axis=1) array([[[ 4, 6], [ 8, 10]], [[20, 22], [24, 26]]]) np.</description>
    </item>
    
    <item>
      <title>Ubuntu18 安装 MySQL8</title>
      <link>https://ooe.ooo/posts/ubuntu18-%E5%AE%89%E8%A3%85-mysql8/</link>
      <pubDate>Fri, 22 Nov 2019 08:38:49 +0000</pubDate>
      
      <guid>https://ooe.ooo/posts/ubuntu18-%E5%AE%89%E8%A3%85-mysql8/</guid>
      <description>安装Mysql8.0 当前apt仓库里面的MySQL版本是5.7，直接apt install则会安装5.7版本，如需安装最新的8.0版本则需要先从官网下载源再进行安装。
从http://dev.mysql.com/downloads/repo/apt找到最新版本进行下载。
wget https://dev.mysql.com/get/mysql-apt-config_0.8.15-1_all.deb  安装
sudo dpkg -i mysql-apt-config_*.deb sudo apt update sudo apt install mysql-server -y  安装过程会提示设置密码，其他的直接回车默认，等待安装完成
输入密码，进入mysql，可以看到当前版本为8.0，安装成功!🎉
root:~$ mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8 Server version: 8.0.21 MySQL Community Server - GPL  相关的操作 默认存储位置 /usr/bin 客户端程序和脚本 /usr/sbin mysqld 服务器 /var/lib/mysql 日志文件，数据库 ［重点要知道这个］ /etc/mysql/mysql.conf.d/mysql.cnf mysql配置  恢复mysql文件夹默认权限 sudo chown -RL root:mysql /usr/local/mysql sudo chown -RL mysql:mysql /usr/local/mysql/data  禁用binlog日志  MySQL 的Binlog 日志是一种二进制格式的日志，Binlog 记录所有的DDL 和DML 语句(除了数据查询语句SELECT、SHOW等)，以Event 的形式记录，同时记录语句执行时间。Binlog的作用类似于Oracle的归档日志，可以用来查看数据库的变更历史（具体的时间点所有的SQL操作）、数据库增量备份和恢复（增量备份和基于时间点的恢复）、Mysql的复制（主主数据库的复制、主从数据库的复制）。</description>
    </item>
    
    <item>
      <title>ShareX截图自动上传并返回链接</title>
      <link>https://ooe.ooo/posts/sharex%E6%88%AA%E5%9B%BE%E8%87%AA%E5%8A%A8%E4%B8%8A%E4%BC%A0%E5%B9%B6%E8%BF%94%E5%9B%9E%E9%93%BE%E6%8E%A5/</link>
      <pubDate>Fri, 22 Nov 2019 07:45:14 +0000</pubDate>
      
      <guid>https://ooe.ooo/posts/sharex%E6%88%AA%E5%9B%BE%E8%87%AA%E5%8A%A8%E4%B8%8A%E4%BC%A0%E5%B9%B6%E8%BF%94%E5%9B%9E%E9%93%BE%E6%8E%A5/</guid>
      <description>准备工作 在这里下载并安装Sharex
选择一个开放api上传的图床，可以使用公共图床sm.ms，我用的是自己搭建的Chevereto图床
配置图床 ShareX官方Github里有已经写好的配置，可以直接复制导入。在列表里找到你使用的图床，复制配置的内容
tips：上面的配置很久没更新，有些已经失效
打开ShareX窗口，点击上传至-&amp;gt;自定义上传目标-&amp;gt;导入-&amp;gt;从剪贴板
chevereto图床配置：
{ &amp;quot;Version&amp;quot;: &amp;quot;12.4.1&amp;quot;, &amp;quot;Name&amp;quot;: &amp;quot;chevereto_markdown&amp;quot;, &amp;quot;DestinationType&amp;quot;: &amp;quot;ImageUploader&amp;quot;, &amp;quot;RequestMethod&amp;quot;: &amp;quot;POST&amp;quot;, &amp;quot;RequestURL&amp;quot;: &amp;quot;https://你的图床URL/api/1/upload&amp;quot;, &amp;quot;Body&amp;quot;: &amp;quot;MultipartFormData&amp;quot;, &amp;quot;Arguments&amp;quot;: { &amp;quot;key&amp;quot;: &amp;quot;API KEY在设置里面获取&amp;quot;, &amp;quot;format&amp;quot;: &amp;quot;txt&amp;quot; }, &amp;quot;FileFormName&amp;quot;: &amp;quot;source&amp;quot;, &amp;quot;URL&amp;quot;: &amp;quot;![$filename$]($response$)&amp;quot; }  配置好后测试一下，正常返回则关闭窗口
设置快捷键 点击快捷键设置-&amp;gt;添加
任务 —— 选中 任务-&amp;gt;屏幕捕捉-&amp;gt;捕捉矩形区域 上传目标 —— 选中 图像上传：自定义图片上传-&amp;gt;自定义图片上传 最后一行 —— 选择你刚才配置的图床  配置完成后关闭窗口，给此动作分配一个快捷键
参考链接:
https://sspai.com/post/43437</description>
    </item>
    
    <item>
      <title></title>
      <link>https://ooe.ooo/booknotes/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://ooe.ooo/booknotes/</guid>
      <description>股价反映了人们的预期，所以当实际结果比预期好时，股价上涨；当实际结果比预期差时，股价下跌。而大多数人会因为近期的经验而产生偏见。
2018/04/06《原则[精品]》当政府决策者向你承诺他们不会允许货币贬值发生时，不要相信他们。他们越是坚决地做出这样的承诺，局势也许就越严重，因而货币贬值即将发生的概率也越大。
2018/04/06《原则[精品]》你最好弄明白其他时间、其他地点、其他人身上发生的事，因为如果你不这么做，你就不知道这些事情会不会发生在你身上，而且一旦发生在你身上，你将不知道如何应对。”
2018/04/06《原则[精品]》教训是什么？当所有人想法都一样时（例如都相信买入“漂亮50股”包赚不赔），这一情况几乎必然会反映在价格中，而把赌注押在这上面，就有可能犯错。我还学到了，所有行为（如宽松的货币和信贷）都会产生与该行为大致相称的后果（在这个例子中是更高的通胀率），这会引起一个大体相同的反向反应（货币和信贷的收紧），以及市场的反转。
2018/04/06《原则[精品]》必须确保任何一次押注，甚至赌注组合，都不能使自己的损失超过可以接受的限度。在交易中，你必须既有防御心又有进攻心。如果没有进攻心，你就赚不到钱；而如果没有防御心，你的钱就保不住。
2018/04/06《原则[精品]》金钱只是你需要的东西之一，但当你已经拥有了实现你真正想要的东西所需的金钱时，金钱就不再是你唯一需要的东西，也肯定不是最重要的东西。
2018/04/06《原则[精品]》有意义的人际关系是指我既深深地关心对方，对方也深深地关心我。
2018/04/06《原则[精品]》在每个投资者的职业生涯中，都有焦虑的时刻，你对未来的期待与真正发生的情况不符，你不知道自己面临的是巨大的机会还是灾难性的错误。因为我有很强的“看对但及早收手”的倾向，所以我更愿意相信这样做是对的。
2018/04/07《原则[精品]》如果你已经做好准备放弃一切其他东西，像医科学生研究解剖一样仔细地研究市场的整个历史和背景，并研究所有主要上市公司——如果你能做到上述的一切，同时你还拥有赌博者的镇定、洞察者的第六感和狮子的勇气，你才有可能抓住一丝机会。”
2018/04/07《原则[精品]》最初，我似乎面临着一个“要么全得、要么全失”的选择：我或者冒很大的风险追求高回报（并有可能在此过程中一败涂地）；或者降低自己的风险，满足于取得较低的回报。但我想要的是既承受低风险也享受高回报，在探索如何使之变得可能的过程中，我学会了在面对两个你都需要但看起来相互矛盾的东西时，你需要耐心地做出选择。通过这种方式，你将摸索出如何尽最大可能让二者兼得。几乎总是存在着一条你还没有发现的有利的道路，所以你需要不断找下去，直到找到它，而不是满足于最初对你显而易见的那种选择。
2018/04/07《原则[精品]》明智的人在经历各种沉浮时都始终盯紧稳健的基本面；而轻浮的人跟着感觉走，做出情绪化的反应，对于热门的东西一拥而上，不热的时候又马上放弃。
2018/04/07《原则[精品]》我发现如果我拥有15—20个良好的、互不相关的回报流，我就能大大降低我的风险，同时又不减少我的预期收益。这简单明了，但如果这个在纸面上行得通的理论在实践中的效果也很好的话，那将是一个重大突破。我称之为“投资的圣杯”，因为它指出了赚大钱的方法。这是我们学习过程中的又一个关键时刻。
2018/04/07《原则[精品]》想要拥有很多优势，而又不暴露于不可接受的劣势之下，最稳妥的方式是做出一系列良好的、互不相关的押注，彼此平衡，相互补充。
2018/04/07《原则[精品]》你是否也曾想过教训或者改变别人？我全力支持你。不过，为什么不从你自己开始呢？自私一点说，改变自己远比改变他人令你受益更多，并且风险更小。孔子曾言：“苟正其身矣，于从政乎何有？不能正其身，如正人何？”
2018/04/10《人性的弱点 戴尔·卡耐基著[精品]》“我的能力在于激发周围人的热情，”施瓦布说，“我拥有的最大资本，是赞赏和鼓励，我以此方式激发人们的潜能。”
2018/04/10《人性的弱点 戴尔·卡耐基著[精品]》此生之路，我将走过；走过这一次，便再也无法重来。所有力所能及的善行，所有充盈于心的善意，我将毫不吝惜，即刻倾予。我将再不拖延，再不淡漠，只因此生之路，再也无法重来。
2018/04/10《人性的弱点 戴尔·卡耐基著[精品]》洞悉他人的立场，并能够同时兼顾自己和他人的立场。”
2018/04/11《人性的弱点 戴尔·卡耐基著[精品]》说服别人的首要途径，是引发对方的强烈欲求。能者纵横四海，庸者踽踽独行。”
2018/04/11《人性的弱点 戴尔·卡耐基著[精品]》表现自我是人性的重要需求。
2018/04/11《人性的弱点 戴尔·卡耐基著[精品]》发自内心地关注他人，不出两个月，你就能交到许多朋友；只想博得他人的关注，哪怕两年，你也交不到朋友。
2018/04/11《人性的弱点 戴尔·卡耐基著[精品]》没有人在意他们，也没有人在意你我。人们真正关心的只有自己，这一点永远不会变，无论今天还是明天，无论现在还是未来。
2018/04/11《人性的弱点 戴尔·卡耐基著[精品]》漠视同胞之人，生活最为艰辛，给周遭带来的伤害也最为深痛。置身于这样的个体周围，人类命运有如堕入寒冬，生机难复
2018/04/11《人性的弱点 戴尔·卡耐基著[精品]》更重要的是，萨士顿对观众充满热诚。他说许多魔术师在演出时都会暗想“面前坐的都是傻帽和土包子，看我怎么骗倒他们”。但萨士顿的想法截然相反。每次站在聚光灯下，他都会对自己说：“很感恩有这么多人来看我的表演。我有幸能以爱好谋生，全靠他们捧场。我要把最好的表演献给他们。”
2018/04/11《人性的弱点 戴尔·卡耐基著[精品]》莎士比亚说：“事无优劣，思想使然。”
2018/04/11《人性的弱点 戴尔·卡耐基著[精品]》那些声称记不住名字的人，无非是不愿花时间和精力专注于此。他们总是以忙碌为借口，但是谁会比美国总统富兰克林·罗斯福更忙呢？哪怕是只有一面之缘的机修工，罗斯福都能叫出他的全名。
2018/04/11《人性的弱点 戴尔·卡耐基著[精品]》无论对于何人，无论以何种语言，自己的名字都是世界上最甜蜜最重要的词汇」
2018/04/11《人性的弱点 戴尔·卡耐基著[精品]》无论何事，你们愿意人怎样待你们，你们也要怎样待人。”
2018/04/12《人性的弱点 戴尔·卡耐基著[精品]》争辩、抱怨和反驳或许会带来暂时的胜利，但你永远无法通过这表面上的胜利赢得对方的尊敬。”
2018/04/15《人性的弱点 戴尔·卡耐基著[精品]》有远大志向的人不会把时间浪费在无益的争执上，”林肯说道，“因为意气用事毫无意义。你的私事再大也大不过天，所以在个人问题上要懂得让步。有狗拦路的时候，最好给它让道，而不要为了争路被它反咬一口；若是被咬了，即使杀了它，你的伤口也不会马上愈合。”
2018/04/15《人性的弱点 戴尔·卡耐基著[精品]》斗争无法餍足人类，退让却能令人受益匪浅。”
2018/04/15《人性的弱点 戴尔·卡耐基著[精品]》若想树敌，就胜于你的朋友；若想交友，请让朋友胜于你。” 为什么呢？如果朋友胜过我们，他们会觉得自己很重要；如果我们胜过他们，他们中的一
2018/04/28《人性的弱点 戴尔·卡耐基著[精品]》江海之所以能为百谷王者，以其善下之，故能为百谷王。是以圣人欲上民，必以言下之；欲先民，必以身后之。是以圣人处上而民不重，处前而民不害。是以天下乐推而不厌。以其不争，故天下莫能与之争。
2018/05/02《人性的弱点 戴尔·卡耐基著[精品]》原则10 激发对方内心深处的高尚情操
2018/05/13《人性的弱点 戴尔·卡耐基著[精品]》也许有些人会反驳：“但金钱并不能给人带来幸福啊。”当然不能。而且这也不是金钱的任务。金钱应该给予我们安全感、自由感。金钱应该为我们提供这样一种可能性，一种我们可以过上自己想要的生活的可能性。但还有一点无可否认：金钱可以使人更接近于幸福的生活。
2018/05/18《财务自由之路Ⅰ：7年内赚到你的第一个1000万[精品]》变得富有的途径有很多。本书中为您详述其中一种，它由以下4种策略组成： 1.储蓄一定比例的金钱。 2.使用储蓄资金进行投资。 3.提高自己的收入。 4.从每次加薪中提取一定比例进行储蓄。
2018/05/18《财务自由之路Ⅰ：7年内赚到你的第一个1000万[精品]》将你的事业建立在你最大的爱好之上。用你的爱好来赚钱。花点时间分析一下，你真正感兴趣的是什么、你的才能在哪方面，之后你才有可能从事一份自己既感兴趣又能赚钱的工作。
2018/05/18《财务自由之路Ⅰ：7年内赚到你的第一个1000万[精品]》整天工作的人是没有时间来赚钱的。
2018/05/18《财务自由之路Ⅰ：7年内赚到你的第一个1000万[精品]》我们首先要问的不是“为什么”，而是“怎么做”。“怎么做”寻找的是解决方案，“为什么”寻找的是托词。寻找并最终找到托词的人，就没有必要再拓宽他的可控领域了，因为他是不负责的，同时他也就放弃了自己的权力。提问“怎么做”的人，他的答案很快便会将他引出现有的可控领域。因为“怎么做”是包含“为什么”这一层含义的，而反过来，“为什么”却不包含“怎么做”，也不会促使我们去寻找解决方案。
2018/05/28《财务自由之路Ⅰ：7年内赚到你的第一个1000万[精品]》我们不仅对自己所做之事负有责任，也对自己未做之事负有责任。有的时候，逃避责任对我们的诱惑力非常大。很多时候，不承担责任显得方便又舒适。但我们之后需要付出的代价是极高的。因为我们会被别人玩弄在手掌之中，只能按照别人为我们谱写的剧本来生活。 我们充分利用自己的潜能时，会获得最大的满足感。我所理解的成功就是成为最好的自己。我全力以赴时，会感受到前所未有的活力。
2018/05/28《财务自由之路Ⅰ：7年内赚到你的第一个1000万[精品]》当然，“金钱是万能的”这样的想法很愚蠢。然而，认为“有钱人结识不到有趣的人，有钱人不能去看迷人的风景，有钱人不能扩大自己的机会，有钱人不能集中精力做别的工作”的人，也同样愚蠢。
2018/05/28《财务自由之路Ⅰ：7年内赚到你的第一个1000万[精品]》责任意味着：没有任何东西能改变你的态度或品格，因为你是按照自己的本性对事情做出反应。你可以决定自己以哪种方式去生活。这种态度使你能够生活幸福，并且成为最好的自己。如果你勇于承担责任，那么你就能在7年内变得富有。
2018/05/28《财务自由之路Ⅰ：7年内赚到你的第一个1000万[精品]》随着年龄增长，你只会对自己没做过的事情感到后悔。
2018/05/28《财务自由之路Ⅰ：7年内赚到你的第一个1000万[精品]》没有责任心地生活就意味着，使自己退化为一个无力的牺牲品，意味着按照别人为你谱写的剧本来生活。</description>
    </item>
    
    <item>
      <title>阅读文摘</title>
      <link>https://ooe.ooo/booknotes/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://ooe.ooo/booknotes/</guid>
      <description>阅读笔记文摘</description>
    </item>
    
  </channel>
</rss>