XStack

Deep into details

0%

简介信息

1. 问题背景#

随着苹果iPhone 14的发布,Xcode也推送了更新。
更新以后,和同事一样都遇到了相同的bug——git用不了:使用git命令会报下面这个错误:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
$ git
2022-09-19 15:21:51.777 xcodebuild[14474:4015692] [MT] DVTPlugInLoading: Failed to load code for plug-in com.apple.dt.IDESimulatorAvailability (/Applications/Xcode.app/Contents/PlugIns/IDESimulatorAvailability.ideplugin), error = Error Domain=NSCocoaErrorDomain Code=3588 "dlopen(/Applications/Xcode.app/Contents/PlugIns/IDESimulatorAvailability.ideplugin/Contents/MacOS/IDESimulatorAvailability, 0x0109): Symbol not found: (_OBJC_CLASS_$_SimDiskImage)
Referenced from: '/Applications/Xcode.app/Contents/PlugIns/IDESimulatorAvailability.ideplugin/Contents/MacOS/IDESimulatorAvailability'
Expected in: '/Library/Developer/PrivateFrameworks/CoreSimulator.framework/Versions/A/CoreSimulator'" UserInfo={NSLocalizedFailureReason=The bundle couldn’t be loaded., NSLocalizedRecoverySuggestion=Try reinstalling the bundle., NSFilePath=/Applications/Xcode.app/Contents/PlugIns/IDESimulatorAvailability.ideplugin/Contents/MacOS/IDESimulatorAvailability, NSDebugDescription=dlopen(/Applications/Xcode.app/Contents/PlugIns/IDESimulatorAvailability.ideplugin/Contents/MacOS/IDESimulatorAvailability, 0x0109): Symbol not found: (_OBJC_CLASS_$_SimDiskImage)
Referenced from: '/Applications/Xcode.app/Contents/PlugIns/IDESimulatorAvailability.ideplugin/Contents/MacOS/IDESimulatorAvailability'
Expected in: '/Library/Developer/PrivateFrameworks/CoreSimulator.framework/Versions/A/CoreSimulator', NSBundlePath=/Applications/Xcode.app/Contents/PlugIns/IDESimulatorAvailability.ideplugin, NSLocalizedDescription=The bundle “IDESimulatorAvailability” couldn’t be loaded.}, dyldError = dlopen(/Applications/Xcode.app/Contents/PlugIns/IDESimulatorAvailability.ideplugin/Contents/MacOS/IDESimulatorAvailability, 0x0000): Symbol not found: (_OBJC_CLASS_$_SimDiskImage)
Referenced from: '/Applications/Xcode.app/Contents/PlugIns/IDESimulatorAvailability.ideplugin/Contents/MacOS/IDESimulatorAvailability'
Expected in: '/Library/Developer/PrivateFrameworks/CoreSimulator.framework/Versions/A/CoreSimulator'
2022-09-19 15:21:51.877 xcodebuild[14474:4015692] [MT] DVTAssertions: ASSERTION FAILURE in /System/Volumes/Data/SWE/Apps/DT/BuildRoots/BuildRoot2/ActiveBuildRoot/Library/Caches/com.apple.xbs/Sources/DVTFrameworks/DVTFrameworks-21303/DVTFoundation/PlugInArchitecture/DataModel/DVTPlugIn.m:374
Details: Failed to load code for plug-in com.apple.dt.IDESimulatorAvailability (/Applications/Xcode.app/Contents/PlugIns/IDESimulatorAvailability.ideplugin)
Please ensure Xcode packages are up-to-date — try running 'xcodebuild -runFirstLaunch'.

