什么是NAS及为什么要用NAS

NAS,英文全名Network Attached Storage,翻译过来是:网络附接存储。

引用维基百科定义

1
网络附接存储(英语:Network Attached Storage,缩写:NAS)[1]是一种文件级(与块级存储相对)的计算机数据存储服务器,它连接到计算机网络,并提供对异构网络用户的数据访问。它专门用于通过其硬件、软件或配置来提供文件服务。它通常作为专门制造的专用计算机设备制造。 NAS系统是包含一个或多个通常排列成逻辑存储器、冗余存储器或RAID存储驱动器的网络设备。NAS消除了从网络上的其他服务器提供文件服务的负担,它们通常使用网络文件共享协议(如NFS、SMB或AFP)提供对文件的访问。

上边说了一大堆,看着头疼。其实说直白一点,百度网盘大家都用过,可以直接存文件,看电影,放照片很方便对吧, 那么NAS也是干这事儿的。这里大家要问,那我百度2个T的宝贝为啥还要要用NAS呢? 这里就不得不说百度网盘及各种乱七八糟的网盘是很方便,但是有一个很大的缺点,那就是你的资源都掌握在别人手里(你懂得),这时候NAS就体现了它的一个优势,数据都由你自己掌控。

小白特供,NAS可以干什么

个人感觉最主要的几个场景,构建家庭影院,照片分享,文件备份。 同时因为其本身就是一个服务器,心情好你可以做个人博客。

如何选择

新手小白可以直接选择现成品牌即可,市面上用的比较多的有以下几个:

极空间:https://tiyan.zspace.cn/

群晖:https://demo.synology.cn/zh-cn/dsm

威联通:https://www.qnap.com.cn/zh-cn/live-demo

爱速特:https://www.asustor.com/zh-cn/live_demo

可以参考他们的官网按照自己的心里价位购买即可,很easy

如果是老鸟(我是菜鸟),就可以根据以前的使用经验,从硬件到软件统统考虑,然后再结合自己的心里价位去综合考虑。或者动手能力强,自己刷刷刷也不是不行。

为什么要自建及优缺点

现在到了本文的重点,自建NAS。 那么为什么自建,且听我一一道来。

成本效益:

自建NAS通常比购买现成的NAS系统更经济,只要你有台差不多的基本废弃不用的电脑,就可以自建。系统本身及需要的软件也是开源免费使用,四舍五入那就是不花钱。

定制化

可以根据自己的需求定制硬件和软件,如果你觉得自己磁盘不够就可以随时加硬盘,软件不好用那就换软件,系统用腻了那就换系统,爽。

上边都是优点,当然自建也是有缺点的

没有开箱即用,很多东西需要自己学习,对于小白来说有点难。

稳定性可能不如现成的NAS。

UI没有现成的NAS看起来好看统一。

如何自建

一台个人闲置电脑

首先要有一台电脑,最好是台式机,小机箱也行,但是如果需要扩展多块硬盘还是大点好。其次是系统,我个人是使用archlinux习惯了,也可以使用其它发行版本。

DLNA/UPnP家庭流媒体服务 jellyfin + KODI(播放器) 家庭影院软件

https://jellyfin.org/docs/general/installation/linux/

1
2
3
4
# 启动
systemctl start jellyfin.service
# 访问, 按照自己设置的密码搞起即可
http://127.0.0.1:8096

BT下载aria2

Linux服务器web管理神器–Cockpit (作为服务资源监控管理工具使用)

1
2
3
4
#启动
systemctl start cockpit.service
# 访问
http://localhost:9091

照片查看 photoprism

https://docs.photoprism.app/user-guide/

1
2
3
4
5
6
7
cd ~/.photoprism
docker-compose up -d

#访问
http://127.0.0.1:2342

PhotoPrism 的默认用户名为 admin,密码为 insecure

优势: 可以使用现有的存储路径,重建索引

缺点: 只有网页版

网盘聚合alist + rclone(非必须)

可以通过该工具,直接在线访问网盘中视频,或者配合其它工具(rclone)通过webdav将网盘目录挂载到本地

windows下用RaiDrive替代rclone

samba: Samba(SMB)文件共享服务(非必须)

主要是用来跟win进行数据共享,如果有需要可以安装起来

移动端

视频播放 mxplayer(安卓) nplayer(ios)

浏览器直接访问

交流

欢迎关注公众号, 更方便查看文章

公众号: 陌上花kai

引言

系统没有高低贵贱,主要还是使用的人,哪个跟你更契合。对我而言, archlinux就是最契合的那个。本文主要是对archlinux使用做一个粗浅的介绍,如果能勾起你一丝兴趣,那就更好了。

