为Conda环境下的命令编写Service文件

本文以用户dedfaf,运行ocr环境下的uvicorn main:app --host 0.0.0.0 --port 8001为例 首先找到conda的激活脚本位置,用需要执行的用户输入 conda info --base 例: /home/dedfaf/miniconda3,一般激活脚本位于/home/dedfaf/miniconda3/etc/profile.d/conda.sh 编写.service文件,按顺序执行激活和需要执行的命令即可 [Unit] Description=Nanonets-OCR-s for ocr service After=network.target [Service] Type=simple User=dedfaf WorkingDirectory=/home/dedfaf/OCRdeploy/ ExecStart=/bin/bash -c \ "source /home/dedfaf/miniconda3/etc/profile.d/conda.sh && \ conda activate ocr && \ uvicorn main:app --host 0.0.0.0 --port 8001" Restart=always RestartSec=5 [Install] WantedBy=multi-user.target

July 7, 2025

Hugo上传构建自动化

在上一篇搭建Hugo网站中,我们完成了静态网站的搭建。为了实现网站的持续更新,这一篇我们来实现编写-上传-构建-部署的自动化流程 由于hugo的构建和部署是分开的,因此可行的思路非常开阔。笔者将提供几种思路以供参考 首先,不建议使用hugo server部署至web端口或将web端口转发至hugo server的方式。hugo server仅为本地开发调试而设计,其默认行为不具备生产环境所需的安全性与性能优化 对博客的版本管理 无论使用什么方式,都建议对内容与配置进行版本管理。版本控制不仅有助于追踪修改历史、恢复误删内容,也便于多设备协作、自动化部署等操作。在本文我们使用git进行版本管理,其余的CVS工具可以使用类似的思路 在建立git仓库时,建议排除public/(或者仓库目录中你规定的其他输出路径(你为什么要这么干))目录。.gitignore中加入 public/ 本地部署 如果你的web服务就部署在本地,那么每次编辑完后手动构建一次目标目录即可 远程部署 本地构建 + 上传构建文件(不推荐) 当然,你可以选择本地build完后,上传publc/等输出仓库至服务器的方式。这也可以通过让git管理输出目录来完成上传的部分,思路和下文类似 本地上传修改 + 远程构建 先看需求:我们需要在完成编辑时,先将本地的修改上传,然后在远程自动触发一次构建,并且使用nginx等工具来运行web server。 能完成需求的思路都是好思路,这里提供两个 建立公共远程仓库,服务器同步并构建 graph LR A[本地] --push--> B(公共仓库) --pull--> C[Web Server] --build & run--> D([用户]) 笔者选择的方式,因此这部分个人的经验会多一些 首先选择一个公共的远程仓库,需要你的本地和服务器都可以访问到。笔者的服务器位于中国大陆且不想配置代理,因此将仓库建立在了自己托管的git平台上。接下来在服务器建立仓库并添加远程,过程不再赘述。 WebServer从公共仓库的同步也可以采取多种思路。最简单的方式就是规定时间自动拉取。笔者采用了当公共仓库的主分支变动时,向服务器发送一个Webhook并触发拉取和构建的流程,笔者团队托管的gitea自带发送Webhook的功能,这部分也可以用其他平台的类似服务代替。 Webhook的客户端,可以使用apt库中的webhook。为Webhook写一个配置文件, // hooks.json [ { "id": "DFSiteHook", "execute-command": "/home/dedfaf/DF-Site/build.sh", "command-working-directory": "/var/www/DF-Site", "response-message": "Hugo rebuild.", "trigger-rule": { "match": { "type": "value", "secret":"xxx", "value": "refs/heads/master", "parameter": { "source": "payload", "name": "ref" } } } } ] 令其接收到hooks后执行脚本 ...

July 7, 2025

搭建Hugo网站

