当前位置: 首页 > news >正文

天工开物 #5 我的 Linux 开发机

首先说一下结论:最终我选择了基于 Arch Linux[1] 的 Garuda Linux[2] 发行版作为基础来搭建自己的 Linux 开发机。

4885f745f93bfb098ddea286af17d03e.png

Neofetch 时刻

发行版的选择

在上周末的这次折腾里,我一共尝试了 Garuda Linux 发行版,原教旨的 Arch Linux 发行版,以及众所周知的 Ubuntu[3] 发行版这三个选择。虽然最后做了逃兵直接摆烂 Garuda Linux 配好的图形桌面环境,算不上符合 Arch 之道[4]的玩法,但是该走的过场还是走了的。

机器的选择

我想配置一个纯粹的 Linux 环境的想法大概酝酿了一年多了。从接触 io_uring[5] 相关功能的代码,到其他依赖 Linux 内核版本或生态工具的功能,我从前同事 @w41ter[6] 那里接受了一个理念:“开发机的环境最好跟生产环境是一致的这样也才好调试问题。”

配置一个原生的 Linux 环境(相较于虚拟机),最舒服的其实是公司提供高配的开发机。例如在某司时用上的 256 GB 内存 96 核 NVMe 盘的机器。毕竟对 Linux 的执念也不过是一个开发环境,而不是必须要一个桌面环境。可惜公司的机器跟特定公司绑定,而且不太适合开展一些未必跟公司工作紧密相关的工作和共享文件,更麻烦的是,往往访问公司机器还得连接内网,这就让“完全使用 Linux 开发”的目标难以实现。

另一个被否定的做法是个人购买云服务器。这个思路我在读书的时候就试过了,最近也还考察过目前的行情。结论就是:太贵。一台上面提到的公司级开发配置的机器,云厂商对个人是卖不到这个配置的。大约打个五折以上可以起卖,每个月少说五千块钱,多了上万。还别说这个机器只是租给你,上面的数据不在本地,而且机器在哪个区域联网都有不同的问题。个人装机花个小几万能配得比这配置好不少,还是自己的资产,用个几年不在话下。这么一看,个人用买云服务器纯属冤大头。

最后,办法就是自己买台机器装上 Linux 系统。由于国内几乎所有机器都预装了 Windows 系统,弃之可惜,所以只能麻烦点装双系统。硬件配置我自己是不会配的,找的好兄弟一揽子解决,这里就不介绍了。

装双系统这件事我在大学时候就做过,当时还干过替换内核和开发内核模块,还有利用显卡写 Lua Torch 之类的事情,所以做起来其实是轻车熟路的。但是一直以来都觉得同一块盘上分区逼死强迫症,也确实对使用多少有点影响,这次我就干脆加了一块 2TB NVMe 的盘来折腾 Linux 系统。

Garuda Linux

我一开始选的就是 @Manjusaka_Lee[7] 在推特上介绍过的他为自家 HomeLab 选型的 Garuda Linux 发行版。在一个非常清晰的教学视频的帮助下,我很快就完成了安装。

How to Dual Boot Garuda Linux and Windows 10 SAFELY[8]

然后就发现 N 卡不愧是 Linux 的两大噩梦硬件之一。

79386b37ca0832fc2817e773c2360cbc.jpeg

你知道我要说什么

我使用的是 GTX 4090 Ti 的显卡,毕竟这次是一揽子计划,估计一劳永逸个五年起步,而且买新不买旧嘛。但是 4090 确实是太新了,而黄老爷自然是不太在乎开源拖拉机能不能用上他的新卡的。Garuda Linux 在我的机器上,如果选择安装开源驱动,Live USB 都起不来;如果选择安装专有软件驱动,则会在安装完成后进入系统的时候起不来。

所幸 @Manjusaka_Lee 哥哥也遇到了这个问题,所以这个问题是可解的,咒语全文如下:

# 首先,选择专有驱动安装系统。此时,直接启动系统会进入 Color buffer .. 卡死
# 此时,重新进入 Boot 页面,选择从 Live USB 登录,在 Live USB 环境中完成修复:# 1. chroot
# Find your system disk by `lsblk -f`
# https://forum.garudalinux.org/t/how-to-chroot-garuda-linux/4004
sudo mkdir -p /mnt/broken
sudo mount /dev/<your system disk partition (e.g. nvme0n1p1)> /mnt/broken
sudo garuda-chroot /mnt/broken/@# 2. Remove nvidia-dkms
pacman -R garuda-nvidia-config
pacman -R nvidia-dkms# 3. Install nvidia-open-dkms
pacman -S nvidia-open-dkms# 重启系统,应该就可以正常登录了。

