MoreRSS

site iconAimer Neige修改

中北大学学生,学习物联网专业。Linux 用户,热爱开源和分享。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

Aimer Neige的 RSS 预览

Install Atlas

2024-02-06 16:06:29

F**k Windows Upgrade to Atlas

如何禁止电脑开机时自动连接蓝牙耳机

2023-04-17 17:49:10

前言

由于电子设备比较多,蓝牙耳机配对的设备也比较多,这就引起了一个问题,本来连着手机听歌听的好好的,电脑开机之后就会自动抢占蓝牙耳机的信号,导致我还得重新在手机上连接耳机,严重影响听歌体验,于是就查询了如何禁用电脑自动连接的行为,希望这篇文章对你也有用。

如何操作

编辑 /etc/bluetooth/main.conf 这个文件:

sudo vim /etc/bluetooth/main.conf

找到这些内容:

# AutoEnable defines option to enable all controllers when they are found.
# This includes adapters present on start as well as adapters that are plugged
# in later on. Defaults to 'true'.
# AutoEnable=true

修改配置文件,禁用自动连接:

AutoEnable=false

重启设备,测试效果。

在 PaperMod 博客中添加友链

2023-03-12 13:25:06

PaperMod 是一个非常棒的博客主题,但是它不支持友链,所以你要自己写一些代码。

完整代码

把下面的代码存储在 layouts/shortcodes/friends.html

<style type="text/css">
 .friends {
 --link-count-per-row: 1;
 }

 @media screen and (min-width: 576px) {
 .friends {
 --link-count-per-row: 2;
 }
 }

 @media screen and (min-width: 768px) {
 .friends {
 --link-count-per-row: 3;
 }
 }

 .friends {
 display: grid;
 grid-template-columns: repeat(var(--link-count-per-row), 1fr);
 grid-gap: 16px;
 }

 /* 空间占位 */
 .friend-skeleton {
 height: 280px;
 display: inline-block;
 position: relative;
 }

 .friend {
 height: 100%;
 width: 100%;
 position: absolute;
 top: 0;
 left: 0;
 transition: 0.67s cubic-bezier(0.19, 1, 0.22, 1);
 border-radius: var(--radius);
 box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2),
 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12) !important;
 overflow: hidden;
 display: flex;
 flex-direction: column;
 justify-content: flex-start;
 align-items: center;
 }

 .friend:hover {
 transform: translateY(-8px);
 box-shadow: 0 3px 5px -1px rgba(0, 0, 0, 0.2),
 0 5px 8px 0 rgba(0, 0, 0, 0.14), 0 1px 14px 0 rgba(0, 0, 0, 0.12) !important;
 }

 .friend-avatar {
 object-fit: cover;
 width: 100%;
 height: 180px;
 margin: 0 !important;
 border-radius: 0 !important;
 }
 .friend-content {
 text-align: center;
 flex: 1;
 width: 100%;
 padding: 16px;
 background: var(--entry);
 transform: translate3d(0, 0, 0);
 }

 .friend-name {
 font-size: 1.2rem;
 font-weight: bold;
 transform: inherit;
 }

 .friend-description {
 font-size: 0.8rem;
 color: var(--secondary);
 transform: translate3d(0, 0, 0);
 }
</style>
<div class="friends">
 {{ range .Site.Data.friends }}
 <div class="friend-skeleton">
 <a href="{{ .link }}" target="_blank">
 <div class="friend">
 <img class="friend-avatar" src="{{ .image }}" />
 <div class="friend-content">
 <div class="friend-name">{{ .title }}</div>
 <div class="friend-description">{{ .intro }}</div>
 </div>
 </div>
 </a>
 </div>
 {{ end }}
</div>
<!-- style code by https://github.com/fissssssh -->
<!-- view https://github.com/fissssssh/fissssssh.github.io for more detail -->

用法

  1. data/friends.yml 中添加你的友链数据,示例:
- title: "伞"
 intro: "一只咸鱼的学习记录"
 link: "https://umb.ink/"
 image: "https://avatars.githubusercontent.com/u/53655863?v=4"
- title: "HelloWorld的小博客"
 intro: "这里是一个小白的博客"
 link: "https://mzdluo123.github.io/"
 image: "https://avatars.githubusercontent.com/u/23146087?v=4"
  1. 在 Post 中按如下方式引用即可:

{{< friends >}}

在 PaperMod 博客中设置自定义字体

2023-03-02 20:54:06

下载字体

下载你需要的字体,并存储在 static/fonts

导入字体

@font-face {
 font-family: "LXGWWenKai-Regular";
 src: url("/fonts/lxgw-wenkai/LXGWWenKai-Regular.ttf") format("truetype");
}

