分类 其它 下的文章

大家好,我是欧阳。今年刚好是欧阳三十而立之年,虽然没有立起来。这篇文章来聊聊我从一名
军工厂电气工程师

某知名互联网公司程序员
,这期间我
吃饭的家伙
都有哪些。

军工厂期间

欧阳大学读的是“电气工程及其自动化专业”,毕业后进入了老家的一个军工厂,成为了一名
电气工程师
。军工厂的位置是在一个镇上,和
“繁华”
这两个字一点都不沾边,如果想自己做饭下午都买不到菜的那种。

2016年还算是互联网的红利期,360行,行行都在转互联网。受到这个风气的影响欧阳在军工厂也呆不住了,想到外面
繁华的世界
看看。

所以欧阳斥巨资,在淘宝买了一份2块钱的黑马前端培训班视频。当时我手里只有大学家里买的一台3千块钱的笔记本,这也是我
第一个吃饭的家伙

first

2元培训班视频
+
3千块钱电脑
(安装WebStorm都卡),几个月后让我成功的入门前端,并且找到了第一份前端工作。

第一份前端工作

从军工厂进入互联网企业后工资也涨了,所以就开始
喜新厌旧
了。开始嫌弃老伙计写代码卡、打游戏也卡、反正哪里都卡。所以咬咬牙,花了一个月的工资买了一台
7k
左右的电脑,也就是我
第二个吃饭的家伙

second

知名互联网公司

由于第一家公司涨薪太慢,1年多后欧阳就跳槽了。进了一家某
央企
成立的互联网公司,半年后某知名互联网公司将我们整个团队都挖了过去。

在这期间我发现对于前端工程师来说单屏有点不够用,需要一边写代码,一边看页面效果。这样就不需要将页面切来切去了,所以后面我又花了几百块钱买了一个便宜显示器,这是我
第三个吃饭的家伙

third

后来发现团队里面的大佬都在用
Mac Book Pro
,欧阳虽然不算大佬,但是也拥有成为大佬的心。当时想的是,必须要和大佬拥有一样的设备,所以咬咬牙买了一台
M1 Pro
。这是我
第四个吃饭的家伙
,一直服役到现在。
four

显示器

以前用Windows电脑搭配外接显示器时还不觉得有什么问题,因为两个清晰度都不高,没有对比就没有伤害。换了MBP后,由于Mac超级清晰的显示器,画页面时一边看Mac屏幕,一边看外接显示器的屏幕,简直就是
一个天上一个地下

晚上经常要熬夜,但是老婆又要睡觉。为了家庭和谐,所以欧阳经常在关灯的情况下继续coding。但是我的那个便宜显示器在夜晚看着特别刺眼,让我本就接近500度的眼睛雪上加霜。

还有就是外接显示器屏幕横向宽度是够了,但是纵向高度太矮了。看见上面的代码,就看不见下面的代码,对于一个记忆力逐渐开始下降的中年男人来说真的很不友好。

毫无疑问,欧阳又喜新厌旧了,决定把那个便宜显示器换掉。有了上一次的教训,这次欧阳决定一步到位。

为什么会说是教训呢?因为上次换的那个7k的windows电脑属于不上不下,二手卖掉又太亏,和Mac比起来又差太远,只能闲置在家里。有时在后悔当初为什么不一步到位直接换个Mac,非要浪费这钱。

经过多方比较,以及找了一些专业的朋友推荐后,最后入手了这款明基的显示器,型号是
明基RD280U
,这就是我
第五个吃饭的家伙

为什么欧阳会选择这款显示器呢?

因为他是
全球首款为程序员设计的显示器
,完美的解决了我的所有痛点。

首先就是他的清晰度非常高,清晰度和我的Mac自带的显示器屏幕差不多了。

除了清晰度之外他还有一个编码模式,开启这个模式后代码看着就更加清晰,也不反光和模糊了。

这个是明基显示器:
compare

这个是以前便宜显示器:
third

还有就是这款显示器自带两种编码模式,分别是
编码-深色主题

编码-亮色主题
。更牛逼的是这两种模式可以对vscode或者webstorm自带的
深色
或者
亮色
主题在色彩这一块进行增强,所以代码的语法高亮效果更清晰了。