“咒语”这个词概括了我配置 Linux 开发机早期阶段的主要心情:一下子接触到一大堆 Linux 图形桌面操作系统的知识,这些以前都是厂商搞定的,现在是个问题都得我自己理解解决,很多时候我是似懂非懂念完找到的咒语能灵就赶紧跑路了。

从这个角度讲,Garuda Linux 基于 Arch Linux 的基本工具和软件库,把一些关键的应用选择全做了,然后开发出了非常漂亮的图形桌面,连 N 卡驱动这种事情都有舒适的路径,细节处用好了 btrfs 和 linux-zen 内核,确实是一个优秀的面向极客的发行版。

这些体会,也是我写《黑客与顾客:开源软件能商业化吗》的背后动因。

Ubuntu

那么为什么我还会尝试 Ubuntu 呢?直接原因是一个很小的事情:绘文字(emoji)在 Garuda Linux 上显示有问题😅

具体技术上怎么出这个问题的后面再谈,总之在输入法提示框和 JetBrains 系 IDE 上不能正确显示 emoji 逼死强迫症,加上一开始尝试时乱安装了一堆依赖早就想清清了的动机下,反正机器上也没啥大不了的数据(甚至我数据全都丢一个分区摆大烂),我就开始了堵死自己逃生路口之旅,验证一下其他发行版确实不行,免得真过两天个人数据记录起来了心里总觉得可能还有更好的沉没成本太高。

兄弟姐妹们,下载 Ubuntu 安装镜像记得从国内镜像站下载,直接从官网下载慢死个人。

Garuda Linux 在官网提供了 Garuda Installer 轻松愉快的点两下就能制作 Live USB 介质,Ubuntu 还得自己搜索工具准备。从这点看,Garuda Linux 的用户体验确实是做得相当不错。不过话说回来,Ubuntu 的 Live USB 网店有人做,Garuda Linux 这种小众货色还得自己买 USB 设备,从这个角度看,是 Ubuntu 赢了。

放弃 Ubuntu 的速度比闪电战还快:它还是我熟悉的配方,每个操作都充满了一卡一卡的摸鱼气息。别说 GNOME 的美工和 UI 确实不如 KDE 了,Ubuntu 这老小子居然也对 4090 水土不服,N 卡果然是噩梦。花了几十分钟试图解决 N 卡驱动问题未果,直接选择和解跑路。

4f9abb5b434285d6ab6cd8bfe9d0ba98.jpeg

梅开二度

其实不选 Ubuntu 这种超重量级的发行版是有原因的。

Arch Linux 系的发行版,遵循所谓 Arch 之道的情况下,整体比较简洁,没有太多不需要的东西。虽然这样很多内容是用户作为开发者自己去调配的,但是到底怎么出的问题,用户一般还调试得了。

Ubuntu 走的是 Windows 和 Mac OS X 的道路,也就是虽然用了 Linux 内核,但是试图提供的是开箱即用的用户体验,可惜我只能称之为其他两者的低配版。这样的产品完成度下,极客或黑客玩家的体验就是:我开箱即用的效果不好,改还不知道咋改,麻了。

不过,抛开 Ubuntu Desktop 的问题不谈,Canonical 公司为 Ubuntu 上软件的正确性测试投入还是很值得肯定的。对于追求稳定可靠版本的 Linux 环境和生态完善经过验证的 apt 系软件库的场景,比如找个合适的基础 Docker 镜像摆烂的情况,Ubuntu 还是个不错的选择的。但是 Ubuntu Desktop 确实大可不必。

Arch Linux

人不 Arch 枉少年!在歌单名《中二少年的轨迹》的加成下,年过半半百的小 tison 还是打算炫一把 Arch Linux 发行版。毕竟可以肯定的是 Garuda Linux 就是基于 Arch Linux 配出来的,emoji 的问题肯定也是做了啥不该做的定制才出现的。我遵循 Arch 之道从头来一把,总能折腾好这个环境。

后来的事实证明确实是做多了事情导致的 emoji 不能在 Garuda Linux 上正常显示,但是从裸的 Arch Linux 上配环境确实也挺折腾人。

