你好! 👋

  • 欢迎来到我的博客,
  • 我将在这里探索互联网。

Windows 开箱即用(Windows OTG)

Refs to: https://sspai.com/post/73019 在这篇少数派博客里面,我终于知道了原来 Windows 也能拥有勉强能用的 Terminal 自动补全体验,我在这里需要记录我自己安装 Windows 之后需要配置的命令环境,可以节省我重装 Windows 重新配置所浪费的时间。 Commands # run as admin at the command below Set-ExecutionPolicy RemoteSigned -scope CurrentUser # scoop installations Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://get.scoop.sh') # scoop apps preinstallation scoop install 7zip git # scoop install 3rd buckets scoop bucket add extras scoop bucket add dorado https://github.com/chawyehsu/dorado # scoop install apps scoop install busybox sudo scoop-completion scoop-search python scoop install everything geekuninstaller volta # add scoop configure Add-Content -Path $Profile -Value "`nImport-Module $env:USERPROFILE\scoop\modules\scoop-completion" Add-Content -Path $Profile -Value "`Invoke-Expression (&scoop-search --hook)" # Change Keymaps to Emacs sudo Install-Module -Name PSReadLine -force Add-Content -Path $Profile -Value "Set-PSReadLineOption -EditMode Emacs" Thanks @MS @柯帕Kepa

VSCode 与 Toolbox 无缝协作开发

Refs to: Integrating Fedora Toolbox into VS Code (with the help of SSH) 笔者已经使用 Silverblue 一段时间了,在这一段时间内使用各类 IDE 都遇到让我困扰的问题。最开始我直接使用 vscode 等 IDE 直接打开本地的项目,但是这样打开的项目完全没有办法使用一些局部的环境变量,例如我的 Python 环境、前端开发的 npm 环境等;接下来我在 Toolbox 中创建我的环境,毕竟这个才是 rpm-os 推荐的做法,用户应该尽可能不要使用 rpm-ostree 来进行环境的安装,任何带 GUI 的应用都最好使用 flatpak 进行安装,需要开发的话在各个 toolbox container 中配置环境,但我通过 toolbox 中安装 vscode 打开本地项目,其中的 shell 依旧是处于 toolbox container 之外的 shell,这导致项目依旧不能识别是我配置的环境。例如在一个 python 虚拟环境中已经安装好了相关依赖,但是在 vscode on toolbox 中使用 pip 会导致受到 module "pip" not found 的报错。 翻越了互联网很久才发现上面的这一篇文章,我突然意识到可以使用 SSH 与 toolbox 进行连接开发,这样的开发可以实现在 vscode 中的 Shell 处于 toolbox 之中。...

五月 10, 2022 · Peng Cheong

如何删除 Cloudfalre KV 命名空间

首先声明,我的长短链使用的是 Url-Shorten-Worker,在很久前,我就好奇 Url-Shorten-Worker 这个 Github Repo 是怎么做到每天清理所有的 key:value 的,也没有认真去了解。 文档相关 https://developers.cloudflare.com/workers/cli-wrangler/commands#kv 在本次操作中我们只关心上述文档中的 kv:key 的操作方式 可以看到右边的 TOC 很清晰的展示了几个操作: 操作 含义 put 往指定的 Namespace 中填充键值对 list 获取全部的 key get 获取某个 key 对应的 value delete 删除指定 key,及其 value 这篇文章的核心思路是: 首先获取所有的 key 查询所有 key 对应的 value 判断对应的 value 是否满足条件 若 value 满足条件,则请求删除对应的 key...

五月 6, 2021 · Peng Cheong

与 Windows Sandbox 文件互访

Windows 沙盒(Windows Sandbox, WS)是 Windows 1909 以上专业版自带的一个沙盒虚拟机。每次打开一个沙盒,他都会模拟一个纯净的 Windows 环境,其内存和存储空间是临时的,当你关闭该沙盒,其保存的文件会随着内存共同销毁,从而确保本机的安全。通过 WS,我们可以大胆测试一些我们不确定是否安全的内容,待安全测试通过后,我们可以再在本机上运行陌生文件。 打开 WS 功能,你需要打开 Control Pannel/Programs and Features/Turn Windows features on or off/ 下的 Hyper-V/Windows Sandbox 两个选项。 网络文件共享 就目前而言,我没能找到比较好的通过 WS 直接访问本机上的磁盘文件的方法,但是这也是理所当然的,只有这样病毒文件才不会随着对该路径的访问污染实际磁盘文件。实际上,我完全基于偶合发现了基于网络文件共享的方法可以解决这个问题。在最开始我使用了 Chfs 作为一个局域网文件共享网络服务,随后我猜想在 WS 中能否通过局域网这样访问本机上的文件,实际是可行的。 Chfs 是一个国人开发的局域网网络文件服务器,任何局域网上的设备可以通过 Chfs 快速访问运行该服务的主机的文件。 请不用太担心,你的文件可以通过设置权限不被其他人浏览到;或者你可以设置仅仅共享指定 文件/文件夹;或者设定一个账户,该账户可以完全访问,也可以仅被允许访问指定文件…具体的实现方式非常多,由你来定义。 Chfs 并不是一个开源软件,如果担心其安全,可以尝试使用其他的网络文件共享服务 q(≧▽≦q) 安装 Chfs 既然 Chfs 可以实现上述功能,就让我们来安装它吧! Chfs 可以通过官网 http://iscute.cn/chfs 下载,按照 Guidance 安装。 但是我更偏好另外一种安装方式:Scoop Scoop 是一个 Windows 下的包管理器,类似 apt、dnf、yum、chocolate,你可以通过一条命令直接安装指定程序。 关于 Scoop 的安装方式这里不再赘述。最简单的方式可以按照 Github 的教程安装。...