Hugo是一个网站编译器,所负责的工作就是把你的内容(主要是md文件),用你规定的主题来构造一个静态网站。只需要把构建好的网站(一个文件夹)扔到web服务器上就可以被访问了 对于那些还拿不准使用哪种静态网站构建器的人,Hugo的优势在于构建速度最快,配置简单,主题较多。可以翻一翻Hugo主题库,只要有看上眼的选择Hugo不会有错 因此,部署Hugo的思路比较多样化: 在本地安装Hugo,在本地编写内容,构建网站后上传服务器 在服务器安装Hugo,在本地编写内容后上传内容,在服务器完成构建(当然在本地预览内容还是要在本地安装Hugo的) 如果方便访问服务器,直接在服务器编写构建也可以 如何维护Hugo,建立自动上传构建的流程,不在本文详解,参考Hugo上传构建自动化 安装Hugo https://gohugo.io/installation/ 根据你选择的思路在本地或远程安装hugo P.S. 笔者使用的Debian目前apt库中的Hugo版本较老,至少已经不支持我的主题了,建议在Release里找最新版安装 建站流程 非常建议参考Hugo Doc - QuickStart 创建项目 找个目录运行 hugo new site 网站名 [--format xxx.yaml] cd 网站名 git init hugo会建立一个网站的基本结构,可以用--format指定hugo的配置文件格式,配置文件需要大量填内容,所以选你熟悉的格式 几个重要的文件夹: content: 放置内容的地方,后续写的文章将放于此 static: 放置静态资源。这里的文件可以通过https://your.url/文件名来直接访问,可以拿来放网站的背景图等资源 public:放置构建后的网站。构建后将这个文件夹设为网站根目录网站就能运行 接下来需要安装主题,主题文件夹需要置于themes/中 先在https://themes.gohugo.io/找一个主题,然后 git clone:从主题仓库clone到themes/ 使用git submodule(推荐) 使用hugo module JUST PACK & DOWNLOAD A FKING .ZIP 推荐使用submodule的方式,因为方便管理(出错时更新和回退)主题的版本 git submodule add https://主题仓库.git themes/主题名 git submodule update --init --recursive P.S. 在clone仓库后,默认不会clone submodule中的文件,在部署至别处时需要注意 如果不熟悉submodule,就记住在需要更新主题时进入主题目录跑git pull就可以了,别忘记在外部git提交对子模块的更新。 另:对于经常爆改theme的人,可以适当性的考虑不使用子模块(因为需要频繁的在本地和远程更新子模块),只要明白自己在做什么(能自己解决问题),可以尝试由一整个git来管理 在配置文件(默认hugo.toml,或别的格式)中添加: ...

July 4, 2025

迁站

DF笑话之文没写几篇,先把站迁了。最终还是投入了hugo的怀抱 新站是用hugo构建的静态网站,主题是从PaperMod魔改了一份自己的版本PaperMod2C 迁站的主要目的是为了节省服务器的开销,静态站比较好迁移,对md语法支持更好,之后也可能直接部署到github pages上。以及这段时间的使用以来Ghost确实不适合我(或者说动态站的功能我也用不上),静态站也比较好维护本地的文件目录和进行版本管理,虽然之前用Code2Ghost实现了类似的效果,但还是hugo的可折腾性更痛快 (其实就是受不了每次写文都要md和html互转无数次) 新站在https://git.hana.im/dedfaf/DF-Site进行版本管理 后续准备更新一些部署该站的经验,大概能水几篇文(笑)

July 4, 2025

我们死在热情之前(节选)