有一说一,装一个基础的 Arch Linux 系统并不难。Arch Linux Wiki 的安装指南[9]加上坊间指南[10]对一些关键细节的补充和选择困难症的终结,装一遍 Arch Linux 应该不到三十分钟就能搞定。

整个安装过程完成后的感想就是:@Xuanwo[11] 哥哥说得对,走完一遍 Arch Linux 的安装,Linux 操作系统的引导、磁盘分区和挂载、网卡的交互和基本的用户模型就都懂了。推荐新玩家在玩过编译替换 Linux 内核的游戏以后也来整一次 Arch Linux 发行版的安装。

然后这个过程就卡死在装好系统以后设置了 KDE 桌面却打不开了。KDE 桌面的安装和 SDDM (Simple Desktop Display Manager) 服务应该都是好的,还是 N 卡拉了胯。

1d6c87b605c760a66bbf93c518ea8e00.jpeg

帽子戏法

试过几个驱动方案无果后和解。

过程里几次通过 Arch Linux 的 Live USB 环境使用类似前文解决 Garuda Linux 驱动问题的手段 arch-chroot 到主系统关闭 systemd 上的 SDDM 服务,这是一个避免机器变砖的逃生出口。

另外 os-prober 安装后必须运行一遍以发现原系统的引导信息,不然你刷了 GRUB 可能突然就看不到启动 Windows 的选项了,万一手忙脚乱出点啥错 Windows 系统丢了,修起来也是个麻烦事。

Emoji 问题的解决

Emoji 已经被收录到 Unicode 编码里了,所以 emoji 的显示问题其实就是字体问题。

不过无论是 Garuda Linux 还是 Ubuntu 都有图形化界面管理字体,所以整体配置环境跟纯粹 Linux 最小集是不一样的。这也是我前面评价 Ubuntu 是低配版 macOS 的一个佐证,这种额外的封装和开箱不即用的体验会伤害黑客玩家的信心。当然在这点上,Garuda Linux 也没好到哪里去。

解决问题的办法隐约中跟 Arch 之道也是呼应的:少即是多。最后查明问题的触发点是我在成功安装 Garuda Linux 以后,按照系统提示的定制化建议勾了几个输入法和语言字体的选项,其中安装了 ttf-google-font-git 这个包,而这个包和系统的 adobe 字体包冲突,导致了一些字体加载、解析和回退方面的问题。不做这个安装就能解决问题,也不会引入新问题。

此外,解决这个问题期间我还试过 Garuda Linux 发行版的其他图形桌面主题。结论是只能说旗舰就是旗舰,其他版本就是大学生课程作用水平。如果要我一句话评价,那就是:别用。

输入法和字体

先说结论:输入法我选择了 Fcitx5 + Rime 的解决方案,字体我在全局用了 Noto fonts 解决中英文加 emoji 的所有问题,代码显示和终端环境里则是用 Source Code Pro 字体。

字体的问题不用多说,各有各的偏爱。我用 Source Code Pro 的历史开始于大二实验室实习期间学到了 CTF 世界冠军 @Atum[12] 老板的配置。

输入法我在 macOS 和 iOS 上七年来都是搜狗拼音摆烂,然而搜狗拼音自己顾不上兼容 Fcitx5 新框架[13]。强迫症让我拒绝回退到旧版本,这也不是 Arch Linux 这种滚动更新天天最新的玩家的做法,我也没那个时间去折腾,尤其是搜狗代码还是闭源的,这基本表明你除了祈祷以外什么也做不了(RMS 打印机的翻版)。

所以入乡随俗,我确实对输入法的定制还是有点需求的,就用了 Rime[14] 中州韵输入法,配置过程大抵可以参考 Arch Linux Wiki 上的 Fcitx5[15] 页面。

第一步,安装一大堆相关的库,比如:

fcitx5fcitx5-rimefcitx5-chinese-addonsfcitx5-configtool

这几个搞完,其他的基本都在依赖里也装上了。然后最重要的就是告诉 X 窗口管理器记得用上 Fcitx5 做输入法,配置方式是在 $HOME/.xprofile 里写上:

export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx

随后就是在 Fcitx5 的默认配置目录 $HOME/.local/share/fcitx5 里定制了。直接改配置文件容易出错,所以我是下载了 Rime 的管理工具 plum[16] 来做这件事的。