并且还支持自定义调节对应的参数,这样我就可以在白天和晚上分别使用两种不同的主题。深色主题完美的解决了我夜晚coding的问题,拯救了我可怜的眼睛。
theme

更洋气的是他还支持背光灯,夜晚coding的时候真的超级安逸。灯光也支持调节
调节亮度、色温、灯光模式

light

上面这张图是我夜晚关灯时拍的照片。

最后就是这个横纵比是
3:2

28寸
屏幕是真的超级大,我算了一下同样的代码比我
16:9
的显示器能够多看10行代码。
这个只能看到315行代码:
small

这个能够看到325行代码:
big

还有就是学习日语的时候用他真的超级享受,又大又清晰,比Mac屏幕还爽。

除此之外这款显示器还有一些其他的功能,比如上下左右调节、猫头鹰模式(根据环境自动调节屏幕亮度)、搭配软件可以设置键盘快捷键操作屏幕的硬件功能(超级牛逼)、配置编程触摸键、个性化快捷键。

总结

到今年工作8年了,这个显示器是欧阳所有
吃饭的家伙
里面最满意的。为什么说
Mac电脑
不是最满意的呢?因为他真的太贵了,和显示器比起来性价比就差不少了。

在开始介绍上周热门开源项目之前,要插播一条开源新闻:Nginx 已正式迁移至 GitHub。

近日,Nginx 官方宣布将 Nginx 开源项目,从 Mercurial 迁移至 GitHub 代码托管平台,并开始接受 PR 形式的贡献、Issues 问题反馈和功能请求等,GitHub 上的 Nginx 项目终于“活”了!

GitHub 地址→
github.com/nginx/nginx

说回上周的热门开源项目,有一个项目着实让我开眼了:用纯 SQL 编写的俄罗斯方块游戏 Tetris-SQL,游戏的逻辑和画面都是由 SQL 实现,核心 SQL 文件仅 500 多行代码,项目内包含了实现细节和讲解。震惊之余,来点实用的开发工具压压惊,全平台通用的换源工具 chsrc、轻量级的 IP 扫描工具 WatchYourLAN 和跨发行版的 Linux 工具箱 linutil,它们都是能解决某个痛点的开发工具。

当然,怎么能少了有趣、好玩的开源项目呢?开源的字修仙游戏 vue-XiuXianGame 和空中交通管制在线模拟器 openscope,它们不仅有趣,更是点开就能玩。

  • 本文目录
    • 1. 热门开源项目
      • 1.1 用 SQL 写的俄罗斯方块游戏:Tetris-SQL
      • 1.2 轻量级的 IP 扫描工具:WatchYourLAN
      • 1.3 跨发行版的 Linux 工具箱:linutil
      • 1.4 在线的空中交通管制模拟器:openscope
      • 1.5 干净可定制的 RAG WebUI:kotaemon
    • 2. HelloGitHub 热评
      • 2.1 开源的文字修仙游戏:vue-XiuXianGame
      • 2.2 全平台通用的换源工具:chsrc
    • 3. 结尾

1. 热门开源项目

1.1 用 SQL 写的俄罗斯方块游戏:Tetris-SQL

主语言:PLpgSQL

Star:400

周增长:400

该项目是仅用 SQL 代码实现的俄罗斯方块游戏,展示了 SQL 语言的强大能力(图灵完备)。它通过 PostgreSQL 数据库中的表和查询语句来控制游戏逻辑和显示。虽然项目包含 Python 脚本,但只是用于将用户输入转化为 SQL 命令。同时,项目还提供了开箱即用的安装方式和详细的实现细节讲解,除了有趣之外,还可以作为实战项目,帮助解释高级 SQL 概念并加深对 SQL 的理解。

GitHub 地址→
github.com/nuno-faria/tetris-sql

1.2 轻量级的 IP 扫描工具:WatchYourLAN

主语言:Go

Star:3.3k

周增长:1.2k

这是一个自带 Web 界面的 IP 扫描工具,可作为轻量级的监控平台。它可以扫描本地/公共网络中的 IP 和端口,帮助用户实时监控主机的在线和离线状态,并记录历史数据。当检测到新设备时,它还能发出通知,让运维人员快速了解当前网络中的变化,从而更方便地维护和追踪网络设备状态。