本文节选前几天写的德育报告文中对于学术回顾的部分。那篇文章原标题是《如何毁掉当代大学生》,不过同学们一致认为太爆了,所以换了名字。那篇文章的主题大概就是吐槽人都对事物漠不关心导致世风日下之类的,有些幼稚,而且涉及的比较多,就不全放上来。 学术 我在大学期间学习了相当多的知识,但是众所周知,大学的学习包括课程,自己找的活和基于兴趣的自学。很不幸,课程内容占比极低。但是,既然是对大学生活的总结,我要总结这三年来的大学课程。 大学三年中,学校的课程总结,我将其归类为:大部分课程无效,部分必修课程有点拨作用,少部分课程有益,极少课程有用。同学们应该曾经听我吐槽过这句话“偌大一个985大学,竟教不出一门有用的课程”。我作为一名略有基础的计算机专业学生,只能对北理工的课程安排感到失望与绝望,在这种课程安排下学习的零基础学生,是绝不可能成为行业中能够拥有能力的人才的。 下面来以具体课程为例来讲解。 先来谈论一下明显为无效的课程:首先必须指出,我对类似工科制图,数学和物理的课程并不抵触,因为这些课程对于培养任何一名工科学生的(工程素养)都是非常必要的,尤其是工图和物理实验的课程,非常有助于学生理解熟悉工程的概念。非常可惜的是,这种对基础能力的培养也仅限于这些课程了,丝毫没有延续到更加重要的,真正的计算机科目的学习,这令我感到非常可悲。即使抛开以上,这些基础课程仍然是对未来的学习必要的。 无效课程,例如网络与通信、计算机组成与体系结构、物联网安全与隐私保护等。这些课程要么教授及其过时(上世纪)的内容,要么就是和其他的课程内容完全重叠,还有部分授课者水平完全不达标,完全没有学习的必要性。 有点拨作用的部分必修课程,特指大一和大二时期的部分编程课。这些课程的确可以算作对零基础学生的编程入门,但是就其实际的授课效果来看,收益及不理想。这些课程的内容主要以在乐学平台刷题为主(即俗称的刷OJ),高度依赖题库训练,缺乏系统讲解与原理梳理。换言之,这些课程是彻头彻尾的“应试教育”,只需要知道怎么做题,不需要掌握编程原理,不要求掌握问题建模、程序设计等基础思维,说句难听的话:这是我初中时被拉去打信息竞赛时做的事情,这也是我初期开始对大学授课产生怀疑的地方。而教授们普遍对学生实际水平不关心(这不能怪罪教授们,因为学生众多,不可能去具体考察每个学生的实际水平),但是可以明显看出,这些问题在很长的一段时间内都无人在意,许多OJ中有问题的题目甚至是10年甚至13,14年前的老题目,不知道有多少人曾和我一样对这些题目产生异议,但结果呢?我还在这种失败中上课,这就是结果。 有益的课程,可以大体分为三类。一种是内容有益,但技术细节太过过时,例如数据库课程,我非常认真的上完了该课程,但在之后的作业里,我发现该课程几乎只有理论部分仍在通用,而具体的技术早已更新迭代。我在和LTSlw同学开发后续课程的作业,需要使用除去MySQL以外的数据库时,才意识到学习的内容早已不再通用。另一种是内容有用,但过于空谈理论,不切实际。以“数字图像处理为”为例,同名的课程,我浙大的同学和我均上过,鲜明的对比令我留下深刻印象。浙大的课程,课上讲解理论,课下进行实操,在对图片的实验中理解算法理论,而我们的课程呢?几乎仅仅停留在了理论阶段,整个课程的作业和考试部分甚至没有出现任何一张图片,更无需谈论算法理论的实操了(番外:这门课程甚至不允许写题解博客,因为分数是从OJ里直接出的,要“防止作弊”,要知道这是一门“重在实践”类的课程,对于这种课,最最重要的就是彼此间对对方的问题进行经验的共享,这不仅是一种学习氛围,更是计算机学界近百年来得以流传和进步的关键,而这种有益的想法,却妄图要在极端压抑的氛围中被扼杀,令人心碎)。 而我们的作业长这样: 最后一种是拥有操作,但囫囵吞枣,重点不明,不考察技术实际水平。典型案例:小学期的Qt实践课程。没有课程内容,只有两周的时间自学并且搓一个所谓的“车载系统”。为了实现两周的时间让人自学Qt并且搓一个应用出来,这个“车载系统”里甚至只要求必须有个视频播放器和音频播放器。在最终的答辩打分环节,令所有人都诧异的事情是,车载功能全面完整并不能拿到高分,而是界面美观,“咋一看很唬人的”作业能够粉饰太平(亲眼所见:某对着黑屏部分表示“你想象一下这个部分长什么样”和切换功能需要把车熄火再打火的小组拿到了和我组不相上下的分数,而LTSlw同学的小组使用了Qt较新的qt quick,并且功能完善也获得了相同的分数。不禁令人怀疑授课者真的懂他教的东西吗)。并且这种课程往往设置一个装模做样的“互助打分系统”,让学生之间互相给出一个分数,作为最终分数的参考。稍微思考一下就会觉得可笑:2025年了,竞争如此激烈,这不是一个零和问题吗? 对于有用的课程,只能列出三个:操作系统(陆慧梅),安卓和web开发(均为金旭亮教授的课程)。因为只有这三门课程从技术的发展出发,在教授具体的技术的同时,鼓励用最新且通用的技术来完成实际的作业。可以说是我在大学中从大学学到东西最多的课程。 综上,BIT的课程设计,有如下非常显著的问题: 其一:课程安排极不合理。 来看看我们专业的教学计划吧,仅限计算机专业相关: 大一上:计算机基础 大一下:C语言程序设计 大二上:数据结构与算法设计,程序设计方法与实践,离散数学 大二下:数据库原理与设计,知识工程,网络与通信,数字逻辑 大三上:计算机专业基础实习(小学期),物联网应用系统开发与实践(小学期),操作系统,汇编语言与接口技术,计算机网络与工程 大三下:略 很明显就能发现一些问题: 计算机专业最重要,也是最难掌握的三门课程(操作系统,汇编语言,计算机网络),汇聚在了同一学期内。这种安排,不仅仅是在其他学校闻所未闻,更是在北理工其他专业都绝无二例的存在。尤其是计算机网络课程,作为大部分实操课程的前置课程,居然放到了大三上如此晚的一个时间点(我认为应该在大一下就学习),这也引出了接下来的问题。 部分课程前后矛盾,内容覆盖。以计算机网络为例,大部分同学在大一大二为了完成实践性的作业,基本都已经完成了对网络部分的学习。而教学安排上在大二下安排的网络与通信,恕我直言,完全是一门无意义的课程(参见上文)。 以上两个问题,仍可以算作是“不合理”的范畴,但接下来的问题,不只针对BIT,更是全国教育的通病,即完全没有对计算机素养方面的培养。来讲一个地狱笑话:《The Missing Semester of Your CS Education》。是的,我们的计算机教育没有任何关于计算机这些最基础的部分,相当于我们都没有告诉孩子怎么握笔写字,就开始让他刷题。name1110同学曾经吐槽我带过小组的一个留学生:“一个大学生,你别说会不会用Git了,你至少得知道GitHub吧,不然作业都没法抄”。是的,一个从985大学毕业的大学生,进入工作后大概第一要学的是这些。但这些东西真的需要大量时间来学吗?即便是看一下链接里的教程,不到一周就能掌握这些技巧,那么为什么不开设一门课程,不把这些内容汇总后让学生自习。我至今记得在安卓课程上,金教授苦口婆心的让学生们注意版本管理,即使不会Git,也要每天保存一份项目的压缩包(这个方法后来被我们戏称为金氏版本管理)。但到了安卓课程的最后答辩,有一个女学生却因为昨天能打开的项目今天打不开了而在教室哭。 其二:大部分授课者,对课程内容,教学的投入度和学生掌握情况毫不关心。 这并不是个例,而是我们在这三年内看到的普遍现象。数据结构与算法设计课上,主讲教授花了20分钟,用dev-c++(公认谁用谁傻逼的ide)写好了一个swap。知识工程课程中,主讲教授在课上只念公式,而作业中需要涉及的模型,轮子只字不提,更是在我们私信询问后,直到作业ddl过期才回复“作业已经过期了”。 这些教授或许在我们不为所知的学术方面有所成就,但是就教学方面来看,他们只是把学生当负担、讲台当义务、只知挂名授课,而毫无实际投入,只配得到愧为人师的评价。 比用技术当饭碗的畜生们更热爱技术,是一种痛苦。 其三:学术环境乌烟瘴气,严重学术不端现象屡见不鲜。 向远了说,在北理工亲亲教授的光头就能混个phD、把屁股撅起来让同性恋教授射进去就能怀孕生论文小宝宝。往近了说,来聊一个我们班众所周知的例子。 数字逻辑考试,形式为上机做41道选择题。暂且抛开为什么一门内容完全是设计电路系统的课程,考试内容没有主观设计题的问题。这门课程的考试系统由于一条“试题做完接着做下一道,不能回看”是完全混乱的。也导致我在考试中由于跳过了20道题(是的,我点一下就跳过去了)还不能回看直接少做了20道题,最后豪取58分的好成绩。这种考试系统的错误,我也尝试反馈过,但是结果是只能我自己承担。如果不是我发现了这个问题,那么下一年,下下年,总会有人遇到。直到前几天我重考这门考试时,还是那个考试系统,一点没改。反馈全部没用。哦对了,那场考试还有个拿手机请代考做题的人来着,我记得是叫安娜吧。 还有我前几天去考试还发现考场能连到宿舍的Rdp,顿时令我感到诚信就是一张保鲜膜,绝了! 权威和规则即便是谎言,也需要装模做样的掩饰虚伪,维持体面吧。 失去诚信的环境还没那么不可怕,而是管理者,实行者对一切的不关心,不作为,令当代一代人失去了对学术,对威权带来的秩序与规范,以及对社会规则的信任。