随便找个地方下载好 plum 工具,然后执行以下命令配置双拼和 emoji 候选词:

rime_frontend=fcitx5-rime bash rime-install double_pinyin
rime_frontend=fcitx5-rime bash rime-install emoji
rime_frontend=fcitx5-rime bash rime-install emoji:customize:schema=double_pinyin_flypy

再到配置目录下做一些微调。

添加 $HOME/.local/share/fcitx5/rime/default.custom.yaml 文件:

patch:# 去掉其他不需要的候选输入法schema_list:- schema: double_pinyin_flypy# 候选词界面支持 Tab 键翻页key_binder:bindings:- { when: has_menu, accept: Tab, send: Page_Down }

原地修改 $HOME/.local/share/fcitx5/rime/double_pinyin_flypy.schema.yaml 文件:

1.把 switches 西文的部分 reset 改成 1 以默认启用英文输入。主要工作是开发,所以默认英文会方便很多。2.把 switches 汉字的部分 reset 改成 1 以默认启用简体字输入。

我也趁着这次换工作机器的契机把输入法切换到了小鹤双拼,确实第一天对着键位图打个几小时就能记住了,打了几天以后虽然不算流畅,但是双拼本身键程短,误输入概率低,所以我的输入速度已经恢复到原来的 80% 有余。误输入的典型案例是,全拼很容易把“时间”(shijian)输入成“时间爱你”(shijain),由于双拼多韵母也是一个键输入,就不会出现这种多韵母字母错位带来的误输入,从而提高打字效率。

aec3eda78e524f3b9b0632cfc709f4e2.png

双拼键位图

Dotfiles

技术上,图形桌面系统也是以 Linux 操作系统为内核的。而 Linux 的特点就是一切皆文件,而且配置也都是一堆文件。

一旦用上 Linux 系统,你就会知道为啥 GitHub 上那么多人分享或者说单纯是备份自己的配置文件。比如上面对 Fcitx5 和 Rime 的这一通配置,不记下来下次再来一遍还得累死人。

我从 macOS 时期就一直需要带着的配置文件是 Git 的配置和 Vim 的配置,所幸我不做复杂的配置,所以迁移起来不怎么费时间。这也是因为越少的配置越能跨平台的缘故,否则定制化太多,真的除了自己的机器,换个环境生产力就跌零了。

Git 可公开配置如下:

[user]email = wander4096@gmail.comname = tisonsigningkey = ...
[pull]rebase = true
[core]excludesfile = /home/tison/.gitignoreeditor = vimpager = less --mouse
[tag]forceSignAnnotated = true
[init]defaultBranch = main
[gpg]program = /usr/bin/gpg
[commit]gpgsign = true

主要是支持自动 GPG 签名的问题,以及引用一个全局的 gitignore 规则:

# JetBrains
.idea
*.iml# Visual Studio Code
.vscode# Apache Maven
.mvn# macOS
.DS_Store

Vim 的配置如下:

syntax on
syntax enablefiletype plugin indent onset nocompatible
set number
set rulerset tabstop=2
set softtabstop=2
set expandtab
set backspace=indent,eol,startinoremap jk <ESC>

其中最后一行是减少 ESC 键的键程。同样的道理,我还会总是把 CapsLock 即大写锁定键映射成 Control 键。高级点的键盘在硬件层面就可以设置,macOS 修饰键配置可以改,Windows 有 Ctrl2Cap[17] 工具,而 Linux 就得根据环境各显神通了。Garuda Linux 发行版的配置下,可以通过在 /etc/profile 里加这一个指令来实现:

# Map CapsLock to Control
setxkbmap -option caps:ctrl_modifier

另外,我把默认的 shell 从 Garuda Linux 发行版配的 fish 程序换成了 zsh 程序,不过没有用 oh my zsh 终端,它跟发行版已经给 zsh 配的默认风格不是特别搭。但是 oh my zsh 在 ls 命令上的一些 alias 还是不错的,我给 pick 了过来:

# User-defined alias
alias ls='ls --color=auto'
alias l='ls -lah'

应用软件

Garuda Linux 发行版默认使用了以下 AUR 源:

•garuda•core•extra•community•multilib•chaotic-aur