应用字体

body {
 font-family: LXGWWenKai-Regular;
}

在 PaperMod 中应用

把你自己的 css 文件文件放在 assets/css/extended/custom_fonts.css

导入多字重的字体文件

@font-face {
 font-family: "LXGWWenKai";
 src: url("/fonts/lxgw-wenkai/LXGWWenKai-Light.ttf") format("truetype");
 font-weight: lighter;
 font-style: normal;
}

@font-face {
 font-family: "LXGWWenKai";
 src: url("/fonts/lxgw-wenkai/LXGWWenKai-Regular.ttf") format("truetype");
 font-weight: normal;
 font-style: normal;
}

@font-face {
 font-family: "LXGWWenKai";
 src: url("/fonts/lxgw-wenkai/LXGWWenKai-Bold.ttf") format("truetype");
 font-weight: bold;
 font-style: normal;
}

使用 CDN

@import url('https://cdn.jsdelivr.net/npm/[email protected]/css/jetbrains-mono.min.css');

code {
 font-family: 'JetBrains Mono';
}

参考链接

如何给 Go 的结构体添加多个 tag

2023-02-26 12:48:36

本来很简单的东西,但是老忘,干脆写个博客吧

错误写法

type Page struct {
 PageId string `bson:"pageId",json:"pageId"`
 Meta map[string]interface{} `bson:"meta",json:"pageId"`
}

正确写法

type Page struct {
 PageId string `bson:"pageId" json:"pageId"`
 Meta map[string]interface{} `bson:"meta" json:"pageId"`
}

很多 Tag

Items []Item `gorm:"column:items,type:varchar(255);comment:'sample column'" json:"items"`

参考链接

Golang Context

2023-02-03 23:29:21

前言

有时我们要通过第三方服务获取数据,它可以是外部提供的 API,也可以是微服务的接口等等,总之,它们有相同的问题:“获取数据可能需要大量时间”。如果在代码中同步地获取这些数据,程序就会花时间等待这些服务响应,而这些等待会严重影响程序的运行效率,而且一旦这些服务崩溃,我们的程序就会陷入无休止的等待中,那么如何解决这个问题呢?可以使用 Go 的 context 包。

问题

我们用这个函数来替代那些第三方服务。我们直接使用 time.Sleep() 函数来模拟一个耗时过程,在现实场景中,它可能是在执行一个非常复杂的 SQL 查询,也可以是调用一个人工智能服务接口。当然,这个耗时是不确定的,甚至有可能是无穷大(卡死)。

func fetchThirdPartyStuffWhichCanBeSlow() (int, error) {
 time.Sleep(time.Millisecond * 500)

 return 64, nil
}

如果我们不做任何处理,直接调用这个函数,就像这样:

func foo() {
 // some code here ...

 val, err := fetchThirdPartyStuffWhichCanBeSlow()
 if err != nil {
 log.Fatal(err)
 }

 // some code here ...
}

上面的代码如果用在一些只执行一次的脚本、工具中,并不会带来严重后果,无非多等一下就好了,即使有问题也可以关掉程序检查一下第三方服务。但是如果上面的代码用在一个承载大流量的 web 服务中,程序在执行完耗时代码后还要继续执行一些重要的业务功能,那么这样直接调用而不加考虑的代码很可能是致命的。一旦第三方服务出现问题,程序没有任何机制检查和处理,而是直接陷入无休止的等待。这显然是不合理的。

解决方案

要解决上述的问题,比较常见的思路是引入一个主动停止耗时服务的功能,这样如果耗时函数花了太多时间执行,程序就可以感知到,并主动干预。

在后文中,我们假设我们要使用用户的 ID 访问用户的数据,且调用三方服务的代码被单独封装为 fetchUserData()

使用 Channel

如果不使用本文要介绍的 Context,传统的思路是使用 Channel + Select 来处理:

type Response struct {
 value int
 err error
}

func fetchUserData(userID int) (int, error) {
 stop := make(chan bool)
 respch := make(chan Response)

 go func() {
 val, err := fetchThirdPartyStuffWhichCanBeSlow()
 respch <- Response{
 value: val,
 err: err,
 }
 }()

 go func() {
 time.Sleep(time.Millisecond * 200)
 stop <- true
 }()

 for {
 select {
 case <-stop:
 return 0, fmt.Errorf("fetching data from third party took to long")
 case resp := <-respch:
 return resp.value, resp.err
 }
 }
}

这里我们使用 stop 这个 Channel 来发送停止信号,在程序执行超过指定时间时关掉终止等待并报错,而 respch 用来接受返回值。在程序的最后,使用 select 来接受 Channel 的信号,当检测到超时或执行完成时返回结果。