5 个原因让我重写 Mac Catalyst 应用

我写了一个名为 MermaidEditor 的 iOS App,这是一个用于编写 mermaid js 图表的编辑器,它使用 WKWebVIew 加载一个monaco 编辑器来编辑 mermaid js 图图的源代码,从而支持语法高亮和关键词自动完成。

在发布了 iOS 版本的 MermaidEditor 之后,我想把这个应用适配到 macOS 上,我认为在这里使用 Mac Catalyst 是一个很好的场景,这是苹果在 WWDC19 开始提供的一项技术,可以让我们的 iPad 应用在 macOS上 运行,只需要在 Xcode 中选中一个复选框就行了。

所以我用 Mac Catalyst 为 macOS 重新编译了 MermaidEditor,并向用户发布。但在一些版本之后,我决定用原生代码重写它。

为什么呢?

最低 macOS 版本要求

Mac Catalyst 要求的最低 macOS 部署目标版本是 macOS 10.15,所以如果我们的应用程序的目标版本早于 …

阅读全文 »

4 步为 Monaco Editor 添加自定义语言支持

在很多需要为用户提供编写代码能力的服务中,我们需要给用户提供一下能力足够强大的编辑器,这样可以使得用户在编写代码时更顺畅,减少查询文档次数,降低出错概率,提升编码效率。

而想要提供这些能力,就需要一个足够强大的代码编辑器,并且为它添加我们自定义语言的支持,这样用户可以在语法高亮、自动完成等方面得到足够的支持。

为什么用 Monaco Editor?

Visual Studio Code 是世界一个非常流行的代码编辑器,而 Monaco Editor 是用于构建 VSCode 核心功能的代码编辑器,它提供了相当多的功能,用于实现各种代码编辑能力。并且微软为 Monaco Editor 提供了单独的项目,单独的打包脚本,因此我们可以轻易的将 Monaco Editor 集成到我们自己的 Web 应用中。

Monaco Editor 已经提供了一系列的基础设施,用于完成对自定义语言的支持,只需要通过很小的步骤,我们就可以搭建一个属于自己语言的代码编辑器。

那么,这就开始吧!

Step 1. 注册一个语言

这里将不再赘述如何将 Monaco Editor 引入 Web 应用,在 Monaco Editor 的仓库提供了使用各种方式集成 Monaco Editor 的说明。

为了让 Monaco Editor 知道我们将要添加一种自定义语言的支持,首先需要注册一个自定义语言标识,这里我们选择 mylang 作为我们自定义语言的标识符。

注册一个自定义语言对于 Monaco Editor …

阅读全文 »

使用 Link Map 分析 iOS App 二进制文件体积

为什么要分析 App 文件体积?

作为一个 iOS 开发者,通常会需要关心 App 体积的大小,这将会是影响用户在 App Store 看到 App 时,是否决定下载的因素之一,如果 App 的体积太大,可能会使得用户放弃下载 App,特别是在用户使用蜂窝网络的时候。

对于一个 iOS App 来说,它的体积通常由以下几个部分组成:

  • 二进制可执行文件
  • 资源文件
  • 第三方 Framework

对于资源文件和第三方 Framework 来说,我们可以直接通过统计文件大小的方式来统计它们所占用的磁盘空间,但是对于二进制文件来说,我们该如何去统计它里面所包含的代码大小组成呢?

如何分析?

非常幸运的,Xcode 为我们提供了 Link Map 这样的一个统计文件来展示代码在经过编译之后,在可执行二进制文件中的实际占用体积大小,通过分析这个文件,我们就可以精确地知道,对应到每一个代码文件,它在最终生成的可执行二进制文件中所占的体积。