其中 garuda 包括了发行版的桌面环境、定制化配置和专用软件。接下来三个是基础源。multilib 包含了一系列兼容模式的 32 位软件。chaotic-aur 则是闻名的二进制应用源。

因此,大部分应用软件在 Garuda Linux 上也可以直接从 AUR 上安装。我的主要应用软件是:

•Google Chrome•Visual Studio Code•JetBrains Toolbox•LogSeq•QQ•Telegram

另外,Notion 和 Slack 也很重要,不过能用的 Desktop 应用体验很差,所幸网页版功能是全的,直接遁入网页版完事儿。JetBrains 全家桶走 JetBrains Toolbox 这个门户应用全都能安装下来。其他一些基本应用比如 Konsole 和 Latter Docker 这些都在 Garuda Linux 发行版的预装里。

国民应用微信[18],可以通过 Wine 使用 Windows 的版本,或者直接安装 AUR 上基于统信 UOS 版魔改的 Linux 原生版本,但是使用体验均不佳,遂放弃。微信移动端以外做得最好的还得是 macOS 平台,而直接下线了网页版则完全体现出了垄断巨头的不讲理。

最后,祝各位每天 yay -Syyu 都顺利 :)

References

[1] Arch Linux: https://archlinux.org/
[2] Garuda Linux: http://garudalinux.org/
[3] Ubuntu: https://ubuntu.com/
[4] Arch 之道: https://wiki.archlinux.org/title/Arch_Linux#Principles
[5] io_uring: https://en.wikipedia.org/wiki/Io_uring
[6] @w41ter: https://github.com/w41ter
[7] @Manjusaka_Lee: https://twitter.com/Manjusaka_Lee
[8] How to Dual Boot Garuda Linux and Windows 10 SAFELY: https://www.bilibili.com/video/BV1Yh411y7ab
[9] 安装指南: https://wiki.archlinux.org/title/Installation_guide
[10] 坊间指南: https://arch.icekylin.online/
[11] @Xuanwo: https://twitter.com/OnlyXuanwo
[12] @Atum: https://netsec.ccert.edu.cn/people/atum
[13] 顾不上兼容 Fcitx5 新框架: https://bugs.launchpad.net/ubuntu/+source/language-selector/+bug/1928360
[14] Rime: http://rime.im/
[15] Fcitx5: https://wiki.archlinux.org/title/fcitx5
[16] plum: https://github.com/rime/plum
[17] Ctrl2Cap: https://learn.microsoft.com/en-us/sysinternals/downloads/ctrl2cap
[18] 微信: https://wiki.archlinux.org/title/WeChat

相关文章:

天工开物 #5 我的 Linux 开发机

首先说一下结论&#xff1a;最终我选择了基于 Arch Linux[1] 的 Garuda Linux[2] 发行版作为基础来搭建自己的 Linux 开发机。Neofetch 时刻发行版的选择在上周末的这次折腾里&#xff0c;我一共尝试了 Garuda Linux 发行版&#xff0c;原教旨的 Arch Linux 发行版&#xff0c;…...

【沁恒WCH CH32V307V-R1开发板输出DAC实验】

【沁恒WCH CH32V307V-R1开发板输出DAC实验】1. 前言2. 软件配置2.1 安装MounRiver Studio3. DAC项目测试3.1 打开DAC工程3.2 编译项目4. 下载验证4.1 接线4.2 演示效果5. 小结1. 前言 数字/模拟转换模块&#xff08;DAC&#xff09;&#xff0c;包含 2 个可配置 8/12 位数字输入…...

Linux进程控制详解

目录前言一、进程创建1.1 fork函数初识1.2 写时拷贝1.3 fork常规用法1.4 fork调用失败的原因二、进程终止2.1 进程终止时&#xff0c;操作系统做了什么&#xff1f;&#xff1f;2.2 进程终止的常见方式有哪些&#xff1f;&#xff1f;2.3 如何用代码终止一个进程三、进程等待3.…...

C语言深度剖析之程序环境和预处理

1.程序的翻译环境和执行环境 第一种是翻译环境&#xff0c;在这个环境中源代码被转换为可执行的机器指令 第二种是执行环境&#xff0c;它用于实际执行代码 2.翻译环境 分为四个阶段 预编译阶段 &#xff0c;编译&#xff0c;汇编&#xff0c;链接 程序编译过程&#xff1a;多个…...

【Spark分布式内存计算框架——Spark Core】9. Spark 内核调度(上)

