https://avatars.githubusercontent.com/u/18242685

lihuu's blog

Mac平台虚拟化神器:Orbstack

OrbStack](https://orbstack.dev/) 是一种快速、轻便和简单的方式来运行容器和 Linux 机器。Mac 平台中强烈建议用它替换 Docker Desktop,它比 Docker Desktop 占用更少的资源,官方有对比,感兴趣可以在这里查看https://docs.orbstack.dev/benchmarks,从图中对比来看,直接吊打。

OrbStack 占用的资源很少。OrbStack 在空闲时使用大约 0.1% 的 CPU,通常会降至 0%,这比大多数应用程序的后台 CPU 使用率更低!并且还可以在运行容器或者虚拟机的时候使用 orb config命令来限制 cpu 的最大使用量。当然啦,如果我们想尽量减少 CPU 的占用,那停止任何没有使用的容器或者关闭任何没有使用的虚拟机。OrbStack 是按需分配内存的,并会根据需要增长,并且后面没有使用的内存会自动返回给 macOS,这对于内存堪比黄金的 mac 电脑,真的是非常适合。OrbStack 磁盘占用也比较少,全新安装的 OrbStack 占用不到 10MB 的磁盘空间,并且它采用了完全动态的磁盘管理,几乎没有额外开销,其占用空间会根据需要自动增减。

普通人为什么缺乏奋斗精神和执行力?

1. 看不到希望

当人感觉前路渺茫,做什么都可能失败时,就很难鼓起勇气去行动。

1.1 习得性无助 (Learned Helplessness)

  • 概念:就像实验里的大象,小时候被细绳拴住无法挣脱,长大后即使有力气挣脱了,也不会再去尝试,因为它“学会”了自己是无助的。
  • 表现:当人经历多次挫折或失败后,可能会认为自己无法掌控局面,从而放弃努力,即使机会来临也不去尝试。
  • 启示:要对抗这种心态,关键在于重建希望感。要相信自己有改变现状的能力,即使面对困难也不要轻易放弃。要认识到“趋利避害”虽然是本能,但有时需要克服这种本能去争取。

1.2 破窗理论 (Broken Windows Theory) - 应用于个人边界

  • 概念:这个理论(常用于社会学)在这里可以理解为:如果第一次受到不合理的对待或侵犯时没有反抗,那么后续就可能招致更多得寸进尺的行为,底线会被不断突破。
  • 表现:不敢拒绝别人的不合理要求,一味退让,导致自己的时间和精力被无谓消耗。
  • 启示:要勇于维护自己的边界,在第一次遇到不公正或不合理情况时,就要明确表达“不”,进行反抗。这样才能避免被他人随意“踩踏”。

1.3 螃蟹效应 (Crab Bucket Effect)

  • 概念:就像桶里的螃蟹,当一只快要爬出去时,其他的螃蟹会把它拉下来。
  • 表现:身边的人(有时甚至是亲友)可能会因为嫉妒、不理解或其他原因,打击你的积极性,阻碍你前进。
  • 启示:要远离那些不断消耗你、拖你后腿的人或环境。寻找积极向上、能互相鼓励的圈子。

2. 看不到结果

行动迟迟得不到正反馈,也会让人失去动力。

Hammerspoon使用入门

Hammerspoon(https://www.hammerspoon.org/) 是一款基于 Lua 脚本的自动化工具,它能够让 Mac 上的各种操作变得更加智能和自动化。无论是自动化日常任务,还是创建复杂的自定义快捷操作,Hammerspoon 都能轻松实现。它通过提供对系统事件的访问、窗口管理、键盘快捷键、自定义菜单等功能,帮助我们大大提高工作效率。

Hammerspoon 的核心特点

  1. Lua 脚本引擎 Hammerspoon 的最强大之处在于它使用 Lua 脚本,这意味着你可以通过编写 Lua 代码来控制 Mac 上的几乎所有操作。无论是简单的文件操作,还是复杂的自动化任务,都可以通过 Hammerspoon 的脚本来实现。
  2. 高度自定义 用户可以通过 Lua 脚本编写自己想要的功能,灵活性极高。例如,你可以为特定的应用程序创建快捷键、设置自动化任务、控制窗口的大小和位置等。Hammerspoon 还允许你将各种任务结合起来,以实现更为复杂的自动化流程。
  3. 与 macOS 深度集成 Hammerspoon 不仅可以操作系统的基本功能(如窗口管理、键盘操作),还能够与其他应用程序进行交互。比如,它可以控制 iTunes、Spotify 等音频应用的播放,或者让它与外部设备进行连接。
  4. 丰富的插件支持 Hammerspoon 本身并没有过多的限制,它拥有丰富的社区支持和插件库。用户可以安装各种插件来扩展功能,像是自动化桌面布局、快速启动应用程序、控制系统亮度等,几乎可以满足各种需求。

如何安装和配置 Hammerspoon?

  1. 安装 你可以通过 Hammerspoon 官网(hammerspoon.org)下载安装包,或者通过 Homebrew 进行安装:
brew install hammerspoon
  1. 配置 安装完 Hammerspoon 后,你需要编辑配置文件来编写脚本。默认的配置文件位于~/.hammerspoon/init.lua。你可以通过文本编辑器打开该文件,并开始编写 Lua 脚本。 3. 加载配置 配置文件编辑完成后,你可以重新加载配置,使修改立即生效。点击 Hammerspoon 图标,在菜单中选择“Reload Config”即可。

一些使用场景分享

根据不同的应用自动切换输入法

可以写一个脚本来实现自动切换输入法,切换窗口的时候自动选择对应的输入法。 例如,我想在 kitty 这个应用中总是使用英文输入法,在微信这个应用中总是使用中文输入法,可以使用下面的代码来实现。

Spring Boot Web Test

创建一个 Controller 类

package com.example.testingweb;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HomeController {
    @GetMapping("/")
    public String greeting() {
        return "Hello, World";
    }
}

如何测试这个 Controller

直接注入对应的 HomeController

@SpringBootTest
public class HomeControllerTest {
    @Autowired
    private HomeController homeController;

    @Test
    public void should_return_hello_world() {
        String expected = "Hello, World";

        String actual = homeController.greeting();

        assertEquals(expected, actual);
    }

}

启动一个随机端口进行测试

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.boot.test.web.server.LocalServerPort;

import static org.junit.jupiter.api.Assertions.assertEquals;
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class HttpRequestTest {

    @LocalServerPort
    private int port;

    @Autowired
    private TestRestTemplate restTemplate;

    @Test
    public void should_return_hello_world() {
        String expected = "Hello, World";

        String actual = restTemplate.getForObject("http://localhost:" + port + "/", String.class);

        assertEquals(expected, actual);
    }

}

使用 WebEnvironment.RANDOM_PORT 在测试时启动一个真实的服务器,但使用随机端口。这种方式有以下优点:

Jpa中自定义枚举映射

Jpa 中默认自带了@Enumerated 注解,它默认提供了两种形式 String 和 ordinal,表示按照枚举的名字和枚举值的顺序 ,但是有时候我们需要自定义枚举映射,比如枚举的值不是枚举的名字,而是枚举的某个属性值。这时候我们可以使用@Convert 注解来实现自定义枚举映射。

使用默认的@Enumerated 注解实现字段映射

@Entity
public class User{
  @Id
  private Integer userId;

  private String name;

  private Integer age;

  @Enumerated(STRING)
  private Status status;
}

public enum Status{
   ACTIVE,DELETED,BANED
}

使用自定义枚举映射

创建一个用于映射的枚举

public enum Status{
  ACTIVE(1),DELETED(0),BANED(-1);

  private final int value;

  public int getValue(){
    return this.value;
  }

  public static Status of(int value){
    for(Status status:Status.values()){
      if(status.getValue() == value){
        return status;
      }
    }
    throw new IllegalArgumentException("Invalid value: "+value);
  }

}

实现一个枚举转换器


//@Converter(autoApply=true)
public class StatusConverter implements AttributeConverter<Status,Integer>{

  @Override
  public Integer convertToDatabaseColumn(Status attribute){
    return attribute.getValue();
  }

  @Override
  public Status convertToEntityAttribute(Integer dbData){
    return Status.of(dbData);
  }
}

使用@Convert 注解 � 用


@Entity
public class User{
  @Id
  private Integer userId;

  private String name;

  private Integer age;

  @Convert(converter = StatusConverter.class, attributeName = "status")
  private Status status;

}

在上面的例子中使用了@Convert 注解,它有两个属性,一个是 converter,用于指定转换器,另一个是 attributeName,用于指定要转换的属性名,如果转换器设置了 autoApply,则可以省略这个注解。 配置完之后,我们就可以在实体类中使用自定义的枚举映射了。

iptables 简易使用手册

iptables 简易使用手册

iptables 是一个强大而灵活的 Linux 防火墙工具,用于管理网络包过滤和网络地址转换 (NAT)。它基于 Netfilter 框架工作,允许你定义详细的规则来管理入站和出站流量。

1. 查看现有规则

  • 查看所有表的规则:

    
    sudo iptables -L
  • 查看特定链(例如INPUT链)的规则:

    
    sudo iptables -L INPUT

2. 允许或拒绝端口

  • 允许某个端口(例如允许 22 端口的 SSH 流量):

UFW 简易使用手册

UFW 简易使用手册

ufw(Uncomplicated Firewall)是 Ubuntu 的默认防火墙管理工具,旨在简化防火墙配置。ufw是一个对iptables的封装,简化了防火墙规则的配置。它适合那些不需要深入配置复杂防火墙策略的用户,易于使用并提供友好的命令行接口。ufw背后实际使用的也是iptables,因此它本质上是简化了iptables的配置过程。

Perttier 使用

Perttier 使用

官网

What is Prettier? · Prettier

安装

# 全局安装
npm install -g prettier
# or
yarn global add pretter

# 项目中安装
npm install --save-dev --save-exact prettier
#or
yarn add prettier --dev --exact

配置

配置的位置

  • package.json 中的 perttier 字段

  • JSON 或者 YAML 格式的 .prettierrc

  • .prettierrc.json, .prettierrc.yml , .prettierrc.yaml, .prettierrc.json5

  • .prettierrc.js , .prettierrc.cjs ,prettierrc.config.js,prettierrc.config.cjs

{
  "tabWidth": 2, // tab缩进大小,默认为2
  "useTabs": true, // 使用tab缩进,默认false
  "semi": false, // 使用分号, 默认true
  "singleQuote": true, // 使用单引号, 默认false(在jsx中配置无效, 默认都是双引号)
  "TrailingCooma": "none", // 行尾逗号,默认none,可选 none|es5|all,es5 包括es5中的数组、对象,all 包括函数对象等所有可选
  "bracketSpacing": true, // 对象中的空格 默认true
  "jsxBracketSameLine": false, // JSX标签闭合位置 默认false
  "arrowParens": "avoid", // 箭头函数参数括号,默认avoid 可选 avoid| always,avoid 能省略括号的时候就省略 例如x => x,always 总是有括号
  "htmlWhitespaceSensitivity": "strict" //html空格严格程度,可选<css|strict|ignore>
}

配置文件的位置从被格式化的文件的位置找起,然后沿着文件系统向上寻找。注意,prettier 没有全局的配置文件。