分类
如何赚钱 方法论

哪怕明天就死,也应该坚持长期主义

美股投资的长期主义

7月底的时候,有油管的观众写邮件给我,问我美股震荡,刚刚买的美股基金,亏了一些。他说,听说对美股要长期主义,问我应该怎么办。

分类
iOS开发 MacOS 技术

用 Xcode cloud 解决 Xcode-beta 无法提交 App 的问题

前两天苹果的 WWDC 2024结束,每次苹果召开 WWDC 都是苹果平台开发者的节日。听完 Keynote,大家往往就想最先下载测试版本的操作系统和 Xcode 来尝鲜。

但是这里也有一个矛盾,一般来说从测试版到正式版要1个多月的时间。而测试版的 Xcode-beta 是无法提交 App。也就是尝鲜的话,你就有一个多月没办法提交你的 App。

解决的方法,一般是如果自己有多台 mac,其中一台不升级,专门留着用来提交 App。还有一种就是安装多系统。

但是前几年,苹果推出了 Xcode cloud,我就想是不是可以利用 Xcode cloud来解决这个问题呢?果然解决了。

分类
读书

出去旅游一圈

最近状态很差,又回到了混吃等死的状态。

一方面可以认为是看韩剧上瘾,最近一直在看金裕贞的电视剧,看了好几个了,现在看到了《与恶魔有约》。听书正在听《庆余年》,我记得当年我是看过的,不过后来已经没啥印象了。但是《庆余年2》电视剧看完后,勾起了很多回忆和不舍,就从头开始听书,最近快听完了。

本来都是为了缓解疲惫和焦虑,为了填充无聊的时刻。但是这些消遣的东西多了,竟然每天全力去看电视,去听书时间也不够了。在厕所也要听书,顺便打开一局 Royal Match。

分类
AI

开源音频驱动人像动画(对口型)项目列表

项目名首页论文代码LiveDemo时间
EMO🌍📑2024年2月27日
Live Speech Portraits🌍📑2021年
AniPortrait🌍📑2024年3月26日
Hallo🌍📑2024年6月13日
V-Express🌍📑2024年6月4日
InstructAvatar🌍📑2024年5月24日
VASA-1🌍📑2024年4月16日

收集的也许还不全,大家遇到好的相关项目也可以在后面留言

分类
读书

《玫瑰的故事》是不是高配版玛丽苏?

前两天,在社交媒体听说了,正在热播的《玫瑰的故事》。朋友说,“黄玫瑰这个角色确实只能让刘亦菲演。为了多看刘亦菲一集充了腾讯svip,太养眼了这部剧,为什么有人能美成这样。”

分类
读书

《剑桥中国史》阅读小感

最近都在微信读书在听《剑桥中国史》,从开头听到明史部分了,当然是泛听有一搭无一搭的听的。

不过最近有点想法。每一代的开国皇帝,往往都是控制狂,工作狂,精神亢奋,目标远大。有点像现在的很多商业巨头。他们是市场选择出来的,人群中总有这样的人。当然不是每个都会成功,但是会成功的很多都是这类人。就像刘强东,他的身家一般中产的感觉已经是几辈子吃不完的。但是这样的人不会因为这种身家就失去动力,他们还想挣更多的钱,攫取更多的利益。而普通人在北京买个房子,有个纸面上的千万人家可能就没那么大的动力了。所以他会觉得不继续奋斗的不是兄弟。从他自己的角度可能觉得天经地义吧。

但是,帝王的孩子们,怎么得到皇位经过的选拔路径就完全不同了。不管是立长立嫡,还是立才立贤,都很难保障找到类似的人。甚至从马上夺天下,不必马上守天下的角度去帮他们开脱,找到合适守天下的人其实也很难。更不要提,皇帝这个职位是理论上至高无上,但是在被选择的时候,更多的其实是宫廷政治。比较明显的是,在很多朝代的中晚期,太监集团、后妃集团,往往希望找到年幼的皇子,因为可以光明正大的去垂莲,所以选择的角度就更加跟所谓的国家利益背道而驰了。

分类
读书

走出高考梦魇

昨天,和菜头写了一篇文章《又到高考发梦季》,描述了每年高考在即,他就会梦到大学和高考的事情。我留言道:我已经早就远离高考带给我的梦魇了,我现在完全忘记了高考,而且也完全看淡了它。我20年的职场经验给我的认知是,我哪怕当年什么大学都没上,现在过的日子也不会相差多少。(也许是因为现在也一般,哈哈哈)

他说,那是因为你梦得不够深,带个陀螺去吧。

分类
iOS开发 IT行业 技术

WWDC 2024将近,苹果的AI革命会给基于AI的独立开发者带来灭顶之灾么?

6月11日,WWDC 2024 就要召开了。每年 WWDC 召开以后,随着苹果发布一堆新的内嵌功能,就会在推特和各种 blog 网站引发很多讨论。很多独立开发者就会哭着喊着说,苹果在搞垄断,苹果新内嵌的某某功能会影响他们的生意,甚至毁掉他们的营生。

