喵星人聚居地 - Linux
type: channel
link: https://miaostay.com/tag/Linux/
items: 给C#的Tesseract构建可用的Linux动态链接库
items: Linux 批量创建硬链接
items: racknerd双十一特价服务器测试
items: 服务器空间清理整合
items: 用 Alpine Linux 搭建软路由
items: rime设置为默认简体
items: Linux上使用base64编解码
items: C的多线程
items: Try To Install An Arch Linux On The Virtual Machine

给C#的Tesseract构建可用的Linux动态链接库
type: item
date: 2021-02-10T13:09:00+08:00
description: 写在开始最近给自己的搜索机器人加了一个OCR识别的功能，本来想尝试着直接识别来着，不过发现效果并不是很好，接下来继续用可能得考虑下有啥方式能提高文本的识别率了。其中有个踩坑就是Nuget上的Tesseract构建的动态链接库只有Windows版，没有构建Linux版的动态链接库，所以直接在Linux上使用就会报错，然后会缺少那几个动态链接库。一个是libleptonica-1.80.0.so另一个是libtesseract41.so，除此之外如果用到了System.Drawing的话还需要libgdiplus库。接下来的解决方案只针对Debian 10，如果是非glibc环境的话自己参考下解决吧，用了好一阵子的alpine之后发现，在上面折腾的时间已经远大于节约的体积了，所以在Docker里面还是用Debian比较方便。构建leptonica构建之前先准备好编译环境apt update -y && \ apt upgrade -y && \ apt install automake ca-certificates g++ git libtool make pkg-config asciidoc docbook-xsl xsltproc libpango1.0-dev git cmake -y然后准备一下LD_LIBRARY_PATH，这个是为了给Tesseract用的，所以现在不写也可以。export LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib接下来准备一个存放最终输出文件的目录mkdir -p /app/out/x64然后在/app目录下克隆leptonica并进入git clone https://github.com/DanBloomberg/leptonica cd leptonica切换到1.80.0版本的commit上去git checkout 1ac72c93fef1a5eb76b76d6723d2aee843dd6e51然后使用autogen.sh、./configure、make -j4、make install四连./autogen.sh ./configure make -j4 make install这里不能用cmake方案，用cmake的话输出文件里面找不到动态链接库，至于原因我没去找，毕竟做成自动编译脚本的话还要改里面的东西就有点麻烦了。执行完成之后就会把liblept.so安装到/usr/local/lib里了，然后直接复制到我定义的输出目录里cp /usr/local/lib/liblept.so.5.0.4 /app/out/x64/libleptonica-1.80.0.so这样子libleptonica就算是构建完成了。构建Tesseract这个构建思路也是类似的，老样子在/app目录下克隆tesseract并进入git clone https://github.com/tesseract-ocr/tesseract.git cd tesseract然后找到4.1.1版本的commit，切换过去git checkout 75103040c94ffd7fe5e4e3dfce0a7e67a8420849然后使用autogen.sh来生成项目./autogen.sh接下来创建输出目录，然后使用cmake编译就可以了mkdir build cd build cmake .. make -j4然后拷贝动态链接库到定义的输出目录cp libtesseract.so.4.1.1 /app/out/x64/libtesseract41.so这两个文件的x64版本的动态链接库就构建完成了。配置运行环境的依赖我使用的时候还遇到了个找不到libdl的问题，这个应该就是缺少了libgdiplus的问题，用下面的命令安装就行了。bash完整的构建命令这个可以抄一下我的Dockerfile，下面贴上我Dockerfile的配置FROM moderras/dotnetsdk:5.0 AS build-env WORKDIR /app RUN export LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib && \ apt update -y && \ apt upgrade -y && \ apt install automake ca-certificates g++ git libtool make pkg-config asciidoc docbook-xsl xsltproc libpango1.0-dev git cmake -y && \ mkdir -p /app/out/x64 && \ git clone https…