四月 23, 2021 · Peng Cheong

对「装饰模式」的简单理解

在前文 设计模式 - 装饰模式 中比较全面地介绍了什么是装饰模式,介绍了设计模式 - 装饰模式优缺点、适用范围。 现在简单实现一下,加深学习印象。 我们可以这样理解: 装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。 装饰模式特点 装饰对象和真实对象有相同的接口。这样客户端对象就能以和真实对象相同的方式和装饰对象交互。 装饰对象包含一个真实对象的引用(reference) 装饰对象接受所有来自客户端的请求。它把这些请求转发给真实的对象。 装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。 真实对象区别于抽象对象(Component)。抽象对象不应该被具体实现;同时修饰类引用和继承 Component 类,具体扩展类重写父类方法。 设计原则 应当多组合,少继承 利用继承设计子类的行为,是在编译时静态决定的,而且所有的子类都会继承到相同的行为。然而,如果能够利用组合的做法扩展对象的行为,就可以在运行时动态地进行扩展。 类的设计应该对扩展开放,对修改关闭 样例实现 在这个样例中,主要体会对子类的组合实现,以及深入体会如何动态加载子类 from functools import wraps def login_check(func): """ Decorator check whether user is logged in :param func :return wrapper """ @wraps(func) def wrapper(*args, **kwargs): if args[0].status != "login": print("User hasn't logged in yet!") else: return func(*args, **kwargs) return wrapper class Visitor(object): def __init__(self, status) -> None: self....

二月 18, 2021 · Peng Cheong

自定义博客功能拓展,HEXO 注入器

在我把主题从 Cards 切换到 Fluid,发现 Fluid 默认没有提供接口以便在 <head> 后面插入 Google Sitemap 相关的信息,通过阅读 Fluid 提供的文档,我发现了 HEXO 5.0+ 提供的一个功能:HEXO Injector。 HEXO INJECTOR What is HEXO Injector ? 注入器被用于将静态代码片段注入生成的 HTML 的 <head> 和/或 <body> 中。Hexo 将在 after_render:html 过滤器 之前 完成注入。 hexo.extend.injector.register(entry, value, to) 几个应用场景 Instant.Page Instant.Page 是一个提高用户浏览网页的好工具,很多比较大的公司都使用了该工具: 例如:Adidas\Spotify and etc Instant.Page 可以让用户在站内移动鼠标到站内链接时用自己的方式预加载当前鼠标指向的链接。当你再次点击该链接,可以实现更迅速的打开。例如我的博客搭建托管在 Cloudflare,加载了 Instant.Page 可以比没有提升了肉眼可见的提升。 Instant.Page Github <script src="//instant.page/5.1.0" type="module" integrity="sha384-by67kQnR+pyfy8yWP4kPO12fHKRLHZPfEsiSXR8u2IKcTdxD805MGUXBzVPnkLHw"></script> 在 HEXO 各个不同的主题中,一般会提供不同的方法让你在</body>前插入自定义代码段。下面是一些我用过的主题实现加载 instant.page 的方法。 Butterfly 直接在 _config.butterfly.yml 中设置 instantpage: true 即可。 fluid 按照以下文段中替换 value 中的值即可。 对于部分安装了 Ublock Origin 的浏览器,由于Amazon等大型网站也是采用该脚本加速广告,该脚本会被插件所屏蔽,你可以保存 instant....

二月 13, 2021 · Peng Cheong

基于 Python 实现「迷宫生成算法」