NSBundle error: Error Domain=NSCocoaErrorDomain Code=3588 "dlopen(/Applications/Xcode.app/Contents/PlugIns/IDESimulatorAvailability.ideplugin/Contents/MacOS/IDESimulatorAvailability, 0x0109): Symbol not found: (_OBJC_CLASS_$_SimDiskImage)
Referenced from: '/Applications/Xcode.app/Contents/PlugIns/IDESimulatorAvailability.ideplugin/Contents/MacOS/IDESimulatorAvailability'
Expected in: '/Library/Developer/PrivateFrameworks/CoreSimulator.framework/Versions/A/CoreSimulator'" UserInfo={NSLocalizedFailureReason=The bundle couldn’t be loaded., NSLocalizedRecoverySuggestion=Try reinstalling the bundle., NSFilePath=/Applications/Xcode.app/Contents/PlugIns/IDESimulatorAvailability.ideplugin/Contents/MacOS/IDESimulatorAvailability, NSDebugDescription=dlopen(/Applications/Xcode.app/Contents/PlugIns/IDESimulatorAvailability.ideplugin/Contents/MacOS/IDESimulatorAvailability, 0x0109): Symbol not found: (_OBJC_CLASS_$_SimDiskImage)
Referenced from: '/Applications/Xcode.app/Contents/PlugIns/IDESimulatorAvailability.ideplugin/Contents/MacOS/IDESimulatorAvailability'
Expected in: '/Library/Developer/PrivateFrameworks/CoreSimulator.framework/Versions/A/CoreSimulator', NSBundlePath=/Applications/Xcode.app/Contents/PlugIns/IDESimulatorAvailability.ideplugin, NSLocalizedDescription=The bundle “IDESimulatorAvailability” couldn’t be loaded.}
Object: <DVTPlugIn: 0x6000032adcc0>
Method: -loadAssertingOnError:error:
Thread: <_NSMainThread: 0x6000016fc480>{number = 1, name = main}
Hints:

Backtrace:
0 0x000000010243ff81
1 0x000000010243f4b5
2 0x000000010243f6c1
3 0x00000001022b63ba
4 0x0000000102271c73
5 0x000000010226fa1f
6 0x00007ff81590b317
7 0x00007ff8159187ee
8 0x000000010248e5a1
9 0x00000001024640d8
10 0x000000010226f8a3
11 0x000000010226faf5
12 0x0000000103354f66
13 0x0000000103354526
14 0x0000000103353919
15 0x0000000100cdc9a4
16 0x0000000100a5f20a
sh: line 1: 14476 Abort trap: 6 /Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -find git 2> /dev/null
git: error: sh -c '/Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -find git 2> /dev/null' failed with exit code 34304: (null) (errno=Invalid argument)
xcode-select: Failed to locate 'git', requesting installation of command line developer tools.

尽管按照苹果的这个提示,下载、安装完了,但也依然不好使。

上面代码的错误截图

尝试了其它几种方法安装git,好多方法是依赖brew的,而brew本身,又是依赖git的。

2. 解决方法#

有两种方法可以解决这个问题:

  1. 打开Xcode,会让你选择安装哪个组件、然后还会再安装一次依赖;
  2. 把git切换到CommandLineTools:

具体就是这个命令:
$ sudo xcode-select --switch /Library/Developer/CommandLineTools

3. 2/3个一样的git#

CommandLineTools的git位于这个位置:
/Library/Developer/CommandLineTools/usr/bin/git

Xcode的git位于这个位置:
/Applications/Xcode.app/Contents/Developer/usr/bin/git

而具体执行的git命令,位于这个位置:
/usr/bin/git

三个文件都是可执行文件,但略有差异:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ ls -l /Applications/Xcode.app/Contents/Developer/usr/bin/git /Library/Developer/CommandLineTools/usr/bin/git /usr/bin/git
-rwxr-xr-x 1 root wheel 6480800 Aug 28 05:46 /Applications/Xcode.app/Contents/Developer/usr/bin/git
-rwxr-xr-x 1 root wheel 6480800 Aug 28 05:46 /Library/Developer/CommandLineTools/usr/bin/git
-rwxr-xr-x 76 root wheel 167120 Aug 24 16:59 /usr/bin/git
$ md5 /Applications/Xcode.app/Contents/Developer/usr/bin/git /Library/Developer/CommandLineTools/usr/bin/git /usr/bin/git
MD5 (/Applications/Xcode.app/Contents/Developer/usr/bin/git) = 2d28c1a09e1981a6df9d5c46a7605371
MD5 (/Library/Developer/CommandLineTools/usr/bin/git) = 2d28c1a09e1981a6df9d5c46a7605371
MD5 (/usr/bin/git) = b804370957619edc6510439fed2b35b0
$ file /Applications/Xcode.app/Contents/Developer/usr/bin/git /Library/Developer/CommandLineTools/usr/bin/git /usr/bin/git
/Applications/Xcode.app/Contents/Developer/usr/bin/git: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit executable x86_64
- Mach-O 64-bit executable x86_64] [arm64]
/Applications/Xcode.app/Contents/Developer/usr/bin/git (for architecture x86_64): Mach-O 64-bit executable x86_64
/Applications/Xcode.app/Contents/Developer/usr/bin/git (for architecture arm64): Mach-O 64-bit executable arm64
/Library/Developer/CommandLineTools/usr/bin/git: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit executable x86_64
- Mach-O 64-bit executable x86_64] [arm64]
/Library/Developer/CommandLineTools/usr/bin/git (for architecture x86_64): Mach-O 64-bit executable x86_64
/Library/Developer/CommandLineTools/usr/bin/git (for architecture arm64): Mach-O 64-bit executable arm64
/usr/bin/git: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit executable x86_64
- Mach-O 64-bit executable x86_64] [arm64e:Mach-O 64-bit executable arm64e
- Mach-O 64-bit executable arm64e]
/usr/bin/git (for architecture x86_64): Mach-O 64-bit executable x86_64
/usr/bin/git (for architecture arm64e): Mach-O 64-bit executable arm64e

