




[{"content":"这个人也许永远不会更新了，也许明天更新:)\n","date":"2026 April 1","externalUrl":null,"permalink":"/","section":"欢迎","summary":"","title":"欢迎","type":"page"},{"content":" ","date":"2026 April 1","externalUrl":null,"permalink":"/knowledge/","section":"知识","summary":"","title":"知识","type":"knowledge"},{"content":" 安装依赖 # 首先，安装依赖\ncargo add ndarray hdf5-metno 也可以直接在toml文件中添加\n代码 # use hdf5_metno::{File,Result}; use ndarray; fn main() -\u0026gt; Result\u0026lt;()\u0026gt; { let file = File::open(\u0026#34;data.hdf5\u0026#34;)?; let ds = file.dataset(\u0026#34;data\u0026#34;)?; println!(\u0026#34;shape: {:?}\u0026#34;,ds.shape()); println!(\u0026#34;ndim: {}\u0026#34;, ds.ndim()); println!(\u0026#34;size: {}\u0026#34;,ds.size()); let attribute = ds.attr_names()?; println!(\u0026#34;attr: {:?}\u0026#34;, attribute); let dtype: hdf5_metno::Datatype = ds.dtype()?; println!(\u0026#34;dtype: {:?}\u0026#34;, dtype.id()); //这里的i32和Dim里的3分别对应数据的格式和维度数，其中3对应上面的ndim let info = ds.read::\u0026lt;i32, ndarray::Dim\u0026lt;[usize; 3]\u0026gt;\u0026gt;()?; println!(\u0026#34;{:?}\u0026#34;,info); Ok(()) } 输出 # shape: [478, 12, 5000] ndim: 3 size: 28680000 attr: [] dtype: 216172782113783908 [[[16, 8, 11, 13, 11, ..., 22, 26, 28, 22, 24], [19, 8, 4, 6, 15, ..., 30, 28, 32, 28, 24], [3, 0, -7, -7, 4, ..., 8, 2, 4, 6, 0], [-18, -8, -8, -10, -13, ..., -25, -26, -29, -24, -24], [7, 4, 9, 10, 4, ..., 7, 12, 12, 8, 12], ..., [-7, -10, -8, -6, -6, ..., -4, -6, -6, -7, -10], [1, -2, -1, 2, 2, ..., -1, -4, -3, -3, -7], [7, 3, 4, 6, 5, ..., 18, 15, 16, 16, 14], [17, 12, 13, 14, 13, ..., 36, 33, 33, 32, 31], [18, 13, 14, 15, 15, ..., 34, 34, 35, 34, 33]], ..., [[-23, -24, -27, -23, -20, ..., 16, 12, 13, 14, 14], [-16, -16, -17, -16, -15, ..., 17, 16, 12, 11, 13], [8, 9, 11, 8, 6, ..., 1, 5, 0, -2, -1], [21, 21, 23, 21, 19, ..., -15, -13, -11, -11, -13], [-15, -16, -18, -15, -12, ..., 8, 4, 7, 9, 8], ..., [-11, -13, -12, -11, -9, ..., 41, 42, 38, 30, 27], [53, 53, 55, 56, 55, ..., -5, -4, -9, -11, -12], [-9, -8, -7, -8, -9, ..., 21, 21, 20, 17, 19], [-8, -7, -6, -6, -6, ..., 28, 29, 29, 27, 28], [2, 3, 3, 2, 1, ..., 15, 16, 18, 15, 15]]], shape=[478, 12, 5000], strides=[60000, 5000, 1], layout=Cc (0x5), const ndim=3 参考 # https://stackoverflow.com/questions/78163086/how-do-i-use-rust-to-read-a-hdf5-string-attribute-of-a-dataset-using-the-hdf5-ru\nhttps://docs.rs/hdf5-metno/latest/hdf5_metno/\n","date":"2024 September 29","externalUrl":null,"permalink":"/knowledge/2024/dl-in-rust/how-to-read-hdf5/","section":"知识","summary":"","title":"Rust读取HDF5","type":"knowledge"},{"content":"","date":"2024 September 29","externalUrl":null,"permalink":"/series/rust%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/","section":"Series","summary":"","title":"Rust深度学习","type":"series"},{"content":"","date":"2024 September 29","externalUrl":null,"permalink":"/series/","section":"Series","summary":"","title":"Series","type":"series"},{"content":" matio-rs看起来已经很久没更新了，并且在安装了hdf5库的情况下无法完成编译 安装依赖 # 首先，安装依赖\ncargo add ndarray matio-rs 也可以直接在toml文件中添加\n.mat源文件 # 使用python的scipy读取，结果为\n{\u0026#39;__header__\u0026#39;: b\u0026#39;MATLAB 5.0 MAT-file Platform: nt, Created on: Mon May 20 17:00:23 2024\u0026#39;, \u0026#39;__version__\u0026#39;: \u0026#39;1.0\u0026#39;, \u0026#39;__globals__\u0026#39;: [], \u0026#39;name\u0026#39;: array([[1145]], dtype=int32), \u0026#39;age\u0026#39;: array([[14]], dtype=int32), \u0026#39;data\u0026#39;: array([[-23, -24, -27, ..., 13, 14, 14], [-16, -16, -17, ..., 12, 11, 13], [ 8, 9, 11, ..., 0, -2, -1], ..., [ -9, -8, -7, ..., 20, 17, 19], [ -8, -7, -6, ..., 29, 27, 28], [ 2, 3, 3, ..., 18, 15, 15]], dtype=int32), \u0026#39;label\u0026#39;: array([[7]], dtype=int32)} 使用matio-rs读取.mat文件 # use ndarray::prelude::*; use matio_rs::{MatFile, Mat, MatioError, MatFileRead}; fn main() -\u0026gt; Result\u0026lt;(),MatioError\u0026gt; { let mat_path = \u0026#34;xxx.mat\u0026#34;; let mat_file: MatFileRead = matio_rs::MatFile::load(mat_path)?; // Returns the list of variables within a MatFile mat_file.info(); // Read the var let mat_age: Vec\u0026lt;i32\u0026gt; = mat_file.var(\u0026#34;data\u0026#34;)?; // To ndarray let array1 = ndarray::Array::from_shape_vec((12,5000), mat_age); println!(\u0026#34;\\n{:?}\u0026#34;,array1); Ok(()) } Output:\nMatlab var.: \u0026#34;name\u0026#34; with dims: [1, 1] Matlab var.: \u0026#34;age\u0026#34; with dims: [1, 1] Matlab var.: \u0026#34;data\u0026#34; with dims: [12, 5000] Matlab var.: \u0026#34;label\u0026#34; with dims: [1, 1] Ok([[-23, -16, 8, 21, -15, ..., 4, -13, 10, 14, -19], [-19, 8, 3, -4, -9, ..., -4, -5, -4, 2, 5], [-3, -1, 10, -1, -34, ..., 24, 2, -11, -15, 14], [-6, -9, -3, 8, -1, ..., -15, 8, 8, -21, 39], [35, 14, 13, -19, 16, ..., 1, -6, -5, 1, 6], ..., [-9, -9, -16, -31, -11, ..., 18, 21, 7, -14, -14], [18, -3, -10, -19, -2, ..., -11, -17, -13, -12, -4], [-9, -9, 1, 10, -4, ..., -7, 14, -6, -14, -8], [-34, -5, -4, -9, 13, ..., -5, -13, -19, -5, 17], [-3, -12, 21, -20, 35, ..., 27, -12, 19, 28, 15]], shape=[12, 5000], strides=[5000, 1], layout=Cc (0x5), const ndim=2) 参考 # https://docs.rs/matio-rs/latest/matio_rs/index.html https://www.cnblogs.com/mxnote/articles/17459015.html https://github.com/rust-ndarray/ndarray/tree/master/examples ","date":"2024 September 18","externalUrl":null,"permalink":"/knowledge/2024/dl-in-rust/how-to-read-mat/","section":"知识","summary":"","title":"Rust读取.mat文件并存入多维数组变量","type":"knowledge"},{"content":" 个人情况 # 出身：天津末流双一流，专业和AI、电子信息、计算机都沾点，因此不算太跨(学校介绍册里说这是个医学专业，雨露均沾了属于是) GPA：3.74/4 科研/项目经历：一篇SCI三作，一个不知名国一，均和深度学习相关 英语：TOEIC 865 日语：无 时间线(大四开学后开始准备) # 2023.9 由于保研过程中发生了一些不愉快的事，深感失望，遂决定出国看看 2023.10 考托业。当时比较狂妄，啥也没准备就去了，甚至题型都不知道是啥，考了650+(个人四六级参考：四级568，六级531)，狠狠爆了波金币 2023.12 痛定思痛，买了一组新东方的TOEIC指导书。最后也没全都做完，但是听力书一本下来提升显著，第二次TOEIC考了865，但主要还是听力拖后腿 经验：别的不清楚，但是新东方的TOEIC听力书确实有用 -2024.4 在家边摆烂边做毕设 2024.4 NAIST预申请系统开启，填写预申请信息 外国出愿需要在报名前两个月完成预申请流程 2024.4 获得Reception Number后，联系教授。和教授来回发了几封邮件(英語で)，获得了内诺 2024.5 回校准备毕设答辩+毕业 2024.6 NAIST报名系统开始前一天晚上才开始写小论文，幸好项目存货够多，但也匆匆忙忙才赶出来，在报名截止前一天晚上提交了 NAIST官网上可以找到Word模板，提前准备，不要等到报名时才写小论文 我小论文写了一页过去做的项目，一页未来研究计划 我用英文写的，日语只会动漫台词:( 建议：尽量多用图，因为面试时可能教授可能需要根据你的小论文快速了解你做了/想做什么东西，用图表直观展现出来比较好，比如流程图之类 交上去之后才发现有个图有点小错误，只能将错就错了。不要学我，应当提前准备 2024.6 报名NAIST和京大社情 2024.7 NAIST线上面试(英語で) 2024.8 京大更新 # 2024.8.4 上海飞大阪。没有提前兑换现金，好在可以直接在人工窗口用信用卡购买电车票。到天下茶屋后，改札附近有个ATM机，取一些日元现金，然后在对面的机器上弄一张ICOCA卡，电车公交都能用，很方便，后面直奔京都。 2024.8.6 早上九点坐公交车往考场赶，正好09.45左右到达考场。以摆烂的心态考完了两场，题目感觉都很常规，奈何自己太懒，没有全方位背诵，很多名词解释只能瞎编，感觉要寄。如果能踏踏实实过一遍专业课和基础课，题目都是可以写出来的。个人感觉专业课倒是挺简单，有很多人提前交卷，而基础课较有难度，大家都到最后一刻才交卷。教训：专业课300分背书就能拿，且背且珍惜。 2024.8.7 除了缺考的其他都进面试，本人面试顺序大概在66/80，入43人，感觉没戏，一上午坐教室里摆烂，中午直接溜了，修考至此结束。 NAIST入试相关 # 根据网上的资料，成绩组成为\n小论文+面试(90)，书类审查(50)，英语成绩(30)，数学笔试(30)\n进入会议后，会先问是否并愿，第一选择之类的，如实回答，然后告知注意事项(应该是)，英语单词大部分没听懂\n经过一段时间的等待后，正式开始，会先让你做两道简单的数学题，然后进入真正的面试环节。面试前几天做了些NAIST过去问，github上可以找到，这里就不贴了，事实证明并没有什么用\n笔试部分 # 一题线代和一题微积分(日本的微积分就是中国的高数)。我先是扫了一眼，发现线代不好对付，所以先做了微积分。\n微积分很简单，复合函数求导，不需要脑子。\n线代两判断题，和什么面，子空间相关，大脑一片空白。考官尝试教我怎么做，可惜我听不懂那些英文词汇，于是在尴尬中结束了笔试部分(感谢優しい考官さん)。\n面试部分 # 三名老师，一志愿教授坐在中间。并没有问一些十分技术相关的问题，以下是大致内容：\n两分钟介绍一下你的小论文 你之前做的项目是关于xxx的，为什么要转来研究xxx？ 你想做的东西的创新点是什么？ 和现有的xxx比起来，有什么优势？ 本以为会问一些专业词汇和算法之类，对这些根本的问题大意了，答的并不是很好，面试结束之后一度感到要寄\n结果 # 合格者发表，找到了自己的考号。感谢S教授\n根据合格情况，这次情报学日语入试大概是135+进98，英语入试大概是20+进12(或许也有内诺提前筛了一部分)\n更新 成绩可以查询了，得分168/200，合格线是124\n其它想说的 # 考完了社情，深感后悔。总体难度是不大的，各位一定不要拿到保底后就开始摆烂😭 ","date":"2024 July 18","externalUrl":null,"permalink":"/life/2024/naist_admission/","section":"生活","summary":"","title":"NAIST情報科学+旅游签京大社情 修考经历记录","type":"life"},{"content":" ","date":"2024 July 18","externalUrl":null,"permalink":"/life/","section":"生活","summary":"","title":"生活","type":"life"},{"content":"","date":"2024 July 9","externalUrl":null,"permalink":"/categories/","section":"Categories","summary":"","title":"Categories","type":"categories"},{"content":"","date":"2024 July 9","externalUrl":null,"permalink":"/tags/","section":"Tags","summary":"","title":"Tags","type":"tags"},{"content":"手里头的当贝H2已经闲置一两年了，最近研究了下怎么对其进行废物利用。这个盒子处理器为S912，在GitHub上有相关的Openwrt和Armbian项目，可以直接使用其已经制作完成的镜像进行刷机。\n然而，这些项目的设备支持列表里均没有当贝H2。但这并不意味着当贝H2无法刷机，可以强行刷上，但可能会遇到一些兼容性问题。对于Openwrt，我将其从盒子中启动，但其无论如何也不能连接到我的网络，即便我用USB转的RJ45的口直接连接到我的电脑，也因此无法访问Openwrt的控制台，无法使用。但万幸的是，Armbian基本可用。 需要额外USB扩展。当贝H2只有一个USB口，没有网口，需要自行购买一个USB转USB+RJ45的转接器。 无法使用内置WiFi。 准备 # 从GitHub上下载Armbian最新系统固件，选择不带后缀的，或者后缀为斐讯T1的，内核版本选择最新的即可。举个例子：Armbian_24.8.0_amlogic_s912_bookworm_6.6.36_server_2024.07.05.img.gz。 下载Rufus或其它工具，将固件写入至U盘。 准备好盒子，和一根较细的棒状物，使其能够按住盒子AV口底部的按钮。(按钮按住和放开的声音很清脆，多试几次就知道手感了) USB转USB+RJ45的转接器 刷入固件 # 断开盒子电源，U盘和网线分别插入转接器的USB口和网口。网口另一端可连路由器 抵住AV口底部按钮，不要松开 插入盒子电源后，一直抵住按钮至少5秒以上后松开 登录路由器后台，查看盒子IP。然后打开终端工具，这里Windows 11可以使用自带的PowerShell，使用SSH连接至Armbian终端，默认用户名密码为root，1234 ssh root@192.168.x.xxx 输入指令armbian-install，将固件刷入至盒子内部。设备型号选择Phicomm-T1 这将覆盖盒子原本的固件，数据都会丢失 写入完成后，拔出U盘，重启盒子 此后更新固件使用armbian-update指令 正常使用 # 使用同样的方法连接至Armbian的终端，开始搞一些有的没的\napt update apt upgrade 其他说明 # 型号选择斐讯T1是因为我发现斐讯T1的配置和当贝H2很像，但是其它型号我并没有调查过或尝试过，或许有更好的选择 在我没买USB转USB+RJ45之前，我只有USB转USB*2，这时我用手机的USB共享网络功能，发现盒子可以成功联网 我还尝试过使用HDMI转RJ45口，然后连接到路由器。但这么做盒子并不能识别。看来传递的依然只能是HDMI信号 ","date":"2024 July 9","externalUrl":null,"permalink":"/knowledge/2024/dbh2_armbian/","section":"知识","summary":"","title":"当贝H2刷Armbian固件","type":"knowledge"},{"content":"","date":"2024 July 9","externalUrl":null,"permalink":"/categories/%E6%8A%80%E6%9C%AF/","section":"Categories","summary":"","title":"技术","type":"categories"},{"content":"","date":"2024 July 9","externalUrl":null,"permalink":"/tags/%E6%8A%98%E8%85%BE/","section":"Tags","summary":"","title":"折腾","type":"tags"},{"content":"","date":"2024 July 3","externalUrl":null,"permalink":"/authors/","section":"Authors","summary":"","title":"Authors","type":"authors"},{"content":"","date":"2024 July 3","externalUrl":null,"permalink":"/authors/guugen/","section":"Authors","summary":"","title":"Guugen","type":"authors"},{"content":"Nintendo 万歳！ ","date":"2024 July 3","externalUrl":null,"permalink":"/life/2024/nintendo_banzai_graduate_time/","section":"生活","summary":"","title":"来自任天堂信者的消息","type":"life"},{"content":"","date":"2024 July 3","externalUrl":null,"permalink":"/categories/%E7%94%9F%E6%B4%BB/","section":"Categories","summary":"","title":"生活","type":"categories"},{"content":"","date":"2024 June 28","externalUrl":null,"permalink":"/ja/series/remote-access/","section":"Series","summary":"","title":"Remote Access","type":"series"},{"content":"","date":"2024 June 28","externalUrl":null,"permalink":"/ja/categories/tech/","section":"Categories","summary":"","title":"Tech","type":"categories"},{"content":"","date":"2024 June 28","externalUrl":null,"permalink":"/tags/windows/","section":"Tags","summary":"","title":"Windows","type":"tags"},{"content":" 开始之前 # 串流客户端设备应当\n屏幕不小 有键盘和鼠标 这样才会有比较好的体验\n1. 安装Sunshine # 服务端 Sunshine # 没啥好说的，从GitHub上下载最新版安装包\n客户端 Moonlight # 没啥好说的，从官网下载最新版安装包\n2. 虚拟显示器 # 如果不使用虚拟显示器，在串流时物理显示器也会同步显示，并且只能根据物理显示器选择分辨率和刷新率。\n下载VDD驱动 # 从GitHub仓库上下载最新Virtual Display Driver程序，这里建议选择no HDR版本，相信不会有人用远程桌面串流HDR内容。\n配置VDD驱动 # 打开解压后得到的option.txt文件，添加自定义分辨率和刷新率。这里推荐按照要运行的Moonlight客户端的设备的分辨率和刷新率填写，比如，笔者用平板进行串流，就把平板的分辨率和刷新率填写了进去 将option.txt复制到C:\\IddSampleDriver\\option.txt 以管理员权限运行*.bat以安装证书 打开设备管理器，点击任意设备，然后点击操作，选择添加过时硬件 安装我手动从列表选择的硬件，选择显示适配器，下一页，从磁盘安装，选择解压后得到的.inf文件 Download the latest version from the releases page, and extract the contents to a folder. Copy option.txt to C:\\IddSampleDriver\\option.txt before installing the driver (important!). Right click and run the *.bat file as an Administrator to add the driver certificate as a trusted root certificate. Don\u0026rsquo;t install the inf. Open device manager, click on any device, then click on the \u0026ldquo;Action\u0026rdquo; menu and click \u0026ldquo;Add Legacy Hardware\u0026rdquo;. Select \u0026ldquo;Add hardware from a list (Advanced)\u0026rdquo; and then select Display adapters Click \u0026ldquo;Have Disk\u0026hellip;\u0026rdquo; and click the \u0026ldquo;Browse\u0026hellip;\u0026rdquo; button. Navigate to the extracted files and select the inf file. You are done! Go to display settings to customize the resolution of the additional displays. These displays show up in Sunshine, your Oculus or VR settings, and should be able to be streamed from. You can enable/disable the display adapter to toggle the monitors. Ps. Make sure that options.txt is accesible for the system at C:\\IddSampleDriver\\option.txt or the installation will fail.\n3. 配置Sunshine # 如果您已经安装了Sunshine，那么托盘中应当已经出现Sunshine图标。右键Sunshine图标，点击Open Sunshine(如果是首次安装，可能会需要您设置用户名密码)。点击配置(Configuration)，在命令准备工作(Command Preparations)中按顺序填入以下内容\nconfig.do_cmd config.undo_cmd 说明 rundll32 user32.dll,LockWorkStation 退出串流时，锁定电脑 DisplaySwitch /external DisplaySwitch /internal 开启串流时，将显示器切换为刚刚配置的虚拟显示器；退出串流时，切换为原来的显示器 点击 保存(Save) 应用(Apply)\n4. 开启愉悦的偷税时光 # 使用Moonlight连接到Sunshine主机(首次连接需要先进行PIN配对)，开启愉悦的偷税时光吧。如果您的网络环境支持IPv6，那么您无需内网穿透，配合WakeOnLan，可以优雅地实现远程办公甚至游戏。\n","date":"2024 June 28","externalUrl":null,"permalink":"/knowledge/2024/remote_access/windows_remote_desktop/","section":"知识","summary":"","title":"使用Sunshine优雅地对Windows桌面进行串流","type":"knowledge"},{"content":"","date":"2024 June 28","externalUrl":null,"permalink":"/series/%E8%BF%9C%E7%A8%8B%E5%8A%9E%E5%85%AC/","section":"Series","summary":"","title":"远程办公","type":"series"},{"content":"","date":"2024 June 27","externalUrl":null,"permalink":"/tags/linux/","section":"Tags","summary":"","title":"Linux","type":"tags"},{"content":"云服务器太贵了，小主机也买不起？来看看我的！ 需要您拥有最新的Windows系统和配套的WSL2，并且主板支持WakeOnLan，并且主机拥有广域IPv6地址。 1. 开启WSL2镜像模式 # 在windows系统的用户目录下创建.wslconfig文件，配置内容如下\n[wsl2] networkingMode=mirrored\t# 端口自动转发，Windows和WSL共享端口，都使用127.0.0.1 dnsTunneling=true\t# WSL的DNS请求通过Windows转发 firewall=true\t# WSL同步Windows防火墙规则 autoProxy=true\t# Windows设置代理时自动同步给WSL [experimental] # sparseVhd = true # 自动清理磁盘空间 autoMemoryReclaim=gradual # 可以在gradual 、dropcache 、disabled之间选择，开启会造成WSL中Docker启动异常 最重要的是networkingMode=mirrored，如此配置，wsl2的ipv6地址也将和windows主机的一致。\n2. 配置WSL2 SSH Server # sudo nvim /etc/ssh/sshd_config\n可能需要将Port修改为其它非22端口(运营商可能会默认封掉家用宽带的这些端口)\n一些关键配置:\n# 监听IPv6请求 ListenAddress :: # 直接使用密钥登录 PubkeyAuthentication yes # 禁用密码登录 PasswordAuthentication no 之后，配置~/.ssh/authorized_keys，将SSH客户端的公钥按行存入其中即可。\n3. 配置Windows防火墙 # 高级安全 Windows Defender 防火墙-\u0026gt;入站规则-\u0026gt;新建规则-\u0026gt;端口，允许你所使用的端口的TCP连接。\n4. 配置WSL2开机启动(无需用户登录) # In Windows System\n任务计划器-\u0026gt;创建任务-\u0026gt;√不管用户是否登录都要运行 触发器-\u0026gt;新建-\u0026gt;启动时-\u0026gt;确定 操作-\u0026gt;新建-\u0026gt;程序或脚本选择wsl.exe(通常在C:\\Program Files\\WSL\\wsl.exe) 条件-\u0026gt;所有选项取消勾选 设置-\u0026gt;除允许按需执行任务外，其它全部取消勾选 完成 5. 配置 DDNS # 笔者这里域名用的Cloudflare托管，所以选择cloudflare-ddns这个项目。 一定记得配置DDNS，否则一旦ipv6改变，主机不在身边就会直接失联。\n6. 其它优化建议 # Windows可以搭配Sunshine和与其配套的Moonlight进行串流，外出再也不需要带笔记本了。笔者使用Android平板进行串流实测体验超乎意料的好。\n参考资料 # https://www.ryanshang.com/2024/01/06/WSL2%E8%AE%BE%E7%BD%AE%E9%95%9C%E5%83%8F%E7%BD%91%E7%BB%9C%E6%A8%A1%E5%BC%8F/ https://www.sjdhome.com/blog/post/wsl2-auto-start/\n","date":"2024 June 27","externalUrl":null,"permalink":"/knowledge/2024/remote_access/wsl2_autostart/","section":"知识","summary":"","title":"让WSL2化身远程主机","type":"knowledge"},{"content":"","date":"2024 May 26","externalUrl":null,"permalink":"/ja/categories/life/","section":"Categories","summary":"","title":"Life","type":"categories"},{"content":"","date":"2024 May 26","externalUrl":null,"permalink":"/ja/tags/photo/","section":"Tags","summary":"","title":"Photo","type":"tags"},{"content":"","date":"2024 May 26","externalUrl":null,"permalink":"/authors/xiaoyueza/","section":"Authors","summary":"","title":"Xiaoyueza","type":"authors"},{"content":"","date":"2024 May 26","externalUrl":null,"permalink":"/tags/%E6%91%84%E5%BD%B1/","section":"Tags","summary":"","title":"摄影","type":"tags"},{"content":"Followings are photo by xiaoyueza by Sony α6000 with Sony E18-135 **警告！**未经许可禁止商用 长城 # 野山 # 野花 # 野拍 # ","date":"2024 May 26","externalUrl":null,"permalink":"/life/2024/photo_share_graduate_time/","section":"生活","summary":"","title":"索尼佬出去拍妹子了","type":"life"},{"content":" 前几天发了一个termux安装archlinux和vscode的文章，其最终实现效果并不理想。然而，笔者最近又仔细研究了一下，发现了更好的利用termux的方法\u0026ndash;使用termux原生的软件生态。同时，如果Android设备已经取得了Root权限，则还有更好的方案，但在这里笔者先不剧透。\n注 请从Github上下载Termux安装包\n1. 开启新世界 # Termux的包管理系统是debian系的apt的二次封装，但只拥有很少的官方包可供安装。但是，可以通过安装tur-repo来获取用户社区维护的包(类似于Archlinux的AUR，Termux叫TUR)。\npkg update pkg install tur-repo x11-repo root-repo 2. 配置开发环境 # 现在，我们可以安装的程序大大增加。是时候发挥想象，配置自己的Termux开发环境了。但首先，安装一些基本工具:\npkg install neovim git curl wget lsd 访问外置存储 # 授予Storage访问权限:\ntermux-setup-storage 之后访问~/storage即可访问Android的内部存储。也可以直接使用cd /storage/emulated/0访问内部储存。\n如果插有SD卡，则可以直接使用cd /sdcard访问SD卡。您可以直接为这两个路径创建软链接，以快速访问。\nln -s /sdcard ~/sdcard 更新 注 不同品牌的Android系统可能会有不同的路径，笔者这里的三星平板SD卡在/storage/\u0026lt;SD卡ID\u0026gt;，具体可以使用Root Explorer APP进行搜寻。\nTermux终端美化 # zim可以代替oh-my-zsh，但在Termux上并没有oh-my-zsh省心。\npkg install zsh # 安装zim curl -fsSL https://raw.githubusercontent.com/zimfw/install/master/install.zsh | zsh 安装powerlevel10k主题，添加 zmodule romkatv/powerlevel10k --use degit 到 ~/.zimrc，同时，注释掉位于.zimrc的zmodule zsh-users/zsh-syntax-highlighting(笔者这里不注释掉会出警告，猜测为Termux没有对应的软件包)，\n更新 修改 ~/.zim/modules/completion/init.zsh文件：\n... if [[ ${glob_case_sensitivity} == sensitive ]]; then setopt CASE_GLOB else # 👇注释掉这行 # setopt NO_CASE_GLOB fi ... completion插件便可正常加载。 然后运行 zimfw install。 想要重新配置p10k主题，可以运行 p10k configure。\n美化ls指令: 更改.zshrc，添加alias ls=lsd。\nGoogle Cloud CLI # pkg install wget curl which curl https://sdk.cloud.google.com | bash # to login gcloud auth login 安装各种编程语言和工具 # 这里列出几个比较常见的。\nPython3 # pkg install python3 python-pip go # pkg install golang # 查看go版本 go version rust # pkg install rust C, C++ # pkg install clang nginx # 由于目前已经普及了ipv6，所以可以通过ipv6直接访问您的平板上的Web服务。但注意不要使用80、8080、443等端口，这些端口国内宽带运营商默认封锁。\npkg install nginx 注 /etc 位于 /data/data/com.termux/files/usr/etc，可直接在~目录中cd ../usr访问。\nhugo # pkg install hugo hugo version 在Termux环境内可以使用hugo开发静态网页，并且可以直接在Android系统的浏览器中输入 http://localhost:1313 访问。\ncode-server # pkg install code-server 配置code-server\nnvim ~/.config/code-server/config.yaml 笔者建议将这里的auth改为none，这样不需要密码就可以直接浏览器进入vscode了。 运行code-server:\ncode-server 最后，在Android系统中打开浏览器，访问 http://localhost:8080 即可进入vscode。实测体验比spck 代码器好很多，最重要的是这个有内置终端，但遗憾的是依然有很多插件无法使用。\n图形界面 - xfce4 # 首先，需要在Android系统安装Termux-X11 APP，可在这里下载对应apk，您通常应当选择arm64版本。\n然后，在Termux终端上安装下列软件包:\npkg install x11-repo termux-x11-nightly pulseaudio xfce4 运行下行指令进入桌面:\ntermux-x11 :1 -xstartup \u0026#34;dbus-launch --exit-with-session xfce4-session\u0026#34; 同时，您可以参考这里 在配置完成后，您可以安装一些主题和字体，美化您的xfce4桌面。具体可参考下面的视频: 图形界面的vscode - code-oss # 这个可以装很多插件，但是笔者这里试了，装了ssh-remote插件，但没法加载出来。\npkg install code-oss 3. 运行Windows程序 # 可以尝试使用Wine或者Mobox对Windows程序进行转译运行。貌似骁龙8gen2已经可以转译运行一些几年前的PC游戏，但是笔者认为这个只能图一乐，直接使用Android APP或者arm64原生应用已经足够。\n最后 # Termux可以给想入门Linux的各位同学一个良好的机会，对于已经熟悉Linux的且对Android平板生产力有期待的同学，也不妨一试。\n","date":"2024 May 25","externalUrl":null,"permalink":"/knowledge/2024/termux_native_dev/","section":"知识","summary":"","title":"Android Termux Native 开发环境配置 — 你的下一台轻薄本何必是轻薄本","type":"knowledge"},{"content":"","date":"2024 May 25","externalUrl":null,"permalink":"/ja/categories/%E6%8A%80%E8%A1%93/","section":"Categories","summary":"","title":"技術","type":"categories"},{"content":"","date":"2024 May 24","externalUrl":null,"permalink":"/ja/series/google-cloud-%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%83%96%E3%83%AD%E3%82%B0%E3%82%92%E3%83%9B%E3%82%B9%E3%83%88%E3%81%99%E3%82%8B/","section":"Series","summary":"","title":"Google Cloud を使用してブログをホストする","type":"series"},{"content":"","date":"24 May 2024","externalUrl":null,"permalink":"/en/series/using-google-cloud-to-host-my-blog/","section":"Series","summary":"","title":"Using Google Cloud to Host My Blog","type":"series"},{"content":" (用的三星TabS9FE+，开了DEX模式很给力)\n最近，由于电脑不在身边，更新博客很是麻烦，需要用ssh连接到位于我卧室的电脑，并且用远程桌面或者vim之类的进行编辑，然后hugo deploy。所以，我决定想出一个更好的解决办法。\nAndroid平板用来编辑markdown绰绰有余，所以我一开始是想用vscode，然而，codeserver和termux上的vscode并不好用。就在这时，我在Google Play发现了一个好用的代码编辑器，名为Spck 代码器。这个编辑器写markdown足够，并且还支持git操作，实属方便。于是，问题便在于如何运行hugo --minify \u0026amp;\u0026amp; hugo deploy。\n运行这个指令需要有完整的linux环境，并安装了最新版本的hugo和google-cloud-cli，这在termux或code-server上都不可能实现(更新 可以实现)。于是，我把目光转向了 Github Actions。现在发现，这玩意真是神器😍。\n创建 Github Actions # 进入本项目代码仓库网页，选择Actions，新建workflow\nname: hugo auto deploy # 什么时候触发 action on: push: branches: [ main ] # 任务的准备，用 ubuntu最新的环境 jobs: setup-deploy: name: Setup and Deploy runs-on: ubuntu-latest permissions: contents: \u0026#39;read\u0026#39; id-token: \u0026#39;write\u0026#39; steps: # 检出main分支的代码 checkout - name: Checkout uses: actions/checkout@v4 with: submodules: true - name: \u0026#34;google-cloud-login\u0026#34; uses: \u0026#39;google-github-actions/auth@v2\u0026#39; with: credentials_json: \u0026#39;${{ secrets.GOOGLE_CREDENTIALS }}\u0026#39; - name: \u0026#34;setup cloud sdk\u0026#34; uses: \u0026#39;google-github-actions/setup-gcloud@v2\u0026#39; # 准备hugo环境 # hugo ready \u0026amp; build - name: Setup Hugo uses: peaceiris/actions-hugo@v3 # hugo 编译部署 - run: hugo --minify - run: hugo deploy 之后，随便修改点内容，并进行git push，在网页端仓库的Actions页面下查看日志。\n配置Google Cloud # 如果您刚刚直接触发了Actions，那么不出意外日志里会报错。现在，让我们逐步修复错误。\n生成Google Cloud服务密钥 # 打开Google Cloud控制台，进入IAM和管理，选择服务帐号，并创建新服务帐号 输入服务帐号名称，可以填github-actions，服务帐号ID会自动生成，点击创建并继续。创建完毕后，选择刚刚创建的帐号，并选择管理密钥 选择添加密钥，创建新密钥，并选择JSON格式。之后，会得到一个JSON文件，请务必保存好。\n授予访问权限 # 在权限页面，点击授予访问权限，新的主帐号填写为刚刚创建的帐号，为其赋予Storage Object Admin权限。\n配置Github Actions Secrets # 返回Github，在本仓库的Settings页面，选择Secrets and variables，选择Actions子项，点击New repository secrets，Name项填GOOGLE_CREDENTIALS，Secret项填在Google Cloud获得的JSON的内容，将JSON文件内的内容全部复制进去即可。\n再次尝试Actions # 重新运行Actions，通过。\n","date":"2024 May 24","externalUrl":null,"permalink":"/knowledge/2024/blog_setup/actions_hugo_auto_deploy/","section":"知识","summary":"","title":"使用Github Actions自动更新Google Cloud储存桶","type":"knowledge"},{"content":"","date":"2024 May 24","externalUrl":null,"permalink":"/series/%E4%BD%BF%E7%94%A8google-cloud%E6%89%98%E7%AE%A1%E6%88%91%E7%9A%84%E5%8D%9A%E5%AE%A2/","section":"Series","summary":"","title":"使用Google Cloud托管我的博客","type":"series"},{"content":"","date":"2024 May 23","externalUrl":null,"permalink":"/tags/%E5%BC%80%E5%8F%91/","section":"Tags","summary":"","title":"开发","type":"tags"},{"content":"折腾了一番，研究了一下如何在安卓平板上体验一下vscode。code-server虽然挺不错，但其无法使用ssh功能，所以有点遗憾。为了真正运行一个本地的vscode，需要在termux中安装完整的linux系统和桌面环境，并配置vnc连接。\n1. 安装完整archlinux环境 # 首先，安装proot-distro\npkg update pkg upgrade pkg install proot-distro proot-distro list 然后，安装想使用的linux发行版。笔者这里使用archlinux，但推荐新手使用ubuntu。\nproot-distro install archlinux 安装完成后，进入archlinux\nproot-distro login archlinux 2. 配置archlinux # 配置桌面环境和vnc # 首先，安装桌面环境相关和vnc的包\npacman -Syyu pacman -S xfce4 xorg xorg-server pacman -S tigervnc neovim 然后，创建并写入以下文件\nnvim ~/.vnc/xstartup #!/bin/sh exec startxfce4 然后，修改权限\nchmod u+x ~/.vnc/xstartup 接着，创建并写入以下文件\n~/.vnc/config 下面的分辨率可以根据平板分辨率进行调整。\nsession=xfce geometry=1920x1080 alwaysshared ＊＊＊注意＊＊＊由于AUR包管理器需要非root用户，所以您可以创建一个新用户，并将配置文件复制至新用户的目录下\nuseradd \u0026lt;new username\u0026gt; su \u0026lt;your new username\u0026gt; mkdir /home/\u0026lt;your new username\u0026gt; exit 需要修改sudoers，配置新用户的权限\nnvim /etc/sudoers 添加下行\n\u0026lt;your new username\u0026gt; ALL=(ALL:ALL) ALL 然后，复制配置文件\nsu \u0026lt;your new username\u0026gt; sudo cp -r /root/.vnc ~/.vnc 安装vscode # AUR管理器这里选择yay-bin，安装paru在rust编译时会报错\n安装yay-bin # sudo pacman -S --needed git bash-devel git clone clone https://aur.archlinux.org/yay-bin.git cd yay-bin makepkg -si 或者at once:\npacman -S --needed git base-devel \u0026amp;\u0026amp; git clone https://aur.archlinux.org/yay-bin.git \u0026amp;\u0026amp; cd yay-bin \u0026amp;\u0026amp; makepkg -si 安装visual-studio-code-bin # yay -S visual-studio-code-bin 3. 使用vnc连接桌面 # archlinux侧打开vnc监听\nvncserver :1 然后，在安卓系统上安装VNC客户端，并设置远程地址为\nlocalhost::5901 4. 打开vscode # 在xfce环境下打开终端，然后输入下面指令在当前文件夹打开vscode。不加\u0026ndash;sand-box在笔者这里会无法打开。\ncode --no-sandbox . 结语 # 折腾了一晚上，仔细想想这东西好像也没什么用，体验并不好。\n参考：\nhttps://antoshabrain.blogspot.com/2021/06/debian-tigervnc-xfce.html?m=1\nhttps://wiki.archlinux.org/title/TigerVNC\n","date":"2024 May 23","externalUrl":null,"permalink":"/knowledge/2024/termux_archlinux_vscode/","section":"知识","summary":"","title":"使用termux安装archlinux和vscode","type":"knowledge"},{"content":"","date":"2024 May 21","externalUrl":null,"permalink":"/ja/tags/development/","section":"Tags","summary":"","title":"Development","type":"tags"},{"content":"我在前阵子正好了解到Google Cloud，并开通了付费计划。虽然是付费计划，但新人有很多的赠金，但是有效期只有三个月。即便如此，Google Cloud还有免费层级可用，也就是每个月只有用到了一定量资源以上，才会收费。这个免费层级足够一个小小博客网站的运行了，于是，我决定采用Google Cloud进行部署。 **警告！**可能会产生费用！ 开始之前 # 在开始之前，需要准备好以下道具或条件：\n科学稳定的网络环境 一张由Visa或MasterCard等组织发行的国际信用卡或储蓄卡，以让您能够成功使用Google Cloud Google Cloud 账户 (直接使用Google账户登录即可) 一个域名 搭建静态网站(博客) # 请参考 域名绑定至Cloudflare(可选) # 由于域名的提供商不同，绑定方法也不尽相同。您应当从互联网上查询相关信息，并完成本步骤，特别是当您想要使用https或CDN时。\n托管至Google Cloud # 请主要参考该文档\n指定项目 # 打开Google Cloud 控制台。 创建项目，并选择该项目。 配置储存桶 # 打开储存桶页面，创建新储存桶，保持默认参数即可。\n将储存桶设置为可公开访问 # 选择创建完成的储存桶，点击图中所示选项(修改储存分区权限)。 点击添加成员。 填写如下图所示，并保存。注：Storage オブジェクト閲覧者 是 Storage Object Viewer 配置负载均衡器 # 进入负载均衡器页面(Load Balancing, ロード バランシング)，选择创建新均衡器，配置保持默认即可。\n根据该文档配置均衡器及SSL等。\n配置Cloudflare(可选，根据实际情况进行) # 打开Cloudflare控制台，配置DNS记录。添加A或AAAA记录指向负载均衡器分配的IP。并且，关闭代理，使其代理状态为仅DNS解析。若打开代理，则打开了Cloudflare的免费CDN，在前期调试时建议关闭，或者打开Cloudflare的开发模式以跳过缓存，后期可根据需要开启。 随后，打开SSL/TLS页面，选择加密模式为完全(严格)。注 如果您在创建均衡器时没有选择HTTPS，那么这里需要关闭加密或改为灵活模式。 将网站上传至Google Cloud 储存桶 # 主要参考Hugo文档。 重新回到Hugo项目，编辑config/_default/hugo.toml，并添加如下内容，其中，URL在储存桶配置中可见，通常为gs://你的域名。 [[deployment.targets]] # 此目标的任意名称。 name = \u0026#34;hugo-deployment\u0026#34; # 要部署的Go Cloud Development Kit URL。示例： # GCS；请参阅https://gocloud.dev/howto/blob/#gcs URL = \u0026#34;gs://xxxx.xxx.xxx\u0026#34; # S3；请参阅https://gocloud.dev/howto/blob/#s3 # 对于S3兼容的端点，请参阅https://gocloud.dev/howto/blob/#s3-compatible # URL = \u0026#34;s3://\u0026lt;Bucket Name\u0026gt;?region=\u0026lt;AWS region\u0026gt;\u0026#34; # Azure Blob Storage；请参阅https://gocloud.dev/howto/blob/#azure # URL = \u0026#34;azblob://$web\u0026#34; # 您可以使用“prefix=”查询参数来定位桶的子文件夹： # URL = \u0026#34;gs://\u0026lt;Bucket Name\u0026gt;?prefix=a/subfolder/\u0026#34; # 如果您正在使用CloudFront CDN，部署将根据需要进行缓存失效。 # cloudFrontDistributionID = \u0026lt;ID\u0026gt; # 可选的，您可以包含或排除特定的文件。 # 有关glob模式语法，请参阅https://godoc.org/github.com/gobwas/glob#Glob。 # 如果非空，则该模式与本地路径匹配。 # 所有路径都与它们的filepath.ToSlash形式进行匹配。 # 如果exclude非空，并且本地或远程文件的路径与之匹配，则该文件不会被同步。 # 如果include非空，并且本地或远程文件的路径与之不匹配，则该文件不会被同步。 # 结果是未通过include/exclude过滤器的本地文件不会上传到远程， # 未通过include/exclude过滤器的远程文件不会被删除。 # include = \u0026#34;**.html\u0026#34; # 只会包含以\u0026#34;.html\u0026#34;结尾的文件 # exclude = \u0026#34;**.{jpg, png}\u0026#34; # 排除以\u0026#34;.jpg\u0026#34;或\u0026#34;.png\u0026#34;结尾的文件 # [[deployment.matchers]]配置与Pattern匹配的文件的行为。 # 有关Pattern语法，请参阅https://golang.org/pkg/regexp/syntax/。 # 在找到第一个匹配项后停止进行Pattern搜索。 # 示例： [[deployment.matchers]] # 缓存静态资源1年。 pattern = \u0026#34;^.+\\\\.(js|css|svg|ttf)$\u0026#34; cacheControl = \u0026#34;max-age=31536000, no-transform, public\u0026#34; gzip = true [[deployment.matchers]] pattern = \u0026#34;^.+\\\\.(png|jpg)$\u0026#34; cacheControl = \u0026#34;max-age=31536000, no-transform, public\u0026#34; gzip = true [[deployment.matchers]] # 为/sitemap.xml设置自定义内容类型 pattern = \u0026#34;^sitemap\\\\.xml$\u0026#34; contentType = \u0026#34;application/xml\u0026#34; gzip = true [[deployment.matchers]] pattern = \u0026#34;^.+\\\\.(html|xml|json)$\u0026#34; gzip = true 使用Google Cloud CLI # 首先，安装：\nsudo snap install google-cloud-cli 随后，登录Google Cloud，这可能需要您在Linux环境中安装图形界面和浏览器。对于最新版本的Win11的WSL2，已经内置了WSLg，可以参考这里。\ngcloud auth login 上传网站至储存桶：\nhugo deploy 配置网站入口:\ngsutil web set -m index.html -e 404.html gs://xxxx.xxx.xxx 等待 # 等待配置生效。在这期间，可能会遇到网页525等错误，需要耐心等待域名和HTTPS配置生效。\n生效后，即可通过 https://你的域名 访问网站。\n如果您没有使用HTTPS，那么不需要太久，便可直接通过http://google分配给你的ip访问。\n更新网站 # 在本地修改博客后，使用hugo server -D查看最新效果，并且该指令会自动更新public/文件夹内容。也可以使用hugo --minify生成最优文件。在该指令之后使用hugo deploy即可更新位于Google Cloud 储存桶中的内容。\n恭喜🎉 # 其它参考\nhttps://www.bobjiang.com/blog-migration-4/\n","date":"2024 May 21","externalUrl":null,"permalink":"/knowledge/2024/blog_setup/static_web_gcs_deploy/","section":"知识","summary":"","title":"使用Google Cloud托管静态网站","type":"knowledge"},{"content":"在高中时，我无法想象自己大学的生活，觉得过于遥远，甚至感觉我会在考上大学前因意外死亡，导致我完全无法窥见这个未来(恥ずかしい)。但四年的大学也就如此度过了。如果我能够回到过去，哪怕是高考刚结束的那天下午，哪怕是刚进入大学校园的那天中午，或许都可以做的更好。\n现在回想起来，我浪费了太多时间在无所谓的事情上，我相信即便是呆在宿舍里打游戏看动漫，都比那些无所谓的事情有意义。但或许只有各种事情都做过了，才知道哪些事情是有所谓的。\n我现在觉得，大学最重要的就是，给了每个人四年的时间来思考：自己究竟想要什么？在我认识的很多人中，都把成为\u0026rsquo;人上人\u0026rsquo;作为目标，并以此努力。但我认为，这个目标毫无意义。所谓的价值，总是被掌握话语权之人定义。人们辛辛苦苦追求的名声，财富等，不过是另一群人一两句话的事。为什么要追求别人的影子？人们赋予事物意义，而非人们追求意义。诚然世俗意义上的物质对每个人及其家庭都是不可或缺的，但这不应当成为我所追求的终极目标。\n人生在世，10年也不过3650天。对于我而言，或许认真体验生活中的每一个事物，才能对得起这趟地球之旅。如果把人生比作一场自助餐，那么世俗上的成功无疑会让我们拿到享用更高级食材的权利。然而，如果只顾着抢高级食材，真正享用食物的时间便所剩无几。或许退休后有人说是安享晚年，但马上就要入土了，还能有心思和头脑享受什么呢？或许到时候能做到的只有怀念了吧。\n当然，我说这些并不是想为躺平找借口。只要涉及人，便没有非黑即白的事。我们确实应当好好反思自己究竟想要什么，并以此为方向前进。\n在当前的社会环境下，想要停下来歇一歇会遭到很多恶意。这不应当被视为理所应当的。要知道，现如今社会的部分风气与西方在20世纪初(现代主义)时如出一辙，比如人们追求效率，财富，真理，主张自律等等，也是以人作为理性主体来认识世界的时期(并非哲学专家，描述可能不准确)，其以纯粹的理性来认识人类社会和自然社会。但目前西方的后现代主义则是将现代主义进行了严格的批判与超越。理解后现代主义的出发点在于对\u0026rsquo;知识\u0026rsquo;的理解，人们开始怀疑所谓的知识是否具有正当性和合法性。在后现代，知识沦落为了一种商品，在某种程度上损失了其客观性。过去人们会认为真理、正义和理性具有普遍性，而在后现代主义看来，唯一认可的只有普遍的多元性。在现代性的话语体系中，那些显而易见的具有普遍性的东西，在后现代主义者看来，其都不具备先天的正当性。语言的意义，真理的标准，这些都值得我们怀疑。后现代对真理标准的怀疑，正是对现代以来元叙事的怀疑。在后现代，每个人都要参与这场\u0026quot;语言游戏\u0026quot;。要注意的是，虽然认为公平和正义之类不存在绝对的标准，但这并不是说公平和正义不存在，公平和正义依然存在于具体的活动中。而对于自由，现代的自由观是\u0026quot;自律即自由\u0026quot;，而后现代主义认为，自由是审美的自由，是面向未知领域的自由，是一种全新的自由。\n然而，社会思想的转变并不是一蹴而就的。但我们是时候转变思想，以这庞大的语言游戏的参与者的身份，来重新认识这个世界了。如果你想追求自由，那么你已经不再自由，因为你已然为自由所困。\n随便写了一点，自己也不知道自己写的是什么，就这样吧。\n","date":"2024 May 21","externalUrl":null,"permalink":"/life/2024/graduate_time/","section":"生活","summary":"","title":"临近毕业杂谈","type":"life"},{"content":"","date":"2024 May 21","externalUrl":null,"permalink":"/tags/%E6%9D%82%E8%B0%88/","section":"Tags","summary":"","title":"杂谈","type":"tags"},{"content":"最近突然有了搭建自己博客的想法。网络上有很多快速的oneclick方案，不过并不符合我的美学。经过一系列探索，我决定使用Hugo来搭建我的网站。网上有很多教程和讨论，因此不用担心出了奇怪的BUG解决不了。并且，由于Hugo生成的是一个静态网站，即没有后端，其部署方式也更加灵活。\n选择了框架，接下来就要思考一下该做一个怎样的博客网站了。好在Hugo可以直接套用别人的主题，这让搭建一个优雅的博客网站简单了不少，并且大部分主题都包含在线demo，可以仔细观摩。在众多的主题中，我选择了我看着最顺眼的Blowfish。\n接下来，我将逐步记录搭建的过程，供参考。\n开发环境准备 # 笔者主要在WSL2上进行开发，其运行系统为Ubuntu22.04。\n安装即将用到的工具 sudo apt install snapd git 安装go sudo snap install go 如果出现提示，请添加--classic 安装hugo sudo snap install hugo --classic 自定义博客 # 初始配置 # 首先，生成站点，名称随意。\nhugo new site my-blog 编辑相关文件 注 需要提前配置好vscode，安装WSL的插件\ncode ./my-blog 此时，当前路径应当为 my-blog/。接着：\ngit init git submodule add -b main https://github.com/nunocoracao/blowfish.git themes/blowfish 复制默认配置文件：\ncp -r themes/blowfish/config/_default config/_default 本地运行网站：\nhugo server -D 此时，由于WSL2的vscode自带端口转发，只需要在Windows下访问 http://localhost:1313 即可。大部分修改保存后都会实时反应在网站上。\n更多自定义 # 这部分请根据Blowfish的官方文档(点击查看)以及自己的喜好进行调整。可能有部分设定需要参考Hugo的文档进行。\n更新Blowfish版本 # git submodule update --remote --merge 静态文件 # 如果终端正在运行hugo server -D，输入Ctrl+C即可退出。此时，最新的静态网站文件会处于public文件夹中。也可以使用hugo --minify生成最优网站文件。\n添加高级功能 # 评论系统 - giscus # 笔者最先尝试的是Disqus，但是没玩明白，评论区总是显示无法加载，即便是实际部署环境。随后，笔者将目光转向giscus。步骤如下：\n开启用于存放评论的GitHub仓库的Discussions功能。这里我直接使用的是本博客的仓库。 根据giscus的步骤，得到一个script标签。 将该标签内容写入 layouts/partials/comments.html。若没有文件夹可自行创建。 打开博文，发现底部出现评论区，配置成功。\n浏览量和点赞 - firestore # 该功能需要使用Google的Firebase。如想使用，请确保您具有可用的Google Cloud账户。官方文档说明的比较详细，可直接参考这里。\n唯一需要说明的是，也是笔者踩的坑，就是在Firestore的规则页面，需要更新为官方文档所提供的规则，并发布。该规则和默认规则并不完全相同，默认规则是拒绝所有读写请求，而官方规则是接受request.auth != null的所有读写请求。\nrules_version = \u0026#39;2\u0026#39;; service cloud.firestore { match /databases/{database}/documents { match /{document=**} { allow read, write: if request.auth != null; } } } 同时，params.toml中所需要的键值都可以在项目概览-\u0026gt;该Web应用名称-\u0026gt;设置中找到。将其对应填入params.toml中即可。\n","date":"2024 May 21","externalUrl":null,"permalink":"/knowledge/2024/blog_setup/static_blog_setup/","section":"知识","summary":"","title":"使用Hugo搭建静态博客","type":"knowledge"},{"content":"手里头有块500G的便携式SSD，之前制作过Ubuntu to Go，体验还行，但更换Manjaro后却发现貌似不能从其他电脑上直接启动。后来，笔者还是感觉WSL2比较香，于是就把这块移动硬盘解放了出来。但最近心血来潮，觉得只要拿块硬盘就可以直接启动熟悉的系统，实在是有诱惑，于是决定将该移动硬盘再次启用，并装上Archlinux体验一波。 本文将介绍笔者的踩坑经历及解决方案。 本文的结果：\nSecure Boot 共存（主板限定） 网络引导安装 移动硬盘引导Archlinux 1. Hyper-V 的努力并非全部白费 # 由于手头没有u盘，笔者最先想到使用虚拟机替身进行安装，以避免已安装的Windows系统的硬盘的干扰，造成启动引导方面的问题。笔者的Ubuntu to go亦采用该方法制作。其主要流程为：\n将待用硬盘脱机（Hyper-V强制，VMware不需要） 虚拟机中选择该物理硬盘 使用安装镜像，完成安装流程 物理重启电脑，并在BIOS中选择该硬盘引导项 笔者先前主要是用VMware，但想到还有微软自家的Hyper-V，便决定一试。 使用Hyper-V制作Archlinux系统盘并不顺利。笔者将简要介绍流程。\nWindows 11家庭版需要手动安装Hyper-V，幸运的是网络上有很多教程，直接运行其提供的脚本即可。 在安装完成后，重启一次电脑，随后搜索Hyper-V，进入Hyper-V管理器。 简单创建一个虚拟机后，在设置中将虚拟硬盘改为物理硬盘。注意：该物理硬盘必须处于脱机状态。可以直接使用Windows自带的DISKPART工具进行操作： DISKPART 在Windows终端中输入该指令，进入工具 LIST DISK 显示当前所有硬盘 SELECT DISK 硬盘序号 根据上一步显示的，选择需要操作的硬盘 OFFLINE DISK 对选择的硬盘进行脱机操作 根据网上的教程安装Archlinux。笔者参考的是 https://arch.icekylin.online/guide 。在安装引导程序，完成安装后，重启虚拟机，可以进入系统。随后笔者将物理机重启，但在主板BIOS的引导选项中并无该硬盘。 初步调查后发现，可能是因为主板的UEFI固件未识别到引导文件。解决方法也很简单，只需要在运行grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=ARCH 这条指令时，后面加上--removable即可。即 grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=ARCH --removable 然而，此时虽能成功引导，但无法挂载硬盘，直接卡死在了第一步，虽然自动进入了紧急模式，但不知道为何键盘按了也没反应，无法进行进一步操作。笔者尝试过不使用uuid的方式定位硬盘，而是直接使用sda1这种形式，但是依然没用。 2. 我的U盘很少 # 恰巧，我爸搞来来一个来历不明的U盘。这个U盘虽然标称64GB，但谁也不清楚是不是虚标。由于Hyper-V制作失败，笔者将安装镜像刻录进U盘，并尝试直接使用U盘的Live系统对移动硬盘上的系统进行调试。 然而，U盘引导出现了上一模一样的问题，无法挂载硬盘。此时笔者怀疑可能是主板问题，也可能这个U盘本身是坏的。\n3. 天降之NetBoot # 在搜索解决方案的过程中，笔者偶然想到了还有网络引导的方式。然而，这种方法需要在局域网搭建一个PXE服务器，笔者尝试过，但太菜了，对这方面没啥了解，看教程都看不懂。好在天无绝人之路，笔者又想到曾在哪个论坛上看到过还有Boot from FAT32的方式。FAT32格式的U盘可以直接引导启动，于是笔者直接将该U盘格式化为FAT32，并创建文件夹 /EFI/BOOT 。随后，在 https://archlinux.org/releng/netboot 中下载ipxe-arch.efi 文件，并改名为BOOTX64.EFI，放入之前创建过的文件夹中。最终路径为 /EFI/BOOT/BOOTX64.EFI。这里如果不改名，笔者的主板将无法成功引导，但或许并不是所有主板都是如此。这个EFI文件很小，相信这个U盘再怎么虚标，存一个1M的文件应该也不成问题。同时，笔者的主机正插着网线，因此不必担心网络问题。\n此时，笔者怀疑也可能是因为开着Secure Boot的问题，导致无法挂载硬盘。网上搜索资料后确实发现Archlinux不支持Secure Boot（但是不是这个原因造成的不好说）。然而，直接将Secure Boot关闭并不符合笔者的美学。笔者使用的主板为技嘉B650M，在探索了一番后，发现该主板可以在Secure Boot相关设置中自定义信任引导程序的签名，于是二话不说，直接添加上了上述网络启动用到的EFI文件和移动硬盘中Archlinux系统的EFI文件签名。 在BIOS中选择该U盘引导后，成功进入Archlinux安装环境。在Archlinux安装环境中，笔者重新进行了pacstrap，以及安装grub步骤。重启后成功通过移动硬盘进入Archlinux系统。\n4. 我独自启动 # 到目前为止只是成功将Archlinux安装进了移动硬盘，并不确定能不能直接在不同的计算机上直接启动。特别是笔者是AMD CPU，所以安装阶段安装了AMD的微码，在INTEL的CPU上可能会出现问题。不过，Ubuntu不用担心这个问题，笔者之前带着装了Ubuntu的硬盘在学校机房里直接借尸还魂，笔记本都不用带，甚是方便😁。\n","date":"2024 May 20","externalUrl":null,"permalink":"/knowledge/2024/archlinux_install/","section":"知识","summary":"","title":"Archlinux的杂技启动方法","type":"knowledge"},{"content":" 理论上的随意，工程上的妥协。 # 2022-9-15 下午在实验室做信号分析。这个学期开了数字信号处理这门课，老师讲的不错，我也自认为搞明白了。但在上手和现实打交道时，才会发现是多么困难。 理论终究是理论，在现实中无法完美实现。特别是近代数学中极限的概念，更是无法在现实世界中实现。 这次上手深刻体会到了理论与现实的差异。如周期函数这一概念，现实中就根本不可能存在，因为周期函数的定义域是无限的！！！ 经由此，我也知道了自己的浅薄，对好多的概念其实都是一知半解，很多核心都没有把握住。比如傅里叶级数中对周期函数的要求， 再比如离散的有限长的函数的傅里叶变换与离散的无限长的差别。这些在理论中我们所忽视的前提与假设，如果不注意，在现实中将会被放大，狠狠地重击我们。\n","date":"2022 September 15","externalUrl":null,"permalink":"/life/2024/tails/%E7%90%86%E8%AE%BA%E4%B8%8E%E5%B7%A5%E7%A8%8B/","section":"生活","summary":"","title":"理论与工程","type":"life"},{"content":" 序 # 当时为了更上官方的sdk，选择搭建官方建议的开发环境，放弃原来的platformIo.结果直接耗费了两天的时间，从网上的教程 Cygwin 版-\u0026gt; CSDN 版官方教程 -\u0026gt;liunx的环境搭建。整个搭建过程接触了很多新东西，踩了很多坑：虚拟机，ubantu，VMware，VMwaretool，linux权限，命令。收获很多，且搭建完成后的成就感很强。 便有了这篇文章。\nWindows😣 # windows不适合搭建嵌入式开发环境，除非有现成的IDE。没有的话，就在直接选择linux吧。 window出问题不报错，无从下手，Linux还会给你报错，还有挽回的余地。\nLinux # 搭建linux环境 # 1.先拥有Linux系统，两种方案，1.直接安装Linux系统。2.在虚拟机下安装Linux。 我选择的是虚拟机。虽然Linux在搭建环境上有优势，但在日常使用中还是windows要方便一些。 我的电脑原本就是windows的系统，不想再折腾了。 搭建虚拟机 先安装一个虚拟机 VMware ，安装好后。 选择一个Linux坂本，我选择的是Ubuntu desktop ，下载好ISO虚拟映像后就可以开始安装了，安装教程 。 安装时由于网速的原因，会安装几小时，耐心等待即可，乘机摸摸鱼🐟。 安装好后，看到这个就算成功了。 恭喜你已经完成了第一步。安装踩坑记录，VMware是收费软件，需要lisence才可以，不同版本对应不同的licens。 没有就CSDN上搜一搜很多，或者成为一名光荣的正版用户。 设置虚拟机硬件标准时，以自己机子的一半为参考，磁盘大小就随意了，30G一般就够用了。\n建文件夹 # mkdir ~/esp 进入文件夹\ncd ~/esp 安装esp8266开发环境 # 建立toolchain文件夹\nmkdir ~/esp/toolchain 进入文件夹后 下载乐鑫提供的交叉编译工具\nwget https://dl.espressif.com/dl/xtensa-lx106-elf-gcc8_4_0-esp-2020r3-linux-amd64.tar.gz 解压\ntar -xzf xtensa-lx106-elf-gcc8_4_0-esp-2020r3-linux-amd64.tar.gz 检查一下\nxtensa-lx106-elf-gcc --version 加入到 环境变量\nexport PATH=~/esp/toolchain/xtensa-lx106-elf/bin:$PATH 重启生效，然后检查一下\nxtensa-lx106-elf-gcc --version 到此编译工具就完成了\n安装SDK包 # 先进入~/esp/esp8266目录下，没有就建一个\ngit https://github.com/espressif/ESP8266_RTOS_SDK.git 碍于网速会下载的很慢。这里可能会提示没有git下载一个就好\nsudo apt install git 下载都可以使用该命令，没什么就install什么 下载好后，进入~/esp/esp8266/ESP8266_RTOS_SDK/examples/get-started/hello_world文件夹下 输入 ls 命令查看文件下的文件 调式编译工具和烧录方式\nmake menuconfig 成功只有此图 失败原因万千重 屏幕太小了，把屏幕扩大即可\n其他的基本都是没有必要的环境导致的，解决思路就一个，没什么搞什么！\nsudo apt-get install git wget make libncurses-dev flex bison gperf python python-seria 先装这些，其中的python部分，可能会遇到无法下载，导致没法加入环境变量。 可以通过建立软连接的方式，建立python与python3的连接，由于python3是兼容python的，所以可以通过这种方式骗骗系统。 先查以下有没有python3\npython3 --version 有版本号就是有了，没有就下一个。 再查一下python在哪\nwhereis python3 之后建立软连接\nsudo ln -s /usr/bin/python3 /usr/bin/python 前面是python3的路径,后面是python的环境变量地址 检查\npython --version 环境变量设置出错，可以看这篇文章How to set your $PATH variable in Linux 或者\nvim ~/.bashrc 在最后加入 按i打开编辑模式，按ESC推出编辑模式，输入:wq，回车退回命令行。 最后进入hello-world文件夹，输入\nmake CONGRATULATION ! ! ! 🎇🎇🎇 文件开始编译了 以上是我遇到的所有坑了，在编译阶段。\n烧录固件 # 这段可以看 官方文档 我就记一下坑了，找不到ttyUSB0 与‘brltty’冲突，直接干掉。\nsudo apt remove brltty 再拔插一下\nsudo ls /dev/ttyUSB* OK，回到hello-world\nsudo chmod 777 /dev/ttyUSB0 make flash make monitor Hello world 😋\n感谢以下文章在我摸索道路上的帮助 # 😊代表解决了我的问题的文章，没有的我觉得写的不错，也加上了，说不定下一次就遇上了这种问题。\n乐鑫ESP系列环境搭建：搭建ESP8266在Linux上的编译环境 😊 官方文档 😊 VMware安装Ubuntu虚拟机全解 【物联网】 ESP8266 Ubuntu开发环境的搭建 How to set your $PATH variable in Linux 😊 make: *** No rule to make target \u0026lsquo;/home/xxxx/esp/hello_world/menuconfig\u0026rsquo;, stop. esp8266SDK环境搭建之make menuconfig 😊 使用apt更新和升级系统软件 make menuconfig python No such file or directory ‘python’: No such file or directory 解决报错/usr/bin/env: ‘python’: No such file or directory 😊 Linux 查看本机串口方法 😊 permission denied：‘/dev/ttyUSB0‘问题的解决 😊 Linux命令大全(手册) 😊 usbfs: interface 0 claimed by ch341 while \u0026lsquo;brltty\u0026rsquo; sets config 😊 linux进入超级管理员权限,一直处于超级管理员权限下 😊 在/mnt/看不到共享文件夹的解决 😊 VMware中找不到hgfs解决办法，重装VMware Tools linux 虚拟机串口连接问题 ","date":"2022 May 14","externalUrl":null,"permalink":"/knowledge/2024/tails/esp8266_dev/","section":"知识","summary":"","title":"ESP8266环境搭建踩坑记录","type":"knowledge"},{"content":" 系统环境 # Archlinux KDE Plasma6 Wayland fcitx5 wine-ge-8-26 解决方案 # 安装必要的库和字体 winetricks gdiplus riched20 riched30 richtx32 winetricks allfonts winetricks fakechinese winetricks wenquanyi 修改注册表 REGEDIT4 [HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows NT\\CurrentVersion\\FontSubstitutes] \u0026#34;Arial\u0026#34;=\u0026#34;WenQuanYi Micro Hei\u0026#34; \u0026#34;Comic Sans MS\u0026#34;=\u0026#34;WenQuanYi Micro Hei\u0026#34; \u0026#34;Courier\u0026#34;=\u0026#34;WenQuanYi Micro Hei Mono\u0026#34; \u0026#34;Courier New\u0026#34;=\u0026#34;WenQuanYi Micro Hei Mono\u0026#34; \u0026#34;Fixedsys\u0026#34;=\u0026#34;WenQuanYi Micro Hei\u0026#34; \u0026#34;Helv\u0026#34;=\u0026#34;WenQuanYi Micro Hei\u0026#34; \u0026#34;Helvetica\u0026#34;=\u0026#34;WenQuanYi Micro Hei\u0026#34; \u0026#34;Lucida Console\u0026#34;=\u0026#34;WenQuanYi Micro Hei Mono\u0026#34; \u0026#34;Lucida Sans\u0026#34;=\u0026#34;WenQuanYi Micro Hei\u0026#34; \u0026#34;Microsoft Sans Serif\u0026#34;=\u0026#34;WenQuanYi Micro Hei\u0026#34; \u0026#34;MingLiU\u0026#34;=\u0026#34;WenQuanYi Micro Hei\u0026#34; \u0026#34;PMingLiu\u0026#34;=\u0026#34;WenQuanYi Micro Hei Mono\u0026#34; \u0026#34;MS Shell Dlg\u0026#34;=\u0026#34;WenQuanYi Micro Hei\u0026#34; \u0026#34;MS Shell Dlg 2\u0026#34;=\u0026#34;WenQuanYi Micro Hei\u0026#34; \u0026#34;MS Dialog\u0026#34;=\u0026#34;WenQuanYi Micro Hei\u0026#34; \u0026#34;MS Gothic\u0026#34;=\u0026#34;WenQuanYi Micro Hei\u0026#34; \u0026#34;MS PGothic\u0026#34;=\u0026#34;WenQuanYi Micro Hei Mono\u0026#34; \u0026#34;MS UI Gothic\u0026#34;=\u0026#34;WenQuanYi Micro Hei\u0026#34; \u0026#34;MS Mincho\u0026#34;=\u0026#34;WenQuanYi Micro Hei\u0026#34; \u0026#34;MS PMincho\u0026#34;=\u0026#34;WenQuanYi Micro Hei\u0026#34; \u0026#34;SimHei\u0026#34;=\u0026#34;WenQuanYi Micro Hei\u0026#34; \u0026#34;SimSun\u0026#34;=\u0026#34;WenQuanYi Micro Hei\u0026#34; \u0026#34;NSimSun\u0026#34;=\u0026#34;WenQuanYi Micro Hei Mono\u0026#34; \u0026#34;System\u0026#34;=\u0026#34;WenQuanYi Micro Hei\u0026#34; \u0026#34;Tahoma\u0026#34;=\u0026#34;WenQuanYi Micro Hei\u0026#34; \u0026#34;Times\u0026#34;=\u0026#34;WenQuanYi Micro Hei\u0026#34; \u0026#34;Times New Roman\u0026#34;=\u0026#34;WenQuanYi Micro Hei\u0026#34; \u0026#34;Tms Rmn\u0026#34;=\u0026#34;WenQuanYi Micro Hei\u0026#34; \u0026#34;Trebuchet MS\u0026#34;=\u0026#34;WenQuanYi Micro Hei\u0026#34; \u0026#34;Verdana\u0026#34;=\u0026#34;WenQuanYi Micro Hei\u0026#34; 添加环境变量 sudo nvim /etc/environment # 添加下行 XMODIFIERS=@im=fcitx Refers # http://linux-wiki.cn/wiki/zh-hant/Wine%E7%9A%84%E4%B8%AD%E6%96%87%E6%98%BE%E7%A4%BA%E4%B8%8E%E5%AD%97%E4%BD%93%E8%AE%BE%E7%BD%AE\nhttps://xixixia.gitlab.io/blog/manual/1_wine_cn.html\nhttps://github.com/zq1997/deepin-wine/issues/278\nhttps://bbs.archlinuxcn.org/viewtopic.php?id=13942\nhttps://wiki.archlinux.org/title/Fcitx5\nhttps://fcitx-im.org/wiki/Using_Fcitx_5_on_Wayland#KDE_Plasma\n","date":"2014 November 11","externalUrl":null,"permalink":"/knowledge/2024/tails/wine_wechat_chinese/","section":"知识","summary":"","title":"Wine 微信中文显示一站式解决方案","type":"knowledge"},{"content":" git使用443端口连接，避免通过代理连接不上 # 添加下面至.ssh/config\nHost github.com Hostname ssh.github.com User git Port 443 vsftpd允许root登录 # Origin\n只需更改/etc/ftpusers，将root注释。 允许写操作: /etc/vsftpd.conf取消注释#write_enable=YES wayland 开启10bit # sudo nvim /etc/X11/xorg.conf.d/30-screensetup.conf Section \u0026#34;Screen\u0026#34; Identifier \u0026#34;Screen0\u0026#34; Device \u0026#34;Device0\u0026#34; Monitor \u0026#34;Monitor0\u0026#34; DefaultDepth 30 SubSection \u0026#34;Display\u0026#34; Depth 30 EndSubSection EndSection cat /var/log/Xorg.0.log|grep bits 通过挂载单元根据需要挂载文件系统 # 由于我把Archlinux装在了一个移动固态硬盘内，在不同的电脑上启动该系统是一个常见场景。但是，如果将我主要使用的电脑中插在主板上的硬盘直接通过fstab挂载的话，在另一台电脑上就会因无法挂载而无法启动，并进入紧急维护模式。为了解决这个问题，可以参考以下解决方案。\n使用 systemd.automount 通过挂载单元根据需要挂载文件系统\n使用 systemd 开机挂载其它硬盘\nqemu安装windows11 # [Run Windows 11 (TPM and Secure Boot) on KVM]https://insights.ditatompel.com/en/tutorials/run-windows-11-tpm-and-secure-boot-on-kvm/\n","date":"2000 December 30","externalUrl":null,"permalink":"/knowledge/2024/remarks/","section":"知识","summary":"","title":"Remarks","type":"knowledge"},{"content":"参考: https://www.bilibili.com/read/cv21769062/\n私有Tor网络搭建 # 1.安装Docker # curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun 2.建立桥接网络 # docker network create --driver bridge --subnet 172.10.1.0/16 --gateway 172.10.1.0 tor_net \u0026ndash;driver bridge 表示使用桥接网络 \u0026ndash;subnet 172.10.0.0/16 表示子网ip（分配范围1～254） \u0026ndash;gateway 172.10.1.0 表示网关 tor_net 表示网络名 3.建立节点模板 # 1.拉取ubuntu镜像，建立容器\ndocker pull ubuntu docker run -itd --name tor_1 --network=tor_net ubuntu /bin/bash -itd == -i -t -d -d 参数默认不会进入容器 -i 交互式操作 -t 终端 \u0026ndash;name 名字 /bin/bash 放在镜像名后面的是命令，bash路径 2.编译tor源码\n先在主机上拉取tor源码，然后拷贝给容器\ngit clone https://github.com/torproject/tor docker cp ./tor tor_1:/root 进入容器 docker attach tor_1\n修改源\nsed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list sed -i s@/security.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list apt clean apt-get update -y 安装必要的包\napt-get install -y neovim git curl net-tools autotools-dev automake autoconf libtool make gcc libevent-dev libssl-dev zlib1g zlib1g-dev apt-get --no-install-recommends -y install asciidoc apt-get -y install docbook-xml docbook-xsl 编译tor\ngit config --global --add safe.directory /root/tor cd /root/tor/ ./autogen.sh ./configure make make install # 将来会用到的 mkdir /etc/tor mkdir /etc/tor/tor_data mkdir /etc/tor/tor_log exit 保留镜像\n# 导出镜像 docker export tor_1 \u0026gt; tor.tar # 导入镜像 docker import - tor \u0026lt; tor.tar # 查看镜像 docker images # 创建新容器 docker run -it --name tor_da1 --network=tor_net tor /bin/bash 4.配置DA # 进入容器 docker attach tor_da1\n1.生成节点密钥和指纹\ntor --list-fingerprint --orport 5000 --dirserver \u0026#34;DA 172.10.0.1:7000 ffffffffffffffffffffffffffffffffffffffff\u0026#34; --datadirectory /etc/tor/tor_data 2.生成DA密钥和证书\ntor-gencert --create-identity-key -m 12 -a 172.10.0.1:7000 \\ -i /etc/tor/tor_data/keys/authority_identity_key \\ -s /etc/tor/tor_data/keys/authority_signing_key \\ -c /etc/tor/tor_data/keys/authority_certificate 3.配置torrc\n注 RA的配置文件这里同样填写要连接的DA的这两个\nnvim /usr/local/etc/tor/torrc v3ident填写\ncat /etc/tor/tor_data/keys/authority_certificate | grep fingerprint 节点指纹填写\ncat /etc/tor/tor_data/fingerprint /usr/local/etc/tor/torrc\nNickName DA Address 172.10.0.1 # LOG 文件 Log notice file /etc/tor/notice.log Log info file /etc/tor/info.log Log debug file /etc/tor/debug.log ## 目录服务器设置 AuthoritativeDirectory 1 ## Tor将生成第3版网络状态 V3AuthoritativeDirectory 1 ContactInfo auth0@test.test # 存储工作数据 DataDirectory /etc/tor ## 关键端口 # 不希望通过SOCKS连接应用程序 SocksPort 0 # OrPort监听Tor连接 OrPort 5000 # DirPort监听目录服务 在此端口上通告目录服务 DirPort 7000 # 调试端口 ControlPort 6666 ## 指定自己的目录服务器 # 1 authority_certificate | grep fingerprint # 2 fingerprint DirAuthority DA orport=5000 no-v2 v3ident=583A462E5CADC4EC5C3212FDAC8F4A028A8E1584 172.10.0.1:7000 DFDA9F10DD63D43B77DFE7FB896310CAD265318E ## 测试 Tornetwork TestingTorNetwork 1 TestingV3AuthInitialVotingInterval 300 TestingV3AuthInitialVoteDelay 20 TestingV3AuthInitialDistDelay 20 TestingDirAuthVoteGuard * TestingMinExitFlagThreshold 0 ## 这些配置是为了快速上线，避开一些对稳定性的限制 RunAsDaemon 1 #后台运行 AssumeReachable 1 #响应SIGINT信号，立即关闭 ShutdownWaitLength 0 # Tor进程启动前必须可用的最小文件描述符数。 ConnLimit 60 #出口策略 不作为出口 拒绝一切出口流量 ExitPolicy reject *:* # 安全设置与调试设置 ProtocolWarnings 1 SafeLogging 0 DisableDebuggerAttachment 0 5.配置中继节点和客户端 # 仅需要生成节点密钥和指纹，创建多个docker容器\ndocker run -it --name tor_ra1 --network=tor_net tor /bin/bash # 容器内执行 tor --list-fingerprint --orport 5000 --dirserver \u0026#34;DA 172.10.0.1:7000 ffffffffffffffffffffffffffffffffffffffff\u0026#34; --datadirectory /etc/tor/tor_data 配置torrc\nnvim /usr/local/etc/tor/torrc NickName relay* Address 172.10.0.* # LOG 文件 Log notice file /etc/tor/notice.log Log info file /etc/tor/info.log Log debug file /etc/tor/debug.log # 存储工作数据 DataDirectory /etc/tor ## 关键端口 # 后续代理访问需要的端口 SocksPort 9050 # OrPort监听Tor连接 OrPort 5000 # 调试端口 ControlPort 6666 ## 指定自己的目录服务器 # 1 authority_certificate | grep fingerprint # 2 fingerprint DirAuthority DA orport=5000 no-v2 v3ident=583A462E5CADC4EC5C3212FDAC8F4A028A8E1584 172.10.0.1:7000 DFDA9F10DD63D43B77DFE7FB896310CAD265318E ## 测试 Tornetwork TestingTorNetwork 1 TestingDirAuthVoteExit * TestingDirAuthVoteHSDir * TestingDirAuthVoteGuard * TestingMinExitFlagThreshold 0 ## 这些配置是为了快速上线，避开一些对稳定性的限制 RunAsDaemon 1 #后台运行 AssumeReachable 1 #响应SIGINT信号，立即关闭 ShutdownWaitLength 0 # Tor进程启动前必须可用的最小文件描述符数。 ConnLimit 60 #出口策略 可以作为出口 ExitRelay 1 ExitPolicy accept *:* # 安全设置与调试设置 ProtocolWarnings 1 SafeLogging 0 DisableDebuggerAttachment 0 6.网络测试 # 启动容器中的tor # docker exec da1 tor docker exec ra1 tor docker exec ra2 tor docker exec ra3 tor 使用代理 # 代理 socks ip:9050\ncurl --proxy socks://127.0.0.1:9050 www.baidu.com ","date":"2000 February 1","externalUrl":null,"permalink":"/knowledge/2024/tails/private_tor_network/","section":"知识","summary":"","title":"私有Tor网络搭建","type":"knowledge"},{"content":" create service in linux # source: https://segmentfault.com/a/1190000014740871\n什么是Systemd Service\nsystemd 服务是一种以 .service 结尾的单元（unit）配置文件，用于控制由Systemd 控制或监视的进程。简单说，用于后台以守护精灵（daemon）的形式运行程序。 Systemd 广泛应用于新版本的RHEL、SUSE Linux Enterprise、CentOS、Fedora和openSUSE中，用于替代旧有的服务管理器service。 基本命令： systemctl command xxx.service # 其中command可以是start、stop、restart、enable等，比如： systemctl start httpd.service #启动Apache服务 systemctl stop httpd.service #停止Apache服务 systemctl restart httpd.service #停止Apache服务 systemctl enable mariadb.service #将MariaDB服务设为开机启动 Systemed Service 存放位置\nSystemd Service 位于 /etc/systemd/system（供系统管理员和用户使用），/usr/lib/systemd/system（供发行版打包者使用），我们一般使用前者即可。 编写Systemd Service\nSystemd 服务的内容主要分为三个部分，控制单元（unit）的定义、服务（service）的定义、以及安装部分。 控制单元 [Unit] 在 Systemd 中，所有引导过程中 Systemd 要控制的东西都是一个单元。基本的用法如下： Description：代表整个单元的描述，可根据需要任意填写。 Wants：本单元启动了，它“想要”的单元也会被启动。但是这个单元若启动不成功，对本单元没有影响。 Requires: 这个单元启动了，那么它“需要”的单元也会被启动; 它“需要”的单元被停止了，它自己也活不了。但是请注意，这个设定并不能控制启动顺序，因为它“需要”的单元启动也需要时间，若它“需要”的单元启动还未完成，就开始启动本单元，则本单元也无法启动，所以不建议使用这个字段。 OnFailure：若本单元启动失败了，那么启动这个单元作为折衷。 Before/After：指定启动顺序。 看一个实际的例子： [Unit] Description=Protect ARP list Wants=network-online.target After=network.target 服务本体 [service] 在定义完了 Systemd 用来识别服务的单元后，我们来定义服务本体。基本的用法如下：\nType：服务的类型，各种类型的区别如下所示\nsimple：默认，这是最简单的服务类型。意思就是说启动的程序就是主体程序，这个程序要是退出那么一切皆休。 forking：标准 Unix Daemon 使用的启动方式。启动程序后会调用 fork() 函数，把必要的通信频道都设置好之后父进程退出，留下守护精灵的子进程。 oneshot：适用于那些被一次性执行的任务或者命令，它运行完成后便了无痕迹。因为这类服务运行完就没有任何痕迹，我们经常会需要使用 RemainAfterExit=yes。意思是说，即使没有进程存在，Systemd 也认为该服务启动成功了。同时只有这种类型支持多条命令，命令之间用;分割，如需换行可以用\\。 dbus：这个程序启动时需要获取一块 DBus 空间，所以需要和 BusName= 一起用。只有它成功获得了 DBus 空间，依赖它的程序才会被启动。 ExecStart：在输入的命令是start时候执行的命令，这里的命令启动的程序必须使用绝对路径，比如你必须用/sbin/arp而不能简单的以环境变量直接使用arp。 ExecStop：这是一个可选的指令， 用于设置当该服务被要求停止时所执行的命令行。 语法规则与 ExecStart= 完全相同。 执行完此处设置的所有命令行之后，该服务将被视为已经停止， 此时，该服务所有剩余的进程将会根据 KillMode= 的设置被杀死(参见 systemd.kill(5))。 如果未设置此选项，那么当此服务被停止时， 该服务的所有进程都将会根据 KillSignal= 的设置被立即全部杀死。 与 ExecReload= 一样， 也有一个特殊的环境变量 $MAINPID 可用于表示主进程的PID 。 ExecReload：这个不是必需，如果不写则你的service就不支持restart命令。 具体可参考这里\n看一个实际的例子： [Service] Type=oneshot RemainAfterExit=yes ExecStart=/sbin/arp -f /etc/ip-mac ExecReload=/sbin/arp -f /etc/ip-mac ExecStop=/sbin/arp -d -a 安装服务 [install] 服务编写完之后还需要被systemd装载，定义安装单元各个字段如下： WantedBy：设置服务被谁装载，一般设置为multi-user.target Alias：为service设置一个别名，可以使用多个名字来操作服务。 Also：在安装这个服务时候还需要的其他服务 完整的 Systemd Service 配置实例 [Unit] Description=Clash service Wants=network-online.target After=network.target User=hiroi [Service] Type=simple ExecStart=/home/huonwe/repos/clash/clash [Install] WantedBy=multi-user.target 之后重新加载systemctl systemctl daemon-reload 总结\nSystemd Service 是一种替代/etc/init.d/下脚本的更好方式，它可以灵活的控制你什么时候要启动服务，一般情况下也不会造成系统无法启动进入紧急模式。所以如果想设置一些开机启动的东西，可以试着写 Systemd Service。当然了，前提是你使用的Linux发行版是支持它的才行。 ","date":"2000 January 1","externalUrl":null,"permalink":"/knowledge/2024/tails/create_linux_service/","section":"知识","summary":"","title":"如何创建Linux服务","type":"knowledge"},{"content":"","externalUrl":null,"permalink":"/ai/chat/","section":"AIs","summary":"","title":"AI - Chat","type":"ai"},{"content":"","externalUrl":null,"permalink":"/ai/sdxl/","section":"AIs","summary":"","title":"AI - Paint","type":"ai"},{"content":"","externalUrl":null,"permalink":"/ai/","section":"AIs","summary":"","title":"AIs","type":"ai"},{"content":"我对各种有趣的都感兴趣。目前为止我主要接触过深度学习，Web开发，以及区块链，主要使用Python，Go，以及Rust。 部署此网站的目的，一方面在于将我踩到过的坑记录下来，方便自己以及各位浏览；另一方面，希望通过撰写文章，提高自己的输出能力。\nhiroi.top 的所有数据禁止用于AI训练。 ","externalUrl":null,"permalink":"/about/","section":"欢迎","summary":"","title":"关于我","type":"page"},{"content":" ","externalUrl":null,"permalink":"/insights/","section":"见解","summary":"","title":"见解","type":"insights"}]