迷宫生成:基于 Python 的实现 前一阵子看了Blibili上一个UP主的视频,讲解了一下迷宫,这引起了我极大的兴趣,诞生了自己从零开始实现一个迷宫生成的程序的想法。 在Github上浏览了一番,虽然有的写的很强,可以实现复杂图案设计,但是很难结合我观看的视频进行改动。我更应该先实现简单功能,复杂设计理应万变不离其宗。更简单的设计可以加深我对迷宫的理解 迷宫生成 - 基本规则 在基本迷宫设计中,我们把每一个单元格理解成为一个房间;那么迷宫生成实际上就可以理解为:破坏两个房间之间的墙。 从所在的房间的四周,能且只能找到没有去过的房间,破坏中间的墙 当前所在的位置四周不存在可以没有去过的房间,应该从已经去过的房间任意选择一个,再从中找其旁边没有去过的房间 无论当前是否到达终点,只有存在没有去过的房间,都需要重复步骤 2,直到所有房间都具有连通性 对迷宫的理解 迷宫可以理解为一颗树,根节点是入口。迷宫玩法实际上是找到从根节点到目的叶节点最近的距离。 在这次实践中,我同时也把这个迷宫理解成为一个二维数组,方便设计,每条边以及房间都包含在该二维数组中。 实现思路 迷宫生成,我期望值是能返回一个全迷宫二维数组;因为要同时设计GUI,我设计了 GUI 以及 MAZE 两个类。 首先生成二维数组,全部置 1;初始化并让其中房间标记为 0。 设计一个方法,接受参数为当前的房间,查询并返回四个方向中可以进行吓一跳的房间。 从步骤 2 返回的房间随机选择一个。 需要注意的是若当前的房间为终点,或者返回的房间为空,需要在已经去过的房间重新选择一个。重复这个步骤直到所有的房间都到达过。 返回对象为已经生成好的二维数组 最后再用 Tkinter 库进行简单绘制即可 Github Address https://github.com/PengCheong/MazeGenerator 语法笔记 1. 返回可用下一跳位置 def get_valid_position(self, x, y): valid_pos = [[x + 2, y], ...] valid_pos.remove([x + 2, y]) if x == height else ....

一月 28, 2021 · Peng Cheong

基于 Python 实现「图片隐写术」

隐写术(Steganographia) 隐写术是一门关于信息隐藏的技巧与科学,所谓信息隐藏指的是不让除预期的接收者之外的任何人知晓信息的传递事件或者信息的内容。隐写术的英文叫做Steganography,来源于特里特米乌斯的一本讲述密码学与隐写术的著作Steganographia,该书书名源于希腊语,意为“隐秘书写”。 概要 一般来说,隐写的信息看起来像一些其他的东西,例如一张购物清单,一篇文章,一篇图画或者其他“伪装”(cover)的消息。 隐写的信息通常用一些传统的方法进行加密,然后用某种方法修改一个“伪装文本”(covertext),使其包含被加密过的消息,形成所谓的“隐秘文本”(stegotext)。例如,文字的大小、间距、字体,或者掩饰文本的其他特性可以被修改来包含隐藏的信息。只有接收者知道所使用的隐藏技术,才能够恢覆信息,然后对其进行解密。 现代隐写术 载体文件(cover file)相对隐秘文件的大小(指数据含量,以比特计)越大,隐藏后者就越加容易。 因为这个原因,数字图像(包含有大量的数据)在互联网和其他传媒上被广泛用于隐藏消息。这种方法使用的广泛程度无从查考。例如:一个24位的位图中的每个像素的三个颜色分量(红,绿和蓝)各使用8个比特来表示。如果我们只考虑蓝色的话,就是说有28种不同的数值来表示深浅不同的蓝色。而像11111111和11111110这两个值所表示的蓝色,人眼几乎无法区分。因此,这个最低有效位就可以用来存储颜色之外的信息,而且在某种程度上几乎是检测不到的。如果对红色和绿色进行同样的操作,就可以在差不多三个像素中存储一个字节的信息。 更正式一点地说,使隐写的信息难以探测的,也就是保证“有效载荷”(需要被隐蔽的信号)对“载体”(即原始的信号)的调制对载体的影响看起来(理想状况下甚至在统计上)可以忽略。这就是说,这种改变应该无法与载体中的噪声加以区别。 (从信息论的观点来看,这就是说信道的容量必须大于传输“表面上”的信号的需求。这就叫做信道的冗余。对于一幅数字图像,这种冗余可能是成像单元的噪声;对于数字音频,可能是录音或者放大设备所产生的噪声。任何有着模拟放大级的系统都会有所谓的热噪声(或称“1/f”噪声),这可以用作掩饰。另外,有损压缩技术(如JPEG)会在解压后的数据中引入一些误差,利用这些误差作隐写术用途也是可能的。) 项目地址 https://github.com/DioPong/Steganography 实现方法 库依赖 argparse:实现CLI方法,从控制台把内容填充到图片中。 os:获取图片路劲。 Pillow:实现对图片数据的操作。 实现思路 通过argparse模块,从控制台获取实现的方法是解码还是插入内容。 如果是插入内容,同时需要传入图片的路径,以及插入的内容;如果是解密,指定图片路径后输出图片隐藏的信息。 若加密: 传入图片,将图片各个值改为偶数,返回该副本, 将文本转为固定长度的二进制, 检查代码长度是否满足根据图片大小检查到的插入字符串最大合法长度,是则下一步,否则抛出异常, 将最低有效位为0的位置插入数据, 保存副本图片 解密: 逆向操作上过程即可。 实现操作 $ run in terminal python main.py [method] [args*] 加密 (decode) python main.py -e /home/picture/Steganographia.png "Nice, Steganographia!" 解密 (encode) python main.py -d /home/picture/Steganographia.png BUG 目前仅支持拥有RGBT四通道的图片(eg: PNG,SVG,etc),仅有三通道(RGB)的图片会报错(eg: JPG) 解决方法: 稍微改一下 encode 方法,支持三通道,追加预判别是三通道还是四通道。...

十二月 8, 2020 · Peng Cheong