June 24, 2025

搭建RDP

最近有远程办公的需要,同时工作通勤距离较远,而且工作的笔记本必须用Windows系统,于是决定搭一个RDP工作站,能够随时连接远程桌面 准备RDP 在一切开始前,建议先了解关于OS中用户和会话的关系。在新版Windwos中,也支持多用户多会话的使用计算机,因此要先考虑好自己搭建远程桌面的目标是单会话还是多会话的,选择合适的RDP服务端 主要需要注意,在我的Windows10企业版中,自带的RDP只支持单会话操作,而大部分RDP服务端都是可以自行设置的 本文章只是本人的技术总结,仅供参考,务必根据自身情况选择合适的技术方案。 Linux 使用xrdp Windows 先查看Windows版本,在专业版及以上的Windows自带RDP服务器,在设置里打开即可 而家庭版的RDP服务是被毙掉的,因此就又到了和微软勾心斗角的环节。可以使用RDPwrap来绕过限制 RDPwrap安装比较简单,下最新release脚本一键装即可,之后开RDPConf.exe调设置,如果Listener state一直不是Listening,大概率是配置文件要更新(毕竟本体很多年没维护了) 在RDPwrap.ini中下载合适的版本然后替换掉原本的,Windows中默认位置为C:\Program Files\RDP Warp,注意每次Windows更新后,尽量检查是否仍然起效 无法替换?service.msc中暂停rdp服务 内网解析 有在内网远程访问主机的需要,但是主机可能随时启停,ip不固定,所以为其分配一个动态dns域名来随时解析至主机 使用ddns-go ddns-go在Windows上的部署很方便,能够单命令安装服务,有web端的配置界面,基本属于傻瓜操作 如何操作在ddns-go的文档中写的非常详细了,在此简单带过,不再赘述 在dns服务商注册apikey,保存好填入配置 我们需要拿到内网地址,获取ip的方式选通过网卡获取,找到对应内网ip的网关。域名填写apikey对应账号可以操控的域名,如果你的DNS服务商api不支持新注册域名解析,就先创建一个域名解析让ddns修改 也可直接编辑yaml。可以在有图形化配置的地方保存后导入。下给出一例: dnsconf: - name: "" ipv4: enable: true gettype: netInterface url: https://myip.ipip.net, https://ddns.oray.com/checkip, https://ip.3322.net, https://4.ipw.cn, https://v4.yinghualuo.cn/bejson netinterface: 以太网 cmd: "" domains: - omen.dedfaf.tech ipv6: enable: false gettype: netInterface url: https://speed.neu6.edu.cn/getIP.php, https://v6.ident.me, https://6.ipw.cn, https://v6.yinghualuo.cn/bejson netinterface: "" cmd: "" ipv6reg: "" domains: - "" dns: name: alidns id: secret: ttl: "" user: username: password: webhook: webhookurl: "" webhookrequestbody: "" webhookheaders: "" notallowwanaccess: true lang: zh 内网穿透 有外网远程访问主机的需要,使用frp将3389端口暴露至公网 ...