GitHub 地址→
github.com/aceberg/WatchYourLAN

1.3 跨发行版的 Linux 工具箱:linutil

主语言:Rust

Star:1.4k

周增长:700

该项目是专为 Linux 设计的命令行工具,旨在简化日常 Linux 任务。它使用 Rust 语言开发命令行界面,提供了一系列常用的自动化脚本和命令,兼容多个 Linux 发行版,功能包括软件安装、系统优化和安全配置(防火墙)等方面。

GitHub 地址→
github.com/ChrisTitusTech/linutil

1.4 在线的空中交通管制模拟器:openscope

主语言:JavaScript

Star:600

这是一个用 JavaScript 开发的多人空中交通管制模拟器,可模拟真实的空中交通环境和管理。它提供了直观的雷达和地图视图,支持模拟飞机的起飞、降落、飞行路径规划和空中交通流量管理,以及天气、紧急情况、不同飞机和机场环境等复杂场景。

GitHub 地址→
github.com/openscope/openscope

1.5 干净可定制的 RAG WebUI:kotaemon

主语言:Python

Star:11k

周增长:5k

该项目可以快速构建一个简洁、易于定制、拥有 Web 界面的 RAG 应用,让用户通过聊天的方式与本地文档交互。它不仅使用方便且功能丰富,支持多用户、文档预览、多模态交互,以及嵌入 LLM API 和本地 LLMs 等功能。

GitHub 地址→
github.com/Cinnamon/kotaemon

2. HelloGitHub 热评

在本章节中,我们将为大家介绍本周 HelloGitHub 网站上的热门开源项目。同时,期待您与我们分享使用这些开源项目的心得与体验。

2.1 开源的文字修仙游戏:vue-XiuXianGame

主语言:Vue

这是一个基于 Vue.js 开发的修仙模拟器,互动式的文字游戏,适合喜欢放置类和修仙题材游戏的玩家。

项目详情→
hellogithub.com/repository/e73a691ffcfa4d0e92a05912fe8c0b46

2.2 全平台通用的换源工具:chsrc

主语言:C

该项目能够为常见的 Linux 发行版、编程语言和软件切换至国内镜像源,操作简单仅需一条命令。它采用 C 语言编写,具有高效和轻量级的特点,支持测速、多平台以及项目级换源等功能,适用于优化下载速度或解决源受限的场景。

项目详情→
hellogithub.com/repository/7666ba91e01e4a59be5809b02d9e8ff6

3. 结尾

以上就是本期「GitHub 热点速览」的全部内容,希望你能够在这里找到自己感兴趣的开源项目,如果你有其他好玩、有趣的 GitHub 开源项目想要分享,欢迎来
HelloGitHub
与我们交流和讨论。

往期回顾

大家好,我是
晓凡。

不少程序员小伙伴都喜欢边听音乐边敲代码,尤其在一个嘈杂的环境中,一个好的想法、好的思路可能就因为一瞬间的干扰就没了。

这时,如果耳机一戴上,听着音乐能更好的集中注意力;遇到bug也能临危不乱,想出更好的解决办法;

网易云音乐,算是一个相对简洁、有趣的播放器了。

不过近些年,各种花里胡哨的功能越来越多,有些歌曲的版权也没了,可谓是让人又爱又恨。

前几天逛
GitHub
的时候发现了一个【高颜值的第三方网易云播放器
YesPlayMusic
】推荐给大家。

YesPlayMusic

一、YesPlayMusic的魅力

YesPlayMusic
并不是简单的“换肤”软件,它基于网易云音乐的
API
,使用
Vue.js
全家桶开发。

实现了网易云音乐的全部核心功能,并且去除了那些你可能根本不会用到的繁琐功能。

也没有社交功能,简简单单,干干净净,专注于听歌。

作者自称灵感来源
Apple Music

YouTube Music

Spotify

网易云音乐

所以
YesPlayMusic
可谓光靠其高颜值的界面设计,成功俘获了一大批用户的心。

目前在
GitHub