Linux 批量创建硬链接
type: item
date: 2021-01-15T23:16:00+08:00
description: 写在开始最近从PT站下的视频直接导入到Jellyfin中集数识别不好，但是又不能直接改名，于是发现了一个好办法，那就是创建硬链接，将新建的硬链接修改成合适的名称之后放在合适的文件夹就可以不重复存储，又能保证两边的软件都正常识别，但是只能对文件设置硬链接，所以想办法让它能够批量创建。解决方法在cp命令中有一个参数是-l这个参数是以硬链接的形式复制文件，配合-R就可以将整个文件夹中的文件以硬链接的形式复制到新的地方，整体命令示例如下：cp -l -R SourcePath TargetPath大概就是这个样子了，这样就可以将整个文件夹中的所有文件都创建一个硬链接到新的文件夹了。写在最后其实就是一个命令的很简单的使用方法，不过回了之后还是能方便很多的，也不用花大力气写个复杂的程序自动匹配了，也挺方便的。

racknerd双十一特价服务器测试
type: item
date: 2020-10-30T15:35:00+08:00
description: 写在开始偶然看到有这么一个机器，而且价格很低，正好最近需要点不是很追求线路但是追求性能的机器，就买了个试试。这台机器是3C4G9T的机器，racknerd的纽约机房，到国内的速度确实很惨，但是性能还是很实在的，算不上亏了。有点意外的是可以玩母猪焊接？好神奇的测试，这明明是美国机器的说。Lemonbench测试LemonBench Linux System Benchmark Utility Version 20201005 Intl BetaVersion Bench Start Time: 2020-10-30 00:38:44 Bench Finish Time: 2020-10-30 01:57:15 Test Mode: Full Mode-> System InformationOS Release: Debian GNU/Linux "Buster" 10.6 (x86_64) CPU Model: Intel(R) Xeon(R) CPU E5-2680 v2 @ 2.80GHz 2.80 GHz CPU Cache Size: 16384 KB CPU Number: 3 vCPU Virt Type: KVM Memory Usage: 181.15 MB / 3.85 GB Swap Usage: 0 KB / 4.00 GB Disk Usage: 1.38 GB / 78.48 GB Boot Device: /dev/vda1 Load (1/5/15min): 0.31 0.25 0.10 CPU Usage: 0.0% used, 0.0% iowait, % steal Kernel Version: 4.19.0-6-amd64 Network CC Method: cubic + pfifo_fast-> Network InformationIPV4 - IP Address: [US] 107.173.89.* IPV4 - ASN Info: 36352 (AS-COLOCROSSING - ColoCrossing, US) IPV4 - Region: United States New York Buffalo-> Media Unlock TestHBO Now: Yes Bahamut Anime: No Abema.TV: No Princess Connect Re:Dive Japan: Yes BBC: No Bilibili China Mainland Only: No Bilibili Hongkong/Macau/Taiwan: No Bilibili Taiwan Only: No-> CPU Performance Test (Standard Mode, 3-Pass @ 30sec)1 Thread Test: 938 Scores 3 Threads Test: 2747 Scores-> Memory Performance Test (Standard Mode, 3-Pass @ 30sec)1 Thread - Read Test : 19449.60 MB/s 1 Thread - Write Test: 15792.97 MB/s-> Disk Speed Test (4K Block/1M Block, Direct-Write)Test Name Write Speed Read Speed 10MB-4K Block 47.0 MB/s (0.09 IOPS, 0.22 s) 48.1 MB/s (11749 IOPS, 0.22 s) 10MB-1M Block 905 MB/s (862 IOPS, 0.01 s) 816 MB/s (777 IOPS, 0.01 s) 100MB-4K Block 45.4 MB/s (0.09 IOPS, 2.31 s) 45.7 MB/s (11159 IOPS, 2.29 s) 100MB-1M Block 1.3 GB/s (1220 IOPS, 0.08 s) 1.7 GB/s (1635 IOPS, 0.06 s) 1GB-4K Block 45.7 MB/s (0.09 IOPS, 22.95 s) 47.2 MB/s (11520 IOPS, 22.22 s) 1GB-1M Block 1.2 GB/s (1152 IOPS, 0.87 s) 1.3 GB/s (1228 IOPS, 0.81 s)-> Speedtest.net Network Speed TestNode Name Upload Speed Download Speed Ping Latency Serve…