第一部分:初识Arch Linux

从Ubuntu和Fedora到Arch的转变

大学期间了解到有linux这么一类系统,看起来很酷,那命令行操作神秘又高级,瞬间引起了我的兴趣。经过各种对比,选择了最容易上手的ubuntu发行版。使用中发现跟windown体验大不相同,很多东西都要从头学起,对于喜欢折腾的人来说真的是瞌睡给了个枕头。同时这个系统简直是游戏荒漠,使用这个系统又能帮助我远离游戏,一举多得。

大概使用一年多ubuntu后中间也接触了fedora但是也没什么吸引力,个人感觉也就是界面不同,包管理机制不同,没什么特殊的。直到我遇到了archlinux,搜索各种资料学习安装,说实话刚开始纯命令行安装真的很头大,就怕一步搞不对,但是折腾起来后,很有j成就感。瞬间感觉自己的水平上了一个档次。

搜索与学习:如何克服初期困难

其实所有发行版都是基于同一个linux内核,大差不差,但是不同的发行版有各自的特色,archlinux就是让你可以更加自由的定制。如果是纯新手我建议不用想别的就是一直逼着自己用, 不会就去搜索,这个是必须要经历的,等过了这段时间就是海阔天空。

第二部分:桌面环境的探索

UNITY

最初ubuntu模式使用unity桌面,那时候导航栏靠左显示,那叫一个帅气。

GNOME

fedora系统默认使用gnome桌面,这个桌面给我的第一感觉就是很绚,而且这套桌面环境自带了很多实用的功能,开箱即用,对新手很友好。

XFCE

如果你的电脑比较老旧,可以选用xfce,这个桌面环境麻雀虽小五脏俱全,占用资源很小而且足够用,不用太折腾。

Openbox

严格来说openbox并不算桌面环境,只能算是个桌面管理器,要构成一个完整的桌面需要自己去定制,如: panel栏:tint2,背景透明: xcompmgr,程序运行:albert,喇叭图标volumeicon,登录管理器:slim等。一段时间这是我的主力桌面,真的很快。

i3wm

一个偶然的机会听说有一种叫平铺的桌面环境,然后就结识了i3,跟openbox一样仅仅是个桌面管理器,一切都要自己去定制,包括桌面背景,导航栏,登录管理器等。感兴趣的道友可以去看看,新手不建议使用,容易劝退。

第三部分:Arch Linux的日常生活

从不熟悉到离不开

最开始因为对系统的不熟悉有很多问题,天天不是在搜索就是在搜索的路上,工作的事情一点没干都是在学怎么用系统了。随着时间的推移,很多坑也慢慢填平了,系统使用越来越熟练,很多工作在命令下操作会比界面操作效率高很多,现在让我换回windows真的很不习惯。

日常工作与生活的便利

在日常工作和生活中,Arch Linux的高效操作让我能够更快地完成任务。有一件印象深刻的事儿,刚毕业工作那会儿,有一次领导让整理几百个脚本文件,需要在每个脚本前边加上begin。作为一个”懒惰”的程序员,必须善用工具,使用sed命令分分钟搞定,当时那叫一个骄傲。

第四部分:工作中的Arch Linux

提高工作效率的秘诀

工作这么多年,大家一致觉得我的工作效率比较高,主要原因就在于这个系统,因为基本上是我自己定制出来的,对它更熟悉,使用起来当然得心应手。对于文本操作,软件开发,linux是有天然的优势,因为一切皆文件,很多时候文本操作会比图形界面快很多,比如开发环境搭建,文本有天然优势,可以做成工具一步到位。

定制化系统以适应工作需求

不论任何行业工作久了都会有自己的工具箱,我自己会把一些日常使用的东西配置都整理到一起,然后通过git版本控制,如果换新的机器,直接安装好后统一初始化,搞定。这个真的很舒服,要用起来。

服务器管理的简便性

如果你是技术人员,日常中使用linux让你在面对生产服务器时也会更从容。 就相当与给你换了太电脑,仅此而已,so easy。

第五部分:Arch Linux的学习之道

逼迫自己:持续使用的重要性

学会使用Arch Linux的最好方式就是逼迫自己一直使用它。

实践出真知:通过实际操作学习

系统就是要经常用,不要怕,用不坏的。

社区资源:如何利用Arch Linux社区

大部分的问题在arch wiki都可以找到,系统安装了之类的不要看乱七八糟的地方,wiki足以。

https://archlinux.org/

结语