为了让 Xcode 能输出我们所需要的 Link Map 文件,需要在 Xcode 进入到工程的设置界面,选择需要输出 Link Map 的 Target,选择 Build Settings Tab,在搜索框中输入“link map”(注意 link …

阅读全文 »

就是要 4K 双显,M1 MacBook Pro + DisplayLink 性能体验测试

这是什么坑

在使用一段 M1 芯片的 13 寸 MacBook Pro 之后,一直有一个问题没有解决,那就是两台 4K 显示器的一台,只能闲置在那里。

虽然给 M1 MacBook Pro 配备的是 StarTech 雷电 3 接口的扩展坞,它拥有一个 DisplayPort 接口和一个全功能 USB Type-C 接口,在配备 Intel 芯片的 16 寸 MacBook Pro 上,它是可以直接驱动两个 4K 显示器。

但是由于 M1 芯片又或者是 M1 MacBook Pro 的限制,配备 M1 芯片的 MacBook Pro 只能驱动一台 4K 显示器,另外一台显示器,即使将它连接在 MacBook Pro …

阅读全文 »

MacBook Pro 16′ 散热大作战

这是什么坑

自从苹果在 2019 年,去掉蝶式键盘,恢复剪刀键盘之后,终于觉得可以入手了,而且在这一年,除了键盘可以接受,而且屏幕也增大到了 16 寸,并且增加了 AMD Radeon 5500M 这样的高规格显卡,选配 8G 显存价格也很实惠。

最终,我选配了一台 i9 2.3G + 64G 内存 + 5500M 8G 的 16 寸 MacBook Pro。

唔,入手之后,还是很香的,毕竟键盘好用,性能也是我使用过的 MacBook 中最强的,而且在经过苹果几年的培养,市场上也有了很多 USB Type-C Dock 可以选择,在使用上已经不太有什么障碍。

但是,在使用这台电脑的过程中,一直有两个问题困扰着我:

  • 一个是接上外接显示器之后,GPU 功耗会直接增加到 20W,从而使得风扇一直工作在 3500RPM 以上
  • 另外一个是所谓的梦幻单热管压 i9 导致 Intel 5 秒真男人,在我实测之后,发现,嘿,还真是……

对于第一个问题,在我经过了长达一个月的折腾之后,终于初步解决了,这个在文末会提到。

然后在前几天,刚好有一批照片和视频需要导出,然后我就顺便打开 Intel Power Gadget,想看看这个 …

阅读全文 »

六款便携 4K60Hz USB Type-C 扩展坞横向对比评测

在之前对比了一些扩展坞,以及新买了一个 DockCase 的扩展坞之后,对现在这些便携类型的 USB Type-C 扩展坞起了兴趣,并且做了一些对比测试:

然后最近想把之前购买的绿联 CM121 Type-C 扩展坞替换掉,因为它虽然接口齐全,包含了 HDMI 输出、SF/TD 读卡器、千兆网口、USB Type-A 接口、PD 充电直通,但是它的 HDMI 输出只能到达 4K30Hz,在真正感受过 4K30Hz 和 4K60Hz 的区别之后,已经不能接受 4K30Hz 的使用感受了。

因此,我在京东找了一番,筛选出来 HDMI 输出是 4K60Hz 的 Type-C 扩展坞,并且价格不算高的产品,来做一个横向对比评测,同时测试一下对 M1 MacBook 的兼容性如何,看看有哪一些能代替绿联 CM121,也可以顺便看一下在这个时间点,市面上便携类型 Type-C …

阅读全文 »

便携 Type-C 扩展坞那些事和 DockCase 7 合 1 带屏扩展坞评测

1. 为什么又买扩展坞

之前因为换了 MacBook Pro 买了一些 USB Type-C 扩展坞 ,已经做了一期对比,现在已经过去一年了,而且也有新出了 M1 芯片的 MacBook Pro,借着这个机会再看看有没有新的更好用的 Type-C 扩展坞。

在去年对比几个 Type-C 扩展坞的时候,对其中新出的 PS186 HDMI 芯片很感兴趣,它可以在 USB 3.2 Gen 2x1 10Gbps 的带宽上实现 4K60Hz 显示输出的同时,仍然有 5Gbps 的 USB 传输速率,这个基本上能满足大部分场景下的需求,所以那些只能支持到 4K30Hz 的扩展坞就不考虑。

在去年 6 月份这个时间点,带有 PS186 HDMI 芯片的扩展坞并没有太多产品可以选择,而且之前购买的威迅扩展坞,也只有 3 个 USB 3.0 和 1 …

阅读全文 »

自用 MacBook Pro USB-C 扩展坞介绍和对比

四款Type-C扩展坞

自从我淘汰了 2015 款 MacBook Pro,买了新款 MacBook Pro 16 寸版本之后,因为它只有四个 USB Type-C 口,去掉了 2015 款自带的 USB Type-A,以及 HDMI 接口,导致在使用 USB Type-A 设备,以及外接显示器时,需要额外的扩展坞才可以实现。

为了解决这个问题,就必须要好好找找便宜又大碗的扩展坞了。

筛选目标

基于 MacBook Pro 雷电 3 接口高达 40Gbps 的带宽,可以做到一根线实现显示器输出、电源输入以及扩展 USB-A 数据上行,因此在筛选目标产品时,会优先考虑以下几个功能是否能实现:

  • 一根线实现电源输入、显示器输出、数据上行
  • Dock 类型设备需要支持双显示器
  • 电源输入功率足够使用,60W 起
  • 有 SD/TF 卡槽更佳
  • 不喜欢硬连接到 MBP 上的设备,偏好使用数据线连接的扩展坞

当然因为所有扩展坞针对的场景不一样,会对设备能支持的能力有所取舍,例如对于 Dock 类型的扩展坞,会更多要求全面的功能支持,但是对于便携类型的扩展坞,则是根据自己的实际使用场景去选择必需的功能,以及可选的功能。

目标产品

在参考同事的意见,阅读网上的评测,以及实际对比各种扩展坞的功能之后,最终陆续购买了以下几款扩展坞:

  • CalDigit


阅读全文 »

基于钉钉 + Virtual-LDAP + KeyCloak 的内网统一认证系统

0. 架构

基于钉钉的内网统一认证

1. 背景

最近公司内网的各种系统部署得越来越多,每个系统都有自己的认证方式和账号体系,这导致大家在每个地方都要去注册一个账号,并且不利于公司统一管理密码安全策略,例如密码到期策略、密码复杂度策略以及强制二次验证等。

以及对于一部分短平快的内网应用来说,我们并没有时间去为它开发一套用户体系,这个时候还是希望能有一个统一的前端反向代理来处理用户认证这个流程。

为此,我就去寻找了一些解决方案,并且为了解决开源系统并不能对接外部用户系统的问题,开发了一个 Node.JS Package(Virtual-LDAP)来提供 LDAP 能力。

2. 问题

虽然总的需求是一个很简单的功能,但是这其中还是有很多细节的问题需要考虑。

认证方式

对于有一些开源系统,它本身是支持 OAuth 来进行用户认证的,这个时候只需要去选择一个支持 OAuth 的用户管理系统就可以了,甚至基于开源库自己去开发一个也并不困难。但是对于某一些开源系统来说,它并没有提供 OAuth 认证接入的支持,只提供了 LDAP 接入。

例如最近我们引入了 Metabase 作为面向运营的快速 BI 分析工具,但是它除了可以接入 Google 账号作为认证方式,就只能接受 LDAP 作为认证方式了。这个时候就得去寻找一个认证系统,同时能支持 OAuth 以及 LDAP。

用户体系

引入用户管理系统之后,还有另外一个问题需要考虑,就是现在员工的用户体系需要去管理。对于一个小公司来说,目前并没有一个统一的工具去同时管理员工的各种信息以及状态。

但是目前公司已经引入钉钉作为公司的交流沟通工具,以及作为各种流程的审批处理系统,HR 也会在钉钉上去管理所有员工的状态,以及员工的组织架构。

因此,这个用户管理系统最好需要能支持同步钉钉中的用户体系,这样就不需要额外的人力去维护用户管理系统,以及在有员工状态变更的时候,能及时同步,避免出现授权外的访问。

数据同步

有了 OAuth,有了 LDAP,还有了钉钉这个数据源,因此就需要处理好各个 Provider 之间的数据同步问题,避免人工去维护各个系统里面的用户数据,做到以钉钉的数据为基础,用户管理系统提供能力,做到各个系统各个认证方式得到的用户数据都是一致的。

以及,对于 …

阅读全文 »

另外一些胶片

对一个宅来说,热情果然很容易消退,胶卷的消耗速度是越来越慢。