可以看出:

  1. /usr/bin/git下的文件是一个单独的副本,不是软链接,但体积明显小于其它两个;
  2. 从md5值可以看出,CommandLineTools下面的和Xcode下面的是同一个文件的两个副本;
  3. 而/usr/bin/git这个文件,经过实验,在使用xcode-select --switch xxx切换时,其md5值是固定的,也就是切换的时候不会引起/usr/bin/git文件的变化。

推测:感觉/usr/bin/git这个文件是通过类库的方式调用的其它依赖代码,而依赖代码影响到了Xcode的运行。

Obsidian是一个非常强大的笔记工具。

如何做到双向链接,还在做测试,比如可以整理所有Linux下的所有文章内容:
[[2017/node-listen-usb]]
[[zsh-prompt]]
[[log-experience]]
[[plantuml]]
[[2021/note-softs]]

面临的问题:
展示节点基于文章维度,而不是单独管理的概念

还需要进一步探索:
了解标准的tag模型如何使用
进一步了解如何和hexo之间如何更好地整合

笔记工具

“标签”是元数据的元数据。试图将标签按照某些逻辑关系链接起来,形成有价值的知识图谱或者思维地图的工具,除了taguage,还有theBrain、GumpNotes、Tomboy Notes等等。虽然出发点相同,但是这些软件各自又有不同的侧重点,外化出不同的操作体验和操作流程。

从功能上来讲,theBrain算是目前最强大的一款软件,操作方法也最复杂,基本上你可以把自己需要掌握的知识点逐个按照主题录入(主题就是标签),然后将各个主题按照一定关系连接起来。从某种程度上讲,theBrain就像一个面向思维的绘图工具,只要你想要表达的思维跳转关系,都可以用它来绘制出来。与mindmanager相比,它的表达方式更为灵活多样。与其它几款软件相比,theBrain更适合做大规模知识管理,只要你不停的录入内容,它可以灵活的支持分类、添加层级、链接知识节点等。

GumpNotes,像是一款具备提醒功能的知识批注工具。它并不提供强大的排版功能,也不提供文件夹管理功能。它的核心操作在于创建每一条笔记时,你都可用给这条笔记附加一个“GUMP”(大概是想说像泡泡糖一样附着在上面的意思吧)。这个所谓Gump就是添加一些标签,譬如:“公共空间;市民中心;总平面设计”。添加标签并保存笔记之后,在使用任何软件时,GumpNotes会随时监听你当前窗口内的文字,一旦文字中包含所添加的标签,对应的笔记就会在屏幕右下角弹出一个小窗口,提示这些内容与当前阅读内容相关。

Tomboy Notes,像是一个个人创建维基知识库的工具。它的特点在于你书写任一笔记时,只要用鼠标拖选一个词或者一句话,然后点击Link按钮,即可开启一个新的笔记窗口,填写与此有关的文字内容。这样在原来的笔记中被拖选的文字就被添加了超链接,点击即可打开对应的笔记。Tomboy Notes只提供建立一层文件夹的功能,对于知识管理来讲也算是一款轻量级的应用。它更强调的是让思维在超链接的辅助下跳转。