Arch Linux的旅程充满了挑战,但也充满了乐趣。它不仅提高了我的技术能力,也锻炼了我的自制力。如果你也在寻找一个能够挑战自我、提高效率的Linux发行版,那么Arch Linux绝对是一个不错的选择。

Vim插件管理器Vundle使用指南

Vundle简介

Vundle是一个Vim插件管理器,它允许您:

  • .vimrc中跟踪和配置插件
  • 安装配置的插件
  • 更新插件
  • 搜索所有可用的Vim脚本
  • 清理未使用的插件
  • 通过交互模式一键运行上述操作

快速开始

1. 安装Vundle

1
git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim

2. 配置vimrc.bundle

.vimrc中添加以下内容,以使用Vundle:

1
2
3
4
5
6
... 一堆配置
if filereadable(expand("~/.vimrc.bundles"))
source ~/.vimrc.bundles
endif
filetype plugin indent on

3. 安装插件

在Vim中执行:PluginInstall来安装插件。

或者从命令行执行vim +PluginInstall +qall

4. (可选)对于使用fish shell的用户

.vimrc中添加set shell=/bin/bash

好用的Vim插件

surround

surround插件可以方便地添加、修改和删除包围符:

1
2
3
4
5
6
7
8
9
10
11
12
13
" 替换: cs"'
"Hello world!" -> 'Hello world!'

" 替换-标签: cst"
<a>abc</a> -> "abc"

" 添加: ysiw"
Hello -> "Hello"

" 添加-整行: yss"
Hello world -> "Hello world"

" 添加-当前到行尾: ys$"

vim-repeat

vim-repeat插件允许你重复一个插件的操作,例如surround.vim:

通过.号重复上一次操作。

模糊搜索神器fzf

fzf是一个强大的模糊搜索工具,结合fzf.vim插件使用:

1
2
Bundle 'junegunn/fzf'
Bundle 'junegunn/fzf.vim'

在Vim中执行:PlugInstall安装插件。

需要安装ripgrep

1
pacman -S ripgrep

使用Vundle

Vundle提供了多种命令来管理插件:

  • :PluginList - 列出配置的插件
  • :PluginInstall - 安装插件
  • :PluginUpdate - 更新插件
  • :PluginSearch - 搜索插件
  • :PluginClean - 清理未使用的插件
1
2
" 把自定义的.vimrc.bundle文件引入到.vimrc中
source ~/.vimrc.bundle
1
2
# 复制molokai主题到你的vim目录
cd ~/.vim & cp -r bundle/molokai/colors .
1
2
" 更新所有插件
:BundleUpdate

一份个人插件配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
if &compatible
set nocompatible
end

filetype off
set rtp+=~/.vim/bundle/Vundle.vim/
call vundle#rc()

" Let Vundle manage Vundle
Bundle 'gmarik/vundle'