March 14, 2025

关于Code2Ghost

Github: https://github.com/dedfaf/Code2Ghost 这个项目源自于我搭完ghost后,发现其没有直接上传或者同步博客仓库的方法,也没有合适的上传工具,索性自己写一个VScode的上传插件 ghost的api功能相当强大,不过目前只用到了上传博客的功能。之后有精力的话,可以写一个在code里完全管理ghost的图形化插件 现在的进度直接看TODO吧 对本人而言,之前其实并没有写VScode插件的经验,这个项目也属于是学习项目,欢迎提出意见 原理 https://ghost.org/docs/admin-api/#creating-a-post 通过vscode插件api读取当前编辑器的内容,通过marked转换为html,通过正则判断<h1>获得标题,然后删去标题留下正文,打包上传api front-matter通过gray-matter读取 获得博文内容基本相反,拉下博文的html还有其他信息,通过turndown转换为md,再把需要的属性直接写成yaml填到front-matter里 目前的难点 / TODO 2025.2.25 这几天完成了 Get(拉取所有帖子,然后选择一个在编辑器打开) Update(将本地文件的内容推送到与本地文件front-matter中id对应的帖子) Sync(先读取本地文件front-matter中的id,然后用服务器上的文章覆盖本地(如果服务器与本地的updated_at不一致,即更新过)) 发布了0.1.0版本,自认为应该算是及格的编辑器了 今天才发现创建/更新后如果不同步全文,那么本地文件的图片路径仍是本地,每次都会上传一份图片,索性每次创建/更新后都直接Sync一遍.. 目前开学了比较忙,目前的进度已经完全足够我个人使用了。这个项目大概会放一段时间,暂时先看Ghost论坛里反响强不强吧 2025.2.24 目前基本完成了之前设想的功能 图片直接正常插入md,插件将自动解析上传并在正文中替换链接为ghost图床链接 标题、作者、标签可以通过markdown的front-matter来添加,同时也做了Get Post,修改然后Update这套流程相关的命令,怎么Update在仓库的README里已经写过了 接下来要做: 更好的标签栏管理,之后将尝试将本地文件与在线博文关联,实现自动更新等操作 一键编辑作者标签?不应该让end user直接碰yaml这种东西,毕竟不是谁都看过api文档。不过这个难度很大,考虑到能用我这个插件的估计也不会有小白,所以暂时先不弄? 或许之后有时间可以重写一下,直接将本插件做成ghost在VScode的客户端。不过这个项目作为在一个Ghost编辑器的功能性还是足够的(前提是没bug,等测试吧,对自己程序的鲁棒性完全没信心) 2025.1.26 上传图片,需要先通过ghost图片api上传ghost图床,然后在文章中引用 插件中只做了标题的确认,实际上作者,标签等都应该在上传时确认 更新,删除,发布文章 至于其他的功能,目前不在本插件的考虑范围内,理应直接在ghost后台操作

