Mac 设置全局快捷键打开任意程序

没想到不是在快捷键那里设置!之前设置了没生效,都懵了。正确的方式是使用“自动操作” 这个app进行配置,然后再配置全局快捷键。

“自动操作”(Automator)是一个内置的应用程序,它可以让你创建自定义的自动化流程,其中包括设置应用快捷启动。

使用Automator创建一个包含你想要启动的应用程序的自动化流程,并将其保存为服务,然后在系统偏好设置中为该服务分配一个全局快捷键:

  1. 自动操作:

    image-20240507下午12250088

  2. 快速操作

    image-20240507下午12536713

  3. 打开应用程序:

    image-20240507下午13536713

  4. cmd+s 保存

  5. 系统偏好设置,分别点击键盘->快捷键->服务,下拉找到「通用」

    image-20240507下午13009248


自动化同步外网文件至内网

下面是一个我的示例脚本。在运行脚本之前,请确保已经安装了所需的软件和工具,并且已经配置了正确的权限和认证信息。

#!/bin/bash

set -e

filename="$1"

# 设置远程机器的地址、用户名和密码
remote_host="your_username@your_remote_ip"
password="your_password"
lockfile="$filename.lock"

# 获取当前日期和时间,并格式化为年月日时分秒
current_time=$(date +"%Y%m%d%H%M%S")

# 创建以当前日期和时间命名的zip文件
zip_file_name="$filename.${current_time}.zip"

# 检查远程服务器上是否存在.lock文件,如果存在则直接退出
if ssh your_username@your_remote_ip '[ -f /path/to/lockfile/$lockfile ]'; then
    echo "$lockfile file exists on remote server. Exiting..."
    exit 0
else
    echo "$lockfile not exists"
fi

# 在远程服务器上检查文件是否存在,如果存在则创建.lock文件
ssh your_username@your_remote_ip "[ -f /path/to/remote/directory/$filename.zip ] && touch /path/to/lockfile/$lockfile"

# 拷贝文件到本地
scp your_username@your_remote_ip:/path/to/remote/directory/$filename.zip /path/to/local/directory/$zip_file_name

# 拷贝文件到远程机器
/opt/homebrew/bin/sshpass -p "$password" scp /path/to/local/directory/$zip_file_name "$remote_host:/path/to/remote/directory/$zip_file_name"

echo ">>>>>>>>>>>>>>>>>> File '$zip_file_name' copied to remote machine successfully."

# 清理远程服务器上的文件和锁文件
ssh your_username@your_remote_ip "rm /path/to/remote/directory/$filename.zip /path/to/lockfile/$lockfile"

需要替换脚本中的以下信息:

  • your_username: 远程服务器的用户名。
  • your_remote_ip: 远程服务器的IP地址或域名。
  • your_password: 远程服务器的密码。请注意,为了安全考虑,你可能需要使用更安全的认证方法,比如SSH密钥对。
  • /path/to/remote/directory/: 在远程服务器上文件所在的路径。
  • /path/to/local/directory/: 本地文件所在的路径。

这个脚本首先检查远程服务器上是否存在锁文件,以确保不会同时运行多个实例。

然后它检查远程服务器上是否存在要同步的文件,如果存在,则创建锁文件以防止其他实例同时操作该文件。

接下来,它将文件从远程服务器复制到本地目录,然后将文件从本地目录复制到另一个远程服务器。

最后,它清理远程服务器上的文件和锁文件。


Xcode 15.3 新增的一个编译选项 "User Response File"

最近接触到这个编译选项,记录一下:

image-20240425下午32724214

具体说明在开发手册中:https://developer.apple.com/documentation/xcode/build-settings-reference#Use-Response-Files:

Use Response Files
Setting name: CLANG_USE_RESPONSE_FILE
When this setting is enabled, the build system will use response files to share common arguments between similar invocations of clang, eliminating redundant information in build logs.

目前已知 xcode 15.2 这个选项默认是打开的,而且不可编辑。

在 xcode 15.3 默认也是打开的,但可以关闭。相较于 15.2 它增加了一些参数进行共享。

这个配置打开的时候,它允许构建系统使用响应文件来在类似的 clang 调用之间共享常见参数,从而消除构建日志中的冗余信息,有助于提高构建过程的效率。更具体情况我还没有深入了解,希望以后有机会研究一下。


Mac 批量关闭finder

一不留神经常开了很多个 Finder 窗口。可以用osascript命令行批量关闭。

  1. 打开 Terminal 应用程序。
  2. 在 Terminal 中输入以下命令并按下回车键:
osascript -e 'quit app "Finder"'

nginx 在图片请求出现 404 时返回自定义默认图片的方法

使用 NGINX 的error_page指令。下面是一个简单的配置示例:

server {
    listen 80;
    server_name example.com;

    root /path/to/your/images;

    # Define a location block for handling image requests
    location /images/ {
        try_files $uri @fallback;
    }

    # Define a location block for the fallback image
    location @fallback {
        error_page 404 = /images/default.jpg;
        return 404;
    }
}

这个配置中:

  • try_files $uri @fallback; 尝试查找请求的图片文件,如果文件存在则返回,否则转到 @fallback 定义的位置。
  • error_page 404 = /images/default.jpg; 当发生404错误时,NGINX会将请求重定向到指定的图片,这里是 /images/default.jpg
  • return 404; 返回404状态码。