" Define bundles via Github repos
Bundle "tomasr/molokai"
Bundle 'vim-airline'
Bundle 'jlanzarotta/bufexplorer'
"Bundle 'skammer/vim-css-color'
"Bundle 'mattn/emmet-vim'
"Bundle 'mbbill/fencview'
"Bundle 'tpope/vim-fugitive'
Bundle 'tpope/vim-surround'
Bundle 'tpope/vim-repeat'
"Bundle 'airblade/vim-gitgutter'
"Bundle 'nathanaelkane/vim-indent-guides'
"Bundle 'vim-scripts/JavaScript-Libraries-Syntax'
"Bundle 'scrooloose/nerdcommenter'
Bundle 'scrooloose/nerdtree'
"Bundle 'edkolev/promptline.vim'
"Bundle 'MarcWeber/vim-addon-mw-utils'
"Bundle 'tomtom/tlib_vim'
"Bundle 'garbas/vim-snipmate'
Bundle 'scrooloose/syntastic'
"Bundle 'godlygeek/tabular'
Bundle 'majutsushi/tagbar'
"Bundle 'tomtom/tlib_vim'
"Bundle 'vim-scripts/TxtBrowser'
"Bundle 'xsbeats/vim-blade'
"Bundle 'guns/vim-clojure-static'
"Bundle 'kchmck/vim-coffee-script'
"Bundle 'webfd/vim-cppstl'
"Bundle 'rhysd/vim-crystal'
"Bundle 'hail2u/vim-css3-syntax'
"Bundle 'OrangeT/vim-csharp'
"Bundle 'chrisbra/csv.vim'
"Bundle 'JesseKPhillips/d.vim'
"Bundle 'dart-lang/dart-vim-plugin'
"Bundle 'ekalinin/Dockerfile.vim'
"Bundle 'elixir-lang/vim-elixir'
"Bundle 'jimenezrick/vimerl'
"Bundle 'kongo2002/fsharp-vim'
"Bundle 'fatih/vim-go'
"Bundle 'tfnico/vim-gradle'
"Bundle 'webfd/vim-haskell'
"Bundle 'jdonaldson/vaxe'
"Bundle 'othree/html5.vim'
"Bundle 'digitaltoad/vim-jade'
"Bundle 'pangloss/vim-javascript'
"Bundle 'mitsuhiko/vim-jinja'
"Bundle 'jason0x43/vim-js-indent'
"Bundle 'leshill/vim-json'
"Bundle 'elzr/vim-json'
"Bundle 'mxw/vim-jsx'
"Bundle 'briancollins/vim-jst'
"Bundle 'JuliaLang/julia-vim'
"Bundle 'udalov/kotlin-vim'
"Bundle 'groenewege/vim-less'
"Bundle 'godlygeek/tabular'
"Bundle 'plasticboy/vim-markdown'
"Bundle 'mustache/vim-mustache-handlebars'
"Bundle 'evanmiller/nginx-vim-syntax'
"Bundle 'rgrinberg/vim-ocaml'
"Bundle 'vim-perl/vim-perl'
"Bundle 'exu/pgsql.vim'
"Bundle 'shawncplus/phpcomplete.vim'
"Bundle 'stephpy/vim-php-cs-fixer'
"Bundle '2072/PHP-Indenting-for-VIm'
"Bundle 'me-vlad/python-syntax.vim'
"Bundle 'wlangstroth/vim-racket'
"Bundle 'vim-ruby/vim-ruby'
"Bundle 'rust-lang/rust.vim'
"Bundle 'derekwyatt/vim-scala'
"Bundle 'cakebaker/scss-syntax.vim'
"Bundle 'slim-template/vim-slim.git'
"Bundle 'iakio/smarty3.vim'
"Bundle 'keith/swift.vim'
"Bundle 'evidens/vim-twig'
"Bundle 'leafgarland/typescript-vim'
"Bundle 'tkztmk/vim-vala'
"Bundle 'vimwiki/vimwiki'
"Bundle 'xwsoul/vim-zephir'
Bundle 'junegunn/fzf'
Bundle 'junegunn/fzf.vim'

syntax enable
filetype plugin indent on

if filereadable(expand("~/.vimrc.bundles.local"))
source ~/.vimrc.bundles.local
endif

filetype on

Vim实用技巧:文本编辑与处理

基数行与偶数行分组

使用Vim的替换命令,可以轻松地将基数行和偶数行分组:

1
%s/\(^.*$\)\n\(^.*$\)/\1 \2/g

然后,删除所有的基数行:

1
%s/^.*$\n\(^.*$\)/\1/g

删除重复行

在Vim中删除重复行是一个常见的操作,以下是几种方法:

删除相邻重复行

1
:g/\(.\+\)$\n\1/d

删除不相邻重复行

使用排序命令删除不相邻的重复行:

1
:sort u

删除重复行,结果按照原顺序排列