Taguage,像是一个傻瓜化的长尾知识管理软件。与上面三款软件不同,taguage试图走的不是充当一个“绘图员”的角色——即:用户输入什么,我就给用户查看什么——而是试图按照一套自建的逻辑自动为用户把笔记中录入的标签甚至是从正文中提取的标签串联起来,自动生成用户的思维地图。相比theBrain,taguage的思维地图是不可编辑的,因为这是机器帮你生成的。所以taguage并不是一个老实的“笔录员”,而是不断把自己的思考结果快速提供给用户,用于启迪思维之用。从这个方面来讲,它更像是一款傻瓜化的知识管理软件,用户只管不断加入有用的东西到自己的账户里,整理工作就交给系统自动完成。之所以说taguage像是长尾知识管理软件,原因在于它的强项并不在于向图书目录一样给你结构化的整理知识,而在于把一些零零碎碎的笔记按照个人思维跳转的逻辑串联起来,所以它可能告诉你你的思维中“大海”关联的不是“海鸥、阳光、沙滩”,而是“一盆洗脚水”。它提供的结果更适合需要跳跃性思维的工作者使用,某种程度上来看,它像是一个头脑风暴的参与者,而非记录者。

oh-my-zsh是一个非常好用的shell增强工具,不止对好多常用命令提供了很强大的alias,还增强了shell的交互能力——像tab键补全、颜色标记、git标记等等。

oh-my-zsh安装后,默认会进行自主的更新,一般不用手动触发。

但我计划在周一将各种环境和插件统一手动检查、更新到最新版,避免在工作的时候被打扰到。

上网搜索到手动触发更新的命令是:upgrade_oh_my_zsh,经过操作,发现执行后果然可以。

不过,此命令执行过程中,也同时返回了如下的提示信息:

1
Note: `upgrade_oh_my_zsh` is deprecated. Use `omz update` instead.

好了,后面就用omz update吧。

进一步探索了下omz命令的其他用法,大致如下:

1
2
3
4
5
6
7
8
9
10
Usage: omz <command> [options]

Available commands:

help Print this help message
changelog Print the changelog
plugin <command> Manage plugins
pr <command> Manage Oh My Zsh Pull Requests
theme <command> Manage themes
update Update Oh My Zsh

help - 不能传其他参数,只能输出上面的帮助信息
update - 更新到最新版
changelog - 查看更新记录的
plugin - 用list和info命令可查看plugin的列表和信息
pr - 看着像是贡献代码用的
theme - 查看和修改主题使用的
update - 主动更新

新收获是theme命令——之前基本都是通过查看目录~/.oh-my-zsh/themes下有哪些名称,然后再去修改~/.zshrc文件里面的ZSH_THEME变量。

Linux/Mac下设置shell下的环境变量代理,使用这个代码

1
2
export http_proxy="http://proxy.xxxx.com:8080/"
export https_proxy="http://proxy.xxxx.com:8080/"

可以使用curl的-v查看是否生效:curl -v http://www.baidu.com/

最近在duolingo上重新学习法语(上次半吊子学习是在2008年自己啃书,一个月从入门到放弃……),不知道怎么在PC上输入法语字符,特地搜索了一下,记录在这里备忘

首先,把输入法调整成系统的英语输入法(其它输入法输入时可能会有快捷键冲突)
然后,输入就行了:

1
2
3
4
5
6
œ=option+q
ç=option+c
`=option+`(就是数字1左边那个)
´=option+e
¨=option+u
ˆ=option+i

简介信息

有时候,CDN不太好使,比如,有些节点上访问资源不正常
在拿到了IP地址的情况下,可以通过Header中指定Host的形式来请求,比如:

1
curl http://<IP Address>/www/store/dist/fonts/ionicons.eot?v=2.0.1 -H 'Host: <Domain Name>'

前端有很多能力,比如响应式布局、链接交互、点击交互
要实现这些效果,对于前端、客户端来说编码其实并不难,难的在于前端并不知道设计师想要什么,所以只能自行添加一些效果
而设计师想要实现一个准确的效果,往往需要较多的沟通、修改,不费力,但耗时
时间久了,对于一些耗时又长、收益又不大的工作,大家也就都默认忽略了
然而,一旦这些细节能够做到位,App的质感将有极大提升
对于一些关键细节,我们目前是有视频效果导出的,但对于大部分基础交互,还是没有一个统一

1. Features#