服务器空间清理整合
type: item
date: 2020-03-13T16:56:00+08:00
description: 写在开始这里写一些Linux上常用的清理空间的操作运行环境：bashDocker清理所有名字为的容器docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker stop docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker rm docker images|grep none|awk '{print $3 }'|xargs docker rmi清理所有未启动的容器docker images|awk '{print $3 }'|xargs docker rmiSystemd清理一天前的日志journalctl --vacuum-time=1d清理日志到剩余1Mjournalctl --vacuum-size=1M写在最后服务器的话基本上常见的清理就是清理日志和清理无用的软件， 因为我都是用docker的， 所以也就是清理掉版本更新之后剩下的的无用镜像了。

用 Alpine Linux 搭建软路由
type: item
date: 2020-03-03T14:31:00+08:00
description: 写在开始使用Hyper-V的时候他会自动分配一个Default Switch这么一个网卡用于NAT， 然而这个网卡的ip似乎每次重启都会自动更换， 所以这个就挺令人烦恼了， 毕竟如果Hyper-V虚拟机里面是一堆linux的话那每次都是自动更换ip的， 连接起来还是很麻烦的。 所以我打算在内网给解决掉这个问题， 把IP地址至少可以接近静态的， 之前那个连IP段都要变确实有点受不了。技术选型其实这个可以直接在虚拟机里跑一个OpenWRT之类的东西的， 但是鉴于我有一个这样子的虚拟机， 而且还被我莫名其妙搞坏了， 这次我就手动搭建一个路由器系统了。 至于选哪个系统， Linux用的比FreeBSD之类的熟悉一点， Windows太占资源。 然后基于节约资源的角度考虑， 我用了 Alpine Linux。 毕竟这个系统的体积小。 而且这个系统我在玩Docker镜像的时候经常用， 所以也不算陌生。其他的东西也就是用vagrant来操作hyper-v了， 这样子会简单点。那开始吧下载 Alpine Linux 的 Box先去找找有没有现成的Vagrant的Box， 然后我发现了这个Box， 这个Alpine Linux的Box支持Hyper-V的版本。 所以就用这个了。那首先随便找个目录， 然后输入vagrant init generic/alpine310 sudo vagrant up --provider=hyperv因为不是用管理员打开的这个终端， 然后如果操作Hyper-V的虚拟机的话需要管理员权限， 所以需要提权。 这里推荐一下这个人的sudo脚本。 感觉还是挺好用的。顺便一提， vagrant是用curl来下载box的。Hyper-V部分的设置在vagrant下载box的这一会去设置一下Hyper-V那边的东西。打开Hyper-V管理器， 在右侧找到虚拟交换机管理器点开之后创建一个内部的交换机名称随意， 注意是要设置成内部网络， 就像这样然后点确定就好。Vagrant Box 下载完成后vagrant up执行过程中会打印出类似以下的输出这个时候选择 Default Switch就好然后接下来会出来一堆输出， 其实也不用在意是啥。然后sudo vagrant halt关闭这个虚拟机， 接下来往里面添加一个给内网用户使用的网卡。首先要在Hyper-V控制台里面找到这个虚拟机， 然后点击它， 右边会出来一排按钮选择设置。 然后选择添加硬件里面有一个网络适配器， 点击之后选择添加。然后选择之前创建的那个内部网络。选择完成之后大概长这个样子然后点击确定， 回到这里点击启动重启开机。接下来就sudo vagrant ssh进入这个虚拟机里操作就好。构建一个简易的软路由器的基本思路首先要有一个DHCP服务器给内网设备分配IP用， 然后要有一个DNS服务器给内网设备提供DNS服务， 最重要的还要有一个NAT和转发来让内网设备可以通过NAT来连接到外部网络， 然后还需要能够回来。 这样子一个路由器就完成了。那么我们一步一步做就好软路由构成的基本选型使用Dnsmasq来给内网设备提供DHCP和DNS， 然后用iptables创建一个NAT和处理请求转发。曾经还考虑过使用AdGuardHome来提供DHCP和DNS服务来着， 奈何它的DHCP看起来不工作的样子， 也很不稳定的样子， 所以我就抛弃了这个选择。那么就进入软路由里进行操作吧毕竟是个国外的Box， 所以自带的软件源自然不会很快， 这里换成中科大的源。首先看一下这个源是啥cat /etc/apk/repositories然后他输出了https://dl-4.alpinelinux.org/alpine/v3.10/main https://dl-4.alpinelinux.org/alpine/v3.10/community中科大官方提供的一键脚本是这样的sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories这样子很明显不能成功替换， 所以要修改成这样子sudo sed -i 's/dl-4.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories替换完成之后执行sudo apk update更新完成之后就可以准备安装软件了。需要安装的软件因为这个Box非常精简， 精简到连iptables都没有， 所以要装这些东西：dnsmasqiptablesip6tables那么就一条命令加上去吧sudo apk add dnsmasq iptables ip6tablesDnsmasq 配置接下来配置一下Dnsmasq。 在这之前先确…