为了保存原有顺序,首先给每行加上行号和1个{

1
:let i=1|g/^/s//\=i.'{'/|let i+=1

按照行号后面的内容排序:

1
:sort /^\d\{-}/

删除行号后面的内容相同的行保留后面的行:

1
:g/^\d\{-}\{.∗$\n\d\{-}\{1$/d

按照行号恢复顺序:

1
:sort n

删除空白行

删除文件中的空白行:

1
%g/^\s*$/d

添加序号

有多种方法可以为文本添加序号:

通过let变量

1
let i=1 | g/^/s//\=i.' '/ | let i=i+1

直接使用行号

1
:g/^/ s//\=line('.').' '

使用range()函数

1
2
3
:for i in range(1, 31)
: call setline(i, i .' '. getline(i))
:endfor

利用Vim的编程支持

1
2
3
4
5
:python <<EOF
from vim import current
for i in range(len(current.buffer)):
current.buffer[i] = str(i+1) + ' ' + current.buffer[i]
EOF

外部命令

使用外部命令如findstr, sed, diff, perl, python等为文本添加序号:

1
2
3
4
5
:%!findstr /N "^"
:%!sed =|sed "N;s/\n/ /"
:%!diff --line-format=%dn%L % -
:%!perl -pe "print ++$a . ' '"
:%!python -c "import sys,fileinput as f;[sys.stdout.write(str(f.lineno())+a) for a in f.input()]"

查看文件行数、列数、字符数及所占字节大小

查看文件的行数、列数、字符数及所占字节大小:

1
g + <Ctrl-g>

人工智能:助手还是替代者?

摘要

本文探讨了人工智能(AI)的概念、应用范围以及它对人类工作和社会关系的潜在影响。通过分析AI的当前能力与局限,本文旨在提供一个全面的视角,以理解AI如何与人类协作,而非简单地替代我们。

什么是AI?

人工智能(Artificial Intelligence,简称AI)是指由人造系统所表现出来的智能行为。它是计算机科学的一个分支,旨在创建能够执行通常需要人类智能的任务的机器和软件。
人工智能的核心目标是模拟、延伸和扩展人类智能。它通过研究、开发用于模拟人类认知任务的理论、方法、技术及应用系统来实现这一目标。这些任务包括感知、理解、学习、推理和行动等。

能干什么?

AI使用范围很广,工作、生活、娱乐方方面面都可以用到,下面以一个简单的生活场景举例:

没有AI前

以前面对不懂或者不会的东西可能需要网上搜索或者问他人,但是这些都有弊端。网上的信息太庞杂,很多时候搜索出来的信息筛选也需要很大的功夫,如果没有好的搜索技巧和判断能力费力不讨好;而问其他人,一次两次还好,如果次数太多可能别人也会烦,自己也会觉得不好意思,不会的还是不会。

有了AI后

使用AI可以让上述事情变得很简单,如果有不懂的问题我们可以直接去问AI,如果没看明白我们可以让它给出详细的解释,如此反复直到你弄明白。是不是感觉很棒。

如何使用?

截至目前AI工具已经很多,无法一一列举,按照目前我经常使用的主要是ChatGPT,KimiAI,秘塔搜索等,这些网站都做的很直观点进去就会用,主要是要动起来。可以用来帮忙整理excel表格,做文本转换,做翻译,生成一份报告,只要你有想法都可以让他试着实现。

能否替代人类?

用多了以后你就会发现AI真的很强,作为一个开发人员,有时候我就会想AI是否会让我停止思考,进而替代我的工作。

个人觉得人类有很多方面是目前AI无法理解的,比如情感,社会关系等。很多工作生活其实是情感、社会关系、独立思考等各种能力参与才能实现,这些场景目前的AI无法替代。但是有些简单的工作比如上述说的做一些文本转换,生成一些简单的文章,做一些excel表格等,AI完全可以胜任。如果是日复一日只从事上述工作的人员,很容易被AI替代。

开发人员是否会被AI替代? 现在有很多AI编程工具,只要你能把场景描述清楚,它就可以迅速实现代码,这时候不免担心这么下去是否会被淘汰。其实仔细想想目前是不可能的,开发工作本身涉及面也很广,不是简单的CRUD,需要对业务的了解,跟其他人员的沟通交流,系统架构的设计,所以纯粹AI目前是无法完全替代开发人员的。但是我们可以充分利用AI,他就像一个刚入行的新人,需要你把业务给他说明白,只要他来完成一些简单的代码模块(业务简单,算法相关),这样可以极大的增加我们的工作效率。代码写完以后我们又可以把AI作为一个仔细的老师,帮我们检查下代码漏洞,留出时间摸鱼很香。

如果太依赖AI会不会让自己的能力降低? 这个担心一点不多余,可能很多时候老师都告诉我们要自己先思考,不明白了再去问人,这就是要锻炼我们独立思考能力。但是有了AI肯能会让我们养成惰性,直接上来就问,这个习惯可不好,会让我们变成一个缺乏独立思考的zz。所以个人觉得对于自己成长(money)有帮助的事情,首先还是要自己先去思考去实现,简单的、重复很多次的事情可以偶尔交给AI去完成,保持我们的敏感度。对于开发人员来说,技术就是根本,这个如果只想着靠AI去喂,趁早转行吧,但是写ppt了啥的很讨厌,让AI这个”新人”去搞很合理。

结论

AI是一个强大的工具,可以作为我们的助手,提高工作效率。然而,它不应该成为我们思考和创造的替代品。真正的专业人士会利用AI来扩展自己的能力,而不是被其替代。

互动环节

所以,您觉得我们最终是否会被AI替代? 欢迎在评论区分享您的看法。

在日常工作和生活中使用Linux-开篇

前言

欢迎来到《在日常工作和生活中使用Linux》的系列分享。在这个系列中,我们将探讨为什么选择Linux,以及如何在日常工作和生活中高效地使用它。无论你是刚刚接触Linux的新手,还是希望深入了解高级应用的老手,我们都希望这个系列能为你提供有用的指导和灵感。

为什么选择Linux?

  • 开放源代码:Linux是开源的,这意味着你可以自由地查看、修改和分发它的源代码(科普用,使用来说爱咋咋)。
  • 灵活性:你可以根据自己的需求定制Linux,从桌面环境到系统工具,应有尽有(这个我最喜欢)。
  • 系统占用: 对于老旧的pc系统占用很重要,相比win开机至少4g来说,linux选择太多了,linux又快又猛。

适用场景

  • 开发和编程:Linux支持多种编程语言和开发工具,是开发人员的理想选择。
  • 日常办公:办公软件、邮件客户端、浏览器等应有尽有,完全可以满足日常办公需求。
  • 多媒体娱乐:还是用win吧,这方面linux差得原。

预期读者群体

  • Linux新手:刚开始接触Linux,希望学习基本操作和配置。
  • 开发人员:希望搭建和优化开发环境,提高开发效率。
  • 系统管理员:关注系统安全、网络管理和自动化运维。
  • 普通用户:希望在日常生活中使用Linux,提升工作和娱乐体验。

系列文章结构

1. Linux入门

  • 什么是Linux:简要历史和不同发行版
  • 如何选择适合自己的发行版(如Ubuntu、Fedora、Arch Linux等)
  • 安装Linux:从下载ISO文件到安装系统的详细步骤
  • 安装后的基本配置

2. 基础命令和工具

  • 常用命令介绍(如ls、cd、cp、mv、rm、cat、grep等)
  • 文件系统和权限管理
  • 使用终端和Shell脚本入门
  • 编辑器推荐及使用(如Vim、Emacs)

3. 日常工作中的Linux

  • 办公套件:Wps,LibreOffice
  • 浏览器推荐及配置(如Firefox、Chrome)
  • 文件管理器(PCManFM)

4. 开发环境搭建

  • 编程语言环境配置(如Python、Java、C++等)
  • 集成开发环境(IDE)推荐及配置(如VSCode、IntelliJ IDEA、Eclipse等)
  • 版本控制系统(如Git)的使用
  • Docker和虚拟机管理(如VirtualBox)

5. 系统维护与优化

  • 软件包管理(如apt、yum、pacman)
  • 系统更新与备份策略
  • 性能监控和优化(如htop、iotop)
  • 日志管理和故障排除

6. 多媒体与娱乐

  • 音乐和视频播放软件推荐(如VLC)
  • 图像编辑工具(如GIMP)
  • 游戏(如Steam)

8. 高级话题

  • 自定义Shell和脚本编写
  • 参与开源社区和项目

交流

欢迎关注公众号, 更方便查看文章

公众号: 陌上花kai

环境工具

系统archlinux

手柄 北通360, usb

安卓手机 小米11

游戏 流行群侠传

步骤

手机要打开开发者调试, 并通过usb连接测试

不属于此次重点, 可自行搜索, 通过命令行adb
devices测试输出,说明连接成功

安装scrcpy

此工具用来在电脑端远程操作手机, 并且该软件开源, 而且使用还算流畅

1
sudo pacman -S scrcpy

在手机电脑正常连接的情况下, 直接启动改程序即可

测试键盘控制

通过键盘测试游戏中一些主要操作的对应按键, 后续跟手柄进行绑定

键盘

  1. 前后左右(wsad)

  2. 轻击(h)

  3. 重击(j)

  4. 技能1(u)

  5. 技能2/3(i)

    随从技能也会一起被放出去,真刺激

  6. 闪避(k)

  7. 怒气(p)

  8. 换武器(l)

编写手柄键盘按键映射程序

这里要注意, 按键使用的是keyboard组件, 测试使用pyautogui会出现连点的情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
"""
通过python + adb + scrcpy的方式,实现手柄玩安卓手机游戏

# Released by rdb under the Unlicense (unlicense.org)
# Based on information from:
# https://www.kernel.org/doc/Documentation/input/joystick-api.txt

# 参考
https://blog.csdn.net/Enderman_xiaohei/article/details/88050036?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-9-88050036-blog-109139735.pc_relevant_3mothn_strategy_recovery&spm=1001.2101.3001.4242.6&utm_relevant_index=12

https://blog.csdn.net/dhjabc_1/article/details/117444998

使用:
linux下需要使用管理员身份运行(触发按键需要), 否则运行报错

sudo python xx.py

"""
import pygame
# 键盘
import keyboard
import pyautogui
import time

# 鼠标, 没啥用了
# from pymouse import PyMouseMeta
# m = PyMouseMeta()


class JoyToKey:
"""
将手柄映射到键盘输入上
"""

def exec(self, joystick, event):
# 可能的joystick行为: JOYAXISMOTION JOYBALLMOTION JOYBUTTONDOWN JOYBUTTONUP JOYHATMOTION
# if event.type == pygame.JOYBUTTONUP:
# print("Joystick button released.")
# ********************键盘按键********************
if event.type == pygame.KEYDOWN:
# print(pygame.key.get_pressed())
pass
# event.key 表示键盘按键的值,比如k 的值是107, 回车键的值是13,等
# self.toggle_show_fps(event.key)
elif event.type == pygame.KEYUP:
# print(pygame.key.get_pressed())
pass

# ********************手柄操作********************
elif event.type == pygame.JOYBUTTONDOWN:
# 检测到手柄上的键按下
# print("Joystick button pressed.")
if joystick.get_button(7) == 1:
# 手柄start键 --> 键盘中的回车键。
keyboard.press('enter')
if joystick.get_button(0) == 1:
# 手柄A键 --> 键盘的k键,也就是对应跳(闪)的功能。
keyboard.press('k')
if joystick.get_button(2) == 1:
# 手柄X键 --> 键盘u
keyboard.press('u')
if joystick.get_button(1) == 1:
# 手柄B键 --> 键盘i
keyboard.press('i')
if joystick.get_button(3) == 1:
# 手柄Y键 --> 键盘p
keyboard.press('p')
if joystick.get_button(4) == 1:
keyboard.press('h')
if joystick.get_button(5) == 1:
# 手柄又键 --> 键盘l(换武器)
# keyboard.press('l')
keyboard.press('j')
elif event.type == pygame.JOYBUTTONUP:
# print("Joystick button release.")
if joystick.get_button(7) == 0:
# 手柄start键 --> 键盘中的回车键。
keyboard.release('enter')
if joystick.get_button(0) == 0:
# 手柄A键 --> 键盘的k键,也就是对应跳(闪)的功能。
keyboard.release('k')
if joystick.get_button(2) == 0:
# 手柄X键 --> 键盘u
keyboard.release('u')
if joystick.get_button(1) == 0:
# 手柄B键 --> 键盘i
keyboard.release('i')
if joystick.get_button(3) == 0:
# 手柄Y键 --> 键盘p
keyboard.release('p')
if joystick.get_button(4) == 0:
keyboard.release('h')
if joystick.get_button(5) == 0:
# 手柄又键 --> 键盘l(换武器)
# keyboard.release('l')
# 攻击键容易连点
keyboard.release('j')

# 攻击键
elif event.type == pygame.JOYAXISMOTION:
# print("Joystick axis pressed.")
if joystick.get_axis(2) > 0:
# 手柄左x --> 键盘h
# 注意: 这里需要让手柄, pygame来控制按压和释放, 如果用pyautogui, keydown每次会触发很多按压,(连点)
# 还是用这个保险
keyboard.press('h')
if joystick.get_axis(5) > 0:
# 手柄右x --> 键盘j
keyboard.press('j')
if round(joystick.get_axis(1)) < 0:
# 前
keyboard.press('w')
if round(joystick.get_axis(1)) > 0:
# 后
keyboard.press('s')
if round(joystick.get_axis(0)) < 0:
# 左
keyboard.press('a')
if round(joystick.get_axis(0)) > 0:
# 右
keyboard.press('d')

# 释放
# print("Joystick axis released.")
# print("s", joystick.get_axis(1))
if joystick.get_axis(2) < 0:
# 手柄左x --> 键盘h
keyboard.release('h')
if joystick.get_axis(5) < 0:
# 手柄右x --> 键盘j
keyboard.release('j')
if round(joystick.get_axis(0)) == 0:
# 释放左右
keyboard.release('a')
keyboard.release('d')
if round(joystick.get_axis(1)) == 0:
# 释放前后
keyboard.release('w')
keyboard.release('s')

# 摇杆转向
# 当前鼠标光标位置, 固定位置, 不单独获取了
# x, y = pygame.mouse.get_pos()
x, y = 482, 305
pyautogui.moveTo(x, y)
# 1. 设置当前鼠标光标位置, 放中间或偏右
# 2. 根据摇杆变化, 利用pyautogui进行拖拽
# 3, 4为遥感的横/纵向变化
if joystick.get_axis(3) != 0 or joystick.get_axis(4) != 0:
# 将当前光标位置的东西向下移动100个像素点,在拖动的过程中按住鼠标左键。
# >> > pyautogui.drag(100, 0, button='left')
# 一样的问题, 连点
# pyautogui.drag(int(round(joystick.get_axis(4))), int(round(joystick.get_axis(3))), button='left')
print(y+int(round(joystick.get_axis(4))), x+int(round(joystick.get_axis(3))))

# 使用pymouse实现上述payautogui的拖拽
# x, y = pygame.mouse.get_pos()
# m.press(x, y)
# x1 = x + joystick.get_axis(3)
# y1 = y + joystick.get_axis(4)
# m.move(x1, y1)
# m.release(x1, y1)


if __name__ == '__main__':
pygame.init()

# 初始化joystick
pygame.joystick.init()

# 得到joystick的数量
joystick_count = pygame.joystick.get_count()
print("Number of joysticks: {}".format(joystick_count))

# 之考虑一个手柄
joystick = pygame.joystick.Joystick(0)
# 按键映射对象
joyToKey = JoyToKey()

# -------- 程序主循环 -----------
# 保持循环直到用户点击关闭按钮
done = False
while not done:
# 事件处理的步骤
# 手柄事件触发
for event in pygame.event.get():
# 如果用户触发了关闭事件
if event.type == pygame.QUIT:
# 设置我们做了这件事的标志,所以我们就可以退出循环了
done = True
else:
joyToKey.exec(joystick, event)

# 关闭窗口并退出.
pygame.quit()

程序运行

程序使用的是keyboard组件, 在linux下运行时需要sudo

1
sudo python 北通360-流行群侠传手游.py

此时在scrcpy界面, 通过手柄即可控制手机进行游戏操作, 并且流畅性也还可以

说明

只是为了提高下游戏的趣味性, 其它操作可自行发掘

摇杆目前无法适应

摇杆转向跟鼠标适配未实现, 事件刷新太快, 暂时未想到好方法进行转换

需求规定

为了减少注释和swagger注解的重复定义, 通过规范注释,
让swagger可以通过javadoc来产生

替换@Api、@ApiOperation、@ApiModel、@ApiModelProperties等注解

只是对swagger的扩展,如果有swagger注解,以注解为准

运行环境

springboot2.1.7

jdk1.8

设计思想

系统构思

  1. 编译完成的class里没有注释的,所以注释信息只有在编译代码时存储起来
  2. swagger本身是通过注解实现接口定义描述等加载的,现将代码注释生成json格式,
    利用swagger扩展在启动项目时通过json进行加载到swagger中
  3. 需要配合自定义的javadoc-json-maven-plugin先将注释生成json文件

关键技术与算法

生成javadoc.json文件

com.example.CommentToJsonMain(已做成maven插件, 这里原始文件可做测试)

插件: https://github.com/zhaozhiwei1992/javadoc-json-maven-plugin

swagger扩展代码

com.example.SpringbootSwaggerJavadocApplication启动即可生效

类定义: com.example.plugin.CommentApiBuilder

方法定义: com.example.plugin.CommentOperationBuilder

类代码注释规范

1
2
3
4
5
6
7
8
9
/**
* @Title: PersonController
* @Package: com/example/springbootcache/controller/PersonController.java
* @Description: 用户信息接口
* @author: zhaozhiwei
* @date: 2022/10/25 下午8:23
* @version: V1.0
*/

方法代码注释规范

1
2
3
4
5
6
7
8
9
10
11
12
/**
* @date: 2022/10/25-上午10:19
* @author: zhaozhiwei
* @method: findByID
* @param id : 唯一id
* @return: com.lx.demo.springbootcache.domain.Person
* @Description: 根据id获取用户信息
* 获取十次, 只有第一次是读库,后续都是取缓存
* 直接删掉redis缓存里的内容,仍然可以获取数据,并且走缓存,此时获取的是服务缓存ehcache中的信息
* seq 10 |xargs -i curl -XGET 'http://localhost:8080/persons/2'
*/

基本处理流程

系统流程图

file
1
2
3
4
5
6
7
8
9
start
:引入javadoc-json插件;
:使用插件:generate goals生成json版注释;
:正常启动web服务;
:访问swagger-ui.html;
note right
此时即可看到没有注解的方法也可以显示方法描述信息
end note
end

代码

https://github.com/zhaozhiwei1992/demo/tree/master/springboot/springboot-swagger-javadoc

参考

swagger扩展

https://github.com/hadix-lin/springfox-plus

https://blog.csdn.net/ydonghao2/article/details/109593416

https://blog.csdn.net/baiihcy/article/details/53861267

https://blog.csdn.net/qq_17623363/article/details/109259315

0%