stars
已经有
28.9k
⭐了

界面简洁而不失优雅,功能全面而不显臃肿,对于喜欢简洁的程序员来说可谓是一个不错的选择

GitHub地址

GitHub
地址在这儿:
https://github.com/qier222/YesPlayMusic

二、YesPlayMusic功能

麻雀虽小,但五脏俱全。该有不该有的功能都有,但不臃肿。

一些无用功能直接拿掉,作者还根据不同设备,不同地区做了各种适配。

可以使用网易云音乐账号登录,并将网易云音乐收藏同步过来。

下面这些功能够你用了么。

image-20240908102713709

三、下载安装

作者考虑周全,做了各种操作系统、各种设备的适配。并且发布了
Electron 版本
,使其在
macOS

Windows

Linux
都得到了适配。

有些小伙伴可能不知道
Electron
是啥?

其实我们平常使用的
Visual Studio Code

网易云音乐

飞书

xmind
等等都是通过
Electron
开发的,这下不陌生了吧。

简单来说
Electron
就是通过网页技术(
HTML

CSS

JavaScript
)来快速开发跨平台桌面应用的工具。

这么在不同平台上安装呢?

  • macOS
    用户可以通过
    Homebrew
    来安装:
    brew install --cask yesplaymusic
  • Windows
    用户可以通过
    Scoop
    来安装:
    scoop install extras/yesplaymusic

晓凡用的
Windows
操作系统,下面就以
windows
为例,简单说下这么下载安装。

① 跳转到Releases页面

目前最新版本是
v0.4.8
版本

https://github.com/qier222/YesPlayMusic/releases

image-20240908104710282

② 选择windows的exe下载即可

image-20240908104828964

如果在 Release 页面没有找到适合你的设备的安装包的话,你可以根据下面的步骤来打包自己的客户端。

  1. 打包 Electron 需要用到
    Node.js

    Yarn
    。可前往 Node.js 官网:
    https://nodejs.org/zh-cn/
    下载安装包。

    安装
    Node.js
    后可在终端里执行
    npm install -g yarn
    来安装 Yarn。

  2. 使用
    git clone --recursive https://github.com/qier222/YesPlayMusic.git
    克隆本仓库到本地。

  3. 使用
    yarn install
    安装项目依赖。

  4. 复制
    /.env.example
    文件为
    /.env

  5. 选择下列表格的命令来打包适合的你的安装包,打包出来的文件在
    /dist_electron
    目录下。了解更多信息可访问
    electron-builder 文档

命令 说明
yarn electron:build --windows nsis:ia32 Windows 32 位
yarn electron:build --windows nsis:arm64 Windows ARM
yarn electron:build --linux deb:armv7l Debian armv7l(树莓派等)
yarn electron:build --macos dir:arm64 macOS ARM

下面是晓凡安装后打开的一些截图

首页

发现页面

歌曲搜索

mv播放

四、本地部署

除了下载安装包使用,小伙伴们还可以将本项目部署到
Vercel
或自己服务器上。

作者在项目首页一共提供了①
Vercel
部署 ② 自己服务器部署 ③
Docker
部署 ④
Replit
部署 四种部署方式

至于怎么部署,作者在
GitHub
上已经说得很详细了。

给出的每种部署方式步骤都很详细,由于文章篇幅愿意,这里就不一一列举了。

感兴趣的小伙伴自己到
https://github.com/qier222/YesPlayMusic
查看即可

五、开发新功能

如果上面的功能还不能满足你,可以在此基础上继续进行二开

克隆项目到本地,运行本项目

# 安装依赖
yarn install

# 创建本地环境变量
cp .env.example .env

# 运行(网页端)
yarn serve

# 运行(electron)
yarn electron:serve

本期内容到这儿就结束了
★,°
:.☆( ̄▽ ̄)/$:
.°★

希望对您有所帮助