第八章 Spark 内核调度 Spark的核心是根据RDD来实现的&#xff0c;Spark Scheduler则为Spark核心实现的重要一环&#xff0c;其作用就是任务调度。Spark的任务调度就是如何组织任务去处理RDD中每个分区的数据&#xff0c;根据RDD的依赖关系构建DAG&#xff0c;基于DAG划分Stag…...

Vulkan教程(15): Graphics pipeline之Render passes(渲染通道)

Vulkan官方英文原文&#xff1a; https://vulkan-tutorial.com/Drawing_a_triangle/Graphics_pipeline_basics/Render_passes对应的Vulkan技术规格说明书版本&#xff1a; Vulkan 1.3.2Setup设置Before we can finish creating the pipeline, we need to tell Vulkan about the…...

乐观锁、雪花算法、MyBatis-Plus多数据源

乐观锁、雪花算法、MyBatis-Plus多数据源e>雪花算法2、乐观锁a>场景b>乐观锁与悲观锁c>模拟修改冲突d>乐观锁实现流程e>Mybatis-Plus实现乐观锁七、通用枚举a>数据库表添加字段sexb>创建通用枚举类型c>配置扫描通用枚举d>测试九、多数据源1、创建…...

详解Redisson分布式限流的实现原理

我们目前在工作中遇到一个性能问题&#xff0c;我们有个定时任务需要处理大量的数据&#xff0c;为了提升吞吐量&#xff0c;所以部署了很多台机器&#xff0c;但这个任务在运行前需要从别的服务那拉取大量的数据&#xff0c;随着数据量的增大&#xff0c;如果同时多台机器并发…...

[python入门㊹] - python测试类

目录 ❤ 断言方法 assertEqual 和 assertNotEqual assertTrue 和 assertFalse assertIsNone 和 assertIsNotNone ❤ 一个要测试的类 ❤ 测试AnonymousSurvey类 ❤ setUp() 和 teardown() 方法 ❤ 断言方法 常用的断言方法: 方法 用途 assertEqual(a, b) 核实a …...

Web 框架 Flask 快速入门(二)表单

课程地址&#xff1a;Python Web 框架 Flask 快速入门 文章目录&#x1f334; 表单1、表单介绍2、表单的简单实现1. 代码2. 代码的执行逻辑3、使用wtf扩展实现4、bug记录&#xff1a;表单验证总是失败&#x1f334; 表单 1、表单介绍 当我们在网页上填写账号密码进行登录的时…...

C++基础(5) - 复合类型(上)

文章目录数组1、什么是数组2、数组的声明3、数组的初始化4、数组的访问5、二维数组6、memset —— 给数组中每一个元素赋同样的值字符串&#xff08;字符数组&#xff09;1、string.h 头文件1.1 strlen()1.2 strcmp()1.3 strcpy()1.4 strcat()string 类简介1、C11 字符串初始化…...

java重写(@Override)介绍及实例说明

1.概述方法的重写&#xff08;override&#xff09;是封装的特性之一。在子类中可以根据需要对基类中继承来的方法进行重写。重载和重写没有任何关系。作用&#xff1a;通过重写&#xff0c;子类既可以继承父类的东西&#xff0c;又可以灵活的扩充。1.override注解是告诉编译器…...

基于STM32的虚拟示波器

仓库地址 https://github.com/shuai132/ScopeMCU ScopeMCU Oscilloscope for MCU MCU: STM32F103C8Tx 需配合ScopeGUI使用 截图说明见wiki 最新版Releases Introduction 用最少的硬件成本&#xff0c;做一个实用的虚拟示波器。 这是硬件部分&#xff0c;基于STM32最小…...

搭建云端vscode-server,使用web ide进行远程开发

使用乌班图系统&#xff0c;搭建自己的网页vs code开发环境github地址&#xff1a;GitHub - coder/code-server: VS Code in the browser安装脚本curl -fsSL https://code-server.dev/install.sh | sh出现deb package has been installed.表示已经正确安装。测试启动2.1修改配置…...

Linux clock子系统及驱动实例

文章目录基本概念CLK子系统时钟API的使用clock驱动实例1、时钟树2、设备树3、驱动实现fixed_clk固定时钟实现factor_clk分频时钟实现gate_clk门控时钟实现基本概念 晶振&#xff1a;晶源振荡器 PLL&#xff1a;Phase lock loop&#xff0c;锁相环。用于提升频率 OSC&#xff1a…...

GIS数据格式坐标转换(地球坐标WGS84、GCJ-02、火星坐标、百度坐标BD-09、国家大地坐标系CGCS2000)

文章目录前言一、坐标系1.地球坐标 (WGS84)2.国测局坐标系(GCJ-02、火星坐标系)3.百度坐标(BD-09)4.国家大地2000坐标系(CGCS2000)二、百度坐标系(BD-09) 与火星坐标系(GCJ-02)的转换1.核心代码2.转换验证百度地图高德地图腾讯地图三、火星坐标系 (GCJ-02) 与百度坐标系 (BD-09…...

流媒体传输系列文章汇总

流媒体传输系列文章汇总 文章目录流媒体传输系列文章汇总引言流媒体交互协议详解视频封装协议详解流媒体环境搭建其他引言 从去年开始编写有关流媒体传输相关知识的文章&#xff0c;已发表文章22篇&#xff0c;阅读量也超过了10万&#xff0c;为了方便各位阅读&#xff0c;本文…...

“万字“ Java I/O流讲解

Java I/O流讲解 每博一文案 谁让你读了这么多书&#xff0c;又知道了双水村以外还有一个大世界&#xff0c;如果从小你就在这个天地里&#xff0c;日出而作&#xff0c;日落而息。 那你现在就会和众乡亲抱同一理想&#xff1a;经过几年的辛劳&#xff0c;像大哥一样娶个满意的…...

数据库(Spring)事务的四种隔离级别

文章目录Spring&#xff08;数据库&#xff09;事务隔离级别分为四种&#xff08;级别递减&#xff09;1、Serializable&#xff08;串行化&#xff09;2、REPEATABLE READ&#xff08;可重复读&#xff09;3、READ COMMITTED&#xff08;读以提交&#xff09;4、Read Uncommit…...

RabbitMQ详解(一):RabbitMQ相关概念

RabbitMQ是目前非常热门的一款消息中间件&#xff0c;不管是互联网大厂还是中小企业都在大量使用。作为一名合格的开发者&#xff0c;有必要对RabbitMQ有所了解&#xff0c;本系列是RabbitMQ快速入门文章&#xff0c;主要内容包括RabbitMQ是什么、RabbitMQ核心概念、五种消息模…...

​ICLR 2023 | GReTo:以同异配关系重新审视动态时空图聚合

©PaperWeekly 原创 作者 | 周正阳单位 | 中国科学技术大学论文简介动态时空图数据结构在多种不同的学科中均普遍存在&#xff0c;如交通流、空气质量观测、社交网络等&#xff0c;这些观测往往会随着时间而变化&#xff0c;进而引发节点间关联的动态时变特性。本文的主要…...

线程池分享总结

线程池介绍 可以复用线程池的每一个资源 控制资源的总量 为什么要使用线程池 问题一&#xff1a;反复创建线程开销大 问题二&#xff1a;过多的线程会占用太多内存 解决以上两个问题的思路 • 用少量的线程——避免内存占用过多 • 让这部分线程都保持工作&#xff0c;且可…...

AOSP Android11系统源码和内核源码

推荐阅读 商务合作 安全产品 安全服务 2023年招聘 安全培训服务 软件定制服务 Android系统定制服务 安全/软件开发的课程列表 1.下载repo工具 (1).创建bin&#xff0c;并加入到PATH中 mkdir ~/binPATH~/bin:$PATH (2).安装依赖库 sudo apt-get install bison g-mult…...

layui框架学习(6:基础菜单)

菜单是应用系统的必备元素&#xff0c;虽然网页中的导航也能作为菜单使用&#xff0c;但菜单和导航的样式和用途有所不同&#xff08;不同之处详见参考文献5&#xff09;。Layui中用不同的预设类定义菜单和导航的样式&#xff0c;同时二者依赖的模块也不一样。本文主要学习和记…...

第十三届蓝桥杯 C++ B组省赛 C 题——刷题统计(AC)

1.刷题统计 1.题目描述 小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天 做 aaa 道题目, 周六和周日每天做 bbb 道题目。请你帮小明计算, 按照计划他将在 第几天实现做题数大于等于 nnn 题? 2.输入格式 输入一行包含三个整数 a,ba,ba,b 和 nnn. 3.输出…...

C++中的多态

【1】表现形式&#xff1a;同样的调用语句有多种不同的表现形态 【2】分类&#xff1a;静态联编和动态联编 静态联编有函数重载(运算符重载是特殊的函数重载),模板 【3】重点说下动态联编 【3.1】动态联编的实现需要以下步骤&#xff1a; 有继承关系、父类函数有virtual关…...

Swift如何保证线程安全

Swift可以通过以下几种方式来保证线程安全 使用互斥锁&#xff08;Mutex&#xff09;&#xff1a;使用互斥锁可以防止多个线程同时访问共享数据&#xff0c;保证线程安全。 使用OSAtomic操作&#xff1a;OSAtomic操作可以在多线程环境中安全地执行原子操作。 使用DispatchQue…...

整型提升+算术转换——“C”

各位CSDN的uu们你们好呀&#xff0c;今天小雅兰的内容是之前操作符那篇博客中没有讲完的内容&#xff0c;整型提升这个小知识点也非常重要&#xff0c;那现在&#xff0c;就让我们进入操作符的世界吧 隐式类型转换 算术转换 操作符的属性 隐式类型转换 表达式求值的顺序一部…...

Freemarker介绍

2. Freemarker介绍 FreeMarker 是一个用 Java 语言编写的模板引擎&#xff0c;它基于模板来生成文本输出。FreeMarker与 Web 容器无关&#xff0c;即在 Web 运行时&#xff0c;它并不知道 Servlet 或 HTTP。它不仅可以用作表现层的实现技术&#xff0c;而且还可以用于生成 XML…...

【软件测试开发】Junit5单元测试框架

目录1. 注解Test 注解BeforeEach BeforeAllAfterEach AfterAll2. 断言 assertassertequalsassertTrue assertFalseassertNull assertNotNull3. 用例执行顺序方法排序&#xff0c;通过 Order 注解来排序4. 测试套件 Suite5. 参数化单参数stringsints6. 参数化多参数CsvSourceCsv…...

备案没有商城可以做商城网站吗/今日中央新闻

boost生成和解析json[转] 原文&#xff1a;《boost生成和解析json》 目录 boost生成和解析json[转] 什么是property_tree&#xff1f; 生成 解析 遍历读取属性 删除节点 修改值 抛出异常 boost json使用过程中需要注意的问题 参考&#xff1a; 《boost::property_tree讲解》《…...

有人情味的网站/惠州seo计费管理

2021年已经到了复工期&#xff0c;给准备跳槽的大家整理了今年来最经典的面试真题100道&#xff0c;每个题目都有详细的解答&#xff0c;收集了java基础、RabbitMQ&#xff0c;微服务、MySQL数据库、Java并发、JVM&#xff0c;Redis、设计模式&#xff0c;Spring / Spring MVC&…...

网站换域名了怎么做301重定向/怎么样自己创建网站

原文地址&#xff1a;Linux内核源码分析--内核启动之(5)Image内核启动(rest_init函数)&#xff08;Linux-3.0 ARMv7&#xff09; 作者&#xff1a;tekkamanninja 转自&#xff1a;http://blog.chinaunix.net/uid-25909619-id-4938395.html 前面粗略分析start_kernel函数&#x…...

局域网内部如何做网站/网络营销策略方案

2-sat相关复习 noi曾经考过&#xff0c;谁能说得准呢 sat问题 通俗的sat问题表述一般是这样的&#xff1a;有很多个集合&#xff0c;每个集合里面有若干元素&#xff0c;现给出一些取元素的规则&#xff0c;要你判断是否可行&#xff0c;可行则给出一个可行方案。如果所有集合中…...

高端开发网站系统/推广代理

“综合交通出行大数据开放云平台是交通运输行业目前唯一实现开放共享的平台。”交通运输部公路科学研究院副院长岑晏青11日在2017年中国互联网&#xff0b;交通运输行业融合创业大赛创业分享会上说。 岑晏青介绍&#xff0c;截至目前&#xff0c;综合交通出行大数据开放云平台有…...

网站全程设计技术/win10优化大师免费版

界面中并没有提供增加硬盘容量的方法。只能在命令行形式下执行。安装所在盘的Program Files\VMware\VMware Workstation下有一个vmware-vdiskmanager.exe&#xff0c;就是它。命令参数如下&#xff1a;------------------------------------------------------------------Usag…...