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
重启设备,测试效果。
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 -->
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"
{{< friends >}}
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;
}
把你自己的 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;
}
@import url('https://cdn.jsdelivr.net/npm/[email protected]/css/jetbrains-mono.min.css');
code {
font-family: 'JetBrains Mono';
}
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"`
}
Items []Item `gorm:"column:items,type:varchar(255);comment:'sample column'" json:"items"`
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()
。
如果不使用本文要介绍的 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 的信号,当检测到超时或执行完成时返回结果。