我们下期再见 ヾ(•ω•`)o (●'◡'●)

单个48TB大小SQL Server数据库备份导致日志文件无法截断


SQL Server 版本:SQL Server 2019
背景
在一个48T大小的单数据库环境中,采用简单恢复模式,日志文件大小限制为600G。执行一次完整备份时,耗时超过12小时,导致日志文件无法截断并达到上限,后续事务无法正常写入,导致整个数据库不可用。



问题现象
LDF日志文件中的虚拟日志文件 (VLF) 全部为活动状态,导致日志无法正常截断。由于日志文件大小达到了600G的限制,后续的事务写入失败,导致数据库操作停滞。



排查思路
排查思路一般有下面几个:
1、大事务导致日志无法截断:可能是未提交的大事务阻止了日志的截断。
2、特殊环境:如复制 (Replication)、镜像 (Mirroring)、可用性组 (AG)、变更数据捕获 (CDC) 等场景下,备用端异常会导致主端无法截断日志。
3、未及时备份事务日志:在完整恢复模式下,未及时备份事务日志导致日志文件增长。
4、数据库恢复时间设置:修改过数据库恢复时间,可能导致checkpoint延迟,从而延长日志文件的截断时间。



排查步骤
按照下面思路进行逐一排查
1、确认数据库恢复模式:数据库为简单恢复模式,排除事务日志备份问题(思路3)。
2、检查运行环境:数据库为单机模式,排除复制、镜像、AG等场景(思路2)。
3、检查长时间事务:使用 `DBCC OPENTRAN` 检查,未发现长时间运行的事务,排除大事务问题(思路1)。
4、检查数据库恢复设置:`TARGET_RECOVERY_TIME` 和 `recovery interval` 为默认值,排除恢复时间问题(思路4)。
5、检查阻塞情况:未发现阻塞问题。
6、检查SQL Agent作业:除了完整备份外,未发现其他作业运行。
7、检查写入逻辑:与开发人员沟通得知,该数据库为日常批量数据写入,日志写入量超过400G。





问题原因分析
这里面我们需要从数据库完整备份的原理入手,解剖备份的细节,分析原因,一般来说,数据库完整备份分为两个阶段:
1、第一阶段:记录备份开始时的LSN,生成快照式备份。
2、第二阶段:快照备份结束后,记录最新的LSN,并将这两次LSN之间的事务日志写入备份。
由于数据库较大,备份时间超过12个小时,导致备份操作一直处于第一阶段,无法进入到第二阶段。这期间,日志文件中的事务无法截断,12小时内的事务量超过600GB,导致LDF日志文件被打爆。



优化建议
最后的解决方案是,开启SQL Server 2019的ADR(加速数据库恢复)功能,完整备份时候,日志文件只有少量增长,问题解决。
启用 ADR 的步骤
确保使用的是 SQL Server 2019 或 SQL Server 2022,因为 ADR 是从 SQL Server 2019 开始引入的。

--开启数据库的ADR功能
ALTER DATABASE [YourDatabaseName]
SET ACCELERATED_DATABASE_RECOVERY = ON;GO


--检查 ADR 状态
SELECTname, is_accelerated_database_recovery_onFROMsys.databasesWHERE name = 'YourDatabaseName';--关闭 ADR
ALTER DATABASE [YourDatabaseName]
SET ACCELERATED_DATABASE_RECOVERY = OFF;GO


这里有如下几个优化思路:
1、多文件备份:将默认的单文件备份改为多文件备份,可以提升备份效率,缩短备份时间。(之前介绍过SQL Server的一个不显眼的功能备份文件分割)
2、升级SQL Server版本:升级到SQL Server 2019或SQL Server 2022,启用ADR(加速数据库恢复)功能,通过SLOG实现日志及时截断。
3、业务拆分:尽管不现实,但从业务上进行拆分也可以减少单一数据库的事务量。


总结

在SQL Server 2019中,一个48TB数据库因备份耗时过长,导致日志文件无法截断并达到上限,阻碍事务写入。
本文介绍了多种解决方案包括多文件分割备份、启用数据库ADR功能。
最终启用数据库ADR功能解决了问题。这里要注意的是,一定要尽量使用最新的数据库版本,例如SQL Server 2019或者SQL Server 2022,
保证能使用到最新功能,可以摆脱很多麻烦。




补充:数据库完整备份原理
在完整备份过程中,即使数据库处于简单恢复模式,备份依然会拷贝未提交事务的日志。对于长时间运行的事务,备份会包含足够的日志信息来撤销这些未提交的事务。
因此,即使数据库的MDF文件较小,日志文件(LDF)也可能会导致备份文件非常大。
这与MySQL的Xtrabackup的原理几乎是一样的,备份开始时生成一个开始LSN,结束时生成一个结束LSN,如果有未提交事务,MySQL8.0的
undoxx
文件会非常大




参考文章
https://learn.microsoft.com/en-us/sql/relational-databases/accelerated-database-recovery-concepts?view=sql-server-ver16
https://www.mssqltips.com/sqlservertip/5971/accelerated-database-recovery-in-sql-server-2019/
https://medium.com/ricos-note/accelerated-database-recovery-a7f0d30b1e0


本文版权归作者所有,未经作者同意不得转载。

LINQ介绍

语言集成查询 (LINQ) 是一系列直接将查询功能集成到 C# 语言的技术统称。数据查询历来都表示为简单的字符串,没有编译时类型检查或 IntelliSense 支持。此外,需要针对每种类型的数据源了解不同的查询语言:SQL 数据库、XML 文档、各种 Web 服务等。借助 LINQ,查询成为了最高级的语言构造,就像类、方法和事件一样。

安装.NET 9

需要体验LINQ的新增功能前提是需要安装.NET9环境,.NET 9是.NET 8的继任者,特别侧重于云原生应用和性能。作为标准期限支持 (STS) 版本,它将在 18 个月内受到支持。

验证是否安装成功

dotnet --list-sdks

.NET 9 SDK目前在Visual Studio 2022中不适用

注意:.NET 9 SDK目前在Visual Studio 2022中不适用,所以无法在Visual Studio2022中选择.NET 9 为目标框架。

VS Code中编写ASP.NET Core Web应用

VS Code中创建.NET 9控制台应用

从VS Code中打开终端

运行以下命令:

dotnet new console --framework net9.0 --use-program-main

运行应用

dotnet run

CountBy方法

CountBy这个方法允许开发者按键来聚合集合中的元素,并计算每个键的出现次数。这使得计算某个数据集中特定元素的频率变得非常简单。

    public static void CountByExample()
    {
            //这里wordCounts是一个字典,包含每个单词及其出现次数的键值对
            var sourceText = "This is a test text. This is only a test. This is the best. This,This,This";
            KeyValuePair<string, int> mostFrequentWord = sourceText
            .Split(new char[] { ' ', '.', ',' }, StringSplitOptions.RemoveEmptyEntries)
            .Select(word => word.ToLowerInvariant())
            .CountBy(word => word)
            .MaxBy(pair => pair.Value);

            Console.WriteLine($"最常见的词是:'{mostFrequentWord.Key}'  {mostFrequentWord.Value}");
   }

输出结果:

AggregateBy方法

AggregateBy这个方法提供了更强大的聚合功能。开发者可以定义一个聚合逻辑(如求和、平均值等),并按键进行聚合。该方法在需要基于键对集合中的元素进行复杂计算时非常有用。

    public static void AggregateByExample()
    {
        (string id, int score)[] data =
            [
                ("0", 88),
                ("1", 5),
                ("2", 4),
                ("1", 10),
                ("6", 5),
                ("4", 10),
                ("6", 25)
            ];

        // aggregatedData 是一个序列,包含按姓名分组并计算总分的元素
        var aggregatedData =
            data.AggregateBy(
                keySelector: entry => entry.id,
                seed: 0,
                (totalScore, curr) => totalScore + curr.score
                );

        foreach (var item in aggregatedData)
        {
            Console.WriteLine(item);
        }
    }

输出结果:

Index<TSource>(IEnumerable<TSource>)
方法

借助
Index<TSource>(IEnumerable<TSource>)
,可以快速提取可枚举项的隐式索引。现在,可以编写代码(如以下代码片段)来自动为集合中的项编制索引。

    public static void IndexExample()
    {
        var lines = new List<string> { "First line", "Second line", "Third line" };
        foreach (var (index, line) in lines.Index())
        {
            Console.WriteLine($"Line {index + 1}: {line}");
        }
    }

输出结果:

参考文章

C#/.NET/.NET Core拾遗补漏