分类
社会生活

高位买了房、车,现在意难平怎么办?

这个问题是偶然看到的,在某社交平台上,一个朋友晒了一个程序员网站 V2ex 上面的帖子,如下:

题目是,高位买了房、车,现在意难平怎么办?

分类
iOS开发

Swift编程中应用@available和deprecated在自己的编程中提供便利

在 Swift 中,@available 是一个属性标注(Attribute),它用来表示一个类、结构体、枚举、函数或者方法等的可用性信息,指示特定的平台和版本。通过这个属性标注,开发者可以对代码中的各个部分设定适用的操作系统平台及最低支持的版本,也可以指定在某个版本中它们已经过期或不推荐使用,甚至是未来某个版本中会被添加的特性。

我们使用苹果的标准 Swift 库的时候,经常遇到 @available ,一个老代码的某个函数调用,系统升级后,可能会发现一个警告,

'oldMethod(text:messages:key:)' is deprecated: Use newMethod() instead

意思就是这个方法或者函数,现在已经被废弃了,最好不要再使用。在这个情况下,往往你其实还可以编译还可以执行。但是这些被废弃的老方法,要么也许有 bug ,或者系统的代码风格,习惯变了,已经被推荐使用了。有的人觉的既然可以编译和执行,何必理会呢?其实不然,有些方法会在某一个操作系统版本废弃,然后在后续的某个大操作系统版本就彻底消失,无法编译和运行。也就是说,废弃声明就是提醒你可以修改代码了,未来这个方法或者类有可能完全不能用了。最好尊重这些声明来写代码。

我们去看系统代码和头文件的时候,会看到很多类似的例子:

1. 指定功能在平台上的最小可用版本:
@available(iOS 10, *)
func newiOS10Method() {
// 这个方法只会在 iOS 10 及以上版本可用
}

2. 标示一个功能在新版本中被弃用:
@available(iOS, deprecated: 11.0, message: "Use newMethod instead")
func oldMethod() {
// 这个方法在 iOS 11 中被标记为弃用
}

3. 标示一个功能在新版本中被废弃或移除:
@available(iOS, obsoleted: 11.0, message: "Use anotherMethod instead")
func obsoleteMethod() {
// 这个方法从 iOS 11 开始就废弃了,调用它会出错
}

4. 标示功能未来新增:
@available(iOS 15, *)
func futureMethod() {
// 这个方法在未来的 iOS 15 版本中会被添加
}

5. 跨多平台设置可用性:
@available(iOS 10, macOS 10.12, *)
func crossPlatformMethod() {
// 这个方法在 iOS 10 和 macOS 10.12 及以上版本都可用
}

6. 为不同的平台指定不同的最小版本:
@available(iOS 14, watchOS 7, *)
func multiPlatformMethod() {
// 对于 iOS 平台,这个方法要求版本 14.0 及以上
// 对于 watchOS 平台,这个方法要求版本 7.0 及以上
}

但是,这是一般情况下我们接触的 @available 和 deprecated。其实我们自己的代码里面也可以用这些用法。比如我最近在给 TinyStudio(最好的Mac字幕软件之一)增加新的功能,代码里面涉及到如何调用 ChatGPT,以及用 ChatGPT 来进行一些复杂的字幕后续处理操作。

在此之前我不知道 Swift 的 await 和 actor 语法,所以涉及到 ChatGPT 的代码非常复杂,比如一个巨长的文本发给 ChatGPT 需要实现分段,然后一段一段的去调用 ChatGPT 来进行处理。代码就非常复杂,我用递归调用和回调函数的方法来做,非常麻烦。虽然我可以轻松的写出这样的代码,但是这样的代码在调试、调优和异常处理方面简直是噩梦。

我知道了 Swift 的 await 和 actor 语法后,发现这个场景用这些并发语法来写,代码可以变得非常简洁,而且在调试、调优和异常处理方面非常方便。于是我就着手写 ChatGPT 和文本处理库的异步版本(await/actor)。写的时候,原有的函数叫 send ,新版本就叫做 asyncSend,原有的函数叫 format,新的就叫做 asyncFormat。

初步实现以后,我发现原有的 send 和 format 在很多地方都有调用,直接用文字搜索也会遇到一些类似的函数名。于是我就想起了 @available 和 deprecated 语法。

首先,我先把 ChatGPTKit 类和 TextKit 类的新老版本函数,放在不同的 extension 里(不影响执行,但是从代码来看,就可以把不同类型的方法条理清晰的分明白了):

// 遗留版本函数
extension TextKit {

func format(textString) {
...

// 遗留版本函数
extension TextKit {

func asyncFormat(textString) {
...

然后,在遗留版本函数的 extension 声明前,标注 @available 即可:

// 遗留版本函数
@available(*, deprecated, message: "老版本已废弃,请使用异步版本")
extension TextKit {

func format(textString) {
...

这时候编译程序,就会发现还在用老版本函数的代码就会被编译器发出警告,然后我们根据警告信息,一一替换为新版本就好了。如下: