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

参考资料


Xcode 下载模拟器报错 Could not download iOS 17.4 Simulator (21E213).

刚升级了 Xcode 15.3,死活无法下载模拟器,也就无法编译代码:

image-20240415下午22232752

太恼人了,我觉得问题的关键在于无法断点续传,每次都下载了好几个G就断了。

image-20240415下午14837455

姑且按照官网的教程:Installing and managing Simulator runtimes,就是开发者官网的这个文章层级:

Documentation / Xcode / Devices and Simulator / Installing and managing Simulator runtimes

执行如下命令,用命令行下载:

sudo xcode-select -s /Applications/Xcode.app
xcodebuild -runFirstLaunch
xcodebuild -downloadAllPlatforms
# xcodebuild -downloadPlatform iOS

image-20240415下午14901189

等得焦急:

image-20240415下午20011254

它报错了,说我磁盘空间不够!之前下载失败,原来是这个原因啊,再回去看截图,确实报了这个报错,当时也没有仔细看。还是命令行童叟无欺:

image-20240415下午20356998

弄清楚原因了就简单了,清理之后再下载一次。

不容易:

image-20240415下午24011475

image-20240415下午23955946

不过看到最后,该断还是断,我从watchOS 、tvOS 到 visionOS 全都是网络断开。不过没所谓了,iOS ok已经可以先用着了。

image-20240415下午34537571

ps: 找到临时目录,刚才下载到一半的在这个位置,可以手动删掉,重启后也会自动删除:

/private/var/folders/sl/j0g8fv0d5h97tc_xxsy3fkyr0000gn/T

image-20240415下午40555976


xcode 清理存储空间

编译用的 Mac 存储已经不堪重负。这一篇整理一下清理内容。

  1. DerivedData 目录:全部清除

    Xcode的缓存文件,曾经在Xcode跑过的所有项目的索引、build的信息等都会保存在这里。删除后在下次打开项目编译的时候将会重新生成。

     ~/Library/Developer/Xcode/DerivedData
    
  2. iOS设备符号表目录:按需删除

    当插入一个新版本的 iOS 设备时,Xcode都会将该设备对应系统的符号表download下来,插入设备的版本越多,数据量越大。连接设备会重新生成。

     ~/Library/Developer/Xcode/iOS DeviceSupport
    
  3. 模拟器支持:按需删除不需要的模拟器

     ~/Library/Application Support/iPhone Simulator/
    
  4. 设备日志:全部删除

     ~/Library/Application Support/iOS Device Logs/
    
  5. Archives 产出目录:按需删除

    删除之后 Xcode->Organizer 下的那些打包文件就全被清空了。

    每次打包 App 的 dSYM 等数据就保存在这里,把一些没用的版本删了。如果是上线了的版本就保留。

     ~/Library/Developer/Xcode/Archives
     ~/Library/Developer/Xcode/Products
    
  6. 模拟器的数据/缓存数据: 全部删除

    ~/Library/Developer/CoreSimulator/Devices/
    ~/Library/Developer/CoreSimulator/Caches/
    

    每个文件夹里包含的就是一个特定系统版本的设备的数据。

    每个文件夹对应哪个设备可以在其下device.plist中查看。

  7. 旧版本的模拟器支持:按需删除

    不需要的就删除了

    ~/Library/Developer/CoreSimulator/Profiles/Runtimes/
    
  8. playground的项目缓存: 全部删除

    ~/Library/Developer/XCPGDevices/
    

1 2 8 9 10 11 12 164 165