以我本地的 blog 为例,我的配置如下:

  location /blog/tags/ {
        try_files $uri @fallback;
    }

  # Define a location block for the fallback image
  location @fallback {
      error_page 404 = /blog/tags/zzz.jpg;
      return 404;
  }

要注意的是,如果在配置中也有关于图片的操作配置,要注意一下他们的先后顺序,NGINX 会使用首先匹配到的配置块来处理请求。


AWK 在 Debian 11 上的表现与 Debian 10 有差异

在Linux环境下,AWK是一种强大的文本处理工具,被广泛应用于数据处理和文本分析。然而,在不同的Linux发行版中,我们可能会遇到不同的AWK实现,其中两个主要的是mawk和gawk。其中Debian 11从 gawk 改为了 mawk。我的脚本在 Debian 11 中也出现了一些问题。

AWK简介

AWK 是一种用于处理文本数据的编程语言,通常用于按行处理结构化文本文件。它由Alfred Aho、Peter Weinberger和Brian Kernighan于1977年开发,其名称来源于他们的姓氏首字母。AWK通过执行一系列的模式匹配和动作来对文本进行处理。

mawk与gawk的差异

mawk(Mike’s AWK)和gawk(GNU AWK)是两种不同的AWK实现,它们在性能、特性和兼容性方面有着不同的特点。

性能

mawk被设计成一个轻量级的AWK实现,注重于速度和资源效率。其代码库较小,可能更容易维护。

相比之下,gawk是一个功能更丰富的实现,提供了更多高级功能和选项,但可能在性能上有所开销。在某些情况下,mawk可能比gawk更快。

特性和兼容性

gawk实现了POSIX和大部分AWK的标准,并提供了许多扩展功能。这使得gawk在处理复杂任务时更为方便。

而mawk更注重于遵循标准,可能在某些gawk的扩展功能方面有所不同。

示例:mawk与gawk在命令行上的差异

在不同的AWK实现中,即使是相同的命令,也可能产生不同的结果。比如,下面这个例子:

echo "nginx.kelu.org" | awk '{split($0,arr,"."); tmp=0; for(i in arr) tmp=i; for(j=tmp; j>0;j--) printf("%s/",arr[j]); }'

在Debian 11上输出为 “nginx”,而在Debian 10上输出为 “org/kelu/nginx”。这种差异可能是由于mawk和gawk在数组遍历时的行为不同所导致的,以下解释来自 gpt,我并未验证,谨慎接受:

1. 数组遍历顺序:

在AWK中,数组的遍历顺序并不总是与元素添加的顺序一致。而在mawk和gawk中,对于 for (i in array) 的遍历,遍历顺序可能有所不同。

  • mawk: mawk的数组遍历顺序可能是未定义的。
  • gawk: gawk通常会按照元素添加的顺序遍历数组。

2. 数组索引:

在AWK中,数组的索引通常是整数或者字符串。在您的例子中,您使用 split() 函数将字符串分割成数组,并且使用数组的索引来访问元素。

  • mawk: mawk可能对数组索引的处理有所不同,可能更加严格,不允许将字符串作为索引?
  • gawk: gawk在处理数组索引时可能更加宽松,允许字符串作为索引。这意味使用 for (i in array) 遍历数组时,索引可能是字符串类型。

切换 Debian 11 使用 gwak

  1. 安装 gawk:首先,确保系统已经安装了 gawk

    sudo apt-get update
    sudo apt-get install gawk
    
  2. 更新 alternatives 系统:Debian 使用 alternatives 系统来管理多版本的程序。你可以将 awk 的默认实现更改为 gawk

    首先,检查当前 awk 使用的是哪个实现:

    update-alternatives --display awk
    

    image-20240607下午50036169

    发现已经默认使用gawk了。如果不是,可以这么设置:

    sudo update-alternatives --set awk /usr/bin/gawk
    
  3. 验证更改:最后,确认 awk 已经切换到 gawk

    awk --version
    

    输出应该显示 gawk 版本信息。

    image-20240607下午52030201


使用 systemd override 自定义服务配置,修改 systemd 服务依赖顺序

在 Linux 系统中,systemd 是一种系统和服务管理器,用于管理系统启动时的进程以及运行中的服务。systemd 允许用户通过 systemd unit 文件来配置服务的行为。

当我们需要修改系统提供的服务的行为,而不希望直接编辑原始的 systemd unit 文件时,可以使用 systemd 的 override 文件来实现自定义配置,可以添加、修改或删除 systemd unit 文件中的选项,以满足其特定需求。

创建 override 文件

a.service为例 :

sudo systemctl edit a.service

这将用nano编辑器中打开一个新的 override 文件,你可以在其中添加你想要修改的配置选项。

由于我习惯使用vim,就手动创建了:

sudo mkdir -p /etc/systemd/system/a.service.d/
sudo vim /etc/systemd/system/a.service.d/override.conf

编辑 override 文件

可以添加、修改或删除配置选项以满足你的需求。例如我修改服务的 After 参数,添加以下内容:

[Unit]
After=network-online.target nss-lookup.target flanneld.service

重新启动相关的服务,以应用新的配置

sudo systemctl daemon-reload
sudo systemctl restart a.service

参考资料