rime设置为默认简体
type: item
date: 2018-11-07T10:27:00+08:00
description: 写在开始我的Arch Linux上面安装的rime-ibus默认输入是繁体中文，但是我日常要用简体中文，然后每次切换输入法的时候都要按一次F4我感觉很麻烦，所以就找了一下怎么修改简体字。修改默认的那个的配置文件我的这个配置文件在这里~/.config/ibus/rime/build/，所以看一下这个目录下面的文件:bopomofo.prism.bin bopomofo_tw.prism.bin cangjie5.prism.bin default.yaml luna_pinyin_fluency.schema.yaml luna_pinyin.schema.yaml luna_pinyin_simp.schema.yaml luna_quanpin.schema.yaml stroke.schema.yaml terra_pinyin.schema.yaml bopomofo.schema.yaml bopomofo_tw.schema.yaml cangjie5.schema.yaml luna_pinyin_fluency.prism.bin luna_pinyin.prism.bin luna_pinyin_simp.prism.bin luna_quanpin.prism.bin stroke.prism.bin terra_pinyin.prism.bin然后我用的是明月拼音所以我第一反应看到的是luna_pinyin.schema.yaml ，似乎也猜对了。拉到底找到这里：switches: - name: ascii_mode reset: 0 states: ["中文", "西文"] - name: full_shape states: ["半角", "全角"] - name: simplification states: ["漢字", "汉字"] - name: ascii_punct states: ["。，", "．，"]然后改成这样：switches: - name: ascii_mode reset: 0 states: ["中文", "西文"] - name: full_shape states: ["半角", "全角"] - name: simplification reset: 1 states: ["漢字", "汉字"] - name: ascii_punct states: ["。，", "．，"]其实就是加一个reset的选择选成简体中文，就这样就结束了。写在最后这个就是这样子了，还算容易，但是不是很好找，因为网上一般都是用F4或者ctrl+\`实现的， 这种就要每次打开都要设置一遍，比较麻烦，所以这样子会比较省事一点若干年后的补充其实正确用法应当是在luna_pinyin.schema.custom.yaml（经评论指正这里应该是luna_pinyin.custom.yaml)文件里编辑这一段， 这样就可以保证更新rime的时候不会被覆盖掉原来的配置了。所以在luna_pinyin.custom.yaml中应当写的内容为# encoding: utf-8 patch: switches: - name: ascii_mode reset: 0 states: ["中文", "西文"] - name: full_shape states: ["半角", "全角"] - name: simplification reset: 1 states: ["漢字", "汉字"] - name: ascii_punct states: ["。，", "．，"]

Linux上使用base64编解码
type: item
date: 2018-11-06T14:39:00+08:00
description: 写在开始其实就是想找一个简单的base64的编解码工具，然后就发现了linux上就有这个命令，所以我就直接用了。命令介绍默认状态（编码）命令： base64效果： 从标准输入读入然后ctrl+d之后结束，将输入数据编码，所以可以用管道解码参数： -d用法： base64 -d效果：同上，只不过就是这个是解码base64用的从文件中读入（编码）命令： base64 filepath/filename效果： 从这个文件读入数据然后编码成为base64之后从标准输出输出，所以也可以用管道或者重定向从文件中读入（解码）命令： base64 -d filepath/filename效果：同上，只不过是解码忽略非字母表字符参数： -i效果：就是忽略掉某些特殊字符，一般解码的时候加上就好。

C的多线程
type: item
date: 2018-10-30T13:27:00+08:00
description: 写在开始昨天有给某人写了一个C语言的作业，内容是写两个线程，然后在一个线程里打印出另一个线程的线程号。第一个线程结束后再结束第二个线程，内容就是这样子。代码内容其实这个写法就是用了一下pthreads里面的几个函数就可以实现了。我第二个线程打印第一个线程的线程号的方式是在第一个线程结束之后的返回值里面添加上第一个线程的线程号，然后第二个线程join一下第一个线程，这样等待着第一个线程结束之后就可以获取到第一个线程当时获取的线程号了，整体思路就这样子。接下来是代码#include <stdio.h> #include <pthread.h> #include <stdlib.h> #include <sys/syscall.h> #define gettid() syscall(__NR_gettid) void * tr1(){ printf("this is thread 1\n"); pthread_exit((void *)gettid()); } void * tr2(void * thread1){ void * thread_id; printf("this is thread 2\n"); pthread_join((pthread_t)thread1,&thread_id); printf("%d",(int*)thread_id); pthread_exit(NULL); } int main() { pthread_t thread1,thread2; pthread_create(&thread1,NULL,tr1,NULL); pthread_create(&thread2,NULL,tr2,(void *)thread1); pthread_exit(NULL); }写在最后方式也是挺简单的，但是至少达到目的了，所以这样就可以了。

Try To Install An Arch Linux On The Virtual Machine
type: item
date: 2017-06-04T12:00:00+08:00
description: Before long I just in my senior high school. I try to install a arch Linux. Because I see a blog or a answer and find that if you want to study Linux try to use arch Linux or gentoo Linux. And it can be build as whatever you want. So at that time, I download an arch Linux and try to install it on the virtual machine named VMware. After I mount the ISO on the virtual machine, I found it just have a terminal. So I searched tutorials on the internet. Because at that time I can't over the wall, I can only use Baidu. So I searched tutorials for a long time. But I didn't find any useful tutorial. I just followed an old tutorial. So in the end, I failed to install that operating system. But now I think I can try it again because I have Google and arch Linux's wiki also some tutorials which seemed newer. So I think this time I may be succeed.So this time I will say how to install a arch Linux on the VMware. Firstly, create a new virtual machine. I think it's easy. So I didn't say that. I just say I give virtual machine 1Gib memory and 20G hard disk. This time I just use legacy boot, because I try uefi boot and it may not work at virtual machine. Then I start the virtual machine. And it will show :Select the first one. And then you can see:My hard disk is in /dev/sda.So it need to use cfdisk /dev/sda to partition my virtual disk.Select dos.I give / 19G and give swap 1G.Then select write and then quit.After quit, it need to mkfs. Using mkfs.ext4 /dev/sda1to make file system as ext4. Also the swap is need to be formatted. Using mkswap /dev/sda2 and then swapon /dev/sda2 to use swap.Then mount /dev/sda1 /mnt to mount the new disk parted. And then vim /etc/pacman.d/mirrorlist to change a faster software source.Server = http://mirrors.163.com/archlinux/$repo/os/$arch Server = http://mirrors.cqu.edu.cn/archlinux/$repo/os/$archAdd this on the top is OK.Then flush the pacman pacman -Syy.And start to install the system.pacstrap -i /mnt base base-develJust press enter is OK. Then it w…