February 25, 2025

Ghost:添加目录栏

对于复杂的技术博文没有侧边目录栏基本看不下去,然而ghost并不自带目录栏功能,所以我们只能通过改主题文件来实现。 不过好在ghost的主题文件并不复杂,这里完全可以依照官方教程把代码粘贴进去就能用了,强烈建议先看官方教程。这篇博客主要讲解一些细节 官方教程:https://ghost.org/tutorials/adding-table-of-contents 我的博客主题修改自source,仓库:https://github.com/dedfaf/DF-Blog-Theme 教程讲解 官方教程使用了ToCBot来实现目录栏 可以用ghost install local安装本地测试环境,在其上修改后再push到生产环境 一些简单的样式调整 这里讲解一些官方教程操作完后的一些细节调整,也可以直接参考文末我的代码 默认展开所有目录 默认情况下,之后浏览到的目录只会展开当前标题的子标题,需要在脚本中加入 <script> tocbot.init({ // ... collapseDepth: 6, // ... }); </script> 去除序号前缀 脚本中加入 <script> tocbot.init({ // ... orderedList: false, // Ensures the list is not ordered // ... }); </script> 去除链接下划线 CSS: .toc-list .toc-list-item a { text-decoration: none; /* remove underline */ } 调整目录的位置 默认的目录位置是紧贴正文的,可以修改css中目录栏的上级.gh-sidebar的偏移量来调整目录的位置。我的目录原本在左侧紧贴正文,我将其向左偏移了px,仅供参考 @media (min-width: 1300px) { .gh-sidebar { position: absolute; top: 0; bottom: 0; margin-top: 4vmin; grid-column: wide-start / main-start; /* Place the TOC to the left of the content */ margin-left: -192px; /* add offset */ } .gh-toc { position: sticky; /* On larger screens, TOC will stay in the same spot on the page */ top: 4vmin; } } 个人最终生成的代码 请重点关注两个{{!– ToC –}}注释后的部分,其余的部分和casper的代码是一样的 ...

February 6, 2025