├── .all-contributorsrc ├── .github ├── ISSUE_TEMPLATE │ ├── custom.md │ ├── job.md │ ├── share-bug.md │ ├── share-content.md │ └── share-reading.md └── workflows │ └── deploy.yml ├── .gitignore ├── Articles ├── App_Review.md ├── ad_jikeshijian_flutter.md ├── bookreview_effective_engineer.md ├── campus_to_recruitment.md ├── cultivation_for_programmer_booknotes_1.md ├── cultivation_for_programmer_booknotes_2.md ├── cultivation_for_programmer_booknotes_3.md ├── darwin_evolation.md ├── devops_quailty.md ├── github_action_for_blog_deploy.md ├── interview-share.md ├── moyu_summary_2022.md ├── runcodes_Automator-dSYM-symbol.md └── yearly_summary_2022.md ├── CategorySummary ├── Articles.md ├── Concepts.md ├── Interviews.md ├── Learnings.md ├── Resources.md ├── Summary-2021.md ├── Summary-2022.md └── Topic.md ├── Employment └── Douyin.md ├── Interview ├── 01_interview_zhanfei.md ├── 02_interview_CoderStar.md ├── 03_interview_qilixiang.md ├── 04_interview_zhuli.md ├── 05_interview_RunsCode.md ├── 05_interview_xiongda.md ├── 06_interview_yuriko.md ├── 07_interview_zhanganyu.md ├── 08_interview_yao.md ├── 09_interview_mimosa.md ├── 10_interview_ihtcboy.md ├── 11_interview_jojo.md ├── 12_interview_xiatian.md ├── 13_interview_parsifal.md ├── 14_interview_fat.md ├── 15_interview_daoge.md └── 16_interview_tangzhu.md ├── LICENSE ├── README.md ├── Resources ├── Books │ ├── DevelopErenLiu-Runtime.pdf │ ├── Event Handling Guide for iOS 中文翻译版.pdf │ ├── Event Handling Guide for iOS 官方文档.pdf │ ├── PX-0335 (Redacted).pdf │ ├── README.md │ └── xuan-computer-basic.pdf ├── DailyLearning │ ├── README.md │ ├── Swift_proposals.md │ └── 程序员修炼之道-从小工到专家.md ├── Guide │ ├── blog_writer.md │ ├── github_guide.md │ └── new_editor.md ├── README.md └── Style │ └── mdnice_style ├── Script ├── README.md ├── ci_run.sh ├── content_category.py ├── deploy.py ├── migration_to_qiniu.py ├── testScript.py └── upload_wechat.py └── WeeklyLearning ├── iOSWeeklyLearning_1.md ├── iOSWeeklyLearning_10.md ├── iOSWeeklyLearning_100.md ├── iOSWeeklyLearning_11.md ├── iOSWeeklyLearning_12.md ├── iOSWeeklyLearning_13.md ├── iOSWeeklyLearning_14.md ├── iOSWeeklyLearning_15.md ├── iOSWeeklyLearning_16.md ├── iOSWeeklyLearning_17.md ├── iOSWeeklyLearning_18.md ├── iOSWeeklyLearning_19.md ├── iOSWeeklyLearning_2.md ├── iOSWeeklyLearning_20.md ├── iOSWeeklyLearning_21.md ├── iOSWeeklyLearning_22.md ├── iOSWeeklyLearning_23.md ├── iOSWeeklyLearning_24.md ├── iOSWeeklyLearning_25.md ├── iOSWeeklyLearning_26.md ├── iOSWeeklyLearning_27.md ├── iOSWeeklyLearning_28.md ├── iOSWeeklyLearning_29.md ├── iOSWeeklyLearning_3.md ├── iOSWeeklyLearning_30.md ├── iOSWeeklyLearning_31.md ├── iOSWeeklyLearning_32.md ├── iOSWeeklyLearning_33.md ├── iOSWeeklyLearning_34.md ├── iOSWeeklyLearning_35.md ├── iOSWeeklyLearning_36.md ├── iOSWeeklyLearning_37.md ├── iOSWeeklyLearning_38.md ├── iOSWeeklyLearning_39.md ├── iOSWeeklyLearning_4.md ├── iOSWeeklyLearning_40.md ├── iOSWeeklyLearning_41.md ├── iOSWeeklyLearning_42.md ├── iOSWeeklyLearning_43.md ├── iOSWeeklyLearning_44.md ├── iOSWeeklyLearning_45.md ├── iOSWeeklyLearning_46.md ├── iOSWeeklyLearning_47.md ├── iOSWeeklyLearning_48.md ├── iOSWeeklyLearning_49.md ├── iOSWeeklyLearning_5.md ├── iOSWeeklyLearning_50.md ├── iOSWeeklyLearning_51.md ├── iOSWeeklyLearning_52.md ├── iOSWeeklyLearning_53.md ├── iOSWeeklyLearning_54.md ├── iOSWeeklyLearning_55.md ├── iOSWeeklyLearning_56.md ├── iOSWeeklyLearning_57.md ├── iOSWeeklyLearning_58.md ├── iOSWeeklyLearning_59.md ├── iOSWeeklyLearning_6.md ├── iOSWeeklyLearning_60.md ├── iOSWeeklyLearning_61.md ├── iOSWeeklyLearning_62.md ├── iOSWeeklyLearning_63.md ├── iOSWeeklyLearning_64.md ├── iOSWeeklyLearning_65.md ├── iOSWeeklyLearning_66.md ├── iOSWeeklyLearning_67.md ├── iOSWeeklyLearning_68.md ├── iOSWeeklyLearning_69.md ├── iOSWeeklyLearning_7.md ├── iOSWeeklyLearning_70.md ├── iOSWeeklyLearning_71.md ├── iOSWeeklyLearning_72.md ├── iOSWeeklyLearning_73.md ├── iOSWeeklyLearning_74.md ├── iOSWeeklyLearning_75.md ├── iOSWeeklyLearning_76.md ├── iOSWeeklyLearning_77.md ├── iOSWeeklyLearning_78.md ├── iOSWeeklyLearning_79.md ├── iOSWeeklyLearning_8.md ├── iOSWeeklyLearning_80.md ├── iOSWeeklyLearning_81.md ├── iOSWeeklyLearning_82.md ├── iOSWeeklyLearning_83.md ├── iOSWeeklyLearning_84.md ├── iOSWeeklyLearning_85.md ├── iOSWeeklyLearning_86.md ├── iOSWeeklyLearning_87.md ├── iOSWeeklyLearning_88.md ├── iOSWeeklyLearning_89.md ├── iOSWeeklyLearning_9.md ├── iOSWeeklyLearning_90.md ├── iOSWeeklyLearning_91.md ├── iOSWeeklyLearning_92.md ├── iOSWeeklyLearning_93.md ├── iOSWeeklyLearning_94.md ├── iOSWeeklyLearning_95.md ├── iOSWeeklyLearning_96.md ├── iOSWeeklyLearning_97.md ├── iOSWeeklyLearning_98.md └── iOSWeeklyLearning_99.md /.all-contributorsrc: -------------------------------------------------------------------------------- 1 | { 2 | "projectName": "iOSWeeklyLearning", 3 | "projectOwner": "zhangferry", 4 | "repoType": "github", 5 | "repoHost": "https://github.com", 6 | "files": [ 7 | "README.md" 8 | ], 9 | "imageSize": 100, 10 | "commit": true, 11 | "commitConvention": "none", 12 | "contributors": [ 13 | { 14 | "login": "zhangferry", 15 | "name": "zhangferry", 16 | "avatar_url": "https://avatars.githubusercontent.com/u/13702445?v=4", 17 | "profile": "https://github.com/zhangferry", 18 | "contributions": [ 19 | "doc", 20 | "blog", 21 | "review" 22 | ] 23 | }, 24 | { 25 | "login": "pilaf-king", 26 | "name": "pilaf-king", 27 | "avatar_url": "https://avatars.githubusercontent.com/u/62095149?v=4", 28 | "profile": "https://www.jianshu.com/u/739b677928f7", 29 | "contributions": [ 30 | "blog", 31 | "review" 32 | ] 33 | }, 34 | { 35 | "login": "teney97", 36 | "name": "师大小海腾", 37 | "avatar_url": "https://avatars.githubusercontent.com/u/76877122?v=4", 38 | "profile": "https://juejin.cn/user/782508012091645/posts", 39 | "contributions": [ 40 | "blog", 41 | "review" 42 | ] 43 | }, 44 | { 45 | "login": "Mim0sa", 46 | "name": "Mim0sa", 47 | "avatar_url": "https://avatars.githubusercontent.com/u/25274332?v=4", 48 | "profile": "https://github.com/Mim0sa", 49 | "contributions": [ 50 | "blog" 51 | ] 52 | }, 53 | { 54 | "login": "HighwayLaw", 55 | "name": "HighwayLaw", 56 | "avatar_url": "https://avatars.githubusercontent.com/u/10418403?v=4", 57 | "profile": "https://github.com/HighwayLaw", 58 | "contributions": [ 59 | "blog" 60 | ] 61 | }, 62 | { 63 | "login": "fanbaoying", 64 | "name": "BaoYing-Fan", 65 | "avatar_url": "https://avatars.githubusercontent.com/u/24238160?v=4", 66 | "profile": "https://juejin.im/user/5a30d987f265da430d580126", 67 | "contributions": [ 68 | "blog" 69 | ] 70 | }, 71 | { 72 | "login": "brave723", 73 | "name": "brave723", 74 | "avatar_url": "https://avatars.githubusercontent.com/u/1267034?v=4", 75 | "profile": "https://github.com/brave723", 76 | "contributions": [ 77 | "blog" 78 | ] 79 | }, 80 | { 81 | "login": "renmoqiqi", 82 | "name": "renmoqiqi", 83 | "avatar_url": "https://avatars.githubusercontent.com/u/8848376?v=4", 84 | "profile": "https://github.com/renmoqiqi", 85 | "contributions": [ 86 | "blog" 87 | ] 88 | }, 89 | { 90 | "login": "Tliens", 91 | "name": "我是熊大", 92 | "avatar_url": "https://avatars.githubusercontent.com/u/31976044?v=4", 93 | "profile": "https://github.com/Tliens", 94 | "contributions": [ 95 | "blog" 96 | ] 97 | }, 98 | { 99 | "login": "LoneyIsError", 100 | "name": "xia", 101 | "avatar_url": "https://avatars.githubusercontent.com/u/8653935?v=4", 102 | "profile": "https://juejin.im/user/571d719171cfe4006170de6f", 103 | "contributions": [ 104 | "blog" 105 | ] 106 | }, 107 | { 108 | "login": "opooc", 109 | "name": "opooc", 110 | "avatar_url": "https://avatars.githubusercontent.com/u/26709018?v=4", 111 | "profile": "https://github.com/opooc", 112 | "contributions": [ 113 | "blog" 114 | ] 115 | }, 116 | { 117 | "login": "Coder-Star", 118 | "name": "CoderStar", 119 | "avatar_url": "https://avatars.githubusercontent.com/u/29835618?v=4", 120 | "profile": "https://coder-star.github.io/", 121 | "contributions": [ 122 | "blog" 123 | ] 124 | }, 125 | { 126 | "login": "RunsCode", 127 | "name": "dev-wang", 128 | "avatar_url": "https://avatars.githubusercontent.com/u/25574478?v=4", 129 | "profile": "http://blog.csdn.net/qq_24761271", 130 | "contributions": [ 131 | "blog" 132 | ] 133 | }, 134 | { 135 | "login": "fatbobman", 136 | "name": "东坡肘子", 137 | "avatar_url": "https://avatars.githubusercontent.com/u/55673881?v=4", 138 | "profile": "http://www.fatbobman.com", 139 | "contributions": [ 140 | "blog" 141 | ] 142 | }, 143 | { 144 | "login": "talka123456", 145 | "name": "clownfish", 146 | "avatar_url": "https://avatars.githubusercontent.com/u/20468636?v=4", 147 | "profile": "https://github.com/talka123456", 148 | "contributions": [ 149 | "blog" 150 | ] 151 | }, 152 | { 153 | "login": "krystal1110", 154 | "name": "krystal1110", 155 | "avatar_url": "https://avatars.githubusercontent.com/u/83936557?v=4", 156 | "profile": "https://github.com/krystal1110", 157 | "contributions": [ 158 | "blog" 159 | ] 160 | }, 161 | { 162 | "login": "eternaljust", 163 | "name": "远恒之义", 164 | "avatar_url": "https://avatars.githubusercontent.com/u/17566920?v=4", 165 | "profile": "https://github.com/eternaljust", 166 | "contributions": [ 167 | "blog" 168 | ] 169 | }, 170 | { 171 | "login": "AkaShark", 172 | "name": "Alloc Alice", 173 | "avatar_url": "https://avatars.githubusercontent.com/u/26460192?v=4", 174 | "profile": "https://akashark.github.io/", 175 | "contributions": [ 176 | "blog" 177 | ] 178 | }, 179 | { 180 | "login": "byshb", 181 | "name": "byshb", 182 | "avatar_url": "https://avatars.githubusercontent.com/u/18521866?v=4", 183 | "profile": "https://github.com/byshb", 184 | "contributions": [ 185 | "blog" 186 | ] 187 | }, 188 | { 189 | "login": "readyhe", 190 | "name": "ready", 191 | "avatar_url": "https://avatars.githubusercontent.com/u/31380513?v=4", 192 | "profile": "https://github.com/readyhe", 193 | "contributions": [ 194 | "blog" 195 | ] 196 | } 197 | ], 198 | "contributorsPerLine": 7, 199 | "skipCi": true 200 | } 201 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/custom.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Custom issue template 3 | about: Describe this issue template's purpose here. 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | 11 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/job.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Job 3 | about: 岗位内推 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | 需要填入以下信息: 11 | 12 | 1、工作地点 13 | 14 | 2、岗位需求 15 | 16 | 3、岗位亮点(可选) 17 | 18 | 4、联系方式(微信或公司邮箱) 19 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/share-bug.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Share Bug 3 | about: 分享一次bug经历 4 | title: '' 5 | labels: documentation 6 | assignees: zhangferry 7 | 8 | --- 9 | 10 | ## bug出现的现象是什么样的? 11 | 12 | ## 是如何解决的? 13 | 14 | ## bug引发的反思?(如果有的话)bug隐含了什么知识点 15 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/share-content.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Share Content 3 | about: 分享好的内容 4 | title: '' 5 | labels: documentation 6 | assignees: zhangferry 7 | 8 | --- 9 | 10 | ## 内容名称及链接 11 | 12 | ## 简介 13 | 14 | ## 推荐理由(可选。可以是主管评价或内容亮点) 15 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/share-reading.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Share Reading 3 | about: 分享好的文章 4 | title: '' 5 | labels: documentation 6 | assignees: zhangferry 7 | 8 | --- 9 | 10 | ## 文章标题、著名出处和作者 11 | 12 | ## 文章链接 13 | 14 | ## 推荐理由(如果没有可以摘抄文章内一段重要的话) 15 | -------------------------------------------------------------------------------- /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | # This is a basic workflow to help you get started with Actions 2 | 3 | name: Weekly Article Deploy 4 | 5 | # Controls when the workflow will run 6 | on: 7 | # Triggers the workflow on push or pull request events but only for the "main" branch 8 | push: 9 | branches: 10 | - 'releases/**' 11 | 12 | # Allows you to run this workflow manually from the Actions tab 13 | workflow_dispatch: 14 | inputs: 15 | weekly_index: 16 | description: 'weekly index for deploy' 17 | 18 | # A workflow run is made up of one or more jobs that can run sequentially or in parallel 19 | jobs: 20 | # This workflow contains a single job called "build" 21 | build: 22 | # The type of runner that the job will run on 23 | runs-on: ubuntu-latest 24 | 25 | env: 26 | ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }} 27 | 28 | # Steps represent a sequence of tasks that will be executed as part of the job 29 | steps: 30 | - name: print inputs 31 | run: | 32 | echo "Weekly Index: ${{ github.event.inputs.weekly_index }}" 33 | 34 | - name: Git Config 35 | run: | 36 | git config --global user.email moyuweekly@github.com 37 | git config --global user.name moyuweekly 38 | # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it 39 | - uses: actions/checkout@v3 40 | 41 | # - name: Clone Repo 42 | # uses: GuillaumeFalourd/clone-github-repo-action@v2 43 | # with: 44 | # owner: 'zhangferry' 45 | # repository: 'GithubPage' 46 | # access-token: ${{ secrets.ACCESS_TOKEN }} 47 | 48 | # Runs a single command using the runners shell 49 | - name: Run a one-line script 50 | run: ./Script/ci_run.sh ${{ github.event.inputs.weekly_index }} 51 | shell: bash 52 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .idea/ 3 | .vscode/ 4 | .workspace/ 5 | venv/ -------------------------------------------------------------------------------- /Articles/ad_jikeshijian_flutter.md: -------------------------------------------------------------------------------- 1 | # 是时候学习 Flutter 了 2 | 3 | ![](https://cdn.zhangferry.com/Images/202303122307415.png) 4 | 5 | ## 为什么是 Flutter 6 | 7 | “小步快跑、快速迭代”的开发大环境下**,“一套代码、多端运行”**是很多开发团队的梦想,美团也一样。他们做了很多跨平台开发框架的尝试:React Native、Weex、PWA 等等。但都没有得到很好的解决,直至遇到 Flutter**。** 8 | 9 | **Flutter 提供了一整套从底层渲染逻辑到上层开发语言的完整方案,有跨平台、高保真、高性能等优点**。因此从发布开始,热度一路攀升,受到开发者们的热切青睐,也有了 **阿里闲鱼、今日头条、腾讯 Now** 等在内的一众知名商业案例。 10 | 11 | 我曾跟很多**前端、Android、iOS 的开发者**聊过,其中超过 80% 的人告诉我他正在或打算学 Flutter ,但他们中的大部分都遇到了这些问题: 12 | 13 | 1、Flutter 从语言到开发框架都是全新的,技术栈的积累必须从头开始,学起来很费力。 14 | 15 | 2、看了很多关于 Flutter 的教程,可它们都太重视应用层 API 各个参数的介绍或实现细节,感觉无从下手。 16 | 17 | ## 如何学习 Flutter 18 | 19 | 想学好 Flutter,不应该仅停留细节层面,更要**深入它的原理、设计思路和通用理念**。 20 | 21 | 分享一张我收藏的 Flutter 核心知识图谱,里面**涵盖了开发、调试、测试、发布、线上运维及工程管理。**只要你能掌握下面80%的知识点,绝对可以搞懂 Flutter。 22 | 23 | ![图片](https://mmbiz.qpic.cn/mmbiz_jpg/xabgupsPLbRLGRia5oBojHTiclAvZxf0Hp9pgOF8eRkCNUVfofXFv9kBJrm93MiagaVOA7d3ZprenQHsmF8z5xpZg/640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1) 24 | 25 | 图谱的作者在他的极客时间专栏**《Flutter 核心技术与实战》**专栏里,重点讲述了Flutter 框架底层有哪些关键技术?Flutter 应用开发的最佳实践是怎样的?企业需要什么样的终端技术人才?等问题。 26 | 27 | 意图帮助大家快速上手 Flutter,学会用 Flutter 开发一款企业级 App。同时**透过现象明白 Flutter 框架的用法,掌握其背后的原理和设计理念**。 28 | 29 | ![](https://cdn.zhangferry.com/Images/3fd240294b851431b8fbc96b3b0e9983.jpg) 30 | 31 | * 👆扫码免费试看 32 | * 新人首单 5 折仅 ¥59 33 | * 老用户 7 折,到手仅 ¥69 34 | * 仅限「 前 100 人,即将恢复原价 ¥99 35 | 36 | 我刚开始学习 Flutter 的时候特别希望有前辈能给我一个明确的指引,提纲挈领地告诉我怎么入手,有哪些要注意的地方,具体怎么操作之类的,老陈就是这么个人。 37 | 38 | 老陈就是陈航,美团点评高级技术专家,目前在美团外卖担任商家业务大前端团队技术负责人,致力于提升终端团队的研发效率与交付质量。 39 | 40 | 近十年来,一直工作于大前端相关领域,且曾分别探索并大规模落地了以 React Native 和 Flutter 为代表的跨平台方案。在他的推动下,2018 年下半年,美团外卖实现了 Flutter 的成功落地。 41 | 42 | ## Flutter 知识体系 43 | 44 | 为了帮大家领悟到 Flutter 的核心思想和关键技术,而不是陷入组件的 API 细节难以自拔,作者特意省去了一些不影响核心功能的代码和参数讲解,**着重剖析框架的核心知识点和背后原理,**并分享一些常见问题的解决思路。 45 | 46 | 根据整个知识体系,他将内容分为 5 个模块: 47 | 48 | 1、**Flutter 开发起步模块**。从跨平台方案发展历史出发,介绍 Flutter 的诞生背景、基本原理,体验 Flutter 代码是如何在原生系统上运行的。 49 | 50 | 2、**Dart 基础模块**。从 Dart 与其他编程语言的设计思想对比出发,讲述 Dart 设计的关键思路以及独有特性,并现场实践一个综合案例。 51 | 52 | 3、**Flutter 基础模块**。比较 Flutter 与原生系统对应概念,讲述 Flutter 独有的概念和框架设计思路,为搭建 Flutter 应用做好知识储备。 53 | 54 | 4、**Flutter 进阶模块**。讲述 Flutter 开发中的一些疑难问题、高级特性及其背后原理,教会大家在遇到问题时化被动为主动。 55 | 56 | 5、**Flutter 综合应用模块**。聊聊在企业级应用迭代的生命周期中,如何从效率和质量这两个维度出发,构建自己的 Flutter 开发体系。 57 | 58 | 希望通过这个课程,能够帮助大家**快速上手 Flutter 开发应用,掌握其精髓,并建立属于自己的终端知识体系**。 59 | 60 | 说了这么多,有多干货,大家自己看看目录了👇 61 | 62 | ![](https://cdn.zhangferry.com/Images/202303122303073.png) 63 | 64 | ![](https://cdn.zhangferry.com/Images/0e914b4ebcbd1e886cb46b3ff3ccf3a6.jpg) 65 | 66 | 👆扫码免费试读 67 | 68 | ## 一些课程评价 69 | 70 | ### 夏天 71 | 72 | [Flutter中文开发者社区](https://flutterchina.club/ "Flutter中文开发者社区") 提供了关于 Flutter 完备的内容,能够让开发者入门,但是其在内容的面面俱到并不容易能够让你短期内快速上手。 73 | 74 | 对于打算在实际应用上能短平快的使用 Flutter,一个结构清晰、简洁明了、实践性强的课程更值得我们学习。如果我们能够在学习的过程中能够解决我们实际场景中遇到的 80% 的问题,那么这个教程就是值得推荐的。 75 | 76 | 这个课程吸引我的点有两个: 77 | 78 | * 通过课程的学习,能够真正构建一个完整的项目,基本涵盖了常用的使用场景 79 | 80 | * 提供一部分进阶内容,能够使我们原有的工程体系更具拓展性 81 | 82 | 如果你想快速上手 Flutter 的话,这门课程应该是适合你的。 83 | 84 | 👇 点「阅读原文」低至 5 折,拿下 Flutter!仅限 **前 100 人!** 85 | -------------------------------------------------------------------------------- /Articles/moyu_summary_2022.md: -------------------------------------------------------------------------------- 1 | # 摸鱼周报 2022 年内容汇总 2 | ![](https://cdn.zhangferry.com/Images/moyu_weekly_cover.jpeg) 3 | 4 | 到今天为止,摸鱼周报已经发了 81 期了,这个数量远超最初预期。今年一共发布了 39 期,我们把这些周报内容进行汇总就有了这个 2022 年的周报合集。 5 | 6 | ## 周报年度合集 7 | 8 | 我们按照相同模块做了一下整合,去掉了时效性比较强的资讯内容,把其他一些价值时效比较长的内容做了提取。大家可以把这当做一个小的资料库,通过输入关键字查找想看的内容,也可以当做一份独立的学习资料随手翻一翻,可能会看到你意料之外的东西。 9 | 10 | ![](https://cdn.zhangferry.com/Images/20230115195034.png) 11 | 12 | ![](https://cdn.zhangferry.com/Images/20230115195337.png) 13 | 14 | 在公众号聊天区回复关键字:「2023冲冲冲」,即可获取 PDF 下载链接。 15 | -------------------------------------------------------------------------------- /Employment/Douyin.md: -------------------------------------------------------------------------------- 1 | # 抖音 iOS 基础技术 - 研发效能方向招聘 2 | 3 | ![](https://gitee.com/zhangferry/Images/raw/master/iOSWeeklyLearning/douyin_cover.jpg) 4 | 5 | ## 团队介绍 6 | 7 | 我们是负责抖音客户端基础能力研发和新技术探索的团队。我们在工程/业务架构,研发工具,编译系统等方向深耕,支撑业务快速迭代的同时,保证超大规模团队的研发效能和工程质量。在性能/稳定性方面不断探索,努力为全球数亿用户提供最极致的基础体验。 8 | 9 | 在年前我们团队做了一次对外的技术分享:[超全回顾 | 5位抖音工程师揭秘抖音iOS基础技术(附PPT和回放视频)](https://mp.weixin.qq.com/s/dFkGjCgZeXbYxsu3F40L-Q)。有兴趣的话可以通过这次分享视频了解我们在做的事情和当下的技术储备。下面这张图代表着当下 iOS 基础技术团队的建设成果及业务范围: 10 | 11 | ![](https://gitee.com/zhangferry/Images/raw/master/iOSWeeklyLearning/douyin_ios_arch.jpg) 12 | 13 | ## 岗位描述 14 | 15 | 研发效能是抖音 iOS 基础技术团队的其中一个组,工作内容涉及能够提高研发效能的各个环节,当前主要工作内容有质量保证: 16 | 17 | - 准入准出 18 | - 静态分析 19 | - 动态测试 20 | - ... 21 | 22 | 还有一些研发效能提升的工作: 23 | 24 | - 依赖管理、架构管理、包管理等 25 | - 基于 bazel 的全新构建系统 JOJO 26 | - 各类研发工具,像 MBox、Spider 27 | - 研发流程节点检测 28 | - ... 29 | 30 | 抖音 iOS 基础技术除研发效能外还有很多其他研究方向,比如稳定性、基础架构、Swift 相关的一些探索项目等,这些岗位在 [「简聊抖音iOS基础技术有哪些岗位适合你」](https://mp.weixin.qq.com/s/cvt1cSjIN7F03LqUJdYyfQ) 这篇文章有一定的介绍。 31 | 32 | ## 岗位体验 33 | 34 | - 技术氛围浓厚,海量的学习文档和视频,各种大大小小的技术分享。 35 | - 没有 PM,项目驱动大多来自于组内目标和个人目标。 36 | - iOS 部门却是全栈团队,如果你对前端或者后端感兴趣,这里也有很大发展空间。 37 | - 工作涉及技术栈会比较多,OC 和 Swift 可能都不够了,最好再学习一门脚本语言。 38 | - 不设限,没有 KPI,我们鼓励发现问题解决问题。 39 | - 大牛云集,不少 iOS 社区牛人都在基础技术部门,私聊我可以告诉你都有谁😘。 40 | - 负责抖音系产品质量分析引擎建设,包括但不限于源码静态分析、自动化测试、产物分析、逆向分析等自研引擎开发,保障产品线上极致的用户体验。 41 | 42 | ## 岗位要求 43 | 44 | - 本科及以上学历 45 | - 有扎实的数据结构和算法基础 46 | - 对新技术保持热情,具备良好的分析、解决问题的能力 47 | 48 | 有以下经验会成为加分项: 49 | 50 | - 脚本语言、静态分析、LLVM、单元测试、自动测试框架、架构、工程效率、全栈开发 51 | 52 | ## 工作地点 53 | 54 | 北京、上海、杭州、深圳。 55 | 56 | ## 联系方式 57 | 58 | 如果对以上任意工作内容感兴趣可以加我微信:`zhangferry`,或者发送简历到 `zhangfei.ferry@bytedance.com`。 -------------------------------------------------------------------------------- /Interview/01_interview_zhanfei.md: -------------------------------------------------------------------------------- 1 | # 人物访谈|展菲 2 | 3 | [@zhangferry](https://zhangferry.com):看一张最近掘金的作者排行榜图片 4 | 5 | ![](https://cdn.zhangferry.com/Images/juejin_rank.png) 6 | 7 | 从上图发现,掘金排名靠前的前端和 Android 端有不少作者也有公众号,而 iOS 端却没有;另一个方面是,前端和 Android 靠前的都有不少是团队号,而 iOS 端基本都是个人创作者。因为这个排行是根据最近一段时间作者文章活跃度动态变化的,所以会存在一定的偶然性,但从中也能分析出一些端倪。以下是我总结出的几点(仅指掘金平台): 8 | 9 | * 资深作者不活跃:iOS 大号(等级高的号)创作活跃度不高,也可能偶然事件了,大号都在蛰伏下一篇。 10 | * 写作环境不过滤:iOS 写作环境不好,这个由来已久了,一直以来都是面试文章为主,一些培训机构甚至都将掘金作为了学员练手的平台,真正分享项目经验、实践的较少。 11 | * 创作环境难突围:掘金平台需要被推荐时才能更高的爆光量,同时,iOS 端作者写作公众号的较少。 12 | * [@iHTCboy](https://ihtcboy.com/):iOS 系统封闭,所以苹果提供的 API 统一和完善,大多数的 API 网络上已经有很多文章积累,而前端和安卓,因为系统兼容性和开放性,手机厂商多等,需要更多的技术探索。 13 | 14 | 整个反应出的就是 iOS 社区不活跃,但真是这样吗?单就前段时间老司机周报组织的 WWDC21 内参来说,参与者就有 200+,社区肯定还是活跃的啊。所以我得出的结论是,**就 iOS 博客环境来说,公众号要优于掘金**。紧接着就有了这次的想法,介绍一些优质的由个人维护的 iOS 开发公众号、博客、独立应用等,同时还会邀请对应的作者讲一下做这些内容的初衷,目前的运营现状和一些未来规划。 15 | 16 | 这次是第一期,邀请的是摸鱼周报联合编辑:展菲。 17 | 18 | ### 博主访谈 19 | 20 | 个人介绍:展菲,目前就职于外企,从事人工智能、智能家居研发工作。 21 | 22 | 公众号:Swift社区。 23 | 24 | > [FBY展菲](https://github.com/fanbaoying):公众号是由 Swift 爱好者共同维护,我们会分享以 Swift 实战、SwiftUI、Swift 基础为核心的技术内容,也整理收集优秀的学习资料。 25 | > 26 | > 做最好的 Swift 社区,我们的使命是做一个最专业最权威的 Swift 中文社区,我们的愿景是希望更多的人学习和使用 Swift。我们会不断维护优化 27 | > ,持续输出优质的原创内容。不忘初心,牢记使命。 28 | > 29 | > 如果您对 Swift 感兴趣欢迎关注我们,有好的建议欢迎联系我们。 30 | 31 | -------------------------------------------------------------------------------- /Interview/02_interview_CoderStar.md: -------------------------------------------------------------------------------- 1 | # 人物访谈|CoderStar 2 | 3 | [@zhangferry](https://zhangferry.com):上周跟 [@展菲](https://github.com/fanbaoying) 聊过之后,有了访谈各位博主的想法。博主 + 访谈,一方面可以给大家介绍优秀的开发者,另一方面访谈的形式方便近距离了解博主,学习他们思考和学习的方法。本期所选问题是一个初步尝试,大家如果有更好的问题,欢迎留言告诉我们。 4 | 5 | 本期介绍的博主也是摸鱼周报的一位联合编辑:[CoderStar](https://juejin.cn/user/588993964541288)。 6 | 7 | zhangferry:简单介绍下自己和自己的公众号吧 8 | 9 | > 我是 CoderStar,坐标北京,目前主要工作与 iOS 相关,对大前端、后端都有一定涉猎,喜欢分享干货博文。 10 | > 11 | > 公众号:CoderStar,分享大前端相关的技术知识,只聊技术干货,目前分享的内容主要是 iOS 相关的,后续还会分享一些 Flutter、Vue 前端等相关技术知识。目前公众号文章内容均是自己原创,很欢迎大家投稿一些好文章,大家一块进步。 12 | 13 | 14 | zhangferry:为什么有写公众号的打算?写公众号有带来什么好处吗? 15 | 16 | > 最开始写公众号的原因其实比较简单, 17 | > 18 | > 1、因为过去积累了一些笔记,比较零散,想整理一下; 19 | > 20 | > 2、觉得工作经验已经到了一定的阶段,也是时候将知识梳理一遍,打造自己的知识体系了,融会贯通; 21 | > 22 | > 3、是想把自己积累的一些技术知识分享出来,大家一起来交流,创造一个好的技术圈子,一个好的技术圈子实在是太重要了。 23 | 24 | > 写公众号的好处: 25 | > 26 | > 1、写文章不仅能让我对一个知识点理解的更透彻,也增强了我的写作能力,对于技术知识而言,自己理解是一个阶段,深入浅出的写出来又是一个更高的阶段; 27 | > 28 | > 2、可以认识很多小伙伴,同行的路上不会孤单,比如和摸鱼周报就是这样结缘的。 29 | 30 | 31 | zhangferry:最近在研究什么有趣的东西?是否可以透露下未来几篇文章的规划? 32 | 33 | > 最近在做优化方面的事情,未来几篇文章可能会偏向优化系列或者底层相关。 34 | 35 | 36 | zhangferry:如何让自己每周都能抽出时间写博客呢?有没有什么好的学习方法可以分享? 37 | 38 | > 我目前更新的频率是一周一篇文章,一般工作日晚上会去看一些本期文章涉及的资料以及做一些代码实践,然后积累一些笔记,在周末时候将笔记进行整理聚合,形成文章,其实这个过程中还是比较累的,毕竟有的时候工作会忙,但是这个事情一定要坚持,给自己一个目标,不能随随便便就断更,毕竟有第一次断更就有第二次。 39 | > 40 | > 学习方法:说一点吧,我自己对于技术的态度是实践型+更优解,当看到一些好的文章的时候,会自己将文章里面的原理或者实现自己动手实践一下,考虑这个方法有什么缺点,并围绕这个技术点去思考有没有更好的解决方案,不断地去寻找更优解。 -------------------------------------------------------------------------------- /Interview/03_interview_qilixiang.md: -------------------------------------------------------------------------------- 1 | # 人物访谈|七里香蛋炒饭 2 | 3 | [@zhangferry](https://zhangferry.com):本期访谈对象是 @七里香蛋炒饭,他也是交流群里的小伙伴。了解到他最近刚换工作,从某小公司入职某一线大厂,就邀请他来聊一聊面试的一些感想。 4 | 5 | zhangferry:你面试准备了多久,大概的面试经历是怎样的? 6 | 7 | > 整个面试过程大概有一个半月时间,前期是断断续续在看一些东西,后面有 3 周左右时间是重点准备。接到面邀的比较多,有些不感兴趣的就没去,实际参与面试的有 10 家,也都是一二线互联网公司。这侧面也说明了 iOS 没人要仅仅是个调侃而已,目前对 iOS 开发的需求还是不少的。 8 | 9 | zhangferry:结合这些面试经历,有哪些高频题?遇到的算法考察多吗? 10 | 11 | > 高频题的话内存管理和多线程肯定算是了,基本上每家面试都会问的。 12 | > 13 | > 另一个就是项目经历,也是必问的。这个一般会结合简历来问,特别是项目重点和难点,所以大家准备简历的时候一定要保证对所写的内容是很清楚的。对于非常喜欢的公司还可以根据他们业务需求有针对性的优化下简历。 14 | > 15 | > 另外,架构设计能力,封装能力,有时也会考察,这个短时间无法快速提升,需要平常工作过程有意培养一下。 16 | > 17 | > 算法的考察整体来看不算多,大概有 30% 的概率吧。那些考算法的也都是考察比较简单的题目,也可能跟我面试的岗位有关,这个仅供参考,面试之前,算法方面多少还是要准备的。 18 | 19 | zhangferry:现在经常有人说面试八股文,结合面试经历,你怎么看待八股文这个事? 20 | 21 | > 首先存在即合理吧,八股文的现象体现的是面试官自身准备的不足。可能来源于早期,大家技术水平都一般,没有太多可问的东西,也没有特意研究过哪些方面,所以就网上扒一扒拿来问。目前的经历来看到还好,被问的问题还算多元,可能这种现象之后会随着面试官水平的提升越来越少。 22 | > 23 | > 同时这也算是一种双向选择,如果某次面试全是那种眼熟的问题,毫无新意,大概率可以说明这家公司对技术的重视和钻研程度不高,可以降低其优先级。 24 | 25 | zhangferry:对待参加面试的小伙伴有没有什么建议? 26 | 27 | > 投递简历没有回复或者面试感觉还可以最后却没过,出现这些现象是有多种原因,比如岗位正好招满了、岗位需求有变等等,不要首先否定自己。面试过程一定要放平心态,不要有心理压力。 28 | > 29 | > 最后祝所有准备找和正在找工作的小伙伴都能拿到满意的 Offer。 -------------------------------------------------------------------------------- /Interview/04_interview_zhuli.md: -------------------------------------------------------------------------------- 1 | # 人物访谈|皮拉夫大王 2 | 3 | [@zhangferry](https://zhangferry.com):本期交流的小伙伴是摸鱼周报的另一位编辑:竹立。这个名字大家可能比较陌生,但是他的 ID 应该有很多人都听过:[皮拉夫大王](https://www.jianshu.com/u/739b677928f7)。竹立是一位非常资深的 iOS 开发,本期围绕职场和学习主题,跟他进行了一些交流。大家如果还有其他问题想问竹立的,可以留言区告诉我们。 4 | 5 | zhangferry:简单介绍下自己吧。 6 | 7 | > 大家好,我是来自 58 同城的邓竹立,目前在团队中主要负责 iOS 的性能优化及稳定性建设。 8 | 9 | zhangferry:你对二进制的研究很深入,还在社区做过一次玩转二进制的直播分享,为什么会对这一领域感兴趣?能讲一些想要学好这方面内容的几点建议吗? 10 | 11 | > 我对二进制的研究还远远算不上深入,可能在个别细分的领域有一点探索,但是从整体来说二进制涉及的知识太庞大,因此还算不上深入。对二进制的探索主要是之前的技术项目所引导的。当时在做技术项目时遇到了一个问题:“如何动态调用项目中的 static C 函数?”,当时感觉研究的方向应该为 mach-o 文件,最终随着调研的慢慢深入,也就对二进制文件有了一定的了解。 12 | > 13 | > 想要学习二进制相关的内容其实我没有特别好的建议,因为我并没有成体系的去学习这方面内容,更多的是利用空闲时间凭借个人的兴趣去探索。有兴趣才会在探索过程中感受到有所收获,在其他技术方向上也是这样。如果大家对二进制文件解析感兴趣,58 同城近期会有一次线上技术沙龙(具体时间还未定,估计得 10 月后了),主要介绍 58 如何打造集团内 Swift 混编生态的。我会借助沙龙的机会介绍下 Swift 的二进制解析。 14 | 15 | zhangferry:作为一位资深开发,能讲下你认为的高级开发和资深开发之间的区别吗?在你看来要达到资深开发需要具备哪些素质? 16 | 17 | > 可能各家公司对高级和资深的定义不太一致。我理解资深开发相对于高级开发更具备触类旁通的能力,或者说是能根据以往的经验提取方法论应用到其他领域。因此从高级到资深可能需要在多个方向上有较好的理解。资深开发更应该从公司和产品的角度考虑问题,多问几个为什么,多关注事后的结果,而不是产品安排什么就做什么。另外,在沟通能力上的对资深开发的要求也会更高一些。 18 | 19 | zhangferry:你具有多年面试官的经历,能简单总结下你认为的什么才是好的候选人以及他们需要具备哪些素质吗? 20 | 21 | > 由于团队职责可能不同,因此每个团队招人的标准存在一些差异。比如有些团队可能对 RN/Flutter 等技术的应用比较看重,有些团队对底层技术比较看重,但是这些差异都是表象的差异。优秀的团队更注重候选人更深层的东西,这些东西可能在短期内无法突击弥补的,比如对技术探索的欲望、思维的灵活性、学习能力、抗压能力、责任心等等。就我所在的团队而言,在技术上,我们更关心的是候选人是否已经找到技术成长的第二曲线。(第二曲线摘自于《第二曲线:跨越“S 型曲线”的二次增长》,书我没看过,图与我脑海中的模型很像,所以在此引用) 22 | > 23 | > ![](https://cdn.zhangferry.com/Images/20210828093945.png) 24 | > 25 | > 或者通过面试能让我们看到即使候选人目前还处于成长期,但是经过培养是可以有更长远成长的。很多团队招人不外乎就这两种:要么候选人现在很厉害,要么候选人将来很厉害。 26 | > 27 | > 一些场景比较复杂的大型 APP,有些问题比较复杂,不是特别好定位,这需要一定的技术基础,灵活的思维,甚至要求心理素质过硬。大家可以看下我的[2019年终总结](https://www.jianshu.com/p/0a4831219cba "皮拉夫大王 2019年终总结")中提到的 **<工作篇>**,我整理了日常工作中遇到的部分问题记录到总结中,这也是 58 T5级别工程师的日常工作内容和要求。 28 | > 29 | > 如果作为团队的老板,你肯定希望自己的属下能够具备打硬仗的实力,而不仅仅是写写需求做做任务,在关键的时刻能够攻坚克难才是团队价值的体现。以上几点要求如果只是看看面经,刷刷算法可能还不够。因此在日常工作中,我们就应该养成良好的习惯,多问几个为什么,多做探索调研和储备,不要放过一些细节。 30 | > 31 | > 回到正题,我们从简历和面试的实际情况来看下有哪些是被鼓励的: 32 | > 33 | > (1)项目经历(这里不是指写了哪些 APP)比较匹配。比如团队目前的重点在与包大小治理,如果你的简历中有相关实践并且做的比较深入,那这就是加分项。 34 | > 35 | > (2)令人耳目一新的技术。有些技术比较前沿或者并未广泛被大家所熟知,在这个领域候选人有较深入的研究。(这表明候选人已经找到了第二曲线) 36 | > 37 | > (3)能证明自己探索和专研能力的经历。简历中有具体的事件能体现出候选人的这方面优势。(具备找到第二曲线的潜力) 38 | > 39 | > (4)灵活的思维能力。算法或者临场方案设计比较完善,考虑的比较完备。 40 | > 41 | > (5)良好的抗压能力。如果在高压的面试情况下,不烦躁不放弃,依旧能保持冷静思考。 42 | > 43 | > (6)能体现出良好的学习习惯。高质量的博客文章、开源代码等都是加分项。临时凑数的可能起不到作用,我一般会留意内容质量和发布时间密度。 44 | > 45 | > (7)业界视野。能关注业界的一些动态,对业界的一些热点技术比较熟悉。 46 | > 47 | > (8)坦诚而良好的沟通。 48 | > 49 | > (9)有足够的入职意愿。 50 | > 51 | > (10)最后就是稳定性、工作背景、学历等条件。 52 | 53 | zhangferry:如何保持学习热情,给我们分享一些你的学习方法吧。 54 | 55 | > 学习主要还是需要制定大的方向,然后在具体实施时会对自己做一些鼓励。这些鼓励的行为包括:写文章、在团队内做技术分享、对外交流等等。在团队内我的文章数和分享数常年领先,因为写文章和分享会促使我重新审视和思考,对成长有极大的好处。对外交流获得的成就感会更大一些,但是需要更谨慎,尽量保证自己输出的内容是准确的,一旦内容有明显纰漏,丢自己脸事小。。。 56 | 57 | zhangferry:个人有什么想法,可以借助于摸鱼周报进行宣传的。 58 | 59 | > (1)希望大家多多关注 WBBlades 开源项目:https://github.com/wuba/WBBlades ,觉得 OK 的话给我个 star 鼓励一下。 60 | > 61 | > (2)58 主 APP、人人车、到家精选等团队正在招人,简历可以投递到 zhulideng@yeah.net。秋天到了,我想赚点内推费填几件衣服。 62 | -------------------------------------------------------------------------------- /Interview/05_interview_RunsCode.md: -------------------------------------------------------------------------------- 1 | # 人物访谈|RunsCode 2 | 3 | [@zhangferry](https://zhangferry.com):这期参与访谈的对象是摸鱼周报的另一个编辑:[RunsCode](https://github.com/RunsCode),RunsCode 在我看来是一个非常酷的人。这个酷来自于他很强的学习能力和个人要求,编程和兴趣爱好都能被他玩出花来。下面通过几个问题,一起了解下他。 4 | 5 | zhangferry:简单介绍下自己吧。 6 | 7 | > Hello,大家好我是 RunsCode,目前就职于 Hello出行,坐标杭州。 8 | > 9 | > 小时候因为沉迷于电脑游戏,毕业后入坑做手游,后来机缘巧合之下结识 iOS,从此移情别恋了,跟 iOS 相爱相杀至今。 10 | 11 | zhangferry:你的学习范围比较广,安卓、Ruby、Applescript 都有写过,你是在什么场景下接触一门新语言的?学习一门新的语言,首先应该关注哪部分内容? 12 | 13 | > 因为之前做的 cpp 游戏要做移动端跨平台移植对接移动支付 SDK,被迫学了 Android 和 iOS,但是还是被 iOS 的纯粹给吸引了。后来在 15 年搞 iOS 的过程中来了一个 CSDN 当时前十的大神当我们领导,开拓视野学习 Swift 和 Ruby,因为他说 Swift 借鉴了很多 Ruby 的特性,再加上 CocoaPods 也是 Ruby 写的,也就稍稍学习了一下。AppleScript 也是这个 CSDN 大神提醒的搞 Mac 自动化,后来也是一发不可收拾。 14 | > 15 | > 这些语言对我而言他们共性是让我写起来很开心,就像那种小孩子看到好吃的那种感觉(主要说 Swift 和 Ruby) 16 | > 其实学语言都是有针对的学习,不同的语言都是有自己擅长的领域,比如说我要用 Ruby 写一个 iOS App,这就有点过分了,相比 OC/Swift 这就不是很适合了,虽说有点过分,但是真的有人这么干了,可以了解下 [RubyMotion](http://www.rubymotion.com/ "RubyMotion"),真是极客啊。 17 | > 18 | > 个人觉得学习一门新语言除了一开始掌握基本的词法语法之外,慢慢的你就会发现这个语言跟你有没有共鸣,你的思路跟它的处理逻辑是不是很契合,就像大家都喜欢脚本 Python 我却更喜欢 Ruby,这主要是Ruby 的处理逻辑跟我很契合,就是同样的展示你用德玛习惯,我却用吕布更加习惯。 19 | 20 | zhangferry:听说你乒乓球和魔方都玩的很好,这些东西的学习跟编程有没有什么共性呢?我之前也着迷过一段时间魔方(三阶),但最快也要 2min 以上,听说你的记录是 15s。由不会到会再到熟练是相对简单的过程,一般人都能做到,但再往上突破就很难了。就魔方来说,1min 对我来说就是一个大的突破了,如果要达到这一步需要做哪些事情呢? 21 | 22 | > 乒乓球会一点,请过教练专门训练过基础技能,不能说玩的很好,跟小区大爷打球有时候经常翻车的,尤其打长胶翻车不少,哎...... 23 | > 24 | > 魔方这个吧,就是比一般复原的稍微快一点,三阶止步 CFOP。 25 | > 26 | > 跟编程的共性:兴趣第一, 然后就是坚持,用正确的方法刻意练习就是了(高手都是寂寞的)。 27 | > 28 | > 一分钟还原三阶魔方来说,学会七步还原法,然后在苦练一个礼拜,每天练习两个小时应该就差不多了。当然掌握正确手法的天赋型选手也许只要两三天。 29 | > 30 | > 然后最重要的事情说三遍,买个好魔方, 买个好魔方, 买个好魔方!!! 31 | > 千万不要买路边摊十块钱那种啊,那种容易卡住或者 POP(就是爆炸开了),及其打击自信,过来人血的教训。 32 | > 33 | > 怎么的也得三十块起步,国甲,孤鸿,圣手这种吧。 34 | > 35 | > ![](https://cdn.zhangferry.com/Images/魔方.jpeg) 36 | 37 | zhangferry:学习很多时候并不是有趣的,该如何保持学习热情? 38 | 39 | > 这个我不知道怎么回答,或许是好奇,或许是焦虑,或许是爱好兴趣。我只知道是这三点支配了我。还有就是我只做自己喜欢的事情,我从不跟风,跟风容易迷失自己,适合别人的不一定适合自己。 40 | > 41 | > 主要还是要坚持,坚持下去能让人更坚定。时间长了你就习惯学习了,如果突然一下子你不学习,你是不是都会感到空虚、焦虑和内疚吧,哈哈哈。 42 | > 43 | 44 | zhangferry:说一个最近的思想感悟吧。 45 | 46 | > 提升生活幸福感还是要终身学习,不仅限于工作技能,其他一切都可以。 -------------------------------------------------------------------------------- /Interview/05_interview_xiongda.md: -------------------------------------------------------------------------------- 1 | # 人物访谈|熊大 2 | 3 | [@zhangferry](https://zhangferry.com):本期交流对象是摸鱼周报的另一位编辑:[🐻我是熊大](https://juejin.cn/user/1151943916921885/posts)。他在音视频方向有很多经验,自己也独立维护了两款应用,我们围绕这两个层面来和他交流一下。 4 | 5 | zhangferry:简单介绍下自己吧。 6 | 7 | > 大家好,我是熊大,野生iOS开发者,目前正在做一款海外社交 App,在团队中主要负责 iOS 的架构设计以及性能优化。 8 | 9 | zhangferry:你有多款独立开发的应用,能简单介绍下当时独立开发的初衷和现状吗? 10 | 11 | > 独立开发的产品是[《今日计划》](https://apps.apple.com/cn/app/id1505020317)、[《imi我的小家》](https://apps.apple.com/cn/app/id1543829703)。 12 | > 13 | > 当时做独立开发的目的有两个:一个是自己有些想法想要实现出来,二是希望能有睡后收入。之前认为独立开发可能需要更多时间投入,后来发现独立开发最首要的问题不是时间,而是运营和验证;如何找到产品定位人群,如何优化 ASO,关键词如何填写,产品留存达到多少才是及格?这些都是初次尝试独立开发容易忽略却不得不面对的挑战。也正因此,我做了个公众号[独立开发者基地](https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=Mzg4OTU1Njk1MQ==&scene=124#wechat_redirect),分享独立开发遇到的问题。 14 | 15 | zhangferry:在你看来要做独立开发需要具备哪些重要技能呢? 16 | 17 | > 以下 5 个方面可能是我们需要的: 18 | > 19 | > 1、具备产品思维,能编写需求文档,分析产品数据,摸索产品方向。 20 | > 21 | > 2、具备使用 Sketch、Figma、蓝湖的能力。 22 | > 23 | > 3、运营推广能力,如何让app能被更多的人知道,如何召回用户 24 | > 25 | > 4、具备iOS、Android、小程序等一个或多个的开发能力 26 | > 27 | > 5、后端开发能力,其实这个前期可以使用第三方代替 28 | > 29 | > 这些都是硬件实例,最关键的还是执行力和创造力,如果你有想法,那就不要等待。 30 | 31 | 4、你的工作中多涉及音视频技能,能说下音视频开发和普通应用开发有什么区别吗?如果想往这个方面学习,需要注意和关注哪些东西。 32 | 33 | > 在我的工作中,音视频开发主要涉及到AVFoundation、FFmpeg、OpenGL ES、MetalKit等框架。 34 | > 35 | > 音视频开发入门会更难一些,需要有图形图像学的基础知识;有时需要编写 C\C++ 代码,很多第三方的音视频库都是 C\C++ 写的,比如常用的 libjpeg-turbo、lame;同时要熟悉CMake工具进行编译等。 36 | > 37 | > 推荐学习路线: 38 | > 39 | > 1、数字图像的基本知识 40 | > 41 | > 2、开源库 GPUImage,AVFoundation + OpenGL ES,2016年时,很多第三方SDK图像处理框架都是基于这个开发的。 42 | > 43 | > 3、开源库 GPUImage3,这是AVFoundation + Metal。 44 | > 45 | > 4、李明杰老师今年有一个FFmpeg的课程。 46 | > 47 | > 我在小专栏开了一个介绍音视频技术的专栏:[GPUImage By Metal](https://xiaozhuanlan.com/GPUImage "GPUImage By Metal"),大家如果对这类知识感兴趣的话欢迎订阅。另外再送大家一些免费领取资格,名额有限只有十个,[点击这里领取](https://xiaozhuanlan.com/GPUImage/present/42a8fba462217d3717c54d707db55ae7b49d86ce "GPUImage By Metal 专栏领取链接")。(公众号外链无法跳转,专栏领取链接在下方参考资料中) 48 | 49 | 5、如何保持学习的热情,能否分享一些你的学习方法。 50 | 51 | > 保持热情的最好办法就是热爱或追求。 52 | > 53 | > 1、学习要循序渐进,不要一下学太多,陌生的东西太多会打消积极性。 54 | > 55 | > 2、如果遇到几天都无法理解的东西,放一放,发酵几个月后再看。 56 | > 57 | > 3、要有目标和实践方案 58 | 59 | 6、有什么需要借助于摸鱼周报宣传的。 60 | 61 | > 1、希望大家多多关注 SpeedySwift 这个开源项目:https://github.com/Tliens/SpeedySwift ,这是一个用于提效 Swift 开发的仓库,觉得 OK 的话给我个 star 鼓励一下吧。 62 | > 63 | > 2、北京连趣科技,寻找一起并肩作战的小伙伴,各个岗位都有需求,简历可以投递到 tliens.jp@gmail.com,我的微信:`bear0000001`。 -------------------------------------------------------------------------------- /Interview/06_interview_yuriko.md: -------------------------------------------------------------------------------- 1 | # 人物访谈|Yuriko 2 | 3 | [@zhangferry](https://zhangferry.com):yuriko 是群里非常活跃也很有趣的一位小伙伴,工作时间还不是太长但学习热情很高,一起来了解下他是如何看待学习这件事的。 4 | 5 | zhangferry:简单介绍下自己吧。 6 | 7 | > 大家好,我就是我们成长之路群里自诩瓜皮的同学,为什么我自诩瓜皮呢,因为我 19 年毕业,就工作经验而言对于很多前辈而言还是稚嫩了些。刚毕业时去了一个 P2P 背景的公司,后来 P2P 在疫情前没几个月就倒了,急于找到一份工作,去了一家传统行业做开发,然后今年跳槽去了家互联网股票头部公司。 8 | 9 | zhangferry:你之前在传统企业也工作过,传统企业跟互联网公司工作的感受有什么不同。 10 | 11 | > 就拿我之前的公司而言,最大的不同就是对开发过程的重视,对技术的重视程度不同。 12 | > 13 | > 虽然我之前待的传统行业,就这家公司而言,员工也是不少,但是对于开发部门来说,完全就是个小作坊。没有合理的生产流程,只注重生产出产品(其实也不是很注重)。一个人负责的东西很杂,测试离职后就只能自测,甚至有一个星期被迫下店当了店员(一生黑)。其实我之前早就想要离开那里,可是碍于疫情只能多留了一年。 14 | > 15 | > 现在在这家公司,最大的感受就是流程规范了许多,公司重视技术,有定期的技术分享,生产流程也规范了许多,也有内部的自动化平台,目前也有机会参与公司的自动化流程构建优化(脚本自动化打包等),感觉在这里可以接触到学习到很多东西。 16 | 17 | zhangferry:感觉你兴趣范围挺广的,逆向、算法,这些由兴趣推动的技术方向,你是如何保热情持续不断的学习的呢? 18 | 19 | > 也可以说是一种有目标,也是为了成功的成就感。 20 | > 21 | > 在我看清了前司要离开却迫于疫情留下后,我就知道要为以后做打算了,于是我每天开始刷算法题,每个模块有目的性的做下来,然后参照题解,分析自己的时空复杂度是否有优化空间。在换工作前做了300 余道算法题,刷算法的同时感受到了算法思维的重要性。 22 | > 23 | > 逆向的学习也是机缘巧合,当时我的好基友有一款付费办公软件找我,希望我能破解。当时我就决定去学习这部分的知识。学了一段时间,也买了 Hopper 作为分析工具,帮基友破解掉了里面的内购付费功能。为了简化部分重复的工作,抽了一段时间学习写 Shell 脚本(也稍微了解了 Python,以后会详细学习),然后自写了一套重签名脚本。软件破解成功以后我真的是满满的成就感。 24 | 25 | zhangferry:有了学习动力还需要一些学习方法,分享一些你的学习方法吧。 26 | 27 | > 我认为最重要的是要有目的性,当初我决定要跳槽后,基本上能抽的空闲时间都抽出来了,地铁上刷 MJ 的视频,回去以后打开 Leetcode 刷题,每天制定学习的时长,时间不到不能进行娱乐活动。然后只玩休闲类益智类游戏,保证不会在游戏上花掉太多时间。像现在的话,我虽然已经没有跳槽的目的性,不过最近 *OS internals part3 译本已经出来了,我也购入了一本,当前目标就是先读完这本书。虽然里面有很多陌生的概念,也磕磕绊绊的看了一百余页。所以对我而言,目的性是我学习的最大动力。 28 | 29 | zhangferry:说一下最近的思想感悟吧。 30 | 31 | > 主要就是想以我自己的经历,向跟我差不多年龄的同学分享下,一定做好职业规划。之前我去那传统公司也是看人比较多,结果却大失所望,走了不少弯路。但是也是因为在那个公司,我才明白了只有提升自己才能进入好企业来摆脱它。 32 | > 33 | > 之前看群里的同学们,有分享过一些开发者视频(油管上的),都是英文的。感觉虽然工作了,英语也是相当重要,建议英文基础薄弱些的同学还是花些精力在这里,毕竟一手的资料比二手的译本更能代表原作者的意思是吧。 34 | > 35 | > 如果有什么想跟我聊的欢迎在群里骚扰我哈,基本秒回^_^ -------------------------------------------------------------------------------- /Interview/07_interview_zhanganyu.md: -------------------------------------------------------------------------------- 1 | # 人物访谈|微软Offer之路 2 | 3 | 本期访谈人物是张安宇,他是 #Swift社区 公众号的负责人,最近换工作接了微软(苏州)的 Offer,11月底入职,目前正在爽爽的休假。咱们拉他过来聊聊关于面试微软的经历。 4 | 5 | ![](https://cdn.zhangferry.com/Images/微软_苏州.jpg) 6 | 7 | zhangferry:简单介绍下自己吧。 8 | 9 | > 大家好,我是 #Swift社区 公众号的负责人,我叫张安宇,很高兴被摸鱼周报邀请来参加这期访谈,我是摸鱼周报的读者,经常看摸鱼周报的文章。 10 | > 11 | > 我是一个换工作非常频繁的人,平均每家公司工作 1-2 年甚至更短,比如搜狐和掌阅科技,兄弟们常常因为这个取笑我。关于这个问题我没有特别多的看法,找工作的过程中也没有因为这些受到伤害或者阻挠,相反每次换工作都还挺顺利,大部分情况下是能够受到用人单位的尊重的。 12 | > 13 | > 在饿了么工作的时间稍长一些,我在饿了么的蜂鸟团队和北京的前端组主导完成过饿了么入淘的第一个项目叫做蜂鸟商城,同时还负责给我们物流团队的几个 App 统一接入淘宝的浏览器框架 `Windvane`。 14 | > 15 | > 我喜欢玩游戏、看书、看电影,偶尔运动,很喜欢交朋友。平时我跟展菲一起维护我们的这个公众号,还有一些技术群。我们会定期分享一些 Swift 社区动态和相关的资讯,欢迎大家的关注。 16 | 17 | zhangferry:能简单说下你是如何准备微软的面试的吗,实际面试过程中有哪些比较重要的记忆点?跟国内其他大厂的 iOS 面试有什么区别? 18 | 19 | > 微软的面试流程非常长,一共有 6 轮,每轮 1 个小时左右,都是技术面。我之前也没有接触过这种面试形式,所以主要依靠 HR 提供的面试考察点,以及自己去了解来的一些信息来准备这场面试。 20 | > 21 | > 这里有个小插曲,正常来说每轮面试间隔应该都是一周左右。因为当时还有另外几家公司在同时面试,跟 HR 说想加快进度,结果后面 2 天就安排完了剩余的 5 轮面试。 22 | > 23 | > 微软的 HR 会特别详细地向大家说明每一轮面试的主要步骤,我觉得最重要的是进行针对性地准备。微软面试的核心考察点就是 coding 环节,算法在每轮面试都有,如果代码功底不足,建议继续刷题再参加应聘。整体来说,是在能白板编程 + bug free 的前提下,再根据自己多年的工作经验,与面试官交流一些 iOS 方面的通用性技术。 24 | > 25 | > 实际面试中,我能够比较从容应对的主要原因是熟练 + 自信。我有 NOIP 与 ACM 的参赛经验,加上面试前认真刷了半个月 Leetcode,基本上遇到题目不会发慌。因为备战仓促的原因,我刷的题目数量也有限,实际面试过程中,也没有遇到最近刷过的原题。好在微软的题目不算太难,毕竟面试时间只有一小时左右,基本上是 mid 难度的题目。在现场编写时我都基本做到了编译通过、结果正确,并且能分析出算法的时间复杂度和空间复杂度。我觉得我这个表现对于微软来说,是最低要求了,如果 coding 不过关,应该也是会得到面试官的 no hire 的。 26 | > 27 | > 我想声明一下,微软的面试要求其实不低,并不是说我就凭刷了两周题目(60 题左右)就通过了面试,整个面试过程的考察还是很全面的,算法只是其中一部分。希望大家不要误解这一点,不要黑微软,谢谢大家。 28 | 29 | zhangferry:你面过很多国内大厂,在你看来微软跟他们比起来有什么区别呢? 30 | 31 | > 工作了这么多年,我几乎参加过所有公司的面试,确实微软这样的企业与国内很多互联网企业的面试要求、流程、侧重点都不一样。 32 | > 33 | > 据我观察,头部的互联网企业,面试大都是以面试题八股文为主,最后结束以前面试官可能会考一下算法题,也可能不会。像字节的话就比较看重算法题,相信这个大家都比我更了解。 34 | > 35 | > 微软对于算法能力更看重一些,整个面试过程对于候选人的考察点聚焦在算法题,coding 能力。coding 对应的是现场写代码,比如手写 GCD 代码,实现一个多线程的需求。还会有一些相对开放的题目,比如问是否关注过最近的 WWDC,苹果的一些最新特性是什么;如果实现一个词云功能有什么思路,中英文如何分词等等。 36 | 37 | zhangferry:你应该通过了多家互联网公司的面试,为什么最终选择了微软,而且还要从北京搬到苏州? 38 | 39 | > 这个并没有特别多,我是收到微软面试的邀请以后决定离职,因为刷题需要付出很多精力与时间,我曾戏谑说,我备战高考时也不曾如此认真,哈哈。 40 | > 41 | > 确实除了微软以外,还有其他公司也在接触,基本都聊的很愉快很顺利,但是不多。我没怎么主动投递自己的简历,甚至简历都没来得及更新,从离职到 Offer 大约两周时间,对于这么密集的面试流程来说,时间是非常仓促的,所以也不能说难度不大。 42 | > 43 | > 为了这 6 轮面试,我腾不开时间鸽掉了一些公司,有一家公司我鸽了两次……我怀疑我已经被这些公司屏蔽拉黑了,但我也没办法哈哈。 44 | > 45 | > 选择微软的原因,我觉得应该是目标职位的匹配程度比较高,还有微软给出的薪资待遇足够慷慨大方。入职的是 Edge 部门,我说过我喜欢前端技术,也喜欢浏览器内核研发相关的领域,我希望这份工作能够让我继续成长突破自己。 46 | > 47 | > 在接受 Offer 的过程中,我坦言过自己可以接受落差,因为我没去过微软,所以对微软所有的了解只能来自于想象与道听途说。希望我的苏州之旅,能够真正让我了解到这家公司,也很乐意在朋友圈与朋友们继续分享我的成长路程与心得体会。 48 | > 49 | > 为什么愿意去苏州,这个话题比较沉重。我是特别舍不得北京的,最开始我拒绝过一次微软的面试邀请,也是因为微软在北京没有 iOS 职位的原因。最后愿意去苏州,说实话也是对北京这个城市很多地方感到不太满意。 50 | > 51 | > 北京是好,但在北京的这些年,真的没有太多归属感,永远在内心里把自己当做低人一等的外地人。所以搬家去苏州对我来说也没那么难受,毕竟我在北京没有根,我自嘲我这种没有根的人,也是很洒脱的,我想去哪里就去哪里。值得一提的是,微软因为这个给了我搬家费,还不少,令我挺感动的。 52 | > 我很庆幸微软的 HR 都特别大度,没有把我之前拒绝面试这件事放心里,后来很快就给我重新安排了面试,并且也很热心的提供了很多资料给我。 53 | 54 | zhangferry:能否简单介绍下已知的微软工作环境、入职的部门?对于英语是否有特殊要求,有没有英文的面试?在你看来微软更喜欢招什么样的人? 55 | 56 | > 据我了解,微软的工作环境非常的好,不管是苏州的研发中心,还是北京的总部。我入职的部门是 Edge 团队,我听说 Bing App 即将与 Edge App 合并,希望这件事不会对我的 Offer 有什么影响,哈哈哈。 57 | > 58 | > Edge 是微软自研的浏览器,我相信很多人都知道,Edge 除了 Windows 客户端以外还有 Mac 和 iOS 端,当然也有 Android 端。据我了解,我应该可以去这个团队学习一些比较深入的浏览器内核技术,以及一些 C++ 技术。我希望我以后能成为这方面的大牛,哈哈。 59 | > 60 | > 英语的话,当然是要能够日常交流,起码阅读、发 email 能做到没有障碍吧我觉得。面试过程中,我没有遇到说英文的面试官,但是不排除别人不会遇到哈,毕竟微软是一家跨国企业。 61 | > 62 | > 我觉得微软喜欢招什么样的人?哈哈这个问题太大了,不过了解我的知道我这个人很狂我也没啥不敢讲的话,我觉得微软应该喜欢招天才进来,真正的天才。不是我自诩天才,是我觉得微软公司配吸引天才们加入这里,一起去实现改变世界的想法,真的。 63 | 64 | zhangferry:对于正在面试和即将面试的人有什么好的建议? 65 | 66 | > 据我了解我有个师弟也在面试微软,他比我优秀多了,我认为他没有问题,他应该刚从中科院读完硕士,在我眼里属于学霸,我认为他进入微软没有太大问题,加油。 67 | > 68 | > 对于即将面试的人有什么建议的话,我觉得真的比较简单,那就是调整好心态,认真刻苦复习算法与数据结构,这是一块特别有针对性的领域。 69 | > 70 | > 你面试其他公司可能还需要复习一下编译原理之类的,但是对于微软的面试流程,对于 coding 环节来说,我认为就可以不用再额外付出时间精力去复习这些。目标性非常强,所以很容易成功。祝愿和希望更多优秀的人才加入微软和我做同事,哈哈。 71 | 72 | zhangferry:有什么想借助于摸鱼周报宣传的。 73 | 74 | > 当然是替微软招人啦。虽然我目前还没入职,还是想借此机会,替微软的 HR 宣传一下,微软苏州研发中心,大量 HC 期待大家加入。前端、后端、全栈、算法、Data Scientist 都需要,感兴趣的可以投递简历到:a-huili@Microsoft.com。 75 | > 76 | > 也希望没有关注过 #Swift社区 公众号的朋友,能点个关注,支持一下我的事业,谢谢大家。 77 | 78 | zhangferry:你经常在朋友圈发不少长文,最近肯定也有不少生活或者工作的感悟吧,可以给我们分享一下。 79 | 80 | > 当然有,最近有很多兄弟说被我的精神感动了,说我怎么说到做到,说刷题就刷题,说换工作就换工作呢,每天还刷到后半夜,太励志了。 81 | > 82 | > 我想了一下,可能也是有那么点励志吧,哈哈。人生需要目标,需要理想,需要榜样,看着别人奋斗你也能被感染与鼓舞的,我觉得这就是力量,让生命变得更加精彩的力量。 83 | > 84 | > 我在朋友圈编过一句鸡汤,我说“我喜欢光,我追寻光,同时我也想成为光”。我觉得大概就是这个意思吧,好的气质,互相吸引互相鼓舞,这是很难能可贵的事。不过鸡汤喝多了会腻,在身边找一个真正的榜样,向他看齐,脚踏实地的前进,时间久了你可能会发现已经与他并肩而行了。 85 | > 86 | > 我就有很多技术偶像和技术榜样,我很荣幸他们大部分都通过了我的好友申请,特别开心。希望大家都能找到自己的榜样。 87 | > 88 | > 如果大家不嫌弃想认识我的话,可以通过飞哥找到我,我这个人真的很爱交朋友,哈哈,兄弟们都说我有社交牛逼症…… 89 | > 90 | > 再次感谢飞哥的邀请,参加这期摸鱼周报的访谈,谢谢。 91 | 92 | -------------------------------------------------------------------------------- /Interview/08_interview_yao.md: -------------------------------------------------------------------------------- 1 | # 人物访谈|一位在校生的iOS之路 2 | 3 | 本期访谈对象是摸鱼周报的主编之一:反向抽烟。他还在读研,因为名字里带个尧字,我们都叫他尧兄。尧兄有一个博客:https://blog.csdn.net/opooc,分享自己的学习记录,大家有兴趣可以看下。 4 | 5 | ![](https://cdn.zhangferry.com/Images/WechatIMG552_sea.jpeg) 6 | 7 | zhangferry:简单介绍下自己,再讲一下最近的状态吧。 8 | 9 | > 大家好,首先感谢飞哥的采访。网名叫反向抽烟,是一名研二在读的大学生,也是 iOS成长之路群的早期用户。目前在做计算机视觉方向学习,一方面对这个领域比较感兴趣,另一方面也是为了毕业设计。在学校的状态一般,强度不大,还是比较随意的。 10 | 11 | zhangferry:你之前在网易实习,后来又回到了校园,为啥结束了实习?对比校园和职场这两种不同的环境,能分享下你的感受吗? 12 | 13 | > 导师给我安排了一些任务,要结束实习工作,所以才回来的。其实我自己不想结束实习,还是挺想上班的。大家一起共事,一起努力完成工作,那种氛围,我还是挺喜欢的。 14 | > 15 | > 时间和精力上的分配不太一样,实习更多的是输出吧,校园自由一些,输入会多一些。 16 | 17 | zhangferry:你接触过的技术方向挺多的,算法、Java、iOS、计算机视觉等,你在选择或者更换技术方向时一般如何做权衡呢? 18 | 19 | > 这些方向的本质是没有什么区别,都是为了解决问题,后端也好,前端也好,我觉得都是值得学一下的,毕竟打工嘛,还是得提高自身价值。 20 | 21 | zhangferry:尧兄啃过很多本书,能推荐一个对自己影响最大的一本书,简单介绍下吗 22 | 23 | > 书的话没有看很多,飞哥既然给面了,那我就推荐一本课外读物《狼的智慧》,强者恒强,适者生存。 24 | 25 | 备注:尧兄真的是在啃书,有一张之前群里发的图片为证: 26 | 27 | ![](https://cdn.zhangferry.com/Images/WechatIMG436_csapp.jpeg) 28 | 29 | 再附一张他推荐过的书目名单: 30 | 31 | ![](https://cdn.zhangferry.com/Images/image_books.png) 32 | 33 | zhangferry:对于学习这件事,你是如何保持热情的?感觉你对学习是沉迷的。可以推荐一些你的学习方法吗? 34 | 35 | > 对我而言应该就是兴趣吧,如果对一样技术的态度是为了完成任务而学习,我大概率完成不好。但如果是自主的学习过程中,我有了一些自己的想法,就会竭尽全力的去弄懂。所以主动而非被动,会让学习这件事更有趣味性。 36 | > 37 | > 学习方法的话,分两个角度吧,一是学习一定得是刻意的,要拿出时间来经常练习的,这个没有捷径;第二是对于新东西要先用起来,再去研究原理,边用边学,这样效率会高一些。 38 | 39 | zhangferry:你经历过不少大厂的 iOS 面试,实习面试时考察侧重点是什么样的?对正在找实习工作的同学有什么建议吗? 40 | 41 | > 实习面试重点还是在考察基础,有四个部分:算法基础 + 计算机基础 + iOS 基础 + 项目/实习。算法是最基本的一项,一般每一面都会问到;计算机基础一般是在一面进行考察;项目/实习一般是在二面/三面进行考察。 42 | > 43 | > 准备的话: 44 | > 45 | > 1.算法最好有个 300 的题量,一定要在面试前保持题感。 46 | > 47 | > 2.计算机基础中考察有计算机网络、编译原理、操作系统、数据结构,网络和操作系统基本是必考,这一部分还是需要花时间理解的,建议平时多花时间钻研下,只背面经是经不住问的。 48 | > 49 | > 3.iOS 基础准备起来还是有章可循的,推荐看 mj 老师的底层视频和慕课网的 iOS 大牛面试视频,最后把不理解的点做好笔记,及时请教。 50 | > 51 | > 4.项目/实习有一样就可以,要是准备项目的话,可以把自己的以前写过的项目进行一些优化,做好总结,写在简历上的点,都一定要弄明白。 52 | > 53 | > 实习面试看公司或者部门,有的公司要实习生去干活,就考 iOS 多一些,有的是为了培养转正,就要求基础牢实一些。主要还是凡事提前准备吧,多往前看几步,早做准备。 54 | 55 | zhangferry:最近有什么新的感想或心得跟我们分享吗? 56 | 57 | > 程序员这个行业其实是与社会关系脱节的,它不是那种社会性质的工作,会经常和人打交道。技术肯定要有的,毕竟是门手艺活,得靠它吃饭,但技术只是一个最最基本的层面,政治书上说了,人的本质是一切社会关系的总和,所以大家还是要多多搞好社会关系,这样人生路才会更宽广,走的更顺畅。(仅为个人观点) 58 | -------------------------------------------------------------------------------- /Interview/09_interview_mimosa.md: -------------------------------------------------------------------------------- 1 | # 人物访谈 | 一位参加过 WWDC 的 iOSer 2 | 3 | Mimosa 是摸鱼周报的编辑之一,负责每期的学习资料整理。在一次聊天过程中他晒出了跟 Tim Cook 的合影,给我们馋哭了。于是就有了这期访谈的主题:WWDC 之旅,也算是拉着 Mimosa 一起回忆了一把,哈哈。因为是在 17 年,WWDC 还是线下,活动真还挺多的,不知道还要多久才开发者大会才能再次回归线下,希望疫情赶紧过去吧。 4 | 5 | ![](https://cdn.zhangferry.com/Images/Mimosa_IMG_0936_small.JPG) 6 | 7 | ### 简单介绍下自己吧 8 | 9 | 哈咯大家好,我是 Mimosa,中文谐音名棉毛衫,小号是 Mimoku(棉毛裤),是一名 iOS 开发者,工作经验一年左右,是 iOS 摸鱼周报的编辑之一。我是在大学的时候接触的 iOS 开发,当时加入了学校的 iOS Club,在大二那年获得了来自 Apple 的 WWDC Scholarship Winner,从此算是与 iOS 开发结缘,参加了许多与 iOS 相关的活动,毕业到如今一直是从事 iOS 开发。 10 | 11 | ### 能讲下自己获得 WWDC 奖学金的经历吗? 12 | 13 | 首先先介绍一下这个奖学金吧,WWDC Scholarship Winner 是 Apple 每年为全球学生提供的一个小福利,每年 4 月份的时候,Apple 会在官网放出当年 Scholarship 的要求,比如你需要是一个学生,你不能年龄太小等等,你还需要做一个有创意、激动人心的小作品,并提交,全球每年将会有大约 350 名学生的作品会被接收。如果你的作品被接收了,那么将免费获得一张当年 6 月份参加 WWDC 的门票,价值 $1599 😎(且提供住宿、来回差旅费也有机会报销)。在 2020 年之后,这个奖学金改名叫做 Swift Student Challenge 了,且由于疫情这两年的 WWDC 改为线上,就无法去现场参加了。 14 | 15 | 我获得的是 17 年的奖学金,申请 WWDC 奖学金时我正值大二,当时是刚学完学校的 C 语言课程和数据结构,加入了我们学校的 iOS Club,也是第一次接触 iOS 开发。我还清晰的记得当时是在 Swift 3.0 的环境下用 Swift 2.0 的教学视频在自学😂,周围会 Swift 的人也是屈指可数,只能自己上网摸索。由于当时有学长获得过上一年的 WWDC 奖学金(但由于时间问题没去 WWDC 现场),所以当时的刚学我们也想试一试,就熬了几天用自己学过的所有东西做了一个作品提交了。没成想那年我们学校有 4 位同学获得了奖学金!但最后由于签证问题(我是之前已经有申根和美签了,但我的朋友们没有😢),所以只有我一个人去圣何塞 WWDC 的现场。 16 | 17 | ![](https://cdn.zhangferry.com/Images/Mimosa_IMG_0906.JPG) 18 | 19 | ### 你当时开发的是什么作品? 20 | 那一年是第一次 Apple 要求参赛者制作一个 playground(之前都是要求做一个介绍自己的 App 这种类型的题目),我制作了一个简单又可爱的可视化冒泡排序教程💂‍♀️,运行在 Swift Playgrounds 这个 App 中(可以在 iPad App Store 和 Mac App Store 中找到这个 App),利用这个 App 一侧可以写代码,一侧可以查看运行结果这种所见即所得的特性,来教使用者冒泡排序算法的原理。 21 | 22 | ![](https://cdn.zhangferry.com/Images/sorting.PNG) 23 | 24 | ### 参加 WWDC 期间有什么好玩的事情,这个过程有什么收获? 25 | 26 | 可以说是收获颇丰。首先一个是,作为 Scholarship Winner 可以额外参加一个 WWDC 正式开幕之前的 WWDC Scholarship Meeting,由 Apple 组织在一个小剧场和我们讲了一点 Apple 在各个方面做出的一些努力等等,还会给我们发一个 dev 版本的 Apple TV。重要的是,在所有演讲结束后,Tim Cook 会突然走出来和所有 Scholarship Winner 合影,然后接下来就是激动人心的和 Tim Cook 合影环节,我当时的情况是你只需挤到他旁边他就会和你合照一张!🤩据我观察现场大约有 2/3 的人都在成功合影了。(剩下没合影成功的只能落寞地望着 Tim Cook 和他保镖的背影😇 27 | 28 | ![](https://cdn.zhangferry.com/Images/IMG_0626.JPG) 29 | 30 | 对于大多数开发者来说,可能 WWDC 里面重要的是各种各样的 session,但其实也会有一些无关技术但与生活相关的演讲,给我印象深刻的有两个。 31 | 32 | 一个是在 WWDC 的第二天,由于我时差没倒过来睡不着,参加的当天最早的一个演讲,是奥巴马夫人米歇尔的一个演讲,(虽说我排队时排在前几个但是仍没坐到前排,气死了),她讲了许多科技与生活的事情,谈论了他的孩子,还讲了去长城的经历,吐槽长城人多等等。 33 | 34 | ![](https://cdn.zhangferry.com/Images/Mimosa_IMG_0725.JPG) 35 | 36 | 另有一个让我印象深刻的演讲是来自 NASA 的一个女数学家奶奶,她谈论了她当年是怎么加入 NASA 以及工作至退休期间的经历,讨论了那个年代女性在 NASA 的情况,讨论了那个年代女科学家的境地,让我大受震撼。 37 | 38 | 作为 Scholarship Winner 还有一大好处就是,除了能接触到说中国话的学生开发者之外,还可以接触到来自世界各地的 Scholarship Winner,由于所有 Winner 住在圣何塞州立大学的宿舍里,我去的那年 350 个 Winner 中大概只有 15 个是来自大陆,同时黄皮肤的面孔不超过 30 个,意味着活动中有大量的时间我需要与母语不是中文的人交流。 39 | 40 | 比如我的室友就来自俄罗斯🇷🇺,他大四在读,我们用散装英语交流了很多东西,他的作品是用 playgrounds 模拟 Metal(?我到现在也没懂这怎么做的😅),他的计算机基础踏实的一塌糊涂,聊天的时候我就像被面试一样,绞尽脑汁地想他到底在说啥。还有一位意大利小哥🇮🇹一看我这是亚洲人面孔,就凑上来问我们是哪里人,问我是不是中国人,问我来自上海嘛,在得到一系列肯定的答复后他说他去同济大学交流过一段时间,然后他突然很想告诉我他是哪个校区,然后我们开始一起苦思冥想同济大学除了四平路还有在哪的校区,想了半天没想出来,意大利小哥也不尴尬,和我面面相觑地走了一路,最后挥手道别😂。 41 | 42 | ![](https://cdn.zhangferry.com/Images/shuangx2.jpg) 43 | 44 | 在 WWDC 期间的会场外,也会有很多的 tech talk 在附近举办(蹭 WWDC 热度),我误打误撞参加了一个 Realm 举办的 tech talk。一开始先是吹了一波 Realm,然后是邀请了一些从 Apple 离职的人来做对话,结果发现请到了 Chris Lattner(当时就职于特斯拉)。大家伙那叫一个激动啊, 连下面的好多爷爷辈的听众都提了好几个问题(真的爷爷辈👨‍🦳,拄拐杖的,不开玩笑),只能感叹一下计算机技术这该死的魅力。 45 | 46 | ![](https://cdn.zhangferry.com/Images/Photo.png) 47 | 48 | 另外 WWDC 的倒数第二天有个 Bash,算是一场露天音乐会,气氛很热烈!来的是 Fall Out Boy(代表作有"The Phoenix","Immortals" 等,现场太顶了)。大家在现场把酒言欢,给 WWDC 收了个尾。在 Bash 现场还和来自国内各大互联网公司的工程师们合影了,不知道各位看官有没有在照片里面的。 49 | 50 | ![](https://cdn.zhangferry.com/Images/Mimosa_WechatIMG270.jpeg) 51 | 52 | 在 WWDC 玩的这几天拓宽了我看待技术的视野,把我从学校里教的那些知识里面拉了出来,在会场的内外,看到了更多与业界发展相关的东西,看到了计算机科学的广度和深度。我本科就读于魔都某不知名二本,且不是工科强校,所以我的学校计算机专业水平比起其他获得奖学金的同学的学校来说(我记得有中大、同济、新国大、中科大、港大等🙂)差的不是一点半点,无意贬低我的母校。但确实这次的经历让我觉得我能努力的地方原来还有这么多,我在学校所认识到的那些知识似乎只是计算机科学的冰山一角,突然在心中对一些东西产生了渴望,让我突然对未来感到期待和兴奋,在这些经历和感受一起冲击我心灵之后,我知道了一件事:我掉进代码这个陷阱里了🥰。 53 | 54 | ### 听说你还在上海科技馆和 Apple 供应链工厂等场合进行过一些线下演讲,这是一种什么体验? 55 | 56 | 由于在学校参加的 iOS Club 与 Apple 有一些方面的交流和合作,所以也参加了一些特别的活动,例如在夏天的时候去上海科技馆免费给小朋友上编程课,就是用上文提到过的 Playgrounds 这个 App,也给科技馆的小朋友分享参加 WWDC 的经历(同时我也发现,现在的 10 岁左右小朋友有编程经历的真不少)。除小朋友外,我还作为助教参加过给 Apple 供应链工厂的 Swift 教学活动,用一个月的时间让一点代码都不懂的工厂员工通过学习实践之后,能够自行开发一个简单的 iOS App。另外我还受邀参加香港教与学博览会分享 playgroundbook 的制作经验,向参观者介绍 Playgrounds 这个 App 作为教学工具的一些优点等等。这些交流的经验带给了我从别的角度看待 Swift 以及 iOS 开发的机会,在准备教学教案这些东西的时候,不可避免地会去研究和比较别的语言、别的技术、别的生态是怎么样的😵,让我了解了一些跨平台技术,对客户端开发多了一点理解。 57 | 58 | 除了这些技术方面的感悟,这些经历带给我了更多情感上的震撼,比如有位 10 岁小朋友学过了Python、C++ 等等语言,对编程思想也理解的很到位,而且为人很谦虚,还会帮助别的小朋友理解代码;还比如在工厂中我们作为老师教那些 20 多岁、30 多岁、甚至 40 多岁的员工写代码,而他们就像是科技馆的小朋友一样,对代码一无所知然后带着好奇和热切的眼神来上课,并且当做不出作业时会很羞愧,这些经历会让我感觉到:诶好像这个世界不是我以为的那个世界这种感觉,我没想到有这么多人在推动编程教育、我没想到这么多人对编程这么大的兴趣、我也没想到学编程对一些小孩子来说是一种消遣、我更没想到多会那么一点点编程能改变一个人的发展。根据给我们的反馈,有一小部分上过我们课的工厂员工由于在编程课的表现很好,被“挖”到了工厂的技术部门,从此工作的地点从流水线换到了办公室🤑。 59 | 60 | ### 能分享下你的学习历程以及保持学习热情的一些方法吗? 61 | 我想我的答案可能和大家想象的很不一样。在校的时候,我是在我社团的推动下成长的,我参加了很多活动、比赛,几乎都是和 iOS 有关的,这些都是是我的社团带给我的资源和推动,比如去参加移动应用创新赛(Apple 赞助)的期间,我学了 ARKit、CoreML、SceneKit、SpriteKit 等等,了解了很多较冷门的 iOS 技术,了解了隐私政策、了解了怎么上架一个 App、以及审核的诸多事项,我的比赛或者活动需要什么我就去学什么,当然这没有什么不好的,没有这些推动我的话我肯定窝在寝室打 Dota(嘿嘿👍)。 62 | 63 | 但至于其他方面的知识?额我懂得很少,记得有次有个评委发现我的 App 里内存泄漏导致 crash 了,他问我为什么 crash 了,我答不出来;记得大四我去面试的第一家实习是英x流x说✍️,面试官和我说他们以前也有一个奖学金的 winner 实习生,表达的意思就是对我蛮期待的,但是后面的面试让他大跌眼镜,我对这次面试印象很深刻,我从第一个问题开始,没有一个问题是答对的(不夸张),答得面试官都有点怀疑人生,他的眼神像是在问我是不是来砸场子的,我对面试的这些内容算是一点都不懂,当时很难受,也很后悔,后悔第一次面试就去了最想去的公司。再之后经过了准备之后换了一家公司得到了 offer,所以在那段时间,**促使我学习的是那种落差感,是那种想要再证明自己的不甘**。再往后我去考研了然后技不如人没考上,那段时间更焦虑了,会一直督促自己去学习,所以其实失败才是我源源不断学习动力的源泉,也希望在今后的成长道路上,失败不会成我唯一的学习动力👨‍💻。 64 | 65 | ### 有什么想借助摸鱼周报宣传的? 66 | 67 | 明年计划换工作了,想去大厂被资本家摧残🤡,坐标上海,邮箱:mim0sa@qq.com,欢迎各位老板骚扰。 68 | 69 | 也希望大家多关注 iOS 摸鱼周报,如果有好的建议和意见快来告诉我们。 70 | -------------------------------------------------------------------------------- /Interview/10_interview_ihtcboy.md: -------------------------------------------------------------------------------- 1 | # 人物访谈 | 游戏行业的 iOSer 2 | 3 | iHTCboy 是摸鱼周报里负责校对的成员之一。记得他第一次参与校验时,我把一期整理好的周报发给他看,他后来给我发了 1600 字的修改意见,我都震惊了。修改意见里即有关于技术点的,也有格式和语言表述的,关键读过之后,感觉他说的还非常有道理,由此可见他做事认真的态度。下面是访谈内容。 4 | 5 | ### 简单介绍下自己吧 6 | 7 | 大家好,我是 iHTCboy,从事游戏 iOS SDK 开发快五年了。目前在 37手游,以 SDK 开发为主栈,自动化技术实践为副栈。目前我们海外版 SDK 中除了仅剩 1% hook 的 OC 代码,全部是 Swift 代码;在游戏行业有多年经验积累沉淀后,我们团队希望打造和分享一些 SDK 相关的自动化方案或框架,未来会逐渐开源,敬请期待,跟大家一起学习交流&进步! 8 | 9 | ### 当初为什么选择计算机这个行业呢? 10 | 11 | 应该是小时候对黑客的幻想,《电脑报》90后应该都有看过吧?而《黑客防线》、《黑客x档案》、《黑客手册》这些杂志,不知道大家有没有看过,初中时很着迷,初中时用破解软件逃过网吧收费系统,高中帮亲戚修电脑重装系统,有非常大的好奇心和成就感。在对计算机编程有全面了解前,总是幻想自己当上黑客后xxx,神秘又强大是每个男孩都有过的梦想吧!所以不加思索的就选择了计算机。 12 | 13 | ### 游戏公司的 SDK 开发日常是什么样的,它跟应用开发有什么区别呢? 14 | 15 | 每一位不熟悉游戏 SDK 开发的朋友都会问这个问题。应用开发大家可能比较熟悉,我们在开发中,也会引用第三方的 SDK,比如友盟 SDK、微信 SDK,这些 SDK 提供推送、分享或者支付的能力。而游戏 SDK 开发也是这个道理,为游戏提供特定平台的原生 API 功能。举例来说,目前主流游戏都是 Unity 引擎开发,游戏开发好后,可以导出 Android 项目或者 iOS 项目(Xcode 项目),然后在接入原生平台的 API。 16 | 17 | 游戏发展到今天,已经高度标准化..... 18 | 19 | 游戏研发专注于游戏内容的设计和开发(跨平台),而 iOS 和安卓平台原生的能力(如支付 IAP)就由我们封装成 SDK,提供接口给游戏调用。 20 | 21 | 1、SDK 开发包括: 22 | * 帐号体系(包括封装第三方账号体系:WeChat、Facebook、Google、Line、Twitter 等) 23 | * 支付体系 24 | * 分享社交 25 | * Web页面(游戏活动、客服、攻略等) 26 | * 数据埋点(广告、留存、数据分析等) 27 | * 性能监控 28 | * ... 29 | 30 | 将以上功能模块封装成 API 给游戏调用,一般就是登录、用户中心(有界面),其它都是业务逻辑处理。 31 | 32 | 2、SDK 是提供给游戏使用,所以不像 App 快速迭代 UI,而是迭代业务逻辑。详细的开发细节,以后有时间专门写篇文章吧。关注游戏行业的发展,可以参考之前写的文章:[游戏出海本地化概述](https://blog.csdn.net/iOSTeam37/article/details/120294727 "游戏出海本地化概述") 。 33 | 34 | ### 看你发多篇调研苹果审核和内购相关的文章,针对最近苹果在美国败诉,撬开苹果 IAP 的限制,你怎么看?这个改动可能带来的影响有哪些? 35 | 36 | 我们先来梳理一下,苹果 AppStore 垄断案的几个新闻关键点: 37 | 38 | | 时间 | 概述 | 引用来源 | 39 | |---|---|---| 40 | | 2021-08-26 | Apple 与美国开发者就 App Store 更新达成一致,开发者可以使用电子邮件等通信方式与用户共享 iOS App 之外的支付方式信息。 | [来源](https://www.apple.com.cn/newsroom/2021/08/apple-us-developers-agree-to-app-store-updates/ "apple-us-developers-agree-to-app-store-updates/") | 41 | | 2021-08-31 | 韩国国会立法和司法委员会通过《电信业务法》修正案,禁止占据市场主导地位的应用商店强迫移动内容提供者使用特定支付方式。 | [来源](https://opinion.lawmaking.go.kr/gcom/nsmLmSts/out/2112203/detailRP "detailRP") | 42 | | 2021-09-01 | 日本公平贸易委员会结束对 App Store 的调查,允许“阅读器”类 App 的开发者在 App 内提供访问其网站的链接,开发者可将用户引导向外部网站进行购买。(*阅读器 App:提供数字杂志、报纸、书籍、音频、音乐和视频的预付费内容或内容订阅。*) | [来源](https://www.apple.com.cn/newsroom/2021/09/japan-fair-trade-commission-closes-app-store-investigation/ "japan-fair-trade-commission-closes-app-store-investigation/") | 43 | | 2021-09-10 | Epic诉苹果垄断案裁决:美国联邦法院命令苹果不得禁止应用发商引导用户通过第三方支付平台付费。法院并不认为苹果公司是手游交易市场垄断者,但认为苹果公司禁止将用户导向其他渠道是反竞争行为。要求苹果必须在12月9日之前执行。 | [来源1](https://www.documentcloud.org/documents/21060631-apple-epic-judgement "21060631-apple-epic-judgement")、[来源2](https://www.documentcloud.org/documents/21060697-apple-epic-judgment "21060697-apple-epic-judgment") | 44 | | 2021-11-10 | Yvonne Gonzalez Rogers 法官拒绝了苹果公司关于推迟执行永久禁令的请求,苹果打算根据这些情况要求第九巡回法院暂缓执行。 | [来源](https://www.ithome.com/0/585/768.htm "https://www.ithome.com/0/585/768.htm") | 45 | 46 | 关于 IAP 内购问题,随着 AppStore 体量越发庞大,大多数开发者认为 30% 税不再合理,其实很多事本身就没有公平合理可言,省略一万字~ 你懂的。 47 | 48 | 大家可能忽视了一个重要的问题:苹果 IAP 收入占比最大的是什么类型的 App?答案是游戏!所以,对非游戏类 App 允许使用 IAP ,目前对于苹果的损失还不是很大,当然,如果没有损失是最好,但是目前的大环境和反垄断,一定会让苹果做出调整。(注:游戏一直以来都是 App Store 中的重头戏,从 2017 年 iOS 11 开始,苹果在 App Store 增加了 [Games](https://developer.apple.com/videos/play/wwdc2017/301/ "Introducing the New App Store - WWDC17") 游戏标签入口。) 49 | 50 | ![](https://cdn.zhangferry.com/Images/AppStore入口更新.jpg) 51 | 52 | 53 | 对于苹果败诉带来的影响: 54 | 55 | (1)苹果在美国一定会上诉,一般垄断案可能长达几年时间,所以苹果愿意继续打官司,尽量拖延时间(参考微软 IE 浏览器反垄断案,从1997年到2002年)。 56 | 57 | (2)苹果降低 IAP 税率或允许所有 App 使用第三方支付是时间问题,但没有了 IAP,苹果可能会推出其它的服务费。 58 | 59 | > 就在 11 月 19 号,谷歌宣布韩国地区的 Google Play 商品允许应用接入第三方支付系统。谷歌目前每年前100百美元抽15%,超过后30%。按谷歌的新规,韩国地区接入第三方支付系统,谷歌依然从中收取11%(26%),也就是说抽成只是被降低 4%。 60 | > 简单来说,就是谷歌允许开发者使用第三方支付系统,但没有说不能抽成啊!抽成和允许第三方支付,不冲突! 61 | > 62 | > 为了应对韩国的新法规,Google 已更新 [Google Play 付款政策](https://notifications.google.com/g/vib/AD-FnExDtmYdlWJuWrU-ItYZHXWvIemvH3_d7LJNriYjI1Xy-URZHDgRXoKECWFNrQ9NoVsZ9DpQEF9ICqST7axfN35HfTmowLztvXJ3reoCUCGbyMggAuRwHtmXTrPGsMddmLdkMLDzjBRN50kTjBM2oqgiy5KRa-A-VvEk-IOIZz-0pqiumbCBV1tEl4K5OX_eEEYzZE94-lKBpdpZaodzJ3wJAGISYi8v_8QHH64Ptqo4lOjzHGZkGAOuzFTsAg2k-zLHUAe9JfpDBYNtF5lh59FB6c5GxSpiaz9mYbWtsBc "Google Play 付款政策") 。 63 | 64 | (3)对于开发者来说,肯定是好事。但这件事背后,是大资本之间博弈的结果,一定要明白为什么可以赢,比结果重要。 65 | 66 | > 看过你的博客:https://ihtcboy.com/ ,从2008年就开始写了, 这是一个非常长的时间跨度。关于博客部分也有几个问题想问下你。 67 | 68 | ### 培养一个良好的习惯并持之以恒是一件不那么容易的事情,能讲下你是如何培养写作的兴趣以及对培养一个有益的习惯有什么建议吗? 69 | 70 | 高中语文课最讨厌的就是写 500 字作文,但没有想到自已大学后会喜欢写作。写作可能是我小时候比较孤僻,很少与人交流,总喜欢自言自语道,也许是这个原因,自己会有很多天马行空的想法或者内心独大。而作文是根据要求写作,限制你话题,没有自由的发挥和空间。 71 | 72 | 当然喜欢是一回事,写的好不好才最重要!培养写作,我认为要了解写作的注意事项,怎么样的文字修饰有多妙,多模仿多练习。培养习惯,更多是从一个个可行的小目标做起,积累量多了,慢慢就是习惯。切忌急功近利! 73 | 74 | 写作一定也有通用的规律规则,比如 [中文技术文档的写作规范](https://github.com/ruanyf/document-style-guide "中文技术文档的写作规范")。大家多写写,多总结,一定会有自己的收获。 75 | 76 | ### 你写过如何建立自己的开发知识体系的文章,程序员也是一个需要不断学习的行业,关于如何让学习这件事变得有趣,再分享一下你的见解吧? 77 | 78 | (1)说起来见笑了,[建立自己的开发知识体系](https://ihtcboy.com/2020/02/02/2020-02-02_%E5%BB%BA%E7%AB%8B%E4%BD%A0%E8%87%AA%E5%B7%B1%E7%9A%84%E5%BC%80%E5%8F%91%E7%9F%A5%E8%AF%86%E4%BD%93%E7%B3%BB/ "建立自己的开发知识体系") 只是觉得大家可以往一些通用的方向去梳理。现在回想起来,发现自己也没有什么都懂,可能接触和学习更多知识后,发现自己空白面更多,然后就越想学习。所以,也许再过几年,会有更深的理解,之后再跟大家分享啊。 79 | 80 | (2)“不断学习”我认为是21世纪,每个人都要学会的。就像父母要学会用智能手机,否则健康码都打不开,在城市里寸步难行。所以,大家一定要正面接受它,每天都要学习和进步。 81 | 82 | (3)“让学习变有趣”,其实我一直认为看书,应该是让人感到愉快的事情。但为什么大家都不愿意学习了呢?我觉得最重要的是,大家越来越急功近利,一切都为更快,从而忘记了体验过程。举个例子,去旅游时,可能为了发一个朋友圈,一直拍照修图,刻意的、绞尽脑汁的想,却没有享受风景的心境。所以学习本身如果慢下来,不只关注结果,还关注或者尝试从问题到结果的推演过程,这样的学习会更有趣一些。 83 | 84 | ### 你博客有很多思维导图,思维导图除了能够帮助梳理知识外,还有其他什么好处吗? 85 | 86 | 大家一定知道一个道理,图片比文字更加形象。思维导图比一段文字也更加生动形象,所以,它不仅能够梳理知识,还能理清知识的层次和架构,帮助记忆知识。举个例子,[Vim 快捷键](https://mp.weixin.qq.com/s/iFJ-EcJPCSbzpQp4nyBzZQ),如果你忘记了,打开思维导图,一看就知道: 87 | 88 | ![](https://cdn.zhangferry.com/Images/20211120140108.png) 89 | 90 | 再比如,说到[人工智能](https://mp.weixin.qq.com/s/mT76LA7AVGZhnQj89sRnSw),可能想法很多,那么大的框架应该是怎么样的呢? 91 | 92 | ### 最近有什么感悟想跟大家分享的吗? 93 | 94 | 关于内卷的话题,网上有很多讨论,大多数是吐槽或者劝退。我想换一个词,“努力”,为什么会有人很努力?现在大家都达到小康生活后,大多数人会选择躺平,然后自嘲自己是打工人。其实自甘打工的还是少部分人,大部分还是想往上跳一跳当老板的。另一方面在一个阶级中,努力的人,往往是想要跳出这个阶级的。就是这个往上跳的愿望,它需要的正是努力。 95 | 96 | 所以,努力它本身上没有错,这代表一种向上的态度。但需要注意的是努力的结果,是不是可以为你改变什么?如果可以,我觉得努力无可厚非。否则,就是真内卷。 97 | 98 | 最后,有一句话送给大家一起共勉: 99 | 100 | > Follow your own course, and let people talk. 101 | > 走自己的路,让别人说去吧! 102 | > - 但丁 《神曲》 103 | 104 | ### 有什么想借助摸鱼周报宣传的? 105 | 106 | 欢迎大家关注我们掘金公众号:[37手游iOS技术运营团队](https://juejin.cn/user/1002387318511214 "37手游iOS技术运营团队"),会定期分享一些有趣的文章。 107 | 108 | 如果大家有兴趣加入三七互娱,可以查找相关岗位 :https://zhaopin.37.com ,或者将简历发给我内推:ihetiancong@gmail.com。不要担心有没有相关岗位,优秀的人,在哪里都是金子! 109 | 110 | > 如果有其他问题想跟 iHTCboy 交流,还可以在留言区评论。 111 | -------------------------------------------------------------------------------- /Interview/11_interview_jojo.md: -------------------------------------------------------------------------------- 1 | # 人物访谈 | 一位 iOS 程序媛 2 | 3 | Jojo 是我的前同事,做事非常细心,负责过团队多项重要功能的开发与建设,是我接触过为数不多的比较优秀的程序媛之一。这次邀请到她,来聊一聊她眼中的 iOS 开发。 4 | 5 | ![](https://cdn.zhangferry.com/Images/programmer_girl.jpg) 6 | 7 | ### 简单做个自我介绍吧 8 | 9 | 大家好,我是 Jojo ,90后,一直从事 iOS 开发的一枚湖南妹子,喜欢交朋友,容易与人相处。现在是一名娃 3 岁➕的宝妈,如果有北京的宝妈,一起遛娃呀,哈哈哈~ 10 | 11 | ### 当初学计算机专业出于什么考虑?后来为什么选择了 iOS 开发? 12 | 13 | 从小农村长大,初中才开始接触电脑,感觉计算机特别神奇,出于好奇,就走了编程这条路。当时 iOS 比较火热,苹果手机高端,能在高端手机上开发 App,会是一件愉快的事情。 14 | 15 | 16 | > 目前程序员群体的男女比例大致在 9:1,女生的比例还是比较小的。 17 | 18 | ### 作为女生,你怎么看待这种状况,有质疑自己选择做程序员这件事吗? 19 | 20 | 我工作时遇到开发的女生还是挺多的,也许现在比例较低,个人认为以后会越来越多。目前为止,我认为自己走上编程这条路没错,也没后悔过。自己是比较简单的人,开发圈相对来讲也比较简单,挺喜欢的。 21 | 22 | ### 你目前的工作状态是什么样的,有没有困惑或迷惘? 23 | 24 | 目前工作状态还不错,知道自己想要什么,需要哪方面充电,也正在往自己希望的方向走,工作三年左右那会有过迷惘,感觉大部分东西能实现,工作中需求也能完成,遇到了程序生涯第一个天花板,却不知道怎么突破,那会感觉这辈子只能这样了。 25 | 26 | 后来遇到了一群可爱又优秀的人,也不排除年纪增长带来的觉悟,能发现自己的不足,目标越来越清晰,了解目标应具备什么能力,寻求突破。不知道大家有没有过相同感受,我曾经不太喜欢看书,逼着自己都看不下去那种,近期却非常想看书,发现认真读完一本书真的可以学到不少东西。 27 | 28 | 最近在看《非暴力沟通》,读这本书一开始是因为家里有个调皮小孩,天天跟我唱反调,心累得很。收获,让我懂得分析矛盾产生原因,以及如何去解决矛盾,书中会提供几种方法,总而言之,冲突产生时,学会倾听内心的声音,然后站在对方角度去感受,这样很大可能能够建立积极关系,收到良好反馈。不仅育儿有用,工作中同样受益匪浅。 29 | 30 | ![](https://cdn.zhangferry.com/Images/feibaoligoutong.jpeg) 31 | 32 | 如果大家有看过的好书,感谢推荐给我看看。如果有跟我一样困惑的人,还没遇见影响着自己变的更好的人,那就多看些好的有意义的书,说不定能找到点思路或者多交交朋友。遇见优秀的人多了,自己也会变得更加优秀。 33 | 34 | ### 作为程序媛,有没有什么与程序猿不同的工作方式?也可以介绍一下自己的高效工作法。 35 | 36 | 个人感觉程序媛会更细心,可能这是女性特质。 37 | 38 | 仅代表个人的一个有效的工作方式是,习惯写 ToDo List 。按照重要和紧急两个维度把待办事项列出来,然后按照紧急重要排优先级一个个完成,这样做会有这些好处: 39 | 40 | 1、做事不会遗漏。工作中随时都有可能被一些事情打断,有插入事项时,能及时记录进去,我比较健忘,所以对我帮助还挺大的。 41 | 42 | 2、有助于回顾。写周报时看 To Do List,秒完成。 43 | 44 | 3、建立目标感。有目标的每天,时间过得快而充实。 45 | 46 | ### 关于“程序员是青春饭、35岁失业”等,作为程序媛,你怎么看这个问题? 47 | 48 | 青春饭 35 岁就失业这个我以前也有过这样的想法,现在则有不同的看法。淘汰的永远是年纪跟能力不匹配的人,所以与其为未来焦虑,不如为现在努力,让自己保持进步和成长。 49 | 50 | ### 你觉得工作中最重要的一项技能是什么? 51 | 52 | 自学能力。曾经就职的公司,开发能用 Swift 的得用 Swift 开发,而我在这之前一直只用 OC ,如果自学能力不够,很难跟得上。不知道大家有没有这样一种错觉,干过编程的,再去干别的,只要给足够多时间,没有学不会的自信😁,我认为这是自学能力带来的信心。 53 | 54 | ### 你现在还要带娃,个人时间应该更少了吧,你是如何平衡工作和学习的呢? 55 | 56 | 相对来讲会减少一点,但也不是没有个人时间,以下方面起到不少作用: 57 | 58 | 1、提高效率,像上面记录 ToDo List 的方式,自己认为是提高效率方法之一。 59 | 60 | 2、寻找合作伙伴,平时我婆婆在这边帮我,我老公也会一起带娃。 61 | 62 | 3、娃上幼儿园后,大部分时间都在学校度过了,目前工作学习带娃没有失衡。 63 | 64 | 不过追剧逛街的时间确实没以前多了,要买啥,记录下来,申请一下逛次狠的😁。平常还会再抽出一些时间看看书,学习一下。 65 | 66 | ### 让你坚持做程序员的动力或目标是什么?有没有什么心得或经验分享给其它程序媛? 67 | 68 | 在任何行业做好一件事都是有难度的,感觉计算机行业自己也挺喜欢,好像没有理由不继续下去。 69 | 对所有女程序员说:如果不讨厌编程,Just do IT。 70 | 71 | ### 有没有什么想借助于摸鱼周报进行宣传的? 72 | 73 | 大家如果对百度感兴趣,可以随时把简历发我邮箱:jojocaonet@163.com,找我内推。马上过年了,买不买新衣回家过年就靠大家了,哈哈哈。 74 | 75 | 大家如果不嫌弃认识我的话,可通过飞哥加我微信,也可以通过邮件跟我交流哦。 76 | -------------------------------------------------------------------------------- /Interview/12_interview_xiatian.md: -------------------------------------------------------------------------------- 1 | # 人物访谈 | 一位普通的 iOS 程序员 2 | 3 | 夏天是摸鱼周报的一位主编,主要负责 Tips 部分的编写和审核。他曾参与[掘金翻译计划](https://github.com/xitu/gold-miner "掘金翻译计划"),翻译过很多篇优质博客内容,也翻译过像是 [iOS Crash Dump Analysis Book](https://github.com/faisalmemon/ios-crash-dump-analysis-book "iOS Crash Dump Analysis Book") 这一类的外文图书。今天拉他来聊一聊关于外文翻译和他个人的一些工作感悟。 4 | 5 | ![](https://cdn.zhangferry.com/Images/lewis-keegan-oB2aEeE8s4A-unsplash.jpg) 6 | 7 | ### 简单介绍下自己吧 8 | 9 | 哈喽,各位摸鱼周报的读者好,我是夏天,是一位双`非`的`老` iOS 程序员。目前在摸鱼周报里面`摸鱼`。 10 | 11 | ### 一般优秀的英文文章,不会马上就有人翻译,所以,如果想获取一手英文资讯,有什么有趣或者必看的外国网站推荐吗 12 | 13 | 一般都是通过[Medium](https://medium.com/ "Medium"),[Realm](https://realm.io/ "Realm") 之类的网站,然后注册一下邮箱,接收推送,没事翻两篇。 14 | 15 | 看到好文章时,看看他们的参照了谁,参照作者可能也有好的文章。 16 | 17 | ### 之前翻译过不少内容,像是:《iOS Crash Dump Analysis Book》,是出于什么理由进行翻译的呢?翻译这个长篇有什么收获? 18 | 19 | 《iOS Crash Dump Analysis Book》这本书,我是在 19 年看到的,其实并没有仔细阅读下去。后来想仔细阅读的时候,发现网上并没有译文,我就申请翻译一下这本书,作者也是很慷慨,给予了这个机会,让我完成了 1.0 和 2.0 的翻译。 20 | 21 | 我觉得整体翻译下来的收获,大概就是形成体系的去了解一些关于崩溃的结构和作者在进行奔溃分析时的分析途径和方法。整本书是一个概论,虽然不能让你成为一个 `crash` 分析高手,但给了一个格式,在碰到崩溃的时候,可以按部就班的去进行分析。 22 | 23 | 为此我还写了一篇观后感[iOS 崩溃分析](https://mp.weixin.qq.com/s/sUfPaAe2UEqRlQ7JXUAADw)。 24 | 25 | ### 技术文章翻译的过程中那部分是相对困难的,有没有什么经验可以分享的 26 | 27 | 第一就是语感,翻译完以后多读几遍,没有 `deadline` 的翻译,你都可以翻译完以后,过几天再去读,再优化一下,至少读到你自己不变扭,能通顺为止。 28 | 29 | 第二就是实践,虽然里面很多技术你不能去实践,但是你可以去了解。文章的引申阅读和搜索一下相关技术。我在写 [字节跳动移动研发工具链 - MBox](https://mp.weixin.qq.com/s/OD2lYfA9tkdgEp4QGRtdog) 一文的时候,也是尽量保留原作者的本意,去了解对应的技术及其实践,进行再创作。 30 | 31 | ### 听说你最近一直在写前端需求,前端和iOS有什么区别?iOS开发想往前端过渡的话,有哪些注意事项? 32 | 33 | 写的都比较简单,都是偏业务方面的。思想上和逻辑上没有大的差异,唯一需要注意的是,如果你接手别人的项目时,一定要`心平气和`,因为前端很坑爹的是`怎么写都对`。 34 | 35 | 学点CSS,学点JS,就可以开始过渡了,期间体系化的学习一下。 36 | 37 | 期待你在一家好的公司,什么东西都有,然后你顺着经验就可以开始夯实之路。 38 | 39 | 利用公司的项目锻炼自己,可以根据现有的模板,从零开始,从第一个组件,到第一个业务模块等等。 40 | 41 | ### 对于“大前端”这个词,你怎么看?随着跨平台、Web WebAssembly等技术发展,会不会统一成一个工种? 42 | 43 | 我理解是为用户体验负责,各种与用户有直接接触的都算是大前端,不过这可能更偏向于程序员这一职业。 44 | 45 | 前端程序员几乎都做着类似的事情,差不多的开发流程,页面埋点,发布流程,项目持续集成,页面性能监控 APM ,工程化,组件化... 46 | 47 | 技术永远都有差别,都是往前也不一定是同向。 48 | 49 | 也许未来这些为页面服务的人员可能会慢慢的变成一类,但是其中的某些人难以忍受这种越来越同化的工作又会开始异化出新的种类。 50 | 51 | 技术不停步,工种就永远有差异。 52 | 53 | ### 在这几年的iOS生涯里有什么比较大的收获?你怎么看待程序员这个行业? 54 | 55 | 没看到有啥收获,连个只能被铭记的功能都没有。 56 | 57 | 程序员这个行业,是一个注重基础和思考的行业,用数据结构和设计模式规范具体的行为,注重实践动手能力。 58 | 59 | 这个行业需要你一直学习,终身学习。 60 | 61 | 不应过分功利,需要一定的职业操守和道德。 62 | 63 | ### 自己在工作中有没有什么好习惯或者高效的工作方法可以分享的 64 | 65 | 解决问题的方式不要困于一种途径,交流能让你成为更好的人,多出去分享去交流,可以使人进步。 66 | 67 | 学到什么一定要做出来, 写下来,讲出去。 68 | 69 | ### 最近的一个生活感悟是什么 70 | 71 | **努力,生活总有好事发生。准备迎接好事发生**。 72 | 73 | 偶尔咸鱼也没关系,躺着是很舒服,但是还是要`动一动`的,不然真的会腰酸背痛 74 | 75 | ### 你的公众号感觉最近更新少了,后续还会恢复吗? 76 | 77 | 不更新的原因有很多: 78 | 79 | * 创作热情:在更新一段时间后,读者的增长量没有达到自己的预期,心理有些懈怠 80 | * 创作质量:期望与创造出真正有价值的东西,但是囿于能力等因素,既不想水,也写不出好文章 81 | * 创作方向:平常的工作更多是业务相关的,作为一名`老` iOSer 并没有自己固定擅长的地方,想像书籍一样写点东西,但是不太清楚具体些什么。 82 | 83 | * ... 84 | 85 | > 最最主要的原因就是懒 86 | 87 | 后续还会恢复更新的。目前在进行 `Swift` 的学习,之前也开了一个`Swift 100 Days`的专题,还在想怎么在里面添砖加瓦,丰富成一个系列 88 | 89 | ### 有什么想借助摸鱼周报宣传的 90 | 91 | 希望大家支持我的公众号:iOS成长指北,也希望大家与我交流。 92 | 93 | 承接各种技术类文章写作,一起交流学习。 94 | 95 | -------------------------------------------------------------------------------- /Interview/13_interview_parsifal.md: -------------------------------------------------------------------------------- 1 | # 人物访谈 | 老司机周报主编 Parsifal 专访 2 | 3 | Parsifal 是老司机周报的主编,今年他给摸鱼周报提供了很多帮助和建议,这里对他再次表达一下感谢。这次邀请他来做一期访谈,主题分为两部分,一部分是老司机周报的发展故事和他的行业观察,另一部分是他对开发者的一些建议。如果大家还有其他问题欢迎留言提问~ 4 | 5 | ![](https://cdn.zhangferry.com/Images/20211211190529.png) 6 | 7 | ### 简单介绍下自己吧 8 | 9 | 哈喽,各位摸鱼周报的读者好,我是 Parsifal,是一位 iOS 开发多年的老司机了。17 年底开始加入「老司机技术周报」编辑组,到 18 年底正式接手至今,主要负责其运营工作(其实就是给我们编辑组的大佬们打打杂)。二次元一点说,我算目前的二代目,当然我们也很快会迎来三代目,感谢大家一直以来的支持~ 10 | 11 | ### 当初创办老司机周报的目的是什么,能讲一些当时的背景吗?现在回想来看,对比当时的目标,达成度怎么样? 12 | 13 | 老司机技术周报自 17 年 12 月创刊以来,已经更新了整整 4 年时间。在我的认知里,4 年对于一个社区组织的生命周期来说,是很长很长了,长到足够让一个小萌新成长为优秀的成熟开发者,甚至长到我们读者群可以完成一轮新陈代谢。 14 | 15 | 现在我们的很多读者,谈到周报编辑组,可能更熟悉的是负责我们社群运营的老王[「Damon」](https://github.com/Damonvvong),或者时不时会在周报中插播公告的[「Parsifal」](https://github.com/ParsifalC),但如果要谈到周报创办的往事,就需要请出我们的创始人 - [「没故事的卓同学」](https://github.com/lacklock)。作为整个编辑组的一代目,老卓一直被我们认为是编辑组的灵魂人物,即使他 18 年底已从编辑组“退休”,但他创办周报的初衷我们还是延续了下来。 16 | 17 | 在经过 14、15 年的野蛮发展后,17 年我觉得是 iOS 开发的一个巅峰尾巴。那会儿很多优秀的开发者依然在社区内活跃着,比如老卓就是其中一位。他是非常擅长和乐于分享的,在周报创办之前也深受大家喜爱。在社区内容输出还很爆炸又良莠不齐的当时,老卓就有了想法要将自己平常看到的优质内容,定期整理出来分享给大家。当然这种事情是人多力量大的,所以老卓又和几个好友聊了下,大家都觉得很有意义,就水到渠成地组成了编辑组的第一批元老 Damon\MM\味精\EF\四娘和 BlackSun 等。随着这几年的不断成长和纳新,周报编辑组已经有 30 多人了,但我们的初心依然没变 - 为读者输送有价值的内容。 18 | 19 | 这么多年的积累,让我们有了一个非常高质的资源库,我个人是非常喜欢在周报仓库检索内容的;WWDC 内参活动越办越好,质量和数量都有了很大提高;今年编辑组也尝试了线下沙龙的方式,用周报的影响力帮助企业对外输送高质内容;我们一直以来做的事情,也逐渐被官方关注和认可。 20 | 21 | 现在回想来看,老卓的目标在他“退休”那天就已经实现了,周报每期都能够顺利发布,18 年的时候周报已经有了相当的影响力,当时主要的两个更新渠道 GitHub 和掘金都收获了较大的关注群体。而于我个人而言,18 年底从老卓手里接过来运营,算超预期了吧。按我原计划,接手后我负责 18 年的收尾工作,让周报能够有个相对完整的 ending。 22 | 23 | 但后面做着做着发现,编辑组的朋友依然还有着热情继续做这个事儿,Damon 和邦本等人也愿意加入平时的运营,并且得益于老卓之前的管理原则:周报的编辑周期不强依赖于某个人,我们还是坚持了下来。 24 | 25 | 18 至 20 上半年左右,周报的发布其实也是轮值的,而后由于调整了发布渠道和时间,并且开始重视公众号运营,才转为主要由我负责发布,我有事的情况下再找其他人代班。然后就是整个编辑组还是得有个人做下统筹,负责一些人员流转,对外合作,以及内参啊,沙龙啊等等其他的活动。轮值没有具体的多长时间,看上一任自己意愿吧。接着编辑组不断吸收优秀的开发者,团队越来越大,新老编辑交替也在很自然地进行。 26 | 27 | 我的周报编辑生涯可能也很快会结束,但老司机技术周报应该还没到停刊的时候。关于这些,接下来我们一二三代目会一起在老卓播客细聊。大家可以开始期待周报三代目了~ 28 | 29 | ### 到目前为止老司机周报已经出了180多期了,分享和传播了非常多优秀的资源和内容,某种程度上也推进了整个 iOS 行业的发展。作为活跃在这一领域最前沿的一群人,在这4年期间里你感受到的变化是什么? 30 | 31 | 作为周报这类聚合资讯性质的内容创造者,我们可以说是最了解社区的那批人了。我们的内容源自于社区,所以对社区发展方向和热度是十分敏感的。这几年,从行业上看,如我上面所说的,17 年算是一个尾巴,而 18 年至今整体趋势还是相对稳定去泡沫化。不过这其实就是一个行业正常的生命周期,萌芽到野蛮生长,稀缺到泡沫化,然后会到稳定的成熟期,最终到衰退期。 32 | 33 | 社区产出的内容,也伴随着行业的稳定,没有了之前百花齐放资讯爆炸的光景。整体感觉就是新的东西越来越少,老的东西还在一遍又一遍地被新人挖出来继续写。而我们的读者群里,0-2 年新人也几乎成了凤毛麟角,早两年虽然也少(我们的内容更偏中高级开发者),但不至于看不太到。 34 | 35 | 整体社区的内容产出来看,17 还是 OC 内容占了大部分,然后是慢慢国内外出现了分歧,国外 18 年开始 Swift 的内容占比越来越大,这几年几乎都见不到国外有 OC 方面的产出了。18 年开始至今的国内,则对跨端(ReactNative\Flutter\Weex)方案爆发了热情,至于 Swift 依然没看到大范围的使用。 36 | 37 | ### 创办老司机周报的过程,都遇到过哪些困难?未来老司机的走向是什么样的,有没有什么规划呢? 38 | 39 | 17 年底起步到 18 年上半年,都算比较顺利,刚开始大家的热情也比较高,也比较有精力做这些事情,同时那会儿社区的优质内容也多,也有很多新的东西被不断挖掘出来。而后我们就遇到了第一个比较大的困难,每周被推荐的内容不够,从而需要主编来花费更多时间去收集。 40 | 41 | 未来的走向我现在不太好说,但目前的形势是很好的,今年做的几个尝试反响也很好,我们会争取更大的影响力,并继续尝试与苹果做一些进一步的合作。当然,更具体的未来规划,就等我们下一任主编官宣后再聊了。 42 | 43 | ![](https://cdn.zhangferry.com/Images/ant-rozetsky-HXOllTSwrpM-unsplash.jpg) 44 | 45 | ### 随着移动互联网红利的消失,对 iOS 开发的要求可能不再仅限于能做出一个 App。如果需要进一步提升,学习的广度和深度,哪一个帮助可能更大? 46 | 47 | 其实我不太认为说以深度为发展方向的开发者和以广度为方向的开发者存在明显的孰优孰劣。为什么会有这两种特征明显的开发者?还是市场需求决定的。这几年大厂产品越来越成熟,那么自然对专精人才的需求就随之增大,比如各类的极致性能优化、基建建设和效能提高等,团队发展到一定阶段,遇到瓶颈了这些需求就出现了;但同样的,全面手,比如大前端全栈开发者,依然是很多企业喜欢的。既然路有很多条,那么主要还是看自己适合和擅长哪条了。 48 | 49 | 选择了哪条路,如何提升?我觉得理好知识图谱,按点攻破即可,方法论不难,关键还在于执行力。前几年看过成甲的一本讲关于如何学习的书,如果还没有形成一套自己学习技巧的朋友,建议快速过一遍,取其精华。 50 | 51 | ### 面对 Flutter、Uni-App 等跨端技术的崛起,对iOS行业未来的发展你怎么看?对当前的iOS从业者有什么想说的? 52 | 53 | iOS 环境这几年确实被吐槽得厉害,事实上我也有认识的同事辞职回家种花当老板。未来几年,iPhone 还会是销量前几的产品,苹果还会是那个科技巨头。iOS 开发者接下来会相对平稳了吧,直到下一个颠覆性产品到来。别把自己局限于 iOS 开发者,我们是做最接近用户端这一侧的开发者,现在是 iPhone,Apple Watch,以后还可能是 Apple Glasses。元宇宙革命正在进行~ 54 | 55 | ### 开发人员除了掌握本职的技术知识外,现在也越来越多提到「软技能」这个词,在你看来有哪些软技能是在职业发展中比较重要的。 56 | 57 | 提到软技能,应该有不少人都或多或少看过或听说过《软技能:代码之外的生存之道》一书。这本书也有提到「十步学习法」,同样适用上面那个问题。当然,这本书讲的方面很广,从社交、理财到健身什么的,作者都分享了自己的经历和想法。我这里基于自己的一些职场经验,简略谈谈职场开发者可能需要的一些软技能吧。 58 | 59 | 需要掌握**优秀的检索能力**,检索能力往往会被很多人忽视,但在工作中却很重要。虽然我们常常调侃面向搜索引擎编程,可这就是绝大多数人的编码常态。好好提高检索能力,会让你效率大增,并且学习起来也比别人更快一步。检索第一步是去哪里搜?Google 作为程序员第一搜索引擎,自然不是个坏去处,但某些场景,可能有更好的地方。比如,我现在想看某些方面的文章,我更优先检索的就是周报仓库。知道了去哪里搜之后,怎么组织关键词去搜就直接决定了你能搜到什么了。编码相关的问题,我更推荐是直接按英文关键词拼接空格来搜,这样搜到的东西往往更准确,而且资源也会更多。最后就是一些相对进阶点的搜索技巧,引号精确匹配,默认模糊匹配等等。 60 | 61 | 老生常谈的**提问的能力**,作为一个某领域的萌新怎么去请教别人也很值得重视。一个好的提问可以帮你更快得到答案,也省了对方很多时间。以寻求帮助去提问的场景下,比如问你的导师,或者平常的一些技术群求教,一个好的提问大体是需要包含这几点内容:谦虚的态度,细致的问题背景,目前你的进度和结论,你期望得到的帮助等。 62 | 63 | **完成事情的能力**,有些人叫「拿结果」的能力。在日常团队管理中,我是比较强调办事能力的,这一个能体现综合水平的点。有些开发者编码能力很强,但他并不一定能把事情做好。在团队内把事情做好,需要足够的责任心,良好的沟通协作能力,过硬的业务水平,有时候还需要有很强的韧性。 64 | 65 | ### 开发的职业发展过程中大多数都会经历瓶颈期,你有没有经历过类似的阶段,后来是如何突破的?对于处于这种阶段的同学,你有什么好的建议吗? 66 | 67 | 可能是自己没有很高的追求,我的职业发展相对比较顺利。所以给不了很有价值的建议。但如果说我自己真的遇到了,我估计会索性放空自己一阵子,任性放纵自由一段时间,都放松下来后,再来思考下一个阶段需要怎么走。生活压力很大,并不是每个人都有这样的机会和勇气这么处理,总之挺过去就好。 68 | 69 | ### 人生就是无数习惯的总和。在你工作中遇到过哪些开发人员好的和不好的习惯,能给我们分享一下吗?能再分享一个你自身具备且感觉对自己帮助较大的好习惯吗? 70 | 71 | 有些小伙伴比较好的习惯是不定期的去**归纳总结**,将所做过的事情,解决好的问题,新掌握的知识,都去做一个阶段性的总结。为自己的总结再设立几个问题,通过这几个问题去判断总结的效果是否理想。 72 | 73 | 不好的习惯,有些小伙伴遇事先条件反射性地自我否定算一个吧。碰到一个困难,第一反应就先觉得这个不行,那个不可能,这不是我的问题等等,本能地去推脱,久而久之也就丧失了正确评估一个事情的能力。或许是出于自我保护意识,察觉到威胁先跑路,但这确实是很不好。于己,这样会让自己的上限不断被压缩,仅维持在一个相对安全的小舒适区;于人,不断地被否定,也会影响对你的观感。 74 | 75 | 我一直认为开发人员不应该扔掉代码,尤其是中低层管理,这很容易会让自己失去竞争力。平常写写代码,**保持编码逻辑的触觉**,也能让自己跟团队其他伙伴更能走到一块。 76 | 77 | 另外对于普通开发者也好,技术管理层也好,定期去**关注业界动态和社区技术生态发展**,也是很重要的。每周看老司机技术周报就是一个很好的途径,哈哈哈~ 78 | 79 | ### 很多开发都知道学习的重要性,但又常常陷到工作中无法抽身学习,就学习和工作的平衡性应该如何维持呢? 80 | 81 | 对于很多人来说,这可能是一个普遍的问题。这里聊下我自己的看法吧。首先还是需要从工作中去学习,毕竟这占据了我们大部分精力,去和自己的直属 Leader 多沟通想法,将一部分想学习的能力与自己的工作内容结合起来,落到工作中去实践。 82 | 83 | 然后是必须注重学习效率,一个阶段做一个事情,贪多嚼不烂;最后,虽然我很不鼓励内卷,平常自己也不 996,但很多人拉开差距真的就是在工作之外的时间。去培养自己的兴趣,将能够给自己带来乐趣的学习内容安排在非工作时间。 84 | 85 | ### 讲一个最近的生活感悟吧? 86 | 87 | 杭州疫情在这几天又复发了,且有迅速扩张的态势。注意防护,没事少出门,听从指挥,少给别人添乱~ -------------------------------------------------------------------------------- /Interview/16_interview_tangzhu.md: -------------------------------------------------------------------------------- 1 | # 人物访谈 | 人在上海的东阁堂主 2 | 3 | 东阁堂主是我非常早就关注到的一位开发者,他写过不少开源库,个人 Github 地址是:https://github.com/dudongge 。本人非常热爱技术,最近翻译了一本 iOS 架构相关的技术书。因为他在上海,还处于封控期间,除了聊工作也会聊一下他目前的生活状态。 4 | 5 | ### 简单介绍下自己吧 6 | 7 | ![](https://cdn.zhangferry.com/Images/15221650267704_.pic_hd.jpg) 8 | 9 | 大家好,我是东阁堂主,在成为码农之前,在车企里做过售后,仪器厂做过测试,电子厂做过机修。受室友影响,15 年入坑 iOS,目前在 B 站的漫画事业部。 10 | 11 | ## 工作相关 12 | 13 | ### 能简单分享下你的工作内容吗? 14 | 15 | 目前我在项目负责哔哩哔哩漫画国内版和国际版的需求开发,也会做些性能优化,比如启动优化,包体瘦身,核心页面的秒开优化等。从 20 年开始,B 漫就在项目中嵌入 Flutter,目前新需求基本都是 Flutter 开发。Flutter 开发页面很快,开发人员没有增加的情况下,开发效率反而大幅提升了。当然测试效率也会提高,之前要两端都要测试,现在只有着重测试一端,另一端测测兼容即可。 16 | 17 | ### 最近在上海的工作状态怎么样,生活各方面造成的影响大不大?可以分享一些这段期间学到的「封城」生存之道。 18 | 19 | 受疫情影响,我不得不蜗居在公司附近的出租房里,工作可以在家办公,但效率会稍微打折(主要是没有大屏的显示器)。狭小的空间限制我的躯体,却限制不了我的灵魂,我一向比较乐观,最近也是被抢菜搞得有些疲惫,生活物资基本全靠团长和政府救济,不能想吃什么吃什么了。总结一些封控期间囤物资的技巧吧: 20 | 21 | * 如果有官方消息要留在家中,可乘空闲时候去附近超市采购,如果厨具齐全,米面油,杂粮,速食,干蔬之类的可多备点,注意,在采购东西时一定要注意安全。 22 | 23 | * 封控期间可在 App 上抢东西,比如叮咚,美团,盒马,他们会在规定的时间内开放购买入口,要先把东西提前加入购物车,因为等开放时刻再加,基本上是来不及的。用安卓手机的可以在网上下载个抢菜插件(https://github.com/Skykai521/DingDongHelper),iOS 用户有筋膜枪就用筋膜枪吧。还有就是注意捡漏,时不时刷一刷,厂商也会时不时补货。等货到后,要注意货物表面消毒。 24 | 25 | * 加入小区群,这个是最靠谱,最省时省力的方式。团长发起团购消息时,及时回应,因为团购有截止时间。我加入的团购群有猪肉群,鸡蛋群,蔬菜群,牛奶群,面包群等。有什么需求,可以直接在小区群里咨询,有富裕的东西可以物物交换。 26 | 27 | * 找跑腿小哥,不过会加相应的跑腿费,只要价钱合适,会有小哥接单的,让小哥代买一些食品。 28 | 29 | ### 在 Bilibili 工作是一种什么体验? 30 | 31 | 在 B 站漫画部门上班,氛围比较轻松,也算是弹性上班,公司鼓励奇装异服,彰显个性,可以带宠物上班,也有很多流浪小动物寄养在公司,哦对了,入职即送 B 站大会员🍻。 32 | 33 | ### iOS 开发没人要了,网上有很多这样的劝退论调,结合你跟 iOS 之间结下的渊源与实际的工作情况来说一下你对这个现象的看法。 34 | 35 | 我是 15 年踏入 iOS 开发行列的,那时移动端正值繁花卓锦,烈火烹油的时代,各行业都想分一杯羹。所以 iOS 开始开发者岗位也是与日俱增,19 年的时候大浪淘沙,行业洗牌,很多公司倒下了,也直接导致了 iOS 的岗位减少。现在初级的 iOS 需求量确实少了,但还是有的,就像 B 站每年都有 iOS 实习生的名额。至少到现在,我认识的 iOS 开发者都有工作,当然打铁还需自身硬,提高自己的技能才是王道。 36 | 37 | ## 学习相关 38 | 39 | ### 看到你整理翻译的这本 [iOS Architecture](https://github.com/dudongge/iOS_Architecture "iOS Architecture") 书,能简单介绍它的主要内容吗?做这件事的出发点是什么?一共花费了多长时间?最终的收获又是什么? 40 | 41 | 这本书前四章会介绍架构的理论基础,会涉及到一些常用的设计模式,结合例子给出具体的代码实现,和读者一起讨论哪种架构适合自己的业务,以及使用架构会带来哪些益处。接下来几章会着重介绍MVVM、Redux、Element 架构的具体实现,使用时注意事项以及优缺点。最重要的是可以启发我们思考,当前我们的项目有哪些可以改进的地方。 42 | 43 | 因为之前没有系统想过 iOS 架构相关东西,想在这方面深入了解一下,就找到了这本书。整理和翻译花费近两个月,通过这本书的完成,使自己对通用架构有了更深一层的认识,感觉自己的 English 没有白学😅,当然体会到了翻译的不容易,算是完成了自己今年初定下的第一个目标吧。 44 | 45 | ### 对于一些非工作项的事情像是翻译书籍、写开源库,你是如何自我驱动来实现的。会不会遇到一些阻力,遇到阻力的话是如何克服的?做这些事情有没有给你带来一些意外收获? 46 | 47 | 翻译整理书籍主要就是想挑战一下自己,也希望可以帮助其他人,自己也是看别人翻译的文章和分享的库来满足日常的开发需要。写开源库,也是记录自己学习的一种方式,或许能帮到有类似需求的小伙伴。遇到的阻力就是时间节点问题吧,开始以为很快就能完成的,事非经过不知难,制定的计划会被其他干扰因素打破(比如上海这次疫情),根据实际情况修正计划,当胜利的曙光到来时,自己的幸福满足感爆棚。 48 | 49 | ### 结合自己的经历,能否分享一下对你来说好的学习经验和学习习惯? 50 | 51 | 工作中的经验积累很重要,要时不时的总结一下,好记性不如烂笔头,这些经验或者教训可是经过实际检验的,比自己写的 Demo 更具有可操作性。平时就是多看技术博客和技术公众号,多和组内的人交流。 52 | 53 | 可以在油管上找些教程,YouTube 可以自动生成字幕,不用担心听不懂。 54 | 55 | 这里特别强烈推荐一款应用,就是苹果自己家的:Developer。这款应用有 WWDC 相关的技术视频,可以缓存下来,也有字幕,闲时找自己感兴趣的看一看,还是会有收获的,稍微介绍一下,说不定你就会爱上它。 56 | 57 | ![](https://cdn.zhangferry.com/Images/20220424000446.png) 58 | 59 | ## 个人爱好 60 | 61 | ### 除了作为开发者的身份,还有其他什么兴趣爱好可以分享的吗? 62 | 63 | 平常爱运动,也爱旅游,参加过几次马拉松,喜欢中国古典诗词文化,偶尔也会写首顺口溜。 64 | 65 | ### 之前在群里有看到你发的桌面照片,有很多手办,这是 B 站的风格还是你的风格。补几张照片让我们都开开眼吧 66 | 67 | 我不是真正的二次元,但也不排斥二次元文化,我的手办不多,补几张大佬的桌面吧。 68 | 69 | ![](https://cdn.zhangferry.com/Images/20220424000532.png) 70 | 71 | ![](https://cdn.zhangferry.com/Images/20220424000557.png) 72 | 73 | ![](https://cdn.zhangferry.com/Images/20220424000627.png) 74 | 75 | ![](https://cdn.zhangferry.com/Images/20220424000644.png) 76 | 77 | ### 作为 B 站人,肯定少不了刷 B 站,推荐几个你感觉不错的up主吧。 78 | 79 | [硬核的半佛仙人](https://space.bilibili.com/37663924 "硬核的半佛仙人"):有搞笑的配图和内容,给平淡的生活增加一些笑意。 80 | 81 | [罗翔说刑法](https://space.bilibili.com/517327498 "罗翔说刑法"):让你在故事中读懂法律。 82 | 83 | [冒险雷探长](https://space.bilibili.com/49494871 "冒险雷探长"):算比较早是旅游达人,可以领略到到国外的风景。 84 | 85 | 再推荐几个入站必看视频吧: 86 | 87 | * [赵本山:我就是念诗之王](https://www.bilibili.com/video/BV1bW411n7fY "我就是念诗之王") 88 | 89 | * [最强法海](https://www.bilibili.com/video/BV1pi4y147tQ "最强法海") 90 | 91 | * [【极乐净土】-咬人猫](https://www.bilibili.com/video/BV1Ys41167aL "极乐净土-咬人猫") 92 | 93 | * [跟着雷总摇起来!Are you OK!](https://www.bilibili.com/video/BV1es411D7sW "跟着雷总摇起来!Are you OK!") 94 | 95 | ### 再推荐一本书或者一个开发工具吧 96 | 97 | 在这里我不推荐学习相关的东西了,推荐一本书吧《明朝那些事》算是一套白话历史的丛书书,讲的诙谐生动,用现代人的观点解读当时的情境。网上也有相关音频,地铁上,睡觉前,都可以听一听,作为消遣娱乐。 98 | 99 | ### 可以谈一个自己最近才明白的心得、感受或者体会吗。 100 | 101 | 生于忧患死于安乐,家里常备粮,心里才不慌,意外和明天真不知道哪一个会提前到来,善待自己,善待他人。 102 | 103 | ### 有没有想借助于摸鱼周报宣传的。 104 | 105 | 漫画部门暂时没有 iOS 坑位 (⊙︿⊙),其他部门有,有看上的可以直接投递,也可以敲我: 106 | 107 | ![](https://cdn.zhangferry.com/Images/20220424000733.png) 108 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 zhangferry 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Resources/Books/DevelopErenLiu-Runtime.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhangferry/iOSWeeklyLearning/0419abf2e16dcb3489de68feba382ace28b75633/Resources/Books/DevelopErenLiu-Runtime.pdf -------------------------------------------------------------------------------- /Resources/Books/Event Handling Guide for iOS 中文翻译版.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhangferry/iOSWeeklyLearning/0419abf2e16dcb3489de68feba382ace28b75633/Resources/Books/Event Handling Guide for iOS 中文翻译版.pdf -------------------------------------------------------------------------------- /Resources/Books/Event Handling Guide for iOS 官方文档.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhangferry/iOSWeeklyLearning/0419abf2e16dcb3489de68feba382ace28b75633/Resources/Books/Event Handling Guide for iOS 官方文档.pdf -------------------------------------------------------------------------------- /Resources/Books/PX-0335 (Redacted).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhangferry/iOSWeeklyLearning/0419abf2e16dcb3489de68feba382ace28b75633/Resources/Books/PX-0335 (Redacted).pdf -------------------------------------------------------------------------------- /Resources/Books/README.md: -------------------------------------------------------------------------------- 1 | # Books 2 | 3 | 该目录主要收录网络开源的学习文档。 4 | 5 | ## iOS 6 | 7 | **DevelopErenLiu-Runtime** 8 | 9 | 来源:https://github.com/DeveloperErenLiu/RuntimePDF 10 | 11 | 简介:本系列Runtime文章总共九篇,发表在我简书的的博客上。本系列文章从各个方面,详细分析了Runtime。为了大家阅读方便,将所有文章汇总为一份PDF,字数 10W+。 12 | 13 | **PX-0335 (Redacted)** 14 | 15 | 来源:https://twitter.com/stroughtonsmith/status/1390768352944136196?s=21 16 | 17 | 简介:是对苹果审核的一期总结,介绍了苹果审核的一些手段及常见的审核问题。 18 | 19 | ## 计算机 20 | 21 | **xuan-computer-basic** 22 | 23 | 来源:https://github.com/crisxuan/bestJavaer 24 | 25 | 介绍:介绍计算机硬件相关一些知识以及一些汇编内容。 26 | 27 | -------------------------------------------------------------------------------- /Resources/Books/xuan-computer-basic.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhangferry/iOSWeeklyLearning/0419abf2e16dcb3489de68feba382ace28b75633/Resources/Books/xuan-computer-basic.pdf -------------------------------------------------------------------------------- /Resources/DailyLearning/README.md: -------------------------------------------------------------------------------- 1 | # DailyLearning 2 | 3 | 该目录主要收录我在群内每日的分享。每日分享当前经历了三个阶段:概念篇、Swift 提案解析、读书笔记。概念篇的内容放到了周报里,本目录仅整理剩下的Swift 提案解析 及 读书比较。 4 | 5 | ## Swift_proposals 6 | 7 | 收录之前整理的Swift 提案分析,仅汇总了我个人比较感兴趣的提案内容,该篇已经结束。 8 | 9 | ## 程序员修炼之道 - 从小工到专家 10 | 11 | 分享这本书的读书笔记,还在连载。 12 | 13 | -------------------------------------------------------------------------------- /Resources/Guide/blog_writer.md: -------------------------------------------------------------------------------- 1 | 本文档为周报协作指导,只要介绍协作时用到的Markdown语法、图片引用及渲染美化操作。 2 | 3 | ## Markdown 4 | 5 | Markdown 是一个 Web 上使用的文本到HTML的转换工具,可以通过简单、易读易写的文本格式生成结构化的HTML文档。目前 github、Stackoverflow 等网站均支持这种格式。 6 | 7 | Markdown的运用对应两项内容:Markdown语法 + Markdown工具。 8 | 9 | ### Markdown语法 10 | 11 | Markdown语法分两部分: 12 | 13 | * [Markdown基本语法](http://markdown.p2hp.com/basic-syntax/) 14 | 15 | * [Markdown扩展语法](http://markdown.p2hp.com/extended-syntax/) 16 | 17 | 几乎所有Markdown应用程序都支持John Gruber原始设计文档中概述的基本语法,我们可以放心使用。扩展语法则视不同程序解析程度而定,并不一定都支持。 18 | 19 | ### Markdown工具 20 | 21 | 有以下工具可供选择:[Markdown工具](http://markdown.p2hp.com/tools/) 22 | 23 | 本地应用:推荐使用[Typora](https://typora.io/),它支持单界面实时渲染,对于扩展语法也全部支持。 24 | 25 | 云端平台:推荐[掘金](https://juejin.cn/),我们可以点击写文章,进入一个Markdown写作界面,如果不想发布,只保存到草稿箱就可以了。 26 | 27 | 服务器工具:推荐使用[Hexo](https://hexo.io/),[Jekyll](https://jekyllrb.com/)。当前 https://zhangferry.com 使用的就是Hexo。 28 | 29 | ## 图片 30 | 31 | 博客写作免不了展示一些图片,对于一些云端平台,像是掘金,简书都提供有自己的图床服务,当我们使用外部图片时它会自动转存至自己的图床,并更换图片链接。但对于自己搭建的服务,就需要自己准备图床了。另外,对于一些本地引用的图片,我们也有上传至图床的需求。如果考虑到文章迁移到微信公众号的情况,我们还需要注意只能使用服务器在国内的图床,国外服务会被微信屏蔽。 32 | 33 | 图床的要求是:国内服务器、价格便宜(最好免费)、访问速度稳定。最终选择了 Gitee 图床服务。 34 | 35 | > ![](http://cdn.zhangferry.com/Images/20220327111414.png) 36 | > 37 | > 因为在网站访问量过大的情况 Gitee 图床遭遇了封禁,所以现将图床更换为七牛云。 38 | 39 | 图床使用还需要搭配一个上传工具,选择了[PicGo](https://molunerfinn.com/PicGo/),它提供了直接上传七牛图床的插件。 40 | 41 | ### 配置过程 42 | 43 | 1、安装 PicGo 44 | 45 | 2、配置七牛云 46 | 47 | ![](https://cdn.zhangferry.com/Images/20220717141350.png) 48 | 49 | AccessKey 和 SecretKey 内容需要跟 @zhangferry 索取,其他内容均如图填写即可。 50 | 51 | 5、PicGo使用 52 | 53 | 本地图片复制到剪切板之后会被PicGo获取,点击工具栏图片,再点击对应图片即会开始上传。 54 | 55 | 对于网络图片,可以右键选复制图片,然后点击工具栏进行上传。 56 | 57 | 上传成功会有通知提示,对应的Markdown链接也会直接复制到剪切板,这时可以直接在编辑工具里粘贴使用。 58 | 59 | ### 图片规范 60 | 61 | 1、命名规范(非必要,对于一些配图可以带上) 62 | 63 | Mardown的图片写法是这样的 64 | 65 | ``` 66 | ![ImageName](http://cdn.zhangferry.com/Images/000.png) 67 | ``` 68 | 69 | 前面中括号里的内容对应图片名称,会作为标注显示。 70 | 71 | 2、图片大小限制 72 | 73 | ~~图片大小不能超过1M,Gif的话也一样,超过的话可以上传成功但不会被显示。~~ 74 | 75 | ~~如果出现了大小超限的情况就需要进行压缩处理。~~ 76 | 77 | ~~普通图片可以降低图片尺寸:预览打开,调整大小。~~ 78 | 79 | 以上限制来源于gitee图床的限制,切换到七牛云之后不再有这些限制了。 80 | 81 | Gif图片比较麻烦: 82 | 83 | 微信的限制是:不能超过300帧、不能大于2M。可以把这个当做最大限制,但这个只能本地上传,无法通过图床直接导入。 84 | 85 | 2022.7.23补充: 86 | 87 | 微信公众号导入图片有两种形式: 88 | * 一种是直接将带图片的内容导入到编辑区,图片会自动上传到微信公众号后台。这种方式的限制是 2M。帧数未验证,推测还是300。 89 | * 另一种是手动上传,编辑区选图片,从本地Finder上传。这里的最大限制是10M。 90 | 91 | 所以对于大图片包括gif,可选方案是压缩和手动上传。Gif的压缩可以从两个方面入手:删帧和压缩。 92 | 93 | 删帧的话,使用预览打开,选中对应帧按Common + Delete 94 | 95 | 压缩的话,使用线上工具[docsmall](https://docsmall.com/gif-compress) 96 | 97 | ## 渲染 98 | 99 | Markdown的渲染通常都是转成HTML,相同的语法可以对应不同的显示效果。通常我们使用的都是Github样式,即Github里对Markdown的渲染效果。对于博客这类需要在电脑端阅读的场景,通常选择这个样式就行了,对于微信公众号这类一般都在移动端阅读的场景,最好使用一些美化渲染效果。 100 | 101 | 当前周报选择的是 [mdnice](https://mdnice.com/) 提供的渲染功能,当前渲染的有两部分: 102 | 103 | * 主题渲染,选择自定义模式,然后增加[该文件](https://github.com/zhangferry/iOSWeeklyLearning/tree/main/Resources/Style)内的代码即可。 104 | * 代码主题,选择的是atom-one-dark,勾选 Mac 风格 105 | 106 | ### 注脚 107 | 108 | 另外mdnice还提供了一些Markdown扩展功能,针对微信公众号不能添加外部链接的情况,支持文档引用。写法为: 109 | 110 | ``` 111 | [摸鱼周报](https://github.com/zhangferry/iOSWeeklyLearning "摸鱼周报") 112 | ``` 113 | 114 | 链接后面引号跟着的内容为参考链接的标题。所有引用的内容会统一归为二级目录的参考资料,并按顺序标记序号。 115 | 116 | 该功能未mdnice支持,非原生Markdown功能。 117 | 118 | ### 代码块 119 | 120 | 代码块可以指定编程语言,写法如下: 121 | 122 | ``` 123 | ```swift 124 | let name = "iOSWeeklyLearning" 125 | ​``` 126 | ``` 127 | 128 | 首行的swift标记代码块的语言,其可以根据不同语言的语法特性进行渲染。 129 | 130 | 常用的几种语言对应的标记有:objectivec、swift、c、c++、bash、python、java等。 131 | 132 | 该功能为Markdown原生扩展功能。 133 | 134 | 135 | 136 | -------------------------------------------------------------------------------- /Resources/Guide/github_guide.md: -------------------------------------------------------------------------------- 1 | # 在摸鱼周报里使用 Github 2 | 3 | 摸鱼周报的资源文件和协作流程都在Github上,所以我们有必要对它有一个大概的了解,特别是协作过程会用到的那些步骤。本篇文档主要是对这些关键步骤进行说明。 4 | 5 | ## 贡献内容 6 | 7 | 摸鱼周报贡献内容的方式有两种:Issue、Pull Request。 8 | 9 | Issue 适用于读者,PR 适用于联合编辑,我们来讲下 PR 的协作方式,大致流程可以看下下面这张图。 10 | 11 | ![](http://cdn.zhangferry.com/Images/20210626113835.png) 12 | 13 | 1-4 用于首次提交的场景,5-7用于后续的提交场景。 14 | 15 | 这里第5步有两种方式完成: 16 | 17 | **Moyu Remote -> My Remote -> Local** 18 | 19 | 这里的同步分为两步进行,Moyu Remot -> My Remote 这一步需要利用 Github 针对Fork仓库增加的 Fetch upstream 功能: 20 | 21 | ![](http://cdn.zhangferry.com/Images/20210626112400.png) 22 | 23 | 点击 Fetch and merge 即可完成Moyu远程仓库到自己远程仓库的同步。之后我们还需通过本地的 Git 进行同步: 24 | 25 | ```bash 26 | $ git fetch origin 27 | # 同步远程仓库代码,这一步有很多指令,rebase和merge均可 28 | $ git rebase main 29 | ``` 30 | 31 | **Moyu Remote -> Local** 32 | 33 | 这种方式是一步完成同步,为了让本地仓库可以直接 Fetch Moyu Repo,需要额外添加一个远程库关联: 34 | 35 | ```bash 36 | # 添加仓库关联,moyu为仓库名,也可以自定义为别的名字,通常它还叫upstream。这时本地应该有origin,moyu两个远程仓库 37 | $ git remote add moyu git@github.com:zhangferry/iOSWeeklyLearning.git 38 | # 拉取moyu仓库代码,如果有输出内容,说明需要同步 39 | $ git fetch moyu 40 | # 指定moyu仓库分支 41 | $ git rebase moyu/main 42 | ``` 43 | 44 | ## Pull Request 45 | 46 | 目前仓库只有 main 分支,所以 PR 指向 `zhangferry:main` 即可。**需要保证每次提交 PR 之前,已经完成了远程仓库的同步**。 47 | 48 | ### PR 修改 49 | 50 | PR的作用主要是审核,如果已经提交了 PR,自己发现或者被审核员评论格式出错,文案出错的情况,仅需再次修改然后 push 即可。PR 是一个动态的过程,它代表的 My Remote 与 Moyu Remote 之间的差异,两者任意内容发生变化,对应的 PR 内容就会自动更新。 51 | 52 | ### PR 关闭 53 | 54 | 当 PR 被打回时才需要关闭。 55 | 56 | ## 其他 Github 功能 57 | 58 | ### Project 59 | 60 | 访问地址是这个:https://github.com/zhangferry/iOSWeeklyLearning/projects/1。其主要用于摸鱼周报的发版事项同步。 61 | 62 | ### README 63 | 64 | README 用于介绍周报的大致情况和协作者。协作者的管理使用了 [all-contributors ](https://github.com/all-contributors/all-contributors)这个工具,为了便于添加和更新协作者的身份信息,引入了 `@all-contributors Bot🤖`,可以在 PR 的 Conversation 对话框里输入指令唤起机器人进行操作,命令如下: 65 | 66 | ``` 67 | @all-contributors please add @ for 68 | ``` 69 | 70 | 不同职责对应有不同 emoji 表情,含义对照可以查看[这里](https://allcontributors.org/docs/en/emoji-key)。 -------------------------------------------------------------------------------- /Resources/Guide/new_editor.md: -------------------------------------------------------------------------------- 1 | ## 当前周报格式 2 | 3 | iOS摸鱼周报,主要分享大家开发过程遇到的经验教训及一些有用的学习内容。当前周报主要分为以下六个模块,也是目前的排序: 4 | 5 | 1、本期话题。写一下近期阅读或者生活的感悟,默认@zhangferry 来写,其他人如果有想写的话,截稿日之前告知即可。目前在连载各个开发的故事,欢迎大家报名和推荐。 6 | 7 | 2、开发Tip。对应开发技巧 8 | 9 | 3、面试解析。整理一些高频面试题 10 | 11 | 4、优秀博客。阅读到的高质量博客,按主题整理 12 | 13 | 5、学习资料。比较成体系的学习资料介绍 14 | 15 | 6、工具推荐。好用的开发工具或者三方库 16 | 17 | 大家如果有好的点子,可以扩展模块,一起商量采用何种形式,怎么维护。 18 | 19 | ## 模块及编辑成员介绍 20 | 21 | ### 模块分配 22 | 23 | 当前周报维护形式是按模块进行划分的,每个模块有至少一个负责人,负责保证该模块内容的正常供应。当前模块说明及对应负责人介绍维护在羽雀文档里:https://www.yuque.com/zhangferry/tz76fi/qlyh51 。 24 | 25 | 新来的编辑可以按照自己喜好选一个模块进行维护,告知@zhangferry进行文档更新。也可以根据自己的情况暂不指定,看哪个模块缺少内容进行补充。 26 | 27 | ### 编辑介绍 28 | 29 | 以下是各位编辑的介绍,新编辑按照如下格式,在最后一行加入自己的介绍,提交 PR 即可。 30 | 31 | | 名字 | 常用ID | 介绍 | 个人博客或公众号 | 32 | |-----------|-------------|--------------------------------------------------------| ------------------------------------------------------------ | 33 | | 张飞 | zhangferry | 抖音,感兴趣方向:研发效能、自动化测试、逆向 | 公众号:iOS成长之路,博客:https://zhangferry.com/ | 34 | | highway | highway | 央行研究院,6年iOS开发经验 | 简书:https://www.jianshu.com/u/1e59b1fe9df8 | 35 | | 人魔七七 | 人魔七七 | iOS开发老兵 | 公众号:人魔七七[ ](https://github.com/fanbaoying)https://github.com/renmoqiqi | 36 | | 夏天 | 夏天 | iOS开发老兵,游荡在各种博客之间,对底层和性能优化比较感兴趣 | 公众号:iOS成长指北 掘金:https://juejin.cn/user/3298190611456638 | 37 | | 展菲 | 展菲 | espressif AE 团队,智能家居研发,擅长蓝牙、Wi-Fi、嵌入式 | 公众号:网罗开发、Swift社区,掘金:https://juejin.cn/user/3192637497025335 | 38 | | 窦术尧 | 反向抽烟 | 网易,研一在读 | https://blog.csdn.net/opooc | 39 | | 师大小海腾 | 师大小海腾 | BabyBus | https://juejin.cn/user/782508012091645/posts | 40 | | 邓竹立 | 皮拉夫大王在此 | 58同城无线团队对底层Mach-O和性能优化比较感兴趣 | 公众号:皮拉夫大王在此,简书:https://www.jianshu.com/u/739b677928f7 掘金:https://juejin.cn/user/281104094332653 | 41 | | 冯士魁 | 我是熊大 | 《今日水印相机》,目前负责海外音视频社交项目 | 掘金:https://juejin.cn/user/1151943916921885/posts | 42 | | Mim0sa | Mim0sa | 没考上研所以家里蹲,WWDC 2017 Scholarship Winner,对界面交互体验这方面比较感兴趣 | 掘金:https://juejin.cn/user/1433418892590136 | 43 | | 邢勇 | brave723 | 樊登读书,对工程化工具比较感兴趣 | 掘金:https://juejin.cn/user/307518984425981/posts | 44 | | 何天从 | iHTCboy | 坐标广州,iOS 自动化方向,目前从事游戏 SDK 开发五年啦~ | https://ihtcboy.com/ | 45 | | CoderStar | CoderStar | 坐标北京,大前端开发方向,对前端、后端都有一定涉猎,目前主要工作与iOS相关,喜欢分享干货博文 | 公众号:CoderStar; 掘金:https://juejin.cn/user/588993964541288/posts | 46 | | RunsCode | RunsCode | 坐标杭州,主要iOS,对前后端、游戏均有涉猎 | https://github.com/RunsCode | 47 | | 徐杨 | 东坡肘子 | 坐标大连,业余iOS开发者 | 公共号:肘子的Swift记事本。 博客 https://www.fatbobman.com | 48 | | 李晨光 | hello world | 坐标成都,iOS开发, 对OC底层原理、性能优化、工程自动化比较感兴趣,目前在向swift转型 | https://juejin.cn/user/2999123453164605/posts 49 | | 廖靖宇 | JY | 坐标上海微盟,iOS开发,对底层性能优化以及Mach-O,逆向方面比较感兴趣 | 掘金:https://juejin.cn/user/1574156380931144/posts 50 | | 陶宗强 | 远恒之义 | 坐标重庆,iOS 开发,关注 Swift 与 SwiftUI | https://github.com/eternaljust 51 | | 强子 | 强子 | 坐标北京,58驾考:iOS + ReactNative | https://www.jianshu.com/u/5875a5736734 52 | | 静静 | 豆豆浆 | 坐标北京,6年iOS开发 | https://github.com/byshb 53 | 54 | 55 | ## 协作形式 56 | 57 | ### 人员分配 58 | 有些模块是单人负责,有些是多人负责。单人不进行特殊说明,按发版规划进行即可。多人负责的模块,有两种推荐形式: 59 | 60 | * 多个人员分别整理,最后汇总 61 | * 每个人轮替着各负责一期 62 | 63 | 当然也可以从以上方案任意组合,但是多人负责时,推荐内部人员之间做好审核再推送。 64 | 65 | ### 内容提交 66 | 67 | 目前主要通过 Pull Request 的形式进行协作,大家在截稿日之前将内容推送上来即可。关于PR不太了解的可以参照这个介绍:[在摸鱼周报里使用Github](https://github.com/zhangferry/iOSWeeklyLearning/blob/main/Resources/Guide/github_guide.md)。周报源文件在主仓库的这个目录[WeeklyLearning](https://github.com/zhangferry/iOSWeeklyLearning/tree/main/WeeklyLearning),内部文件序号对应周报的期数,带 process 的文件为待整理内容,带 process 且序号最小的文件即为当期要整理的源文件,当期整理完成会去掉process标记。 68 | 69 | 内容采用 Markdown 形式,语法和图床问题,可以看这个文件 [blog_writer](https://github.com/zhangferry/iOSWeeklyLearning/blob/main/Resources/Guide/blog_writer.md),该文件为**编辑必读**。 70 | 71 | 对于图片统一采用 Gitee 图床,按照上述 `blog_writer` 文档配置完成即可,仓库 token 可以找 @zhangferry 索要。 72 | 73 | ### 校验审核流程 74 | 75 | 考虑到篇幅和内容质量的问题,推送内容会经过审核、修改、延期或者被拒掉。目前校验流程如下: 76 | 77 | 1、提交 pr 有一个粗审,由具有合入权限的人员处理。目前多数编辑已开通推送权限,可以直接推送,但是喜欢 pr 形式的话也可以一直保持,pr 有助于审核。 78 | 79 | 2、合入之后会整体整理和修改,也有可能因为篇幅原因去掉一些内容。 80 | 81 | 3、整理完会发布预览版,预览版的审核有@师大小海腾,@iHTCboy。其他没有审核责任的可以关注下自己的那部分内容,看是否有问题和需要修改的内容。 82 | 83 | 综上全部完成才会设置定时推送。 84 | 85 | ## 发版规划 86 | 87 | 发版时间为每周五,大家提交稿件的时间应在上一周的周日之前。这样调整的目的是大家可以完全利用周六日进行内容提交。 88 | 89 | 发版需要经历几个阶段: 90 | 91 | * 资料整理:这个根据大家每个人的时间安排。 92 | * 提交截稿:每周日是内容提交截止时间,该时间即**截稿日**。 93 | * 模块整理:我一般会在周日晚上或者周一整理完本期内容,并将临时链接发到编辑群 94 | * 周报校验:目前有两位固定人员参与校验,@阿腾 @iHTCboy,主要检查错别字,知识点勘误,内容优化工作。 95 | * 发版:目前规划是每周五发版,如果遇到节假日,会特殊说明。 96 | 97 | ## 重点说明 98 | 99 | 以下两项是需要大家共同遵循的要求: 100 | 101 | > 1、目前有些模块是有多人负责的,以模块为单位,如果在截稿日当天无内容推送,或者内容较少,不够原定内容的量,需要模块负责人在群内进行说明原因:是延期(最晚可延期至周二),还是本期无内容(无内容和内容较少都可请求群内小伙伴的帮助)。 102 | > 103 | > 2、重视版权问题。对于别人绘制的详细教学图,暂以是否能感觉到作者花费了一些功夫为标准,高质量的图片需注明出处。另从别处复制粘贴的文案,技术项的,如果超过20个字,需注明出处。 104 | 105 | 为了保证周报内容的质量,这个是必须进行的,它很重要,希望大家可以共同遵守。 106 | 107 | ## 其他事项 108 | 109 | * 各位编辑如果自身有优秀的作品,可以推荐给**iOS成长之路**进行转载,或者提前联系优秀博客整理,看主题是否契合,会优先考虑是否采用。 110 | * 各位公司招聘信息等,可以优先推广。内推模块暂未开启,后续会加。 111 | -------------------------------------------------------------------------------- /Resources/README.md: -------------------------------------------------------------------------------- 1 | # Resources 2 | 3 | 该目录主要收录各种资源。 4 | 5 | ## Books 6 | 7 | 收录网络中比较有用的图书资源,多为pdf版本。 8 | 9 | ## Guide 10 | 11 | 写作博客的一些小技巧及注意事项,做了新来的联合编辑需要了解这里的内容。 12 | 13 | ## DailyLearning 14 | 15 | 为群里的每日分享汇总,通常一周更新一次。 16 | 17 | -------------------------------------------------------------------------------- /Resources/Style/mdnice_style: -------------------------------------------------------------------------------- 1 | /* 全局属性 2 | * 页边距 padding: 30px; 3 | * 全文字体 font-family: ptima-Regular; 4 | * 英文换行 word-break: break-all; 5 | */ 6 | #nice { 7 | } 8 | /* 段落,下方未标注标签参数均同此处 9 | * 上边距 margin-top: 5px; 10 | * 下边距 margin-bottom: 5px; 11 | * 行高 line-height: 26px; 12 | * 词间距 word-spacing: 3px; 13 | * 字间距 letter-spacing: 3px; 14 | * 对齐 text-align: left; 15 | * 颜色 color: #3e3e3e; 16 | * 字体大小 font-size: 16px; 17 | * 首行缩进 text-indent: 2em; 18 | */ 19 | #nice p { 20 | } 21 | /* 一级标题 */ 22 | #nice h1 { 23 | } 24 | /* 一级标题内容 */ 25 | #nice h1 .content { 26 | } 27 | /* 一级标题修饰 请参考有实例的主题 */ 28 | #nice h1:after { 29 | } 30 | /* 二级标题 */ 31 | #nice h2 { 32 | /*border-bottom: 2px solid rgb(239, 112, 96);*/ 33 | font-size: 1.3em; 34 | text-align: center; 35 | } 36 | /* 二级标题内容 */ 37 | #nice h2 .content { 38 | display: inline-block; 39 | font-weight: bold; 40 | /*background: rgb(239, 112, 96);*/ 41 | color: #000000; 42 | padding: 3px 10px 1px; 43 | border-top-right-radius: 3px; 44 | border-top-left-radius: 3px; 45 | margin-right: 0px; 46 | background: linear-gradient(#fff 90%, #fcaf17 10%); 47 | } 48 | /* 二级标题修饰 请参考有实例的主题 */ 49 | #nice h2:after { 50 | display: inline-block; 51 | content: ""; 52 | vertical-align: bottom; 53 | /*border-bottom: 36px solid #efebe9;*/ 54 | border-right: 0px solid transparent; 55 | } 56 | /* 三级标题 */ 57 | #nice h3 { 58 | } 59 | /* 三级标题内容 */ 60 | #nice h3 .content { 61 | font-weight: 600; 62 | font-size: 1.0em; 63 | color: #555555; 64 | border-left: 3px solid rgb(239, 112, 96); 65 | padding-left: 10px; 66 | } 67 | /* 三级标题修饰 请参考有实例的主题 */ 68 | #nice h3:after { 69 | } 70 | /* 无序列表整体样式 71 | * list-style-type: square|circle|disc; 72 | */ 73 | #nice ul { 74 | } 75 | /* 有序列表整体样式 76 | * list-style-type: upper-roman|lower-greek|lower-alpha; 77 | */ 78 | #nice ol { 79 | } 80 | /* 列表内容,不要设置li 81 | */ 82 | #nice li section { 83 | } 84 | /* 引用 85 | * 左边缘颜色 border-left-color: black; 86 | * 背景色 background: gray; 87 | */ 88 | #nice .multiquote-1 { 89 | border-left-color: rgb(239, 112, 96); 90 | background: #fff9f9;/*#fff9f9;*/ 91 | } 92 | /* 引用文字 */ 93 | #nice .multiquote-1 p { 94 | } 95 | /* 链接 96 | * border-bottom: 1px solid #009688; 97 | */ 98 | #nice a { 99 | color: rgb(239, 112, 96); 100 | border-bottom: 1px solid rgb(239, 112, 96); 101 | } 102 | /* 加粗 */ 103 | #nice strong { 104 | } 105 | /* 斜体 */ 106 | #nice em { 107 | } 108 | /* 加粗斜体 */ 109 | #nice em strong { 110 | } 111 | /* 删除线 */ 112 | #nice del { 113 | } 114 | /* 分隔线 115 | * 粗细、样式和颜色 116 | * border-top: 1px solid #3e3e3e; 117 | */ 118 | #nice hr { 119 | } 120 | /* 图片 121 | * 宽度 width: 80%; 122 | * 居中 margin: 0 auto; 123 | * 居左 margin: 0 0; 124 | */ 125 | #nice img { 126 | } 127 | /* 图片描述文字 */ 128 | #nice figcaption { 129 | } 130 | /* 行内代码 */ 131 | #nice p code, #nice li code { 132 | color: rgb(239, 112, 96); 133 | } 134 | /* 非微信代码块 135 | * 代码块不换行 display: -webkit-box !important; 136 | * 代码块换行 display: block; 137 | */ 138 | #nice pre code { 139 | } 140 | /* 141 | * 表格内的单元格 142 | * 字体大小 font-size: 16px; 143 | * 边框 border: 1px solid #ccc; 144 | * 内边距 padding: 5px 10px; 145 | */ 146 | #nice table tr th, 147 | #nice table tr td { 148 | } 149 | /* 脚注文字 */ 150 | #nice .footnote-word { 151 | color: #ff3502; 152 | } 153 | /* 脚注上标 */ 154 | #nice .footnote-ref { 155 | color: rgb(239, 112, 96); 156 | } 157 | /* "参考资料"四个字 158 | * 内容 content: "参考资料"; 159 | */ 160 | #nice .footnotes-sep:before { 161 | content: "引用资料"; 162 | } 163 | /* 参考资料编号 */ 164 | #nice .footnote-num { 165 | } 166 | /* 参考资料文字 */ 167 | #nice .footnote-item p { 168 | } 169 | /* 参考资料解释 */ 170 | #nice .footnote-item p em { 171 | } 172 | /* 行间公式 173 | * 最大宽度 max-width: 300% !important; 174 | */ 175 | #nice .block-equation svg { 176 | } 177 | /* 行内公式 178 | */ 179 | #nice .inline-equation svg { 180 | } -------------------------------------------------------------------------------- /Script/README.md: -------------------------------------------------------------------------------- 1 | ## 脚本说明 2 | 3 | 主要使用的脚本有两个,一个是是用于发布的 `deploy.py`,一个是用于归类的`content_category.py`。 4 | 5 | ## 发布 6 | 7 | 发布周报: 8 | 9 | ```bash 10 | # --index 用于指定发布哪一期内容,如果不填会发布去除process标记的最大一期内容 11 | $ python3 Script/deploy.py --index 60 12 | ``` 13 | 14 | 为了简化执行流程,增加了一个shell的调用方式。 15 | 16 | ```bash 17 | $ Script/ci_run.sh 60 18 | ``` 19 | 20 | 同样,表示期数的 60 可以省略。 21 | 22 | deploy.py 还有一个额外功能用于发布非周报类文章,可以执行下面的命令: 23 | 24 | ```bash 25 | # --name 表示文件名,--tags 表示tag值,多个内容可以用逗号分割 26 | $ python3 Script/deploy.py --name --tags 27 | ``` 28 | 29 | ## 周报内容聚类 30 | 31 | `content_category.py` 主要用于识别周报里的内容并将其归类到`CategorySummary`文件夹中。 32 | 33 | ```bash 34 | $ python3 Script/content_category.py 35 | ``` 36 | 37 | -------------------------------------------------------------------------------- /Script/ci_run.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | path=$(cd $(dirname "$0"); pwd) 4 | deploy="${path}/deploy.py" 5 | 6 | if [ -n "$1" ]; then 7 | python3 "${deploy}" --index "$1" 8 | else 9 | python3 "${deploy}" 10 | fi -------------------------------------------------------------------------------- /Script/content_category.py: -------------------------------------------------------------------------------- 1 | # -*- coding: UTF-8 -*- 2 | import os 3 | import sys 4 | from deploy import get_latest_weekly_index 5 | 6 | category_map = { 7 | "Topic": ["本期话题"], 8 | "Articles": ["优秀博客", "内容推荐"], 9 | "Interviews": ["面试解析"], 10 | "Learnings": ["本周学习", "开发Tips"], 11 | "Concepts": ["编程概念"], 12 | "Resources": ["工具推荐", "摸一下鱼", "学习资料"] 13 | } 14 | 15 | weeklyFile = "WeeklyLearning" 16 | categoryFile = "CategorySummary" 17 | 18 | 19 | def export_category(from_index=1, to_index=1, merged_file=None): 20 | execute_path = sys.path[0] 21 | weekly_folder = execute_path + "/../" + weeklyFile 22 | category_folder = execute_path + "/../" + categoryFile 23 | 24 | if not merged_file: 25 | category_files = [f"{category_folder}/{category}.md" for category in category_map] 26 | else: 27 | category_files = [f"{category_folder}/{merged_file}.md"] 28 | 29 | for category_file in category_files: 30 | if os.path.exists(category_file): 31 | with open(category_file, "r+", encoding='utf-8') as file: 32 | file.seek(0) 33 | file.truncate() 34 | 35 | if merged_file: 36 | export_yearly_category(category_folder, weekly_folder, from_index, to_index, merged_file) 37 | else: 38 | export_weekly_category(category_folder, weekly_folder) 39 | 40 | 41 | def export_weekly_category(category_folder, weekly_folder): 42 | """导出周报文档""" 43 | # 为了保证读取的顺序 44 | latest_index = get_latest_weekly_index(weekly_folder) - 1 45 | for index in range(latest_index): 46 | weekly_file = f"{weekly_folder}/iOSWeeklyLearning_{index + 1}.md" 47 | print(weekly_file) 48 | export_content = export_topic_content(weekly_file) 49 | write_to_file(category_folder, export_content) 50 | 51 | 52 | def export_yearly_category(category_folder, weekly_folder, from_index=1, to_index=1, merged_file=None): 53 | """导出年度文档""" 54 | weekly_group = {} 55 | yearly_group = {} 56 | black_list = ["Topic"] 57 | subject_name_map = { 58 | "Articles": "优秀博客", 59 | "Learnings": "本周学习", 60 | "Resources": "摸一下鱼", 61 | "Interviews": "面试选题" 62 | } 63 | 64 | sorted_category = ["面试选题", "摸一下鱼", "本周学习", "优秀博客"] 65 | sorted_group = [] 66 | 67 | for index in range(from_index - 1, to_index): 68 | weekly_file = f"{weekly_folder}/iOSWeeklyLearning_{index + 1}.md" 69 | print(weekly_file) 70 | export_content = export_topic_content(weekly_file) 71 | 72 | weekly_group[index] = export_content 73 | 74 | for index, content in weekly_group.items(): 75 | for category, content_lines in content.items(): 76 | if category in black_list or not content_lines: 77 | continue 78 | 79 | category_name = subject_name_map[category] 80 | current_list = yearly_group.get(category_name, []) 81 | # 同一类别分组 82 | if len(current_list): 83 | current_list.append("***\n") 84 | current_list.extend(content_lines) 85 | yearly_group[category_name] = current_list 86 | 87 | for item in sorted_category: 88 | sorted_group.append({item: yearly_group[item]}) 89 | 90 | write_to_file(category_folder, sorted_group, merged_file) 91 | 92 | 93 | def export_topic_content(weekly_file): 94 | output = dict.fromkeys(category_map.keys(), []) 95 | if os.path.exists(weekly_file): 96 | with open(weekly_file) as file: 97 | lines_content = file.readlines() 98 | for category, topic_list in category_map.items(): 99 | topic_content_list = [] 100 | for topic in topic_list: 101 | topic_content_list.extend(filter_data(lines_content, topic)) 102 | output[category] = topic_content_list 103 | # print(output) 104 | return output 105 | 106 | 107 | def filter_data(lines_data, category_name): 108 | begin = "## " + category_name 109 | print(f"category: {category_name}") 110 | output_lines = [] 111 | is_start = False 112 | is_end = False 113 | for line_content in lines_data: 114 | # print(line_content) 115 | if begin in line_content: 116 | is_start = True 117 | elif line_content.count("#") == 2 and is_start: 118 | is_end = True 119 | elif is_end: 120 | # print("====") 121 | # print(output_lines) 122 | return output_lines 123 | elif is_start: 124 | output_lines.append(line_content) 125 | # print(line_content) 126 | return output_lines 127 | 128 | 129 | def write_to_file(file_path, content_group, merged_file=None): 130 | """如果传入merged_file会将所有的category合并到一个文件""" 131 | for category in content_group: 132 | 133 | if merged_file: 134 | category_file = f"{file_path}/{merged_file}.md" 135 | category_name = list(category.keys())[0] 136 | category_content = category[category_name] 137 | else: 138 | category_name = category 139 | category_file = f"{file_path}/{category_name}.md" 140 | category_content = content_group[category_name] 141 | # if os.path.exists(sub_file): 142 | with open(category_file, "a", encoding='utf-8') as file: 143 | if merged_file: 144 | file.write(f"## {category_name}\n") 145 | else: 146 | file.write("***") 147 | for content_line in category_content: 148 | file.writelines(content_line) 149 | print("write success!") 150 | -------------------------------------------------------------------------------- /Script/migration_to_qiniu.py: -------------------------------------------------------------------------------- 1 | # migration gitee to qiniu 2 | import os 3 | import re 4 | from ast import Str 5 | 6 | from qiniu import Auth 7 | import qiniu 8 | 9 | # folder map with repo 10 | repo_map = { 11 | "/Users/zhangferry/Desktop/iOSWeeklyLearning": ["Articles", "Resources", "WeeklyLearning", "CategorySummary", 12 | "Interview"], 13 | "/Users/zhangferry/zhangferry.github.io/source": ["_posts", "about", "wechat"] 14 | } 15 | images_path = "/Users/zhangferry/Downloads/Images-master" 16 | 17 | # http://r9ccmp2wy.hb-bkt.clouddn.com/Images 18 | # https://gitee.com/zhangferry/Images/raw/master/ 19 | link_prefix = r"http://cdn.zhangferry.com/Images" 20 | 21 | cdn_path = "https://cdn.zhangferry.com/Images" 22 | # qiniu config 23 | k_access_key = "HF6aHnsNHPJRePvl2PTE7Z_jWT_9kts2t4vgyB-u" 24 | k_secret_key = "Db-SRqLu9T0-1W3I8LfyM__aCGyvsuGBHbxn2v_A" 25 | k_bucket_name = "moyuweekly" 26 | 27 | 28 | def parse_urls(repo_map): 29 | for dir in repo_map: 30 | traversal_dir = repo_map[dir] 31 | for subdir in os.listdir(dir): 32 | if subdir in traversal_dir: 33 | # local_path = Path(local_path) 34 | sub_root = dir + "/" + subdir 35 | for idx, file in enumerate(os.listdir(sub_root)): 36 | if ".md" not in file: 37 | continue 38 | # if idx == 1: 39 | # break 40 | file = sub_root + "/" + file 41 | # print(file) 42 | with open(file, 'r') as fp: 43 | content = fp.read() 44 | regular_expre(content, file) 45 | 46 | 47 | def regular_expre(content, path): 48 | # result is wrapped by brackets 49 | # for markdown 50 | rex1 = r"!\[.*\]\(({}.*)\)".format(link_prefix) 51 | # rex1 = r"({}.*)".format(link_prefix) 52 | # for hexo header 53 | rex2 = r"cover: *({}.*)".format(link_prefix) 54 | 55 | rexs = [rex1, rex2] 56 | for rex in rexs: 57 | 58 | pattern = re.compile(rex) 59 | res_list = pattern.findall(content) 60 | for res in res_list: 61 | # pure link 62 | # print(res) 63 | file_name = f"{res}".split("/")[-1] 64 | new_link = f"{cdn_path}/{file_name}" 65 | print(f"find url:{res}") 66 | print(f"new url:{new_link}") 67 | # upload_file(path) 68 | content = content.replace(res, new_link) 69 | 70 | # print(content) 71 | # replace = re.sub(rex, content, content) 72 | # write back 73 | with open(path, "w") as fp: 74 | fp.write(content) 75 | 76 | 77 | def upload_file(file_path): 78 | host = "https://cdn.zhangferry.com" 79 | 80 | # 需要填写你的 Access Key 和 Secret Key 81 | access_key = k_access_key 82 | secret_key = k_secret_key 83 | # 构建鉴权对象 84 | q = Auth(access_key, secret_key) 85 | # 要上传的空间 86 | bucket_name = k_bucket_name 87 | # 上传后保存的文件名 88 | key = f"Images/{os.path.basename(file_path)}" 89 | # 生成上传 Token,可以指定过期时间等 90 | token = q.upload_token(bucket_name, key, 3600) 91 | # 要上传文件的本地路径 92 | ret, info = qiniu.put_file(token, key, file_path, version='v2') 93 | print(info) 94 | assert ret['key'] == key 95 | assert ret['hash'] == qiniu.etag(file_path) 96 | print(f"upload {key} success") 97 | 98 | 99 | def upload_images_repo(path): 100 | traversal_dir = ["blog", "gitee", "iOSWeeklyLearning"] 101 | for subdir in os.listdir(path): 102 | if subdir in traversal_dir: 103 | # local_path = Path(local_path) 104 | sub_root = path + "/" + subdir 105 | for image_name in os.listdir(sub_root): 106 | image_path = sub_root + "/" + image_name 107 | print(image_path) 108 | upload_file(image_path) 109 | 110 | 111 | parse_urls(repo_map) 112 | # upload_file(file) 113 | # upload_images_repo(images_path) -------------------------------------------------------------------------------- /Script/testScript.py: -------------------------------------------------------------------------------- 1 | import unittest 2 | from deploy import BlogArticleBuilder, BlogRepo 3 | from content_category import export_category 4 | 5 | 6 | class MyTestCase(unittest.TestCase): 7 | 8 | def setUp(self): 9 | pass 10 | 11 | def test_deploy_article(self): 12 | article_args = ["--name", "campus_to_recruitment", 13 | "--tags", "面试,职场,校园"] 14 | self.builder = BlogArticleBuilder(article_args) 15 | 16 | blog_branch = "master" 17 | blog_git_url = "git@github.com:zhangferry/GithubPage.git" 18 | blog_repo = BlogRepo(git_url=blog_git_url, branch=blog_branch) 19 | self.builder.run_with(blog_repo=blog_repo) 20 | 21 | def test_deploy_book_notes(self): 22 | article_args = ["--name", "cultivation_for_programmer_booknotes_1", 23 | "--tags", "书评,读书笔记,程序员的自我修养"] 24 | builder = BlogArticleBuilder(article_args) 25 | 26 | blog_branch = "master" 27 | blog_git_url = "git@github.com:zhangferry/GithubPage.git" 28 | blog_repo = BlogRepo(git_url=blog_git_url, branch=blog_branch) 29 | builder.run_with(blog_repo=blog_repo) 30 | 31 | def test_export_category(self): 32 | # export_weekly_category() 33 | export_category(from_index=43, to_index=81, merged_file="Summary-2022") 34 | 35 | 36 | if __name__ == '__main__': 37 | unittest.main() 38 | -------------------------------------------------------------------------------- /Script/upload_wechat.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from werobot import WeRoBot 3 | import os 4 | import json 5 | import requests 6 | from selenium import webdriver 7 | 8 | 9 | class WebDriver: 10 | def __init__(self, driver_path): 11 | self.brower = webdriver.Chrome(executable_path=driver_path) 12 | website = self.brower.get("https://whaoa.github.io/markdown-nice/") 13 | page_source = self.brower.page_source 14 | title = self.brower.title 15 | # print(website) 16 | print(page_source) 17 | print(title) 18 | 19 | 20 | class WeRoBotClint: 21 | 22 | def __init__(self): 23 | robot = WeRoBot() 24 | robot.config["APP_ID"] = os.getenv("wx2dfe81f38281cfd9") 25 | robot.config["APP_SECRET"] = os.getenv("ef5e460dd2941f640aa6eaf69b97d1c4") 26 | self.we_client = robot.client 27 | self.we_token = self.we_client.grant_token() 28 | 29 | def upload_media(self, media_file): 30 | res_json = self.we_client.upload_permanent_media("image", open(media_file, "rb")) 31 | media_id = res_json["media_id"] 32 | url = res_json["url"] 33 | return media_id 34 | 35 | # 因werobot暂未支持,所以直接采用接口访问 36 | def upload_article(self, content): 37 | articles = { 38 | "articles": [ 39 | { 40 | "thumb_media_id": "JqgEfa5SNzBYVoHTccyIRsGDDhotpIMnUnwCL2L6pp_JfvIA3qdDBc9kYJmlzGi4", 41 | "author": "zhangferry", 42 | "title": "Happy Day", 43 | "content_source_url": "https://zhangferry.com/2022/07/24/github_action_for_blog_deploy/", 44 | "content": content, 45 | # 图文信息描述 46 | "digest": "描述信息", 47 | "need_open_comment": 1 48 | } 49 | ] 50 | } 51 | 52 | client = NetworkClint() 53 | token = client.get_access_token() 54 | headers = {'Content-type': 'text/plain; charset=utf-8'} 55 | datas = json.dumps(articles, ensure_ascii=False).encode('utf-8') 56 | postUrl = "https://api.weixin.qq.com/cgi-bin/draft/add?access_token=%s" % token 57 | 58 | r = requests.post(postUrl, data=datas, headers=headers) 59 | resp = json.loads(r.text) 60 | print(resp) 61 | 62 | 63 | class NetworkClint: 64 | def __init__(self): 65 | self.__accessToken = "" 66 | self.__leftTime = 0 67 | 68 | def __real_get_access_token(self): 69 | post_url = ("https://api.weixin.qq.com/cgi-bin/token?grant_type=" 70 | "client_credential&appid=%s&secret=%s" % ( 71 | os.getenv('WECHAT_APP_ID'), os.getenv('WECHAT_APP_SECRET'))) 72 | print(post_url) 73 | response = requests.request(method="post", url=post_url) 74 | response_json = json.loads(response.text) 75 | 76 | self.__accessToken = response_json["access_token"] 77 | self.__leftTime = response_json["expires_in"] 78 | 79 | def get_access_token(self): 80 | if self.__leftTime < 10: 81 | self.__real_get_access_token() 82 | return self.__accessToken 83 | 84 | 85 | if __name__ == '__main__': 86 | local_path = "/Users/zhangferry/Desktop/wechat_content" 87 | local_img_path = "/Users/zhangferry/Desktop/WechatIMG9.jpeg" 88 | driver_path = "/Users/zhangferry/Developer/chromedriver" 89 | 90 | driver = WebDriver(driver_path) 91 | 92 | # os.environ['WECHAT_APP_ID'] = "" 93 | # os.environ['WECHAT_APP_SECRET'] = "" 94 | # with open(local_path, "r") as fp: 95 | # file_content = fp.read() 96 | # print(file_content) 97 | # 98 | # clinet = WeRoBotClint() 99 | # # res = clinet.upload_media(local_img_path) 100 | # # print(res) 101 | # clinet.upload_article(file_content) 102 | 103 | 104 | temp_token = "59_FzaJlr22Qak-Sd4XNnXGjUprHTp7xaDQV_RDv8BRpal_-TyEPyaYUlWNpLHAvJxYpZoPqtpMb-1nMzV6ZuJDVFi8QwMYJz88SKE86U-SNX_wDPiOpwaZ6D8O9UXOuR0aEjYh3rIBk4NDe8LVNFIaAGADVY" 105 | -------------------------------------------------------------------------------- /WeeklyLearning/iOSWeeklyLearning_35.md: -------------------------------------------------------------------------------- 1 | # iOS摸鱼周报 第三十五期 2 | 3 | ![](https://cdn.zhangferry.com/Images/iOS摸鱼周报模板.png) 4 | 5 | ### 本期概要 6 | 7 | > * Tips:count vs isEmpty 8 | > * 面试模块:Swift 中 struct 和 class 的区别,值类型和引用类型的区别。 9 | > * 优秀博客:本期继续介绍几个优秀的 Swift 开源库。 10 | > * 学习资料:戴铭的 Swift 小册子。 11 | > * 开发工具:PhotoSweeper,一款快速而强大的重复照片清理器。 12 | 13 | ## 开发Tips 14 | 15 | 整理编辑:[zhangferry](zhangferry.com) 16 | 17 | ### count vs isEmpty 18 | 19 | 通常在判断一个字符串或者数组是否为空的时候有两种方式:`count == 0` 或者 `isEmpty`。我们可能会认为两者是一样的,`isEmpty` 内部实现就是 `count == 0`。但在 SwiftLint 的检验下,会强制要求我们使用使用 isEmpty 判空。由此可以判断出两者肯定还是存在不同的,今天就来分析下两者的区别。 20 | 21 | count 和 isEmpty 这两个属性来源于 `Collection`,count 表示数量,这个没啥特别的,需要注意的是isEmpty的实现。在标准库中,它的定义是这样的: 22 | 23 | ```swift 24 | extension Collection { 25 | var isEmpty: Bool { startIndex == endIndex } 26 | } 27 | ``` 28 | 29 | 集合的首索引和尾索引相等,则表示为空,这里只有一个比较,复杂度为 O(1)。 30 | 31 | 大部分集合类型都是走的该默认实现,但也有一些特定的集合类型会重写该方法,比如 `Set`: 32 | 33 | ```swift 34 | extension Set { 35 | var isEmpty: Bool { count == 0 } 36 | } 37 | ``` 38 | 39 | 那为啥会出现两种不同的情况呢,我们再看 Collection 里对 count 的说明。 40 | 41 | > **Complexity**: O(1) if the collection conforms to `RandomAccessCollection`; otherwise, O(**n**), where **n** is the length of the collection. 42 | 43 | 所以对于遵循了`RandomAccessCollection` 协议的类型,其count获取是 O(1) 复杂度,像是 Array;对于未遵循的类型,比如 String,其 count 复杂度就是 O(n),但是isEmpty 却还是 O(1)。 44 | 45 | 这里的 Set 还要再特殊一些,因为其没有实现 `RandomAccessCollection` 却还是用 count 的方式判定是否为空,这是因为 Set 的实现方式不同,其 count 的获取就是 O(1) 复杂度。 46 | 47 | 当然为了简化记忆,我们可以总是使用 isEmpty 进行判空处理。 48 | 49 | 因为涉及多个协议和具体类型,这里放一张表示这几个协议和类型之间的关系图。 50 | 51 | ![](https://cdn.zhangferry.com/Images/20211126004620.png) 52 | 53 | [图片来源](https://itwenty.me/2021/10/understanding-swifts-collection-protocols/ "图片来源") 54 | 55 | ## 面试解析 56 | 57 | 整理编辑:[师大小海腾](https://juejin.cn/user/782508012091645/posts) 58 | 59 | ### Swift 中 struct 和 class 的区别,值类型和引用类型的区别 60 | 61 | **struct & class** 62 | 63 | 在 Swift 中,其实 `class` 与 `struct` 之间的核心区别不是很多,有很多区别是值类型与引用类型这个区别隐形带来的天然的区别。 64 | 65 | - `class` 可以继承,`struct` 不能继承(当然 `struct` 可以利用 `protocol` 来实现类似继承的效果。);受此影响的区别有: 66 | 67 | - - `struct` 中方法的派发方式全都是直接派发,而 `class` 中根据实际情况有多种派发方式,详情可看 [CoderStar|Swift 派发机制](https://mp.weixin.qq.com/s?__biz=MzU4NjQ5NDYxNg==&mid=2247483768&idx=1&sn=0a6be7a9c5a374cbc5c5ba9a3c48020a&scene=21#wechat_redirec); 68 | 69 | - `class` 需要自己定义构造函数,`struct` 默认生成; 70 | 71 | - `class` 是引用类型,`struct` 是值类型;受此影响的区别有: 72 | 73 | - - `struct` 改变其属性受修饰符 let 影响,不可改变,`class` 不受影响; 74 | - `struct` 方法中需要修改自身属性时 (非 `init` 方法),方法需要前缀修饰符 `mutating`; 75 | - `struct` 因为是值类型的原因,所以自动线程安全,而且也不存在循环引用导致内存泄漏的风险; 76 | - ... 77 | 78 | - ... 79 | 80 | **值类型 & 引用类型** 81 | 82 | - 存储方式及位置:大部分值类型存储在栈上,大部分引用类型存储在堆上; 83 | - 内存:值类型没有引用计数,也不会存在循环引用以及内存泄漏等问题; 84 | - 线程安全:值类型天然线程安全,而引用类型需要开发者通过加锁等方式来保证; 85 | - 拷贝方式:值类型拷贝的是内容,而引用类型拷贝的是指针,从一定意义上讲就是所谓的深拷贝及浅拷贝 86 | 87 | 你可以在 [CoderStar|从 SIL 角度看 Swift 中的值类型与引用类型](https://mp.weixin.qq.com/s/6bvZ1YIhf2WCNsdkukTlew) 中查看详细内容。 88 | 89 | 90 | ## 优秀博客 91 | 92 | 整理编辑:[皮拉夫大王在此](https://www.jianshu.com/u/739b677928f7)、[我是熊大](https://juejin.cn/user/1151943916921885)、[东坡肘子](https://www.fatbobman.com) 93 | 94 | 1、[第三方日期处理库SwiftDate使用详解](https://www.hangge.com/blog/cache/detail_2222.html "@hangge|第三方日期处理库SwiftDate使用详解") -- 来自航歌:hangge 95 | 96 | [@东坡肘子](https://www.fatbobman.com/):SwiftDate 是在所有苹果平台,甚至在 Linux 和 Swift 服务器端框架(如 Vapor 或 Kitura )上操作和显示日期和时区的权威工具链。在 CocoaPods 上有超过 300 万的下载量。SwiftDate 功能强大,无论是简单的日期操作,还是复杂的业务逻辑都能满足。本文将对 SwiftDate 的使用方法做详尽说明。 97 | 98 | 2、[搞事情之 Vapor 初探](https://juejin.cn/post/6844903834659667981 "@PJHubs|搞事情之 Vapor 初探") -- 来自掘金:PJHubs 99 | 100 | [@东坡肘子](https://www.fatbobman.com/):Vapor 是一个基于 Swift 语言的开源 Web 框架,可用于创建 RESTful API、网站和使用 WebSockets 的实时应用。在核心框架之外,Vapor 还提供了 ORM 、模板语言,以及用户身份验证和授权模块。本文主要记录了第一次上手 Vapor 所遇到的问题、思考和总结。 101 | 102 | 3、[用 Publish 创建博客](https://www.fatbobman.com/tags/publish/ "@东坡肘子|用 Publish 创建博客") -- 来自肘子的Swift记事本:东坡肘子 103 | 104 | [@东坡肘子](https://www.fatbobman.com/):Publish 是一款专门为 Swift 开发者打造的静态网站生成器。它使用 Swift 语言构建整个网站,并支持主题、插件和其他大量的定制选项。本系列文章将通过三个篇幅分别介绍 Publish 的基本用法、主题定制以及插件开发。 105 | 106 | 4、[Using Realm and Charts with Swift 3 in iOS 10](https://medium.com/@skipadu/using-realm-and-charts-with-swift-3-in-ios-10-40c42e3838c0#.2gyymwfh8 "@Sami Korpela|Using Realm and Charts with Swift 3 in iOS 10") -- 来自:Sami Korpela 107 | 108 | [@我是熊大](https://github.com/Tliens):一个十分强大并且是纯 Swift 的图表相关的开源框架 -- Charts。本文作者利用 Swift 中的轻量级数据库 Realm 和 Charts,构建了一个 Demo。篇幅较长,适合新手,但美中不足的是:Demo 基于 Swift 3。此外我早期写过一篇关于 Realm 的实践代码的文章:[如何降低Realm数据库的崩溃](https://juejin.cn/post/6844904143501557773 "@我是熊大|如何降低Realm数据库的崩溃"),有兴趣可以看一下。 109 | 110 | 5、[今天我们来聊一聊WebSocket(iOS/Golang)](https://juejin.cn/post/6844904062408720391 "@齐舞647|今天我们来聊一聊WebSocket(iOS/Golang)") -- 来自掘金:齐舞647 111 | 112 | [@我是熊大](https://github.com/Tliens):Starscream swift 中的 7k+ star 的 socket 开源库,本文作者利用 GO 和 Starscream,模拟了客户端和服务端 websocket 的交互过程,建议对 Socket 感兴趣的阅读。 113 | 114 | 6、[Hero Usage Guide](https://github.com/HeroTransitions/Hero/wiki/Usage-Guide "Hero Usage Guide") -- 来自:Hero官方 115 | 116 | [@我是熊大](https://github.com/Tliens):Hero 是我用过的最好的转场动画,没有之一,20k+ star 的成绩也表明了它在转场动画的地位;Hero 应该能满足绝大部分需求,这是它的官方使用手册。 117 | 118 | ## 学习资料 119 | 120 | 整理编辑:[Mimosa](https://juejin.cn/user/1433418892590136) 121 | 122 | ### 戴铭的 Swift 小册子 123 | 124 | 地址:https://github.com/ming1016/SwiftPamphletApp 125 | 126 | 戴老师用 Swift 写的、按照声明式 UI、响应式编程范式开发的 Swift 小册子。你可以在这本小册子中查询到 Swift 的语法指南,同时还有 Combine、 Concurrency 和 SwiftUI 这些库的使用指南,你还可以在这追踪到一些知名仓库、开发者的 Github 动态和本仓库的 Issues。由于是开源的,你也可以自己调试学习或者是为项目作出贡献。 127 | 128 | ### 2021 黑五特惠 129 | 130 | 地址:https://github.com/mRs-/Black-Friday-Deals 131 | 132 | 这个仓库收集了今年黑五打折的开发类、效率类、工具类的软件,好多知名的不知名的软件都在打折,有需要的快冲! 133 | 134 | ## 工具推荐 135 | 136 | 整理编辑:[CoderStar](https://mp.weixin.qq.com/mp/homepage?__biz=MzU4NjQ5NDYxNg==&hid=1&sn=659c56a4ceebb37b1824979522adbb15&scene=18) 137 | 138 | ### PhotoSweeper 139 | 140 | **地址**:https://overmacs.com/ 141 | 142 | **软件状态**:$9.99,可以试用 143 | 144 | **软件介绍**: 145 | 146 | `PhotoSweeper` 是一款快速而强大的重复照片清理器,旨在帮助您在 Mac 上查找和删除重复和相似的照片。 147 | 148 | 我们可以考虑用在给应用瘦身时扫描相似图片资源场景下。 149 | 150 | ![PhotoSweeper](https://cdn.zhangferry.com/Images/PhotoSweeper_MacBook.jpeg) 151 | 152 | ## 关于我们 153 | 154 | iOS 摸鱼周报,主要分享开发过程中遇到的经验教训、优质的博客、高质量的学习资料、实用的开发工具等。周报仓库在这里:https://github.com/zhangferry/iOSWeeklyLearning ,如果你有好的的内容推荐可以通过 issue 的方式进行提交。另外也可以申请成为我们的常驻编辑,一起维护这份周报。另可关注公众号:iOS成长之路,后台点击进群交流,联系我们,获取更多内容。 155 | 156 | ### 往期推荐 157 | 158 | [iOS摸鱼周报 第三十四期](https://mp.weixin.qq.com/s/P0HjLDCIM3T-hAgQFjO1mg) 159 | 160 | [iOS摸鱼周报 第三十三期](https://mp.weixin.qq.com/s/nznnGmBsqsrWcvZ4XFMttg) 161 | 162 | [iOS摸鱼周报 第三十二期](https://mp.weixin.qq.com/s/6CyL0B6Zkf6KXRrfocohoQ) 163 | 164 | [iOS摸鱼周报 第三十一期](https://mp.weixin.qq.com/s/DQpsOw90UsRg6A5WDyT_pg) 165 | 166 | ![](https://cdn.zhangferry.com/Images/WechatIMG384.jpeg) 167 | -------------------------------------------------------------------------------- /WeeklyLearning/iOSWeeklyLearning_68.md: -------------------------------------------------------------------------------- 1 | # iOS 摸鱼周报 #68 | iPhone14 灵动岛创意 2 | 3 | ![](https://cdn.zhangferry.com/Images/moyu_weekly_cover.jpeg) 4 | 5 | ### 本期概要 6 | 7 | > * 本期话题:iPhone14 灵动岛创意 8 | > * 本周学习:OC 泛型中的 `__covariant` 与 `__contravariant` 9 | > * 内容推荐:编译和热重载优秀文章推荐 10 | > * 摸一下鱼:关于 iOS 开发国际化相关工具推荐 11 | 12 | ## 本期话题 13 | 14 | 整理编辑:[zhangferry](zhangferry.com) 15 | 16 | ### iPhone14 灵动岛创意 17 | 18 | 在发布会之前关于 iPhone 14 的爆料已经不少了,但看到灵动岛(Dynamic Island,翻译太赞了)的创意,还是让人眼前一亮。 19 | 20 | ![](https://cdn.zhangferry.com/Images/iphone_14_dynamic_island.GIF) 21 | 22 | 回想一下从 Home 键、3D Touch、全面屏的解锁手势、灵动岛,再包括 MacBook 的 Touch bar,Apple 对于交互的设计都是软硬件结合的。但灵动岛又不太一样,挖孔屏对于苹果来说不是首发,他是在一个本来就带槽点的能力上做的设计,把劣势变成优势这个能力是非常厉害的。 23 | 24 | 再说回这个设计,看过宣传视频,对于灵动岛具备的能力可能还会有些疑惑,这个控件能否由开发者控制呢?能控制到什么地步?原有通知的样式是否需要适配?因为这个功能可以配合 Live Activities 使用,应该是有一种配置是用于在灵动岛中展示的,但当我想看下这个文档,看能否找到一些相关的 API时,发现这个[文档链接](https://developer.apple.com/documentation/activitykit/displaying-live-data-on-the-lock-screen-with-live-activities "displaying-live-data-on-the-lock-screen-with-live-activities")被下掉了,整个 ActivityKit 文档也都没了,不知道这是要干啥。既然没法看文档就从网上爆出的视频简单推测下它的能力吧。 25 | 26 | * 已知与两种能力对应:信息通知和后台停留内容展示。作为展示能力看的话,灵动岛很有 iPhone 第二屏的感觉。 27 | * 作为后台停留展示时,需要申请后台能力,同时应该还会有一个停留的配置项。 28 | * 与 Live Activities 能力结合时,可以作为一个更精简的通知面板。这块样式是否可以定制还不确定,有两种方案,一种是通过 ActivityKit 简单定制,一种像音乐控制器一样,设置特定元素由系统自动提取。 29 | * 支持最多两个 App 的停留,会变成「叹号」样式。如果有更多后台 App 会如何替换,这个还不清楚。 30 | * 点击切换至对应 App,长按展开为大屏,目前已知的大屏样式有长条状、圆角正方形状、延伸屏幕边缘的矮矩形和高矩形、还有一种介于圆角正方形和屏幕宽度之间的尺寸。 31 | * 长按展开的样式会提供开发者定制能力,因为这块样式太多了。但能控制的内容不多,比如为了跟屏幕融为一体,背景会被限定为黑色。 32 | * 灵动岛长短的变化会影响左右两侧时间和信号的展示,如果灵动岛展示为大尺寸,两边的元素会被挤压至屏幕外。 33 | * 关于原有通知如何弹出的问题,因为灵动岛需要黑色背景才能体现连贯性,所以这块的交互不会默认迁移,那这样话会由一种新的通知样式用于适配灵动岛。 34 | 35 | ## 本周学习 36 | 37 | 整理编辑:[JY](https://juejin.cn/user/1574156380931144/posts) 38 | 39 | #### OC泛型中的 `__covariant` 与 `__contravariant` 40 | 41 | `__covariant` 与 `__contravariant` 分别是OC泛型当中的关键字 42 | 43 | * `__covariant` 代表协变,子类转成父类,子类型可以和父类型一样使用。 44 | * `__contravariant` 代表逆变,父类转成子类,父类型可以和子类型一样使用。 45 | 46 | 我们来看一下 `__covariant` 的作用: 47 | 48 | ```objectivec 49 | @interface Car : NSObject 50 | @property (nonatomic, copy) NSString *name; 51 | @end 52 | 53 | @interface BMW : Car 54 | @end 55 | 56 | @interface Person<__covariant T> : NSObject 57 | @property (nonatomic, strong) T car; 58 | @end 59 | ... 60 | Person * personBMW = [[Person alloc]init];; 61 | BMW * bmw = [[BMW alloc]init]; 62 | personBMW.car = bmw; 63 | personBMW.car.name = @"BMW"; 64 | 65 | Person * pCar = [[Person alloc]init]; 66 | pCar = personBMW; 67 | NSLog(@"%@",pCar.car.name); // BMW 68 | ``` 69 | 我们可以看到上述实例当中,子类型 `BMW` 成功转换成了父类型 `Car` 70 | 71 | 我们再来看看 `__contravariant` 的作用: 72 | 73 | ```C++ 74 | // 不使用__contravariant 的情况下 75 | Person * PCar = [[Person alloc]init]; 76 | Person * PBMW = [[Person alloc]init]; 77 | BMW * bmw = [[BMW alloc]init]; 78 | PBMW.car = bmw; 79 | PBMW.car.name = @"BMW"; 80 | PBMW = PCar; // ⚠️ 出现警告 Incompatible pointer types assigning to 'Person *' from 'Person *' 81 | ``` 82 | 83 | ```objectivec 84 | @interface Person<__contravariant T> : NSObject 85 | @property (nonatomic, strong) T car; 86 | @end 87 | ... 88 | Person * PCar = [[Person alloc]init]; 89 | Person * PBMW = [[Person alloc]init]; 90 | BMW * bmw = [[BMW alloc]init]; 91 | PBMW.car = bmw; 92 | PBMW.car.name = @"BMW"; 93 | PBMW = PCar; // 这时候再去赋值,不会出现警告 94 | ``` 95 | 96 | ## 内容推荐 97 | 98 | 整理编辑:[夏天](https://juejin.cn/user/3298190611456638) 99 | 100 | 1. [基于 LLVM 自制编译器——序](http://chuquan.me/2022/07/17/compiler-for-kaleidoscope-00/ "基于 LLVM 自制编译器——序") -- 来自:楚权的世界 101 | 102 | [@夏天](https://juejin.cn/user/3298190611456638):文章是基于官方教程 [《My First Language Frontend with LLVM Tutorial》](https://llvm.org/docs/tutorial/MyFirstLanguageFrontend/index.html "《My First Language Frontend with LLVM Tutorial》") 的翻译,有助于加深对编译原理的理解。 103 | 104 | 这位大佬的其他内容也值得推荐。 105 | 106 | 2. [How to improve iOS build times with modularization](https://www.runway.team/blog/how-to-improve-ios-build-times-with-modularization "How to improve iOS build times with modularization") -- 来自:Bruno Rocha 107 | 108 | [@夏天](https://juejin.cn/user/3298190611456638):文章分析了影响 iOS 构建的因素,以及当我们使用模块化后如何使用 **API/Impl** 技术更快地编译相互依赖的模块。 109 | 110 | 3. [ARC and Memory Management in Swift](https://www.raywenderlich.com/966538-arc-and-memory-management-in-swift "ARC and Memory Management in Swift") -- 来自:RayWenderlich 111 | 112 | [@夏天](https://juejin.cn/user/3298190611456638):RayWenderlich 教程系列的文章质量都比较高,本文介绍了 ARC 的工作原理以及内存管理的最佳实践,顺便介绍了如何发现内存泄露,很完整的一个教程。 113 | 114 | 4. [Hot Reloading in Swift](https://www.merowing.info/hot-reloading-in-swift/ "Hot Reloading in Swift") —— Krzysztof Zabłocki 115 | 116 | [@夏天](https://juejin.cn/user/3298190611456638):如同 Injection 一样的帮助热重载的工具[DyCI](https://github.com/DyCI/dyci-main "DyCI"),文章并没有涉足原理,但是讲述了一些设计历程。 117 | 118 | 5. [App 如何通过注入动态库的方式实现极速编译调试?](https://time.geekbang.org/column/article/87188 "App 如何通过注入动态库的方式实现极速编译调试?")—— 戴铭《iOS 开发高手课》 119 | 120 | [@夏天](https://juejin.cn/user/3298190611456638):使用动态库加载方式进行极速调试,简单分析了 Flutter 和 Injection 的原理。 121 | 122 | ## 摸一下鱼 123 | 124 | 整理编辑:[CoderStar](https://mp.weixin.qq.com/mp/homepage?__biz=MzU4NjQ5NDYxNg==&hid=1&sn=659c56a4ceebb37b1824979522adbb15&scene=18) 125 | 126 | 介绍几个关于iOS开发国际化的工具; 127 | 128 | - genstrings:Xcode内置工具,从指定的 C 或者 Objective-C 源文件生成 `.strings` 文件; 129 | - ibtool:Xcode内置工具,正如 `genstrings` 作用于源代码,而 `ibtool` 作用于 `XIB` 文件; 130 | - bartycrouch:bartycrouch 可以依据 interfaces 文件( xib 文件) 和代码(swift 、m、h 文件)来增量更新 strings 文件。在这里 增量 是指 bartycrouch 会默认保留已经翻译的值及改变了的注释; 131 | - Poedit:Poedit 是一款基于多语言的本地化工具,支持 Win/Mac/Linux 三大主流平台,经常被用于本地化各种计算机软件; 132 | 133 | ## 关于我们 134 | 135 | iOS 摸鱼周报,主要分享开发过程中遇到的经验教训、优质的博客、高质量的学习资料、实用的开发工具等。周报仓库在这里:https://github.com/zhangferry/iOSWeeklyLearning ,如果你有好的的内容推荐可以通过 issue 的方式进行提交。另外也可以申请成为我们的常驻编辑,一起维护这份周报。另可关注公众号:iOS成长之路,后台点击进群交流,联系我们,获取更多内容。 136 | 137 | ### 往期推荐 138 | 139 | [iOS 摸鱼周报 #67 | Xcode Cloud 已支持订阅](https://mp.weixin.qq.com/s/8H7YnrVTubKvVnYJBXcF_A) 140 | 141 | [iOS 摸鱼周报 #66 | Shazam 迎来问世 20 周年](https://mp.weixin.qq.com/s/LP1qNAgjzEiDwrR7I32kuA) 142 | 143 | [iOS 摸鱼周报 #65 | 什么是精准测试](https://mp.weixin.qq.com/s/lvMHf5qQHpnDGLz1KY-2dg) 144 | 145 | [iOS 摸鱼周报 #64 | 与 App Store 专家会面交流](https://mp.weixin.qq.com/s/Bd9MZDqmvmgp1UTr5WKPig) 146 | 147 | ![](https://cdn.zhangferry.com/Images/WechatIMG384.jpeg) 148 | -------------------------------------------------------------------------------- /WeeklyLearning/iOSWeeklyLearning_7.md: -------------------------------------------------------------------------------- 1 | # iOS摸鱼周报 第七期 2 | 3 | ![](https://cdn.zhangferry.com/Images/iOS摸鱼周报模板.png) 4 | 5 | iOS摸鱼周报,主要分享大家开发过程遇到的经验教训及学习内容。虽说是周报,但当前内容的贡献途径还未稳定下来,如果后续的内容不足一期,可能会拖更到下一周再发。所以希望大家可以多分享自己学到的开发小技巧和解bug经历。 6 | 7 | 周报仓库在这里:https://github.com/zhangferry/iOSWeeklyLearning ,可以查看README了解贡献方式;另可关注公众号:iOS成长之路,后台点击进群交流,联系我们。 8 | 9 | ## 开发Tips 10 | 11 | 开发小技巧收录。 12 | 13 | ### 文件夹命名 14 | 15 | 最近执行shell脚本时,发生了奇怪的问题,很简单的`rm`命令却一直执行出错。看了日志发现是文件路径路径中包含`&`符号,其中某个文件夹的命名带有这个与符号。执行命令时这被作为特殊符号,被拆成了两条命令,导致出错。 16 | 17 | 所以之后文件或者文件夹命名切记不要用`&`、`|` 这些特殊字符。 18 | 19 | ### 动态库vs静态库 20 | 21 | 使用Swift的第三方库的时候我们可以选择静态或者动态库,那它们之间有什么区别呢?可以参考这篇文章 22 | 23 | [Static VS dynamic frameworks in Swift: an in-depth analysis](https://acecilia.medium.com/static-vs-dynamic-frameworks-in-swift-an-in-depth-analysis-ff61a77eec65 "Static VS dynamic frameworks in Swift: an in-depth analysis") 24 | 25 | 测试项目有27个动态库,其中6个是用Carthage集成的,21个是用CocoaPods集成的。把他们全部转成静态库之后,软件Size降低了14.55%,启动时间降低了35%左右,主要是降低了动态库的加载时间,以下是各阶段详细的时间对比: 26 | 27 | ![](https://cdn.zhangferry.com/Images/20210328160207.png) 28 | 29 | 这里启动时间降低好理解,大小降低是因为啥呢,是因为静态库时编译器移除了无用的符号表。 30 | 31 | 因为应用内的动态库,不像系统动态库一样可以供别的App共享,所以它无法起到减少包体的作用。所以通常情况下我们都应该考虑优先使用静态库。 32 | 33 | 另外静态库可以依赖动态库,但是动态库是不能依赖静态库的。 34 | 35 | ## 编程概念 36 | 37 | ### 什么是SSH 38 | 39 | SSH是一个网络安全协议,用于计算机之间的加密登录(非对称加密),每台Linux上都安装有SSH。它工作在传输层,能防止中间人攻击,DNS欺骗。它的用法是 40 | 41 | ```shell 42 | $ ssh user@host 43 | ``` 44 | 45 | host可以是ip地址或者域名,还可以通过-p指定端口号。 46 | 47 | ssh登录流程为: 48 | 49 | 1、远程主机收到用户的登录请求,把自己的公钥发给用户。 50 | 51 | 2、用户使用这个公钥,将登录密码加密后,发送回来。 52 | 53 | 3、远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录。 54 | 55 | 56 | 如果不想每次登录时都输密码,可以将本地的公钥发送到远程主机,这样登录过程就变成了: 57 | 58 | 1、每次远程主机发送一个随机字符串 59 | 60 | 2、用户用自己的私钥加密 61 | 62 | 3、远程主机利用公钥解密,如果成功就就同意用户登录。 63 | 64 | ### 什么是Nginx 65 | 66 | ![](https://cdn.zhangferry.com/Images/nginx.png) 67 | 68 | Nginx是一款轻量级的Web服务器、反向代理服务器,由于其开源、内存占用少,启动快,高并发能力强,在互联网项目中广泛应用;同时它还是一个IMAP、POP3、SMTP代理服务器,还可以作为反向代理进行负载均衡的实现。 69 | 70 | 应用场景:在博客站点中,它担任HTTP服务器的作用,通过HTTP协议将服务器上的静态文件(HTML、图片)展现给客户端。 71 | 72 | ### 什么是负载均衡 73 | 74 | 负载均衡是一种提高网络可用性的解决方案。当没有负载均衡时,当前服务器宕机或访问量超过服务器上限都会导致网站瘫痪无法访问。负载均衡的解决方案是,设立多台服务器,在访问服务器之前首先经过负载均衡器,由负载均衡器进行分配当前请求应该访问哪一个服务器。既提高了网站瘫痪的容错率又分摊了单个服务器的压力。 75 | 76 | 负载均衡的实现关键点是如何分配服务器。前置条件是定期检测服务器健康状态,维护一个健康服务器池,然后用一定的算法进行服务器分配,有三种常见分配算法: 77 | 78 | 轮询:按健康服务器表逐一分配 79 | 80 | 最小链接:优先选择连接数最少的服务器 81 | 82 | Source:根据来源ip地址选择服务器,保证特定用户连接同一服务器 83 | 84 | Nginx可以用于实现负载均衡,也提供了以上几种分配算法实现。 85 | 86 | ### 什么是Apache 87 | 88 | ![](https://cdn.zhangferry.com/Images/apache.png) 89 | 90 | Apache有多个含义: 91 | 92 | 一是Apache基金会,它是专门为支持开源软件项目而创办的一个非营利性组织,它所发行的软件都遵循Apache协议。 93 | 94 | 二是Apache服务器,即httpd,它是Apache团队最早开发的项目,由于它的跨平台和安全性的特点,它成为了世界上最流行的Web服务器软件之一。Apache作为服务器跟Nginx是一样的东西,他们都只支持静态网页,Nginx更轻量,Apache则更稳定。 95 | 96 | 三是Apache协议(Apache Licence),Apache协议的目的是为了鼓励代码共享,并达到尊重原作者的著作权的作用。你可以使用遵循Apache协议的开源框架并投入商用,但要保留其原有协议声明,如果进行了修改也需要进行说明。 97 | 98 | ### 什么是Tomcat 99 | 100 | ![](https://cdn.zhangferry.com/Images/tomcat.png) 101 | 102 | Tomcat是由Apache基金会推出的一款开源的可实现JavaWeb程序的Web服务器框架,它是配置JSP(Java Server Page)和JAVA系统必备的一款环境。 103 | 104 | 它与Apache服务器的区别在于,Apache只支持静态网页,比如博客网站,而Tomcat支持JSP,Servlet,可以实现动态的web应用,像是图书管管理系统。两者也可以结合,处理既有动态又有静态的网站。 105 | 106 | ### 什么是Docker 107 | 108 | ![](https://cdn.zhangferry.com/Images/20210326231951.png) 109 | 110 | 理解Docker之前需要知道容器的概念,容器就是一个封闭的开发环境,类似移动端的沙盒,每个沙盒都可以配置不同的程序,甚至相同程序的不同版本,我在沙盒做的操作不会影响别的沙盒程序。 111 | 112 | 虚拟机也是一种容器,我可以在不同虚拟机的配置里运行不同的程序,他们互不影响。但是虚拟机太占用系统资源了,不同虚拟机占用不同的内核资源,能否把其中一些共性的东西进行共享?当然是可以的,这就是Docker做的事情。 113 | 114 | Docker是一家公司,它还做了一个好事情,就是供了很多配置好的镜像资源(一整套的环境搭建),存储在公共的镜像仓库,大大简化了应用的分发,部署流程。 115 | 116 | 117 | ## 优秀博客 118 | 119 | [翻译-为什么objc_msgSend必须用汇编实现](http://tutuge.me/2016/06/19/translation-why-objcmsgsend-must-be-written-in-assembly/ "翻译-为什么objc_msgSend必须用汇编实现") -- 来自博客:土土哥的blog 120 | 121 | [深度长文:细说iOS代码签名](http://xelz.info/blog/2019/01/11/ios-code-signature/ "深度长文:细说iOS代码签名") -- 来自博客:xelz's blog 122 | 123 | [从Mach-O角度谈谈Swift和OC的存储差异](https://www.jianshu.com/p/ef0ff6ee6bc6 "从Mach-O角度谈谈Swift和OC的存储差异") -- 来自简书:皮拉夫大王在此 124 | 125 | [一种Swift Hook新思路——从Swift的虚函数表说起](https://www.jianshu.com/p/0cbbbe783ac9 "一种Swift Hook新思路——从Swift的虚函数表说起") -- 来自简书:皮拉夫大王在此 126 | 127 | [Swift5.0 的 Runtime 机制浅析](https://juejin.cn/post/6844903889523884039 "Swift5.0 的 Runtime 机制浅析") -- 来自掘金:欧阳大哥2013 128 | 129 | [编译原理初学者入门指南](https://mp.weixin.qq.com/s/ZTxVG6KG-4vzbvclC_Q1LQ "编译原理初学者入门指南") -- 来自公众号:腾讯技术工程 130 | 131 | [神秘!申请内存时底层发生了什么?](https://mp.weixin.qq.com/s/DN-ckM1YrPMeicN7P9FvXg "神秘!申请内存时底层发生了什么?") -- 来自公众号:码农的荒岛求生 132 | 133 | [推荐收藏 | 美团技术团队的书单](https://tech.meituan.com/2020/04/23/read-book-2020-04-23.html "推荐收藏 | 美团技术团队的书单") -- 来自博客:美团技术团队 134 | 135 | [青年人在美团是怎样成长的?](https://tech.meituan.com/2020/05/04/meituan-0504-young-people.html "青年人在美团是怎样成长的?") -- 来自博客:美团技术团队 136 | 137 | 138 | ## 学习资料 139 | 140 | ### 一个人工智能的诞生 141 | 142 | 地址:https://jibencaozuo.com/product/1/episode/0。 143 | 144 | 由回形针制作的人工智能交互视频课程,对,可交互的视频,这种可交互性作为学习还是非常棒的。视频质量很高,趣味性也很强。你可以1元体验第一个章节,如果认为很不错,需要支付49元解锁剩余内容。 145 | 146 | 作者在每个章节都会设计一些问题,答对了才能进到下一章节。前面几节在讲人工智能学习的一些概念和核心数学思想,最后的两个章节属于练习题,我感觉还是有点难的。但课程整体还是很有意思的,如果想了解可以买来看看。下图是课程的目录: 147 | 148 | ![](https://cdn.zhangferry.com/Images/20210328103223.png) 149 | 150 | ## 工具推荐 151 | 152 | 推荐好用的工具。 153 | 154 | ### P4Merge 155 | 156 | **推荐来源**:zhangferry 157 | 158 | **地址**:https://www.perforce.com/downloads/visual-merge-tool 159 | 160 | **软件状态**:对开发者免费 161 | 162 | **使用介绍** 163 | 164 | 非常强大的可视化diff工具,如果你嫌[Kaleidoscope](https://kaleidoscope.app/)太贵的话,可以用它做代替品。我们可以把它集成进git,通常diff工具有两个作用一个是作为difftool,一个是作为mergetool。配置流程如下: 165 | 166 | ```shell 167 | # difftool 168 | $ git config --global diff.tool p4merge 169 | $ git config --global difftool.p4merge.cmd \ 170 | "/Applications/p4merge.app/Contents/Resources/launchp4merge \$LOCAL \$REMOTE" 171 | # mergetool 172 | $ git config --global merge.tool p4merge 173 | $ git config --global mergetool.p4merge.cmd "/Applications/p4merge.app/Contents/MacOS/p4merge $PWD/$BASE $PWD/$LOCAL $PWD/$REMOTE" 174 | ``` 175 | 176 | 以下是作为mergetool的界面,下面内容为最终合并的内容,我们可以通过右侧的扩展按钮选择当前应该选择哪个分支的内容。 177 | 178 | ![](https://cdn.zhangferry.com/Images/20210327200304.png) 179 | 180 | ## ProfilesManager 181 | 182 | **推荐来源**:[jcexk](https://github.com/jcexk) 183 | 184 | **地址**:https://github.com/shaojiankui/ProfilesManager/releases 185 | 186 | **软件状态**:免费,开源 187 | 188 | **使用介绍** 189 | 190 | 一款Provisioning Profile管理工具,ProfilesManager特点如下: 191 | 192 | 1. 方便快捷:支持查看电脑中所有的描述文件 193 | 2. 一目了然:通过美化描述文件名,不再是难以辨认的'uuid+ext'格式 194 | 3. 功能强大:支持查看ipa中描述文件和info.plist信息 195 | 4. 结构清晰:通过树状结构查看描述文件包含的详细信息,如:创建时间、失效时间和包含的移动设备信息等 196 | 5. 免费使用:而在App Store上类似功能的软件居然还要收费??? 197 | 6. 可排序和过滤:通过关键词筛选过滤找到想要的文件,也可以通过头部标签排序文件 198 | 199 | ![](https://cdn.zhangferry.com/Images/20210327112346.png) 200 | 201 | ## 联系我们 202 | 203 | [摸鱼周报第三期](https://zhangferry.com/2021/01/10/iOSWeeklyLearning_3/) 204 | 205 | [摸鱼周报第四期](https://zhangferry.com/2021/01/24/iOSWeeklyLearning_4/) 206 | 207 | [摸鱼周报第五期](https://zhangferry.com/2021/02/28/iOSWeeklyLearning_5/) 208 | 209 | [摸鱼周报第六期](https://zhangferry.com/2021/03/14/iOSWeeklyLearning_6/) 210 | 211 | ![](https://cdn.zhangferry.com/Images/wechat_official.png) 212 | -------------------------------------------------------------------------------- /WeeklyLearning/iOSWeeklyLearning_70.md: -------------------------------------------------------------------------------- 1 | # iOS 摸鱼周报 #70 | iOS / iPadOS 16.1 公测版 Beta 3 发布,支持老款 iPad 台前调度 2 | 3 | ![](https://cdn.zhangferry.com/Images/moyu_weekly_cover.jpeg) 4 | 5 | ### 本期概要 6 | 7 | > * 本期话题:苹果 iOS / iPadOS 16.1 公测版 Beta 3 发布,为老款 iPad 支持台前调度 8 | > * 本周学习:排查修复 App Store 上架项目闪退问题 9 | > * 内容推荐:iOS 开发技巧及计算机基础内容学习 10 | > * 摸一下鱼:计算麦当劳套餐卡路里的营养计算器,可以模拟木鱼声音的软件,以及插图绘制软件 11 | 12 | ## 本期话题 13 | 14 | ### 苹果 iOS / iPadOS 16.1 公测版 Beta 3 发布,为老款 iPad 支持台前调度 15 | 16 | [@师大小海腾](https://juejin.cn/user/782508012091645/posts):苹果于 9 月 29 日向 iPhone 用户推送了 **iOS 16.1 公测版 Beta 3 更新(内部版本号:20B5056e)**,本次更新距离上次发布隔了 7 天。此外,iPadOS 16.1 也迎来新的公测版。 17 | 18 | 公测版的更新内容与昨日推送的开发者预览版基本一致,对于苹果 iPad 用户,苹果将台前调度功能扩展到了搭载 **A12X 或 A12Z 芯片**的 iPad Pro,不过功能上有缺失,无法支持外部显示器使用。该功能此前只能在 M1 芯片的 iPad 上使用。 19 | 20 | ![](https://cdn.zhangferry.com/Images/20220929212647.png) 21 | 22 | 在 iOS 16.1 的最新更新中,苹果在设置中加入了新的修改壁纸选项,并且移除了 Matter 配件,添加了新的开关选项,允许应用在下载后和用户首次启动之前自动开始下载其应用内内容。 23 | 24 | ![](https://cdn.zhangferry.com/Images/20220929212708.png) 25 | 26 | ![](https://cdn.zhangferry.com/Images/20220929212719.png) 27 | 28 | 另外,苹果将在 iOS 16.1 中为用户带来实时活动通知,用户将可以在锁屏、灵动岛上看到 App 的实时消息。 29 | 30 | ![](https://cdn.zhangferry.com/Images/20220929212740.png) 31 | 32 | 来源:[IT之家 - 苹果 iOS / iPadOS 16.1 公测版 Beta 3 发布,为老款 iPad 支持台前调度](https://m.ithome.com/html/643916.htm "IT之家 - 苹果 iOS / iPadOS 16.1 公测版 Beta 3 发布,为老款 iPad 支持台前调度") 33 | 34 | ## 本周学习 35 | 36 | 整理编辑:[FBY 展菲](https://github.com/fanbaoying) 37 | 38 | ### App Store 已上架项目打开瞬闪问题 39 | 40 | #### 1. 问题背景 41 | 42 | 用户反馈 iPhone11 iOS14.7 下载安装 App 后,点击图标,App 闪一下就回到了桌面。 43 | 44 | 收到问题反馈之后,使用手上测试机测试,iPhone11 iOS15.5 和 iPhone12 iOS15.0 均没有复现问题。 45 | 46 | 一时没有找到和用户相同的版本的测试手机,找到一台 iPhone11 iOS13.6 的手机。复现了问题。 47 | 48 | 后面使用 iPhone7 iOS13.6 也复现了问题。iPhoneX iOS16.0 没有问题。 49 | 50 | #### 2. 问题分析 51 | 52 | 问题分析使用的是 iPhone11 iOS13.6 和 iPhone7 iOS13.6 两部手机。 53 | 54 | App 安装版本限制是 iOS13 及以上版本。 55 | 56 | **怀疑一:** 是项目中引入的音频动态库版本太老不兼容导致。 57 | 58 | 检查之后发现虽然和最新版本差了2个小版本,并且文档中没有更新提示相关兼容性问题。并且项目打包上架,经过了 `Validate App`。排除怀疑。 59 | 60 | **怀疑二:** 系统 Api 在 iOS15.0 以下版本不兼容 。 61 | 62 | 如果是系统 Api 不兼容,不管是直接在 App store 下载安装,还是直接编译到手机,都会有问题。实际测试,直接编译到手机没有复现问题。 63 | 64 | **怀疑三:** 群友提出可能是因为 Xcode 版本太老导致的问题 65 | 66 | 我目前的 Xcode 版本是 13.3.1,最新版本是 13.4.1,只差了一个小版本。 67 | 68 | **怀疑四:** 群友提出可能电脑是 M1 芯片导致 69 | 70 | 感觉关系不大。 71 | 72 | #### 3. 问题调试 73 | 74 | 根据以上的四个疑问,逐个排查。 75 | 76 | 在调试之前,已经清除掉手机上已经存在的 App,并且卸载清除掉所有缓存。 77 | 78 | **1. 联机调试** 79 | 80 | 手机连接电脑,直接编译到手机中。App 正常使用,没有闪退问题 81 | 82 | **2. Crashes** 83 | 84 | Xcode 中的 Crashes 也没有收到任何崩溃信息。 85 | 86 | **3. TestFlight** 87 | 88 | 通过 TestFlight 的内外部测试,收集闪退的问题。 89 | 90 | **4. 升级 Xcode** 91 | 92 | 申请使用备用电脑,进行 Xcode 升级,项目打包上架。在 Xcode 升级到 13.4.1 后打包上架的项目,闪退的问题消失。 93 | 94 | 95 | 来源:[App Store 已上架项目打开瞬闪问题 - Swift 社区](https://mp.weixin.qq.com/s/QOB5alijsV5Gg8pi4lg03g "App Store 已上架项目打开瞬闪问题 - Swift 社区") 96 | 97 | ## 内容推荐 98 | 99 | 整理编辑:[Mimosa](https://juejin.cn/user/1433418892590136) 100 | 101 | 1、[How necessary are the programming fundamentals?](https://swiftrocks.com/how-necessary-are-the-programming-fundamentals "How necessary are the programming fundamentals?") -- 来自: Bruno Rocha 102 | 103 | [@Mimosa](https://juejin.cn/user/1433418892590136):我们平时写写业务代码好像用不到高深的算法、数据结构等知识,但是在大厂的面试中似乎又不可避免以高难度的形态出现,那这些编程基础知识到底有什么用呢?本文的作者讨论了这一普遍的现象,并以生动的例子提出了自己的见解和类比,并解释了这种情况出现的原因,同时也对这种略显病态的面试流程提出了自己的看法,如果你也有类似的疑惑,相信这篇文章可以给你一些启发。 104 | 105 | 2、[DocC Tutorial for Swift](https://www.raywenderlich.com/34919511-docc-tutorial-for-swift-getting-started "DocC Tutorial for Swift") -- 来自: raywenderlich 106 | 107 | [@Mimosa](https://juejin.cn/user/1433418892590136):在 WWDC21 上,Apple 推出了 DocC,这是一个文档编译器,可以在 Xcode 文档窗口中构建和查看 Swift 包的文档。Apple 在 WWDC22 中扩展了 DocC 功能,因此它也可以记录 Swift 和 Objective-C 项目。在这个教程中,会告诉你 DocC 的工作原理、一些实操的例子以及如何导出和发布。 108 | 109 | 3、[How to create Rounded Corners Button in UIKit](https://sarunw.com/posts/uikit-rounded-corners-button/ "How to create Rounded Corners Button in UIKit") -- 来自: Sarunw 110 | 111 | [@Mimosa](https://juejin.cn/user/1433418892590136):相信很多人还不知道在 iOS 15 之后,我们可以使用 `UIButton.Configuration` 来设置按钮的圆角以及其他表现,这篇文章就带大家熟悉一下这个好用的配置属性。 112 | 113 | 4、[聊聊 iOS 中的像素对齐](https://juejin.cn/post/7124658703088910350 "聊聊 iOS 中的像素对齐") -- 来自: JPlay 114 | 115 | [@Mimosa](https://juejin.cn/user/1433418892590136):当一个 UILabel 的宽度是 500.001 和 500 时会有什么区别?本文探讨了像素不对齐出现的原因以及系统像素补齐的原则,并给出了一些避免和解决的方法。 116 | 117 | 5、[重新开始学习计算机](https://juejin.cn/post/7124660156612214814 "重新开始学习计算机") -- 来自: JPlay 118 | 119 | [@Mimosa](https://juejin.cn/user/1433418892590136):这是一份一位程序员面对 35 岁职业魔咒的应对之道:拥有扎实的、广泛的、不受平台局限的计算机基础知识。 120 | 121 | 122 | ## 摸一下鱼 123 | 124 | 整理编辑:[夏天](https://juejin.cn/user/3298190611456638) 125 | 126 | 1、[麦当劳-营养计算器](https://www.mcdonalds.com.cn/nutrition_calculator "麦当劳-营养计算器"):如同其提及的,这是一款计算麦当劳套餐卡路里的网页,你可以怀揣着健康饮食的心来面对你手中的汉堡和多冰可乐。 127 | 128 | ![](https://cdn.zhangferry.com/Images/nutrition_calculator.png) 129 | 130 | 2、[Wooden Fish](https://apps.apple.com/app/id1522144157 "Wooden Fish"): 木鱼-念经助手。一个模拟真实敲木鱼的App。如果你是一个虔诚的基督徒,你可以试试 [我的圣经](https://apps.apple.com/cn/app/my-holy-rosary-%E6%88%91%E7%9A%84%E5%9C%A3%E7%BB%8F-%E6%9C%89%E5%A3%B0%E8%AF%BB%E7%89%A9/id1188342937?mt=12 "我的圣经")。 131 | 132 | ![](https://cdn.zhangferry.com/Images/wooden_fish.png) 133 | 134 | 3、[Vectornator](https://www.vectornator.io "Vectornator"): 一款好用的插图绘制软件。 135 | 136 | ![](https://cdn.zhangferry.com/Images/vectornator.png) 137 | 138 | > 官网的交互体验感觉很不错 139 | 140 | ## 关于我们 141 | 142 | iOS 摸鱼周报,主要分享开发过程中遇到的经验教训、优质的博客、高质量的学习资料、实用的开发工具等。周报仓库在这里:https://github.com/zhangferry/iOSWeeklyLearning ,如果你有好的的内容推荐可以通过 issue 的方式进行提交。另外也可以申请成为我们的常驻编辑,一起维护这份周报。另可关注公众号:iOS成长之路,后台点击进群交流,联系我们,获取更多内容。 143 | 144 | ### 往期推荐 145 | 146 | [iOS 摸鱼周报 #69| 准备登陆灵动岛](https://mp.weixin.qq.com/s/Miy8xsHYHHSXsl5NtxswQA) 147 | 148 | [iOS 摸鱼周报 #68 | iPhone14 灵动岛创意](https://mp.weixin.qq.com/s/YNukagI-VTOsIkhlYM6dEQ) 149 | 150 | [iOS 摸鱼周报 #67 | Xcode Cloud 已支持订阅](https://mp.weixin.qq.com/s/8H7YnrVTubKvVnYJBXcF_A) 151 | 152 | [iOS 摸鱼周报 #66 | Shazam 迎来问世 20 周年](https://mp.weixin.qq.com/s/5chb-a9u7VMdLis1FG6B6Q) 153 | 154 | ![](https://cdn.zhangferry.com/Images/WechatIMG384.jpeg) 155 | -------------------------------------------------------------------------------- /WeeklyLearning/iOSWeeklyLearning_76.md: -------------------------------------------------------------------------------- 1 | # iOS 摸鱼周报 #76 | 程序员提问的智慧 2 | 3 | ![](https://cdn.zhangferry.com/Images/moyu_weekly_cover.jpeg) 4 | 5 | ### 本期概要 6 | 7 | > * 本周学习:如何智慧提问? 8 | > * 内容推荐:SwiftUI 相关的一些博客推荐 9 | > * 摸一下鱼:Combine 操作符;Token,Session,JWT 这些鉴权技术有哪些区别?Mac 版微信为何不断往电脑中写日志?;Github 开源两款字体;一个摸鱼小网站。 10 | 11 | ## 本周学习 12 | 13 | 整理编辑:[阿拉卡](https://github.com/readyhe) 14 | 15 | ### 面向程序员,如何智慧提问? 16 | 17 | 在平时的工作中,相信很多的程序员小伙伴都面临两个问题: 18 | 19 | - 经常不知道如何提出自己的问题 20 | - 经常被其他同学打断自己的编码思路 21 | 22 | 这两个问题曾也久久困扰着小编。那么如何提升提问和被提问的能力?我们今天就聊聊**智慧的提问**这个很虚但很实用的话题,它适用于开发,产品,运营等同学 23 | 24 | #### 提问前需要做什么? 25 | 26 | 在你准备提问时,你应该是有做过思考和前期准备的。对于程序员来说,当你遇到业务问题或者是技术问题。那么你应该有如下几点需要做到: 27 | 28 | >尝试在旧的问题列表找到答案。 29 | > 30 | >尝试上网搜索以找到答案。 31 | > 32 | >尝试阅读手册以找到答案。 33 | > 34 | >尝试阅读常见问题文件(FAQ)以找到答案。 35 | > 36 | >尝试自己检查或试验以找到答案。 37 | > 38 | >尝试阅读源码找到答案。 39 | 40 | 当你提出问题的时候,请先表明你已经做了上述的努力;这将有助于树立你并不是一个不劳而获且浪费别人的时间的提问者。如果你能一并表达在做了上述努力的过程中所**学到**的东西会更好,因为我们更乐于回答那些表现出能从答案中学习的人的问题。 41 | 42 | **准备好你的问题,再将问题仔细的思考过一遍,然后开始提问** 43 | 44 | #### 提问时如何描述问题? 45 | 46 | 如何很好的提问,这也是我们常见的一些问题。下面是常用的一些手段: 47 | 48 | > 使用有意义且描述明确的标题 49 | > 50 | > 精确地描述问题并言之有物 51 | > 52 | > 话不在多而在精 53 | > 54 | > 别动不动就说自己找到了 Bug 55 | > 56 | > 描述实质问题而不是你的猜测问题 57 | > 58 | > 按发生时间先后列出问题症状 59 | > 60 | > 询问有关代码的问题时,不要直接粘贴几百行代码 61 | > 62 | > 去掉无意义的提问句,减少无效内容 63 | > 64 | > 即使你很急也不要在标题写`紧急`,你可能直接都不知道是否紧急 65 | 66 | #### Bad Question(蠢问题) 67 | 68 | 以下是几个经典蠢问题: 69 | 70 | 问题:我能在哪找到 X 程序或 X 资源? 71 | 72 | 问题:我怎样用 X 做 Y? 73 | 74 | 问题:我的程序/设定/SQL 语句没有用? 75 | 76 | 问题:我的 Mac 电脑有问题,你能帮我吗? 77 | 78 | 问题:我的程序不会动了,我认为系统工具 X 有问题 79 | 80 | 问题:我在安装 Linux(或者 X )时有问题,你能帮我吗? 81 | 82 | 问题:你的程序有Bug,能帮我解决吗? 83 | 84 | 来源:[How To Ask Questions The Smart Way](http://www.catb.org/~esr/faqs/smart-questions.html "How To Ask Questions The Smart Way")和[提问的智慧](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/main/README-zh_CN.md "提问的智慧") 85 | 86 | ## 内容推荐 87 | 88 | 整理编辑:[远恒之义](https://github.com/eternaljust) 89 | 90 | 1、[在 SwiftUI 中创建自适应的程序化导航方案](https://www.fatbobman.com/posts/adaptive-navigation-scheme/ "在 SwiftUI 中创建自适应的程序化导航方案") -- 来自:东坡肘子 91 | 92 | [@远恒之义](https://github.com/eternaljust):随着苹果对 iPadOS 的不断投入,越来越多的开发者都希望自己的应用能够在 iPad 中有更好的表现。尤其当用户开启了台前调度( Stage Manager )功能后,应用对不同视觉大小模式的兼容能力就越发显得重要。本文将就如何创建可自适应不同尺寸模式的程序化导航方案这一内容进行探讨。 93 | 94 | 2、[简介 iOS 16 新的 Layout 协议](https://www.appcoda.com.tw/ios16-layout-protocol/ "简介 iOS 16 新的 Layout 协议") -- 来自:appcoda 95 | 96 | [@远恒之义](https://github.com/eternaljust):在 iOS 16 中,Apple 推出了 Layout 协议,希望进一步简化在 SwiftUI 构建 UI Layout 的步骤。本文将介绍这个新协议的用途和使用方法,并用它们的 Layout 规则创建属于自己的容器。 97 | 98 | 3、[Swift project in 2023](https://www.swift.org/blog/focus-areas-2023/ "Swift project in 2023") -- 来自:swift.org 99 | 100 | [@远恒之义](https://github.com/eternaljust):来自 Swift 官网博客的消息,Swift 核心团队收集并整理了社区和论坛所关注的信息,列出了他们明年的工作计划和内容。其中核心团队会更新重组,将创建更多工作组,包括一个致力于提高 Swift 跨平台可用性的工作组。语言工作组专注于在五个主要语言领域:Concurrency(并发)、Generics(泛型)、Ownership(内存所有权)、Macros(宏)和 C++ interoperability(C++ 互操作性)。同时编译器开发团队将改进编译器与构建系统和自身其他调用的交互方式。其他还包括对 Swift 包管理器的优化,文档工作组将开发工具来解决文档需求,网站工作组专注于通过多种方式增强 swift.org 网站,服务器工作组专注于提升服务器和 Linux 上的 Swift 状态等。 101 | 102 | 4、[如何在 SwiftUI 中使用手势](https://www.swiftanytime.com/gestures-in-swiftui/ "如何在 SwiftUI 中使用手势") -- 来自:swiftanytime 103 | 104 | [@远恒之义](https://github.com/eternaljust):在如今的触摸屏手机中,实体按键快消失殆尽了,几乎所有的操作都基于手指手势。现代手机可以识别多种手势感应:点击、拖动、滑动、捏合、双击、旋转、摇动、触摸和长按等等,本文将介绍 SwiftUI 中一些基本且最常用的手势使用。 105 | 106 | 5、[SwiftUI 按钮的基本用法](https://sarunw.com/posts/swiftui-button-basic/ "SwiftUI 按钮的基本用法") -- 来自:sarunw 107 | 108 | [@远恒之义](https://github.com/eternaljust):SwiftUI 中的按钮十分方便使用和自定义。按钮界面很简单,只需要做两件事:动作和标签。动作是一种方法或闭包,当用户单击或点击按钮时会调用它,标签是描述按钮用途的视图,可以是文本、图标图像或任何自定义视图。使用自定义按钮也非常容易,任选 `buttonStyle(_:)` 内置五种按钮样式之一即可。 109 | 110 | 6、[如何在 SwiftUI 中使用自定义字体](https://sarunw.com/posts/swiftui-custom-font/ "如何在 SwiftUI 中使用自定义字体") -- 来自:sarunw 111 | 112 | [@远恒之义](https://github.com/eternaljust):要在 SwiftUI 中使用自定义字体,你需要执行以下步骤:查找在你的应用中能免费使用的自定义字体;将字体文件添加到你的 Xcode 项目,同时在 Info.plist 中引入注册;最后使用 `custom(_:size:)` 方法来初始化字体。 113 | 114 | ## 摸一下鱼 115 | 116 | 整理编辑:[zhangferry](https://zhangferry.com) 117 | 118 | 1、[Combine operators cheat sheet](https://tanaschita.com/20221121-cheatsheet-combine-operators/ "Combine operators cheat sheet"):Combine 里有很多操作符,这些操作符很多并不能通过命名就完全区分出来,那该如何记忆和理解这些操作符的含义呢,tanaschita 用 SwiftUI 实现了这些操作符的可视化表达。如果你看过 RxSwift 的文档应该对这些图标非常亲切。 119 | 120 | ![](https://cdn.zhangferry.com/Images/20221124201158.png) 121 | 122 | 2、[Session, cookie, token, JWT, SSO 和 OAuth 2.0 是什么](https://twitter.com/alexxubyte/status/1595455518583029764 "Session, cookie, token, JWT, SSO 和 OAuth 2.0 是什么"):这几种常用的身份校验技术有什么区别呢, Alex Xu 做了这样一张图用于解释它们的区别以及用于解决的问题。 123 | 124 | ![](https://cdn.zhangferry.com/Images/20221124205007.png) 125 | 126 | 3、[电脑端微信不断写日志](https://v.douyin.com/rVWRmUG/ "微信在电脑不断写日志"):来源于抖音一位技术博主的视频,详细描述了微信在电脑端不断写日志的过程。利用 Xcode 的 Instruments 里的 File Activity,采集微信在后台的文件读取记录。会发现很多 xlog 日志的生成,但因为文件是加密的,我们并不能解析里面是什么内容。我看了我电脑里的日志,有三天我的电脑都是没有打开的,但是却能找到这几天的 xlog 日志,也就是说即使是休眠状态,微信依然在尝试写东西。该日志并非完全本地,还会通过网络进行上传。目前关于这些数据是做什么的还没有查到任何相关资料。 127 | 128 | 如果你感觉不放心,可以通过这种方式,关闭日志写权限: 129 | 130 | ```bash 131 | $ sudo chmod 400 ~/Library/Containers/com.tencent.xinWeChat/Data/Library/Caches/com.tencent.xinWeChat/2.0b4.0.9/log 132 | ``` 133 | 134 | 4、对于新技术很多开发都会抑制不住想去尝试,比如 SwiftUI,当你有这种想法时你可能会理解这张图的含义。 135 | 136 | ![](https://cdn.zhangferry.com/Images/20221124205551.png) 137 | 138 | 5、[Github 推出的两种开源字体 mona & hubot sans](https://github.com/mona-sans "Github 推出的两种开源字体 mona & hubot sans"):这是一种强大而通用的字体,以Degarism风格设计,灵感来源于工业时代的怪诞风格。Mona Sans在产品、网络和印刷领域都很有效。Hubot Sans 字体更修长,有一种独特的技术感。 139 | 140 | ![](https://cdn.zhangferry.com/Images/20221124211158.png) 141 | 142 | 6、[Moyu.Games](https://moyu.games/ "摸鱼游戏"):一个站点聚合网站,一直工作也挺累的,偶尔摸摸鱼吧。 143 | 144 | ## 关于我们 145 | 146 | iOS 摸鱼周报,主要分享开发过程中遇到的经验教训、优质的博客、高质量的学习资料、实用的开发工具等。周报仓库在这里:https://github.com/zhangferry/iOSWeeklyLearning ,如果你有好的的内容推荐可以通过 issue 的方式进行提交。另外也可以申请成为我们的常驻编辑,一起维护这份周报。另可关注公众号:iOS成长之路,后台点击进群交流,联系我们,获取更多内容。 147 | 148 | ### 往期推荐 149 | 150 | [iOS 摸鱼周报 #75 | 远程工作推行之难](https://mp.weixin.qq.com/s/nguqKvkuzDBR9o-Yw6y3KQ) 151 | 152 | [iOS 摸鱼周报 #74 | 抖音 iOS 基础技术大揭秘 Vol.02 周六见](https://mp.weixin.qq.com/s/lhhV0Qlc9NtFoM6nF7gZbA) 153 | 154 | [iOS 摸鱼周报 #73 | macOS Ventura 初体验](https://mp.weixin.qq.com/s/Om_1TOGKWkMiNneB6Ittrw) 155 | 156 | [iOS 摸鱼周报 #72 | 1024 开始预热](https://mp.weixin.qq.com/s/5chb-a9u7VMdLis1FG6B6Q) 157 | 158 | ![](https://cdn.zhangferry.com/Images/WechatIMG384.jpeg) 159 | -------------------------------------------------------------------------------- /WeeklyLearning/iOSWeeklyLearning_79.md: -------------------------------------------------------------------------------- 1 | # iOS 摸鱼周报 #79 | Freeform上线 & D2 本周开始 2 | 3 | ![](https://cdn.zhangferry.com/Images/moyu_weekly_cover.jpeg) 4 | 5 | ### 本期概要 6 | 7 | > * 本期话题:iOS 16.2 发布,带来了无边记 App;D2 本周开始 8 | > * 本周学习:Xcode 僵尸对象 Zombie Objects 9 | > * 内容推荐:几篇 Swift 相关的文章 10 | > * 摸一下鱼:再次解读灵动岛的定位;面相算法初学者的算法书「Hello 算法」;关于独立开发如何养活自己的讨论 11 | 12 | ## 本期话题 13 | 14 | ### iOS 16.2 发布 15 | 16 | [@zhangferry](zhangferry.com):iOS 16.2 主要发布了这些功能,其中 Freeform 这个全新内置 App 感觉值得拿出来单独讲一讲。 17 | 18 | ![](https://cdn.zhangferry.com/Images/20221215234359.png) 19 | 20 | #### [Freeform App 上线](https://www.apple.com/newsroom/2022/12/apple-launches-freeform-a-powerful-new-app-designed-for-creative-collaboration/ "Freeform App上线") 21 | 22 | ![](https://cdn.zhangferry.com/Images/20221215212106.png) 23 | 24 | 随 iOS 16.2,Apple 发布了新的系统应用 Freeform,同时有 iPad 和 Mac 版,中文译为:「无边记」,该 App 定位于创造性的头脑风暴和协作。Freeform 有这些特点: 25 | 26 | * 创作空间无限,想画多大就画多大。 27 | 28 | * 支持非常多格式的嵌入,包括图片、PDF、网站链接、视频、地图定位、图表等等。 29 | 30 | * 可以多人创作,支持最多邀请 100 位协作者。 31 | 32 | * iClound 同步,你可以无缝切换到 iPad 和 Mac 场景继续使用。 33 | 34 | * 可以边创作边开启 Facetime。 35 | 36 | 白板是一个相对自由的创作空间,我想到的一些使用场景是,办公室的远程会议,大家一起想一些 idea;网课里老师远程教授知识,通过 Freeform 跟学生进行互动。 37 | 38 | ### 第十七届 D2 本周末开始 39 | 40 | 本届 D2 为期两天共五场活动,议题范围从开发者的研发交付到监控运维,从运行时的上层框架到底层引擎,从过去始终在效率与体验间平衡的跨端技术,到将引领下一代体验革命的 3D/XR 技术全部都会涵盖。会议详情可以查看这篇介绍:[3D/XR、自研 SwiftUI、Lynx、QUIC、边缘计算、Flutter 等话题集结,与32位技术专家相约第十七届 D2!](https://mp.weixin.qq.com/s/xFeWpkZcRHQygmORAuHkFw "3D/XR、自研 SwiftUI、Lynx、QUIC、边缘计算、Flutter 等话题集结,与32位技术专家相约第十七届 D2!")。 41 | 42 | 因为是付费活动,所以整体的会议质量和讨论氛围都会好很多。如果你对议题感兴趣可以付费购买门票或者在上面那篇文章底部留言获取门票抽取资格。 43 | 44 | ## 本周学习 45 | 46 | 整理编辑:[JY](https://juejin.cn/user/1574156380931144/posts) 47 | #### Xcode 僵尸对象 Zombie Objects 48 | 49 | Zombie Objects 是用来调试与内存有关的问题,跟踪对象的释放过程的工具,通常用来排查野指针问题。 50 | 51 | 在 `Xcode` -> `Edit Scheme` -> `Memory Management` -> `Zombie Objects` 52 | 53 | #### 僵尸对象的生成过程: 54 | 55 | ```C++ 56 | // 获取到即将deallocted对象所属类(Class) 57 | Class cls = object_getClass(self); 58 | 59 | // 获取类名 60 | const char *clsName = class_getName(cls) 61 | 62 | // 生成僵尸对象类名 63 | const char *zombieClsName = "_NSZombie_" + clsName; 64 | 65 | // 查看是否存在相同的僵尸对象类名,不存在则创建 66 | Class zombieCls = objc_lookUpClass(zombieClsName); 67 | if (!zombieCls) { 68 | // 获取僵尸对象类 _NSZombie_ 69 | Class baseZombieCls = objc_lookUpClass(“_NSZombie_"); 70 | 71 | // 创建zombieClsName类 72 | zombieCls = objc_duplicateClass(baseZombieCls, zombieClsName, 0); 73 | } 74 | // 在对象内存未被释放的情况下销毁对象的成员变量及关联引用。 75 | objc_destructInstance(self); 76 | 77 | // 修改对象的isa指针,令其指向特殊的僵尸类 78 | objc_setClass(self, zombieCls); 79 | ``` 80 | 81 | #### Zombie Object 触发时做了什么? 82 | 83 | ```C++ 84 | // 获取对象class 85 | Class cls = object_getClass(self); 86 | 87 | // 获取对象类名 88 | const char *clsName = class_getName(cls); 89 | 90 | // 检测是否带有前缀_NSZombie_ 91 | if (string_has_prefix(clsName, "_NSZombie_")) { 92 | // 获取被野指针对象类名 93 | const char *originalClsName = substring_from(clsName, 10); 94 | 95 | // 获取当前调用方法名 96 | const char *selectorName = sel_getName(_cmd); 97 |    98 | // 输出日志 99 | print("*** - [%s %s]: message sent to deallocated instance %p", originalClsName, selectorName, self); 100 | 101 | // 结束进程 102 | abort(); 103 | } 104 | ``` 105 | 106 | 系统修改对象的 `isa` 指针,令其指向特殊的僵尸类,使其变为僵尸对象,并且打印一条包含该对象的日志,然后终止应用程序。 107 | 108 | ## 内容推荐 109 | 110 | 整理编辑:[Mim0sa](https://juejin.cn/user/1433418892590136/posts) 111 | 112 | 1、[源码探索SwiftUI框架—TCA](https://juejin.cn/post/7164699554711863326 "源码探索SwiftUI框架—TCA") -- 来自:合合信息 113 | 114 | [@Mim0sa](https://juejin.cn/user/1433418892590136/posts):本文将会详细的带你体验 TCA 框架该如何去使用,从定义、绑定到调用,并从源码探析整个流程的逻辑,清晰易懂。同时 TCA 也还在快速的发展和推进中,可以期待 TCA 的完善。 115 | 116 | 2、[《游戏学导论》- 笔记](http://pjhubs.com/2022/01/29/game05/ "《游戏学导论》- 笔记") -- 来自:PJHubs 117 | 118 | [@Mim0sa](https://juejin.cn/user/1433418892590136/posts):这是一份博主学习华科熊硕老师的《游戏学导论》的系列笔记文章,主要讨论了游戏作为人文社会的一部分中,人与游戏之间的关系和理解,感兴趣的朋友可以读一下。 119 | 120 | 3、[GCDWebServer 使用详解](https://xiaovv.me/2018/11/30/GCDWebServer-BasicUse/ "GCDWebServer 使用详解") -- 来自:笑忘书店 121 | 122 | [@Mim0sa](https://juejin.cn/user/1433418892590136/posts):GCDWebServer 是一个基于 GCD 的轻量级服务器框架,使用 GCDWebServer 我们可以很轻松的在我们的应用中搭建一个 HTTP 服务器,比如可以使用 GCDWebServer 来实现一个无线U盘 App。该篇文章比较详细的讲解了这个框架的主要使用流程,有两种语言的实现,代码内容详实。 123 | 124 | 4、[SwiftOnTap](https://swiftontap.com/ "SwiftOnTap") -- 来自:SwiftOnTap 125 | 126 | [@Mim0sa](https://juejin.cn/user/1433418892590136/posts):这是一份看起来很像官方文档,但是又比官方文档详细很多的 SwiftUI 文档,由一些 iOS 开发者一起维护,将一些在官方文档上写的不清楚、不详细的地方重新编写,填补了 Apple 文档的一些漏洞,其中各种 UI 类的实现还有动画和图片作为辅佐,很好用。 127 | 128 | 5、[What is the difference between #available and @available](https://sarunw.com/posts/available-vs-available/ "What is the difference between #available and @available") -- 来自:Sarunw 129 | 130 | [@Mim0sa](https://juejin.cn/user/1433418892590136/posts):本文主要讨论了 # 和 @ 在 Swift 代码中的不同的意义。 131 | 132 | 6、[iOS APP添加桌面快捷方式](https://mp.weixin.qq.com/s/z_CfthCni7m1mKtM0KzH6g) -- 来自:搜狐技术产品 133 | 134 | [@Mim0sa](https://juejin.cn/user/1433418892590136/posts):本文记录了实现添加桌面快捷方式的一些实现,给出了两个具体的方案,同时也分析了两个方案的利弊。 135 | 136 | 137 | 138 | 139 | ## 摸一下鱼 140 | 141 | 整理编辑:[zhangferry](zhangferry.com) 142 | 143 | 1、[【深度解读】喧嚣过后,再来聊聊灵动岛](https://www.bilibili.com/video/BV1W14y1N7MY "【深度解读】喧嚣过后,再来聊聊灵动岛"):这是ZEALER官方频道的一期视频,作者从 Apple 的开发者文档和UI交互的深层用意两方面去考虑灵动岛的设计意图。灵动岛的主要作用是「补上了iOS高频更新信息管理缺失的一环」,由此也延伸出了几个观点: 144 | 145 | * 微信消息不可能适配灵动岛 146 | * 灵动岛未来不会成为多任务的入口 147 | 148 | 2、[Hello 算法](https://www.hello-algo.com/ "Hello 算法"):「如果您是 **算法初学者**,完全没有接触过算法,或者已经有少量刷题,对数据结构与算法有朦胧的理解,在会与不会之间反复横跳,那么这本书就是为您而写!」这本书第一作者是 Krahets,力扣全网阅读量最高博主。 他曾经求职也踩过算法的雷,于是就有了后来的发愤图强,并写作这本面相初学者的算法小书。 149 | 150 | ![](https://cdn.zhangferry.com/Images/20221216000024.png) 151 | 152 | 3、[那些独立开发者(非外包)都是怎么养活自己的](https://www.v2ex.com/t/900741 "哪些独立开发者都是怎么养活自己的"):来自 V2EX 上的一个帖子,评论区有很多独立开发者的项目。我们可以发现一些有趣的独立项目,同时也能看到一些独立开发者的生活状态,这条路不那么容易走。如果你向往独立开发的话,也可以了解他们遇到的问题。 153 | 154 | 4、[新冠病毒感染者居家预防治疗指南](https://docs.qq.com/doc/DTVZTdENJbnhWaFpQ "新冠病毒感染者居家预防治疗指南"):随着防疫政策的放开,身边有越来越多的人🐑了,🐑了该如何应对?这份在线文档综合多份机构的新冠治疗指南汇总制作而成,比如什么症状应该用什么药?跟自己同住的人应该如何防护?如何消杀?儿童、孕妇被感染应该如何处理?去医院就诊应该注意什么情况?另外还提供了很多中医和饮食相关的注意事项。 155 | 156 | 157 | ## 关于我们 158 | 159 | iOS 摸鱼周报,主要分享开发过程中遇到的经验教训、优质的博客、高质量的学习资料、实用的开发工具等。周报仓库在这里:https://github.com/zhangferry/iOSWeeklyLearning ,如果你有好的的内容推荐可以通过 issue 的方式进行提交。另外也可以申请成为我们的常驻编辑,一起维护这份周报。另可关注公众号:iOS成长之路,后台点击进群交流,联系我们,获取更多内容。 160 | 161 | ### 往期推荐 162 | 163 | [iOS 摸鱼周报 #78 | iOS 摸鱼周报 #78 | 用 ChatGPT 做点好玩的](https://mp.weixin.qq.com/s/27J4NguYRsxYWmff_6iDcg) 164 | 165 | [iOS 摸鱼周报 #77 | 圣诞将至,请注意 App 审核进度问题](https://mp.weixin.qq.com/s/yYdGO1kRcwQJ3-z-aavHYA) 166 | 167 | [iOS 摸鱼周报 #76 | 程序员提问的智慧](https://mp.weixin.qq.com/s/UmXvtKYS6Z0a30yPRyIV9g) 168 | 169 | [iOS 摸鱼周报 #75 | 远程工作推行之难](https://mp.weixin.qq.com/s/nguqKvkuzDBR9o-Yw6y3KQ) 170 | 171 | ![](https://cdn.zhangferry.com/Images/WechatIMG384.jpeg) 172 | -------------------------------------------------------------------------------- /WeeklyLearning/iOSWeeklyLearning_81.md: -------------------------------------------------------------------------------- 1 | # iOS 摸鱼周报 #81 | Apple 推出 Apple Business Connect 2 | 3 | ![](https://cdn.zhangferry.com/Images/moyu_weekly_cover.jpeg) 4 | 5 | ### 本期概要 6 | 7 | > * 本期话题: Developer 设计开发加速器|探索 iPad 最新技术,Apple 推出 Apple Business Connect 8 | > * 本周学习:基础知识回顾:iOS 中的 const 修饰符 9 | > * 内容推荐:本期将推荐近期的一些优秀博文,涵盖如何保护剪切板内容、SwiftUI 的视图风格、iOS 应用启动优化等方面的内容 10 | > * 摸一下鱼:基于 MarkDown 的写作工具以及一文多发的工具 openwrite;从 TimeMachine 中移除开发依赖包的工具 Asimov;查看个人 Github 全年使用趋势的 Github Trends;一份开源软件使用指南;AI 辅助 Code reivew 的工具。 11 | 12 | ## 本期话题 13 | 14 | ### [设计开发加速器线上讲座:探索 iPad 最新技术](https://developer.apple.com/events/view/U2U58S76GX/dashboard "设计开发加速器线上讲座:探索 iPad 最新技术") 15 | 16 | [@远恒之义](https://github.com/eternaljust):本次课程将通过一系列创新性 App 的演示,带领您充分了解 iPad 最新技术特性,学习如何利用功能强大的 API 来让您的 App 在 iPad 的体验更上一层楼。活动时间:2023 年 2 月 16 日上午 10:00 (GMT+8) – 中午 12:00 (GMT+8) (UTC+08:00),报名截止:2023 年 2 月 15 日。 17 | 18 | ### [Apple 推出 Apple Business Connect](https://www.apple.com.cn/newsroom/2023/01/introducing-apple-business-connect/ "Apple 推出 Apple Business Connect") 19 | 20 | [@远恒之义](https://github.com/eternaljust):近日,Apple 推出了 Apple Business Connect,这是一款全新的免费工具,让企业可以在地点卡中自定义显示精美图像、关键信息和特别促销活动。这款免费工具让各种规模的企业都能认领相应地址的地点卡,并自主设计关键信息在 Apple 地图、信息、钱包、Siri 等各种 app 中向超过十亿 Apple 用户展示的方式。Business Connect 的推出,方便了世界各地的 Apple 用户都能找到关于美食、购物、旅行目的地的精确信息。 21 | 22 | ![通过 Business Connect,企业可以向顾客展示优惠或促销信息,用户可还以在地图 app 地点卡中直接执行的多种操作](https://cdn.zhangferry.com/Images/81-apple-business-connect.png) 23 | 24 | ## 本周学习 25 | 26 | 整理编辑:[夏天](https://juejin.cn/user/3298190611456638) 27 | 28 | ### 基础知识回顾:iOS 中的 const 修饰符 29 | 30 | `const` 修饰符将其后的变量设置为常量,`const` 在 \* 之前和 \* 之后的区别在于,常量指针是否可以指向其他的 内存块。以 iOS 中的字符串为例: 31 | 32 | #### NSString 33 | 34 | ```objective-c 35 | NSString *const str1 = @"str1"; 36 | // str1 = @"str1***str1"; //报错:Cannot assign to variable 'str1' with const-qualified type 'NSString *const __strong' 37 | ``` 38 | 39 | 如示例所示,常量指针已经指向 `@"str1"` ,不能再指向其他的内存 `@"str1***str1"` ,因此不能修改常量指针指向的内容,常量指针仍然指向原内存中的内容。因为是 `NSString` ,所以改变指针指向的内存,才能改变指针指向的内容,常量指针指向的内存不变,所指向的内容就不会变。 40 | 41 | 当 `const`修饰了 \* 时,常量指针可以指向其他的内存,释放掉原来的内存,从而可以修改常量指针指向的内容(因为指向的内存变了): 42 | 43 | ```objective-c 44 | NSString const *str2 = @"str2"; 45 | str2 = @"str2***str2"; 46 | ``` 47 | 48 | #### NSMutableString 49 | 50 | 如果把 `NSString` 换成 `NSMutableString` 情况就不一样了。以下示例可以修改原内存中的内容,也可以指向其他的内存: 51 | 52 | ```objective-c 53 | NSMutableString const *var1 = [@"str" mutableCopy]; 54 | [var1 appendString:@"__var"]; // 改变内存中的内容 55 | var1 = [@"123" mutableCopy]; // var1指向新的内存 NSLog(@"var1:%@",var1); 56 | ``` 57 | 58 | 而当 `const` 修饰 \* 时可以修改原内存中的内容,但是不能指向其他的内存: 59 | 60 | ```objective-c 61 | NSMutableString *const var2 = [@"str" mutableCopy]; 62 | [var2 appendString:@"__var"];//改变内存中的内容 63 | var2 = [@"123" mutableCopy];//var2不能指向新的内存,报错:Cannot assign to variable 'var2' with 64 | const-qualified type 'NSMutableString *const __strong' 65 | NSLog(@"var2:%@", var2); 66 | ``` 67 | 68 | 69 | ## 内容推荐 70 | 71 | > 本期将推荐近期的一些优秀博文,涵盖如何保护剪切板内容、SwiftUI 的视图风格、iOS 应用启动优化等方面的内容 72 | 73 | 整理编辑:[东坡肘子](https://www.fatbobman.com/) 74 | 75 | 1、[如何防止复制和粘贴到其他 iOS 应用程序中](https://blog.eidinger.info/prevent-copy-paste-into-other-ios-apps "如何防止复制和粘贴到其他 iOS 应用程序中") -- 来自:Marco Edinger 76 | 77 | [@东坡肘子](https://www.fatbobman.com/): 在企业应用程序中,经常需要通过防止最终用户将内容复制和粘贴到其他应用程序中来保护敏感信息。在这篇文章中,作者将向你展示为 iOS 应用程序引入这种高级剪贴板保护功能的多种方法。 78 | 79 | 2、[掌握 Swift Concurrency 的 AsyncStream](https://www.donnywals.com/understanding-swift-concurrencys-asyncstream/ "掌握 Swift Concurrency 的 AsyncStream") -- 来自:Donny wals 80 | 81 | [@东坡肘子](https://www.fatbobman.com/): 创建自定义的异步序列的最好方法是什么?实现 AsyncSequence 协议并构建你的 AsyncIterator 确实可以解决一切问题,但实现起来很繁琐而且容易出错。在这篇文章中,作者将向你展示如何利用 Swift 的 AsyncStream 来构建自定义的异步序列,在你需要的时候产生数值。 82 | 83 | 3、[SwiftUI 视图的样式 —— 视图样式是如何工作的](https://peterfriese.dev/posts/swiftui-styling-views/ "SwiftUI 视图的样式 —— 视图样式是如何工作的") -- 来自:Peter Friese 84 | 85 | [@东坡肘子](https://www.fatbobman.com/): SwiftUI 视图的样式是一个强大的概念,让开发者在设计应用程序时具有很大的灵活性,且不会丢失我们使用的视图的语义。支持此概念的 SwiftUI 视图列表令人印象深刻:按钮、选择器、菜单、切换、指示器、文本和标签、集合视图、导航视图、窗口和工具栏以及组等。因此,下次在你需要定制 UI 元素的特殊外观时,请先查看苹果的文档,看看是否已经有满足你需求的风格。如果没有,本文将告诉你如何创建自定义样式。 86 | 87 | 4、[Dependencies —— Point Free 发布了新的开源依赖库](https://www.pointfree.co/blog/posts/92-a-new-library-to-control-dependencies-and-avoid-letting-them-control-you "Dependencies —— Point Free 发布了新的开源依赖库") -- 来自:Point Free 88 | 89 | [@东坡肘子](https://www.fatbobman.com/): 依赖性是指你的应用程序中需要与不受你控制的外部系统交互的类型和功能。典型的例子是向服务器发出网络请求的 API 客户端,但也有一些看似无害的东西,如 UUID 和日期初始化器、文件访问、用户默认值,甚至时钟和计时器,都可以被认为是依赖关系。Point Free 将 TCA 中广受好评的依赖功能分离出来构建成一个独立且开源的依赖管理系统,以便让更多的开发者受益。 90 | 91 | 5、[云音乐 iOS 启动性能优化「开荒篇」](https://juejin.cn/post/7145672412883845127 "云音乐 iOS 启动性能优化「开荒篇」") -- 来自:网易云音乐技术团队 92 | 93 | [@东坡肘子](https://www.fatbobman.com/): App 启动作为用户使用应用的第一个体验点,直接决定着用户对 App 的第一印象。网易云音乐作为一个有着近 10 年发展历史的 App,随着各种业务不停的发展和复杂场景的堆叠,不同的业务和需求不停地往启动链路上增加代码,这给 App 的启动性能带来了极大的挑战。而随着云音乐用户基数的不断扩大和深度使用,越来越多的用户反馈启动速度慢,况且启动速度过慢更甚至会降低用户的留存意愿。因此,云音乐 iOS App 急需要进行一个专项针对启动性能进行优化。本文将介绍云音乐技术团队在 App 启动优化方面所做出的努力。( 编者同大多数评论的想法一致,在不解决开屏广告的情况下,一切基于技术层面的优化都很难让用户有较大的感知 ) 94 | 95 | ## 摸一下鱼 96 | 97 | 整理编辑:[CoderStar](https://mp.weixin.qq.com/mp/homepage?__biz=MzU4NjQ5NDYxNg==&hid=1&sn=659c56a4ceebb37b1824979522adbb15&scene=18) 98 | 99 | 1、[openwrite](https://openwrite.cn/ "openwrite") 提供了基于`MarkDown`的写作工具以及一文多发的工具,适合需要做新媒体矩阵的程序员。 100 | 101 | ![](http://cdn.zhangferry.com/20230112163018.png) 102 | 103 | 2、[Asimov](https://github.com/stevegrunwell/asimov "Asimov") 自动检查本地磁盘把开发依赖的文件包全部从 TimeMachine 移出掉的好用工具。 104 | 105 | 3、[Github Trends](https://www.githubtrends.io/wrapped "Github Trends"):一个 Github 图标统计工具,需要首先给仓库 Star 你才能用这个功能。 106 | 107 | ![](https://cdn.zhangferry.com/Images/github-wrapped.png) 108 | 109 | 4、[开源软件指南](https://opensource.guide/ "开源软件指南"):关于开源软件的一份指南,如何向开源软件共享,如何做自己的开源软件,如何围绕开源做社区,还有这些环节的最佳实践。 110 | 111 | ![](https://cdn.zhangferry.com/Images/20230112223404.png) 112 | 113 | 5、[AI-powered code review](https://codeball.ai/ "AI-powered code review"):AI 加持的 Code review 工具,对于开源软件是免费的,目前使用形式是基于 Github Action。 114 | 115 | ![](https://cdn.zhangferry.com/Images/20230112225337.png) 116 | 117 | ## 关于我们 118 | 119 | iOS 摸鱼周报,主要分享开发过程中遇到的经验教训、优质的博客、高质量的学习资料、实用的开发工具等。周报仓库在这里:https://github.com/zhangferry/iOSWeeklyLearning ,如果你有好的的内容推荐可以通过 issue 的方式进行提交。另外也可以申请成为我们的常驻编辑,一起维护这份周报。另可关注公众号:iOS成长之路,后台点击进群交流,联系我们,获取更多内容。 120 | 121 | ### 往期推荐 122 | 123 | [iOS 摸鱼周报 #80 | 开发加速器 SwiftUI 中管理数据模型](https://mp.weixin.qq.com/s/eIQLuAIsRQ7eeEnsrL5QuA) 124 | 125 | [iOS 摸鱼周报 #79 | Freeform上线 & D2 本周开始](https://mp.weixin.qq.com/s/HdEhmXt60853tzM6xiVUwA) 126 | 127 | [iOS 摸鱼周报 #78 | 用 ChatGPT 做点好玩的事 ](https://mp.weixin.qq.com/s/27J4NguYRsxYWmff_6iDcg) 128 | 129 | [iOS 摸鱼周报 #77 | 圣诞将至,请注意 App 审核进度问题](https://mp.weixin.qq.com/s/5chb-a9u7VMdLis1FG6B6Q) 130 | 131 | ![](https://cdn.zhangferry.com/Images/WechatIMG384.jpeg) 132 | -------------------------------------------------------------------------------- /WeeklyLearning/iOSWeeklyLearning_82.md: -------------------------------------------------------------------------------- 1 | # iOS 摸鱼周报 #82 | 去中心化社交软件 Damus 2 | 3 | ![](https://cdn.zhangferry.com/Images/moyu_weekly_cover.jpeg) 4 | 5 | ### 本期概要 6 | 7 | > * 本期话题:设计开发加速器线下活动:女性开发者社区日; 8 | > * 本周学习:Python 如何调用 Swift 程序 9 | > * 内容推荐:涵盖现代 SwiftUI 编程探讨、可变视图、NSTimer、Swift Charts 等方面的内容 10 | > * 摸一下鱼:去中心化社交软件 Damus;2022 年最后欢迎的 Chrome 插件;一款通过工作流驱动提效的办公工具 monday 11 | 12 | ## 本期话题 13 | 14 | ### [设计开发加速器线下活动:女性开发者社区日](https://developer.apple.com/events/view/CN36QR48T5/dashboard "设计开发加速器线下活动:女性开发者社区日") 15 | 16 | [@远恒之义](https://github.com/eternaljust):Apple 在 2022 年 10 月开展了 Apple Entrepreneur Camp(苹果企业家培训营)课程活动,主要面向女性、黑人和西班牙裔/拉丁裔创业者,帮助她们提供技术支持与免费服务。女性开发者社区日是针对中国女性开发者的特别活动,以此帮助更多的中国女性开发者熟悉了解 Apple 平台。相比之前的企业家培训营要求,本次活动降低了门槛,参会资格不再限制组织必须满足女性创业者与女性开发者。 17 | 18 | ![](https://cdn.zhangferry.com/Images/82-women-developer-community-day.jpeg) 19 | 20 | ### [App 和 App 内购买项目即将实行税率和价格调整](https://developer.apple.com/cn/news/?id=g8dce2t4 "App 和 App 内购买项目即将实行税率和价格调整") 21 | 22 | [@远恒之义](https://github.com/eternaljust):2023 年 2 月 13 日起,哥伦比亚、埃及、匈牙利、尼日利亚、挪威、南非和英国 App Store 的 App 及 App 内购买项目 (自动续期订阅除外) 的价格将上调。从 2023 年春季起,App 和 App 内购买项目的定价功能升级将带来 700 个新增的价格点,开发者可更加灵活地管理全球各地区定价。 23 | 24 | ## 本周学习 25 | 26 | 整理编辑:[zhangferry](https://zhangferry.com) 27 | 28 | ### Python 如何调用 Swift 程序 29 | 30 | Swift 调用 Python 有现成的方案,就是 [PythonKit](https://github.com/pvieito/PythonKit "PythonKit"),这个库是从 TensorFlow 迁移出来的,利用 Swift 里 `@dynamicCallable`和 `@dynamicMemberLookup`实现动态调用。 31 | 32 | Python 调 Swift 则相对绕一些,核心思路是将 Swift 转成 C 语言库,然后利用 Python 的`ctypes` 去调用这个 C 语言库。大概流程如下: 33 | 34 | ![](https://cdn.zhangferry.com/Images/20230203004524.png) 35 | 36 | 1、导出 C 语言符号。 37 | 38 | ```swift 39 | @_cdecl("myname") 40 | public func myname (x: UnsafePointer) -> UnsafePointer{ 41 | let ret : String = "My name is \(String(cString: x))" 42 | return UnsafePointer(ret) 43 | } 44 | ``` 45 | 46 | Swift 在编译时会根据命名空间和参数进行符号签名,为了保证符号的统一性,使用`@_cdecl`固定函数签名。另外C 语言的字符串跟Swift字符串不同,将字符串转成`UnsafePointer`类型指针。 47 | 48 | 2、生成动态库让 ctypes 引用 49 | 50 | ```bash 51 | $ swiftc -emit-library modules.swift 52 | ``` 53 | 54 | 生成的动态库为`libmodules.dylib`。有时候还会出现一些动态库依赖关系,为了让 ctypes 也能够找到这个库,还需要修改动态检索路径: 55 | 56 | ```bash 57 | export DYLD_FRAMEWORK_PATH="path/to/depend_dylib_folder" 58 | ``` 59 | 60 | 该环境变量的指定要在 python 脚本外部执行。 61 | 62 | 3、python 通过 ctypes 调用对应函数 63 | 64 | 需要注意的是不同语言之间的类型转换 65 | 66 | | ctypes | Python | C | Swift | 67 | | -------- | ------ | ------ | ------ | 68 | | c_int | int | int | Int | 69 | | c_char_p | str | char * | String | 70 | 71 | 关于ctypes使用可以参看官方文档:[ctypes Python 的外部函数库](https://docs.python.org/zh-cn/3/library/ctypes.html#module-ctypes "ctypes`Python的外部函数库")。 72 | 73 | 以下是调用示例: 74 | 75 | ```python 76 | import ctypes 77 | # 把对应动态库转成ctypes类型 78 | modules = ctypes.CDLL('path/to/libmodules.dylib') 79 | 80 | def py_myname(x): 81 | # 定义返回值类型 82 | modules.myname.restype = ctypes.c_char_p 83 | # python str to char 84 | y = ctypes.c_char_p(x.encode()) 85 | # char to python str 86 | return modules.myname(y).decode() 87 | 88 | str = py_myname("zhangferry") 89 | print(str) # My name is zhangferry 90 | ``` 91 | 92 | ## 内容推荐 93 | 94 | 本期将推荐近期的一些优秀博文,涵盖现代 SwiftUI 编程探讨、可变视图、NSTimer、Swift Charts 等方面的内容 95 | 96 | 整理编辑:[东坡肘子](https://www.fatbobman.com/) 97 | 98 | 1、[现代 SwiftUI](https://www.pointfree.co/blog/posts/94-modern-swiftui-parent-child-communication "现代 SwiftUI") -- 来自:Piont Free 99 | 100 | [@东坡肘子](https://www.fatbobman.com/): 近期 Point Free 在其博客上发表了多篇免费文章,以探索现代 SwiftUI 开发的最佳实践。内容涵盖:视图沟通、可识别数组、状态驱动导航、依赖项、测试等内容。 101 | 102 | 2、[可变视图](https://chris.eidhof.nl/post/variadic-views/ "可变视图") -- 来自:Chris Eidhof 103 | 104 | [@东坡肘子](https://www.fatbobman.com/): _VariadicView 是 SwiftUI 提供的一个未公开 API ,它为布局容器提供了遍历子视图的能力。Chris Eidhof 在 [Moving Parts](https://movingparts.io/variadic-views-in-swiftui) 博客的基础上进一步对该 API 进行了研究,并提出了视图是列表的观点。 105 | 106 | 3、[NSTimer Block 为什么不会触发循环引用?!](https://juejin.cn/post/7194064273960599611 "NSTimer Block 为什么不会触发循环引用?!") -- 来自:wiiale 107 | 108 | [@东坡肘子](https://www.fatbobman.com/): NSTimer 是 iOS Foundation 框架中一种计时器,在经过一定的时间间隔后触发,向目标对象发送指定的消息。本文将通过探究 NSTimer 与 Runloop 之间的关系来分析不会触发循环引用的原因。 109 | 110 | 4、[Searchable](https://kean.blog/post/pulse-search "Searchable") -- 来自:Alex Grebenyuk 111 | 112 | [@东坡肘子](https://www.fatbobman.com/): 从 iOS 15 开始,SwiftUI 通过新的 .searchable 修饰符开始支持搜索栏功能。Alex Grebenyuk 通过本文将其在 Pulse 应用中有关 searchable 的使用体验和心得分享给大家。 113 | 114 | 5、[掌握 Swift Charts](https://swiftwithmajid.com/2023/01/26/mastering-charts-in-swiftui-custom-marks/ "掌握 Swift Charts") -- 来自:Majid 115 | 116 | [@东坡肘子](https://www.fatbobman.com/): Swift Charts 是苹果的一个新框架,允许我们使用 SwiftUI 以声明性的方式可视化数据。Majid 将通过多篇文章对 Swift Charts 进行详尽介绍,目前已以完成:基础、自定义标记、标记样式等内容。 117 | 118 | ## 摸一下鱼 119 | 120 | 整理编辑:[zhangferry](https://zhangferry.com) 121 | 122 | 1、[Damus](https://damus.io/ "Damus"):一个建立在去中心化网络上的社交软件,最近挺火的,被称为「推特杀手」,目前已上线 App Store,国区没有。它具有这些特点: 123 | 124 | * 你发的内容完全由你自己控制 125 | * 端到端加密,交流过程无法被其他人查看 126 | * 无注册限制,创建账户会生成一对公私钥,公钥表示你的id,可以让其他人找到你,私钥表示登录凭证 127 | * 无中心服务器,而是利用去中心化中继器来分发消息 128 | * 可编程,支持自定义机器人,用于处理消息分发和通知 129 | * 可以赚钱,利用比特币给帖子打赏 130 | 131 | App 端目前功能还比较粗糙,可以通过 [iris](https://iris.to/ "iris") 体验这种社交形式。去中心化优点是自由,不会有人删你帖子,但缺点也明显,容易成为非法活动的温床。它能提供的价值有多大以及多大范围内能成为主流社交平台,还有待观察。 132 | 133 | ![](https://cdn.zhangferry.com/Images/20230202222757.png) 134 | 135 | 2、[2022 年最受欢迎的 Chrome 插件](https://blog.google/products/chrome/our-favorite-chrome-extensions-of-2022/ "2022 年最受欢迎的 Chrome 插件"):这些插件覆盖工作、学习、娱乐多个方面,列几个我感觉还不错的插件: 136 | 137 | * [Tango](https://chrome.google.com/webstore/detail/tango-screenshots-trainin/lggdbpblkekjjbobadliahffoaobaknh?hl=en "Tango"):对于一个复杂的操作页面,如果我们想演示如何操作,可以利用 Tango 快速生成一个操作步骤指南。 138 | 139 | * [workona](https://chrome.google.com/webstore/detail/workona-tab-manager/ailcmbgekjpnablpdkmaaccecekgdhlh?hl=en "workona"):一个书签管理插件,我看大部分人使用 chrome 都会出现 tab 栏占满的情况,tab 管理对我来说也一直是一个头疼的事情。这个插件提供了一种解决方案,就是为所有页面和书签建一个管理页面,每次对tab的切换都通过这个管理页面进行。 140 | 141 | ![](https://cdn.zhangferry.com/Images/20230202232756.png) 142 | 143 | 3、[monday](https://monday.com "'monday'"):一个面相工作场景的项目管理平台,可以定制工作流来满足不同工作的需求,从而提高团队的一致性、效率和生产力。 144 | 145 | ![](https://cdn.zhangferry.com/Images/20230202234211.png) 146 | 147 | 4、Github 在个人信息页面新增了社交网络的链接,可以填四个链接: 148 | 149 | ![](https://cdn.zhangferry.com/Images/20230202225613.png) 150 | 151 | ## 关于我们 152 | 153 | iOS 摸鱼周报,主要分享开发过程中遇到的经验教训、优质的博客、高质量的学习资料、实用的开发工具等。周报仓库在这里:https://github.com/zhangferry/iOSWeeklyLearning ,如果你有好的的内容推荐可以通过 issue 的方式进行提交。另外也可以申请成为我们的常驻编辑,一起维护这份周报。另可关注公众号:iOS成长之路,后台点击进群交流,联系我们,获取更多内容。 154 | 155 | ### 往期推荐 156 | 157 | [iOS 摸鱼周报 #81 | Apple 推出 Apple Business Connect](https://mp.weixin.qq.com/s/Ek6W0MTBDP6PN1uxWQ5M_A) 158 | 159 | [iOS 摸鱼周报 #80 | 开发加速器 SwiftUI 中管理数据模型](https://mp.weixin.qq.com/s/eIQLuAIsRQ7eeEnsrL5QuA) 160 | 161 | [iOS 摸鱼周报 #79 | Freeform上线 & D2 本周开始](https://mp.weixin.qq.com/s/HdEhmXt60853tzM6xiVUwA) 162 | 163 | [iOS 摸鱼周报 #78 | 用 ChatGPT 做点好玩的事 ](https://mp.weixin.qq.com/s/27J4NguYRsxYWmff_6iDcg) 164 | 165 | ![](https://cdn.zhangferry.com/Images/WechatIMG384.jpeg) 166 | -------------------------------------------------------------------------------- /WeeklyLearning/iOSWeeklyLearning_83.md: -------------------------------------------------------------------------------- 1 | # iOS 摸鱼周报 #83 | ChatGPT 的风又起来了 2 | 3 | ![](https://cdn.zhangferry.com/Images/moyu_weekly_cover.jpeg) 4 | 5 | ### 本期概要 6 | 7 | > * 本期话题:各大搜索引擎开始接入类 ChatGPT 功能 8 | > * 本周学习:Python 中的匿名函数与闭包 9 | > * 内容推荐:iOS 越狱检测、获取虚拟内存状态、使用 KeyChain 进行持久化等内容 10 | > * 摸一下鱼:Stable Diffusion 功能尝鲜;关于技术规划的思考;大厂复盘文档 11 | 12 | ## 本期话题 13 | 14 | 整理编辑:[zhangferry](zhangferry.com) 15 | 16 | ### ChatGPT 的风又起来了 17 | 18 | 最近 ChatGPT 又火了一波,不仅搜索引擎纷纷引入类 ChatGPT 能力,就连各种跟 ChatGPT 沾边公司的公司股价都涨了一波。随着新用户的不断涌入,官网已经多次停止用户登录了。 19 | 20 | ![](https://cdn.zhangferry.com/Images/20230207235606.png) 21 | 22 | 搜索引擎盯上 ChatGPT 是自然而然的事情,早在 ChatGPT 开发之初就有它能否代替 Google 的讨论,因为它大多数使用场景跟搜索重叠很高。能否替换 Google 还有待验证,但 StackOverflow 受到的影响已经非常明显,根据报道 StackOverflow 一个月内访问量骤降 3200w。这已经促使大部分产品不得不考虑 ChatGPT 的影响,以及如何让自己的产品利用类似能力。 23 | 24 | 1、[Google 宣布了 ChatGPT 的竞争对手 Bard](https://www.theverge.com/2023/2/6/23588033/google-chatgpt-rival-bard-testing-rollout-features "Google 宣布了 ChatGPT 的竞争对手 Bard"),一个基于 LaMDA 模型训练的智能对话服务。该服务正在做最后的测试,未来几周会更大范围的对外开放。 25 | 26 | ![](https://cdn.zhangferry.com/Images/20230207232302.png) 27 | 28 | 2、微软的 「new Bing」 整合 ChatGPT 的能力已经可以尝试了,不过并没有全量放开。访问:https://www.bing.com/new,登录账号,可以加入候选等待名单,通过之后可以正常使用 new Bing。 29 | 30 | ![](https://cdn.zhangferry.com/Images/20230209200203.png) 31 | 32 | OpenAI 对外开放的 ChatGPT 是基于 GPT 3.5 的,这个能力已经非常惊艳,Bing 则是使用训练量更大的 GPT-4 模型。根据训练模型评估,GPT 3.5 就已经超过了 Google 的 LaMDA,所以就回答准确性 new Bing 应该稳稳强于Bard 的。微软能否抢占一些搜索引擎的份额就看这次发挥了。 33 | 34 | 3、[百度也宣称推出类 ChatGPT 服务](http://www.chinanews.com.cn/cj/2023/02-07/9949192.shtml "百度也宣称推出类 ChatGPT 服务"),即将上线聊天机器人「文心一言」,3 月完成内测。未说明使用的技术,因为百度在人工智能方面布局还比较多,应该是使用自己的训练模型,具体效果如何要等上线之后来看了。 35 | 36 | ## 本周学习 37 | 38 | 整理编辑:[zhangferry](https://zhangferry.com) 39 | 40 | ### Python 中的匿名函数与闭包 41 | 42 | Python 中正常的函数是这样的: 43 | 44 | ```python 45 | # 函数名是 add 46 | def add(x, y): 47 | return x + y 48 | ``` 49 | 50 | 匿名函数是没有函数名的函数,但可以做一些函数做的事情,对应就指 Lambda 表达式。 51 | 52 | ```python 53 | func = lambda x, y: x + y 54 | print(func(1, 2)) # 3 55 | ``` 56 | 57 | 关于闭包可以先看一个计算平均数的例子: 58 | 59 | ```python 60 | def make_averager(): 61 | # 以下整体属于闭包 62 | series = [] # 自由变量 63 | 64 | def averager(new_value): 65 | series.append(new_value) 66 | total = sum(series) 67 | return total / len(series) 68 | 69 | return averager 70 | 71 | avg = make_averager() # 可调用对象 72 | print(avg(10)) # 10.0 73 | print(avg(11)) # 10.5 74 | print(avg(12)) # 11.0 75 | ``` 76 | 77 | `make_averager()`创建了一个 `avg`,它表示内部函数`averager`。正常来说一个函数调用完之后就返回了,本地作用域数据也就释放了,为什么它还可以存储数据呢?数据是存在哪里了呢? 78 | 79 | 关键点就在于那个自由变量 `series`。Python 里的函数有几个内部属性,`avg.__code__`表示编译后的定义体: 80 | 81 | ```python 82 | # 局部变量 83 | avg.__code__.co_varnames 84 | ('new_value', 'total') 85 | # 自由变量 86 | avg.__code__.co_freevars 87 | ('series',) 88 | ``` 89 | 90 | 再看闭包的内容`avg.__closure__`: 91 | 92 | ![](https://cdn.zhangferry.com/Images/20230210000433.png) 93 | 94 | 我们传入的值都存放到了闭包里。再说回闭包,**闭包也是一种函数,它会保留定义函数时存在的自由变量的绑定,这样调用函数时,虽然定义作用域不可用了,但是仍能使用那些绑定**。自由变量的生命周期是跟着闭包走的。 95 | 96 | 再稍微改下代码: 97 | 98 | ```python 99 | def make_averager(): 100 | count = 0 101 | total = 0 102 | def averager(new_value): 103 | count+= 1 104 | total+= new_value 105 | return total / count 106 | return averager 107 | ``` 108 | 109 | 这个代码在 PyCharm 里会直接报编译错误,用命令行执行报 `UnboundLocalError: local variable 'count' referenced before assignment`,提示变量未定义,但实际问题是这里变量类型有冲突。默认闭包内部函数外的变量为自由变量,但内部函数里包含赋值语句,这样count 和 total 就应该是局部变量了,两者冲突引发问题。 110 | 111 | 修改方式是引入 `nolocal` 字段,告诉编译器它不是局部变量,而是自由变量,就可以正常赋值了。 112 | 113 | ```python 114 | def make_averager(): 115 | count = 0 116 | total = 0 117 | def averager(new_value): 118 | nonlocal count, total 119 | count+= 1 120 | total+= new_value 121 | return total / count 122 | return averager 123 | ``` 124 | 125 | 回到 Objective-C 中的 block,它的定义是:带有自动变量值的匿名函数, 126 | 127 | ## 内容推荐 128 | 129 | 本期将推荐近期的一些优秀博文,涵盖 iOS 越狱检测、获取虚拟内存状态、使用 KeyChain 进行持久化 以及 SwiftGG 但新项目等方面的内容 130 | 131 | 整理编辑:[东坡肘子](https://www.fatbobman.com/) 132 | 133 | 1、[iOS 数据持久化 —— KeyChain](https://juejin.cn/post/7195486949526732857 "iOS 数据持久化 —— KeyChain") -- 来自:庄周晓梦 134 | 135 | [@东坡肘子](https://www.fatbobman.com/): 为了安全的在本地存储敏感数据,不少开发者都会采用系统提供的 KeyChain 框架。在本文中,作者将为你展示如何创建一个通用的同时适用于 iOS、 MacOS 的 keyChain 辅助类,以提高数据增删改查操作的便利性。 136 | 137 | 2、[2023 年 iOS 越狱检测](https://blog.eidinger.info/ios-jailbreak-detection-in-2023 "2023 年 iOS 越狱检测t") -- 来自:Marco Eidinger 138 | 139 | [@东坡肘子](https://www.fatbobman.com/): 在这篇博文中,作者将展示现有的检测越狱的方法并分享代码示例。但更重要的是,通过讨论越狱检测的动机、分享相关实现并提供信息,方便开发者评估越狱检测在 2023 年(或总体上)是否仍是一个好主意。 140 | 141 | 3、[SwiftUI Layout](https://juejin.cn/post/7196952530256724023 "SwiftUI Layout") -- 来自:东吴贾诩 142 | 143 | [@东坡肘子](https://www.fatbobman.com/): 本文作者对 SwiftUI 4 中提供的 Layout 协议做了比较详尽的说明。即使你目前仍使用老版本的 SwiftUI ,通过本文可以了解更多有关 SwiftUI 布局的内部逻辑。 144 | 145 | 4、[好久不见,SwiftGG](https://mp.weixin.qq.com/s/aK7L3MIyF_ftCh3gvrovuA "好久不见,SwiftGG") -- 来自:SwiftGG 146 | 147 | [@东坡肘子](https://www.fatbobman.com/): SwiftGG 是国内知名的苹果生态开发社区,尽管它的公众号处于歇业状态已经很久了,但 SwiftGG 翻译组在这几年并没有处于停滞状态。在本文中,SwiftGG 对近两年的工作进行了总结,并介绍了接下来一些新的计划和打算。同时,也回答了一些网友提出的问题。 148 | 149 | 5、[iOS APP虚拟内存用量初探](https://juejin.cn/post/7196931784328626234 "iOS APP虚拟内存用量初探") -- 来自:呦呦君 150 | 151 | [@东坡肘子](https://www.fatbobman.com/): 在作者当前的项目中有用于 APP 物理内存、系统物理内存等内存状态的获取 API,但是一直缺少获取虚拟内存的 API。由于之前业务上出现过因为虚拟内存耗尽所导致的 Crash,因此本文将基于以上的背景对虚拟内存进行一些调研与探讨。 152 | 153 | ## 摸一下鱼 154 | 155 | 整理编辑:[zhangferry](https://zhangferry.com) 156 | 157 | 1、[diffusionbee-stable](https://github.com/divamgupta/diffusionbee-stable-diffusion-ui "diffusionbee-stable"):Stable Diffusion 是一个开源的人工智能模型,它可以根据文字描述生成一张图像。现在已经有不少图像类项目基于这个模型进行产品设计。如果你想本地跑这个模型的话,还需要租用 GPU,配置也比较麻烦。因为 PyTorch 对苹果的 ARM 芯片进行了完善的支持,已经完全可以用手头的 M1/M2 设备去运行 Stable Diffusion 了。Github 有一个开源项目 diffusionbee,把整个配置流程封装到了一个 Mac Applicaiton 上,我们可以更快速的体验这项功能。项目依赖模型将近 8 个 G,下载体验需要准备好足够的磁盘空间。 158 | 159 | ![](https://cdn.zhangferry.com/Images/20230206003633.png) 160 | 161 | 2、[技术三板斧:关于技术规划、管理、架构的思考](https://mp.weixin.qq.com/s/vL9_PQBCDxEgCyzh1lGFeQ):最近关于技术规划写了不少,参考了团队内部其他人的技术规划文档,也查了一些技术规划相关的文章,对如何做技术规划有这些总结。 162 | 163 | 第一步:问题分析。如果是从零开始的项目,分析的是痛点,如果是已有项目分析的是现状。这里要结合数据指标,客户反馈,历史事件,并对未来有一定畅想。 164 | 165 | 第二步:目标制定。目标选择要结合上一步的问题分析,用于解决实际痛点。目标制定要具体明确可量化,对每个目标进行拆解,确定实现路径。 166 | 167 | 第三步:以终为始。以最终结果溯源开始,明确时间节点,设置可验收的 Milestone。项目结果从业务、平台、效能视角等视角审视结果。 168 | 169 | 3、[大厂项目复盘](https://www.yuque.com/wikidesign/ykf0s9/vki4ecckwzsqaky3 "大厂项目复盘"):UED 方向的各大厂项目复盘文档汇总。 170 | 171 | ![](https://cdn.zhangferry.com/Images/20230205233726.png) 172 | 173 | ## 关于我们 174 | 175 | iOS 摸鱼周报,主要分享开发过程中遇到的经验教训、优质的博客、高质量的学习资料、实用的开发工具等。周报仓库在这里:https://github.com/zhangferry/iOSWeeklyLearning ,如果你有好的的内容推荐可以通过 issue 的方式进行提交。另外也可以申请成为我们的常驻编辑,一起维护这份周报。另可关注公众号:iOS成长之路,后台点击进群交流,联系我们,获取更多内容。 176 | 177 | ### 往期推荐 178 | 179 | [iOS 摸鱼周报 #82 | 去中心化社交软件 Damus](https://mp.weixin.qq.com/s/ck4Jn4Cq-yOs_mjAO-WacA) 180 | 181 | [iOS 摸鱼周报 #81 | Apple 推出 Apple Business Connect](https://mp.weixin.qq.com/s/Ek6W0MTBDP6PN1uxWQ5M_A) 182 | 183 | [iOS 摸鱼周报 #80 | 开发加速器 SwiftUI 中管理数据模型](https://mp.weixin.qq.com/s/eIQLuAIsRQ7eeEnsrL5QuA) 184 | 185 | [iOS 摸鱼周报 #79 | Freeform上线 & D2 本周开始](https://mp.weixin.qq.com/s/HdEhmXt60853tzM6xiVUwA) 186 | 187 | ![](https://cdn.zhangferry.com/Images/WechatIMG384.jpeg) 188 | -------------------------------------------------------------------------------- /WeeklyLearning/iOSWeeklyLearning_85.md: -------------------------------------------------------------------------------- 1 | # iOS 摸鱼周报 #85 | ChatGPT 的 API 开放使用 2 | 3 | ![](https://cdn.zhangferry.com/Images/moyu_weekly_cover.jpeg) 4 | 5 | ### 本期概要 6 | 7 | > * 本期话题:在线讲座:与 App Store 专家会面交流;加速器线上活动:设计挑战(亚太) 8 | > * 内容推荐:本期将推荐近期的一些优秀博文,涵盖基于文本生成图像、SwiftUI 布局、Swift 静态代码检测、原生的 SwiftUI Markdown 渲染包等方面的内容 9 | > * 摸一下鱼:ChatGPT 的 API 开发使用;Notion AI 体验;new bing 体验;针对程序员的智能搜索引擎 phind 10 | 11 | ## 本期话题 12 | 13 | ### [在线讲座:与 App Store 专家会面交流](https://developer.apple.com/cn/news/?id=tfb0r2ql "在线讲座:与 App Store 专家会面交流") 14 | 15 | [@远恒之义](https://github.com/eternaljust):Apple 会在 2 月 28 日至 4 月 13 日举行「与 App Store 专家会面交流」在线讲座,探索如何吸引新顾客、测试营销策略、优化订阅等多个主题。感兴趣的 Apple Developer Program 开发者,可登录关联的 Apple ID,查看日程表并注册。 16 | 17 | ### [加速器线上活动:设计挑战(亚太)](https://developer.apple.com/events/view/R67PUKP9H9/dashboard "加速器线上活动:设计挑战(亚太)") 18 | 19 | [@远恒之义](https://github.com/eternaljust):新一期的线上讲座开启,优秀的 App 少不了卓越的设计,与 Apple 设计布道师一起学习重要设计原理的实践方式,并在两项设计挑战当中展示你的设计技能。 20 | 21 | ![](https://cdn.zhangferry.com/Images/85-developer-design.jpeg) 22 | 23 | ## 内容推荐 24 | 25 | 本期将推荐近期的一些优秀博文,涵盖基于文本生成图像、SwiftUI 布局、Swift 静态代码检测、原生的 SwiftUI Markdown 渲染包等方面的内容 26 | 27 | 整理编辑:[东坡肘子](https://www.fatbobman.com/) 28 | 29 | 1、[MarkdownView 从 0 到 1 —— 回顾整条时间线”](https://liyanan2004.github.io/the-road-of-markdown-view/ "MarkdownView 从 0 到 1 —— 回顾整条时间线") -- 来自:LiYanan2004 30 | 31 | [@东坡肘子](https://www.fatbobman.com/): [MarkdownView](https://github.com/LiYanan2004/MarkdownView) 是一个用于在 SwiftUI 中原生渲染 Markdown 的 Swift 软件包,不久前刚刚正式发布了 1.0 版本。该包的作者 LiYanan2004 通过本文回顾了开发的动机、历程,并分享了主要的技术点和一些解决方案。 32 | 33 | 2、[Swift 静态代码检测工程实践](https://kingnight.github.io/programming/2023/02/20/Swift静态代码检测工程实践.html "Swift静态代码检测工程实践") -- 来自:Kingnight 34 | 35 | [@东坡肘子](https://www.fatbobman.com/): 随着 App 功能不断增加,工程代码量也随之快速增加,依靠人工 CodeReview 来保证项目的质量,越来越不现实,这时就有必要借助于自动化的代码审查工具,进行程序静态代码分析;提升自动化水平,提高团队研发效率。本篇文章将介绍 SwiftLint 的工作原理,配置文件的参数含义,同时还介绍了 SwiftLint 内置规则的分类、如何读懂规则说明、如何禁用规则;另外从工程实践角度出发,给出了一些切实可行的建议,并详解了如何添加自定义规则;最后在大项目改进耗时方面给出了解决方案。 36 | 37 | 3、[一段因 @State 注入机制所产生的‘灵异代码’](https://www.fatbobman.com/posts/bug-code-by-state-inject/ "一段因 @State 注入机制所产生的‘灵异代码’") -- 来自:东坡肘子 38 | 39 | [@东坡肘子](https://www.fatbobman.com/): 本文将通过一段可复现的“灵异代码”,对 State 注入优化机制、模态视图( Sheet、FullScreenCover )内容的生成时机以及不同上下文( 相互独立的视图树 )之间的数据协调等问题进行探讨。 40 | 41 | 4、[用 SwiftUI 的方式进行布局](https://www.fatbobman.com/posts/layout-in-SwiftUI-way/ "用 SwiftUI 的方式进行布局") -- 来自:东坡肘子 42 | 43 | [@东坡肘子](https://www.fatbobman.com/): 最近时常有朋友反映,尽管 SwiftUI 的布局系统学习门槛很低,但当真正面对要求较高的设计需求时,好像又无从下手。SwiftUI 真的具备创建复杂用户界面的能力吗?本文将通过用多种手段完成同一需求的方式,展示 SwiftUI 布局系统的强大与灵活,并通过这些示例让开发者对 SwiftUI 的布局逻辑有更多的认识和理解。 44 | 45 | 5、[swift -e 直接从命令行运行代码](https://blog.eidinger.info/swift-e-runs-code-directly-from-the-command-line "swift -e 直接从命令行运行代码") -- 来自:Marco Eidinger 46 | 47 | [@东坡肘子](https://www.fatbobman.com/): 在 Swift 5.8 / Xcode 14.3 Beta 1 中引入的一个新的命令行选项,允许 Swift 执行单行代码。在这篇文章中,作者解释了这个可以为执行小型一次性任务或操作数据带来便利的 swift -e 的用法。 48 | 49 | 6、[使用 Core ML 在 Apple Silicon 上生成 Stable Diffusion 图像](https://www.createwithswift.com/generating-images-with-stable-diffusion-on-apple-silicon-with-core-ml/ "使用 Core ML 在 Apple Silicon 上生成 Stable Diffusion 图像") -- 来自:Moritz Philip Recke 50 | 51 | [@东坡肘子](https://www.fatbobman.com/): Stable Diffusion 是 2022 年发布的基于深度学习的文本到图像模型,也是热门的人工智能工具之一。 它可用于根据文本描述生成图像。本文将介绍如何使用 Apple 的 Core ML Stable Diffusion Package 通过 Swift 在 Apple Silicon 上使用 Stable Diffusion 生成图像。 52 | 53 | ## 摸一下鱼 54 | 55 | 整理编辑:[zhangferry](https://zhangferry.com) 56 | 57 | 1、[ChatGPT 和 Whisper 模型 API 开放](https://openai.com/blog/introducing-chatgpt-and-whisper-apis "ChatGPT 和 Whisper 模型 API 开放"):在 OpenAI 团队一些列的优化下,ChatGPT 的成本降低了 90%,他们要把这部分节省的钱回报开发者,现在开发者可以用相当于 GPT 3.5 十分之一的价格来使用 ChatGPT 的API。之前很多基于 OpenAI API 开发的对话功能将模型从`text-davinci-003`切到`gpt-3.5-turbo`,即完成了切换。作为开发者可以关注这些事项: 58 | 59 | * 除非机构选择加入,否则通过 API 提交的数据不再用于服务改进(包括模型训练)。 60 | * 为API用户实施默认的 30 天数据保留政策,并根据用户需求提供更严格的保留选项。 61 | * 移除我们的预发布审核(通过改进自动监控而解锁)。 62 | * 改进开发人员文档。 63 | * 简化我们的服务条款和使用政策,包括关于数据所有权的条款:用户拥有模型的输入和输出。 64 | 65 | 同时 OpenAI CEO 在推特上发表了一则信息: 66 | 67 | > a new version of moore’s law that could start soon: the amount of intelligence in the universe doubles every 18 months 68 | 69 | 即人工智能领域的摩尔定律,宇宙中的智能数量每 18 个月会翻一倍。 70 | 71 | 伴随 ChatGPT 这个风口,相信会有越来越多的基于这个模型的应用场景诞生出来,而更多应用场景更有助于推进 AI 相关技术的快速发展,或许一个新的时代已经到来。 72 | 73 | 2、[Notion AI 上线](https://www.notion.so/product/ai "Notion AI 上线"):在 Notion AI 的 whitelist 里排了两周多时间都没有获得资格,竟然正式上线了。免费用户有 20 次的使用额度,之后就需要付费,每月 $10。体验了一下 Notion AI 的写作方式,我让它写一篇介绍 NotionAI 和 ChatGPT 这类 AIGC 工具的文章。 74 | 75 | ![](https://cdn.zhangferry.com/Images/202302261414807.png) 76 | 77 | 文章思路和内容都很强,关键还非常快。 78 | 79 | 3、等了两周 new bing whitelist,都没有回音。给 bing 团队回了一封邮件,隔了一天测试资格就下来了。需要使用 Edge 浏览器才能体验,我问了它:作为计算机专业学生,可以帮我选一款笔记本电脑吗: 80 | 81 | ![](https://cdn.zhangferry.com/Images/202302261723153.png) 82 | 83 | 相比 ChatGPT,它的速度更快,且检索不再有训练模型的限制,不能回答2021年之后的问题,而是可以回答任何实时性的问题;为了让 Chat 过程更人性化,回答内容还会包含一些 emoji 和原文链接内容。当然不只是内容检索,内容创作也完全可以。 84 | 85 | 相比搜索引擎它可以理解自然语言,且有上下文能力。它的工作流程可以看出来是先把自然语言转成搜索引擎识别的关键字,然后检索结果,并用自然语言生成。当这种自然的检索能力跟商业化结合起来,比如测试的电商场景,如何定义性能强劲、如何定义性价比,谁排名靠前,让算法做决定,它选择哪一个。这些原本人为判断的过程,都可以作为 AI 的选择路径之一,细想一下真的不要太强大。 86 | 87 | 4、[phind](https://phind.com/ "phind"):一个针对研发者的 AI 搜索引擎,我试了几个问题,跟 ChatGPT 回答的差不多,感觉还要更详细一些。同时它还会把参考文档一起列出来,可以选择时效时间。 88 | 89 | ![](https://cdn.zhangferry.com/Images/202302261834156.png) 90 | 91 | 92 | 93 | ## 关于我们 94 | 95 | iOS 摸鱼周报,主要分享开发过程中遇到的经验教训、优质的博客、高质量的学习资料、实用的开发工具等。周报仓库在这里:https://github.com/zhangferry/iOSWeeklyLearning ,如果你有好的的内容推荐可以通过 issue 的方式进行提交。另外也可以申请成为我们的常驻编辑,一起维护这份周报。另可关注公众号:iOS成长之路,后台点击进群交流,联系我们,获取更多内容。 96 | 97 | ### 往期推荐 98 | 99 | [iOS 摸鱼周报 #84 | 开箱即用的云服务 AirCode](https://mp.weixin.qq.com/s/fKutqWAHfzkbbFgYCvPfIA) 100 | 101 | [iOS 摸鱼周报 #83 | ChatGPT 的风又起来了](https://mp.weixin.qq.com/s/Ty95hGBIevHaJQ5TU774aQ) 102 | 103 | [iOS 摸鱼周报 #82 | 去中心化社交软件 Damus](https://mp.weixin.qq.com/s/ck4Jn4Cq-yOs_mjAO-WacA) 104 | 105 | [iOS 摸鱼周报 #81 | Apple 推出 Apple Business Connect](https://mp.weixin.qq.com/s/Ek6W0MTBDP6PN1uxWQ5M_A) 106 | 107 | ![](https://cdn.zhangferry.com/Images/WechatIMG384.jpeg) 108 | -------------------------------------------------------------------------------- /WeeklyLearning/iOSWeeklyLearning_86.md: -------------------------------------------------------------------------------- 1 | # iOS 摸鱼周报 #86 | 更多基于 ChatGPT API 的产品诞生了 2 | 3 | ![](https://cdn.zhangferry.com/Images/moyu_weekly_cover.jpeg) 4 | 5 | ### 本期概要 6 | 7 | > * 本期话题:Apple 公布 iOS 16 的普及率已达 81% 8 | > * 内容推荐:继续推荐近期的一些优秀博文,涵盖 Swift 混编 Module、App Store 价格新政、内存优化、Xcode 命令行参数和构建配置等方面的内容 9 | > * 摸一下鱼:一些新的基于 ChatGPT API 的工具如雨后春笋般产生,产品形态有这几个:移动端、watch端、浏览器插件、网站等 10 | 11 | ## 本期话题 12 | 13 | ### [Apple 公布 iOS 16 的普及率已达 81%](https://developer.apple.com/cn/support/app-store/ "Apple 公布 iOS 16 的普及率达 81%") 14 | 15 | [@远恒之义](https://github.com/eternaljust):Apple 官方数据来源于 App Store 上进行交易的设备统计,时间截止至 2023 年 2 月 14 日。在过去四年推出的设备中,iOS 16 的普及率达 81%。在所有的设备中,iOS 16 的普及率达 72%,加上 iOS 15 的 20%,iOS 15 系统及以上的普及率总计 92%。是时候修改 iOS 项目最低版本的限制了,开发者们要紧跟 Apple 的步伐,毕竟现在「小而美」的微信,也早已是 iOS 13 系统起步。 16 | 17 | ## 内容推荐 18 | 19 | 继续推荐近期的一些优秀博文,涵盖 Swift 混编 Module、App Store 价格新政、内存优化、Xcode 命令行参数和构建配置等方面的内容 20 | 21 | 整理编辑:[东坡肘子](https://www.fatbobman.com/) 22 | 23 | 1、[云音乐 Swift 混编 Module 化实践](https://juejin.cn/post/7207269389474037817 "云音乐 Swift 混编 Module 化实践") -- 来自:网易云音乐技术团队 冰川 24 | 25 | [@东坡肘子](https://www.fatbobman.com/): 云音乐 iOS App 经历多年的迭代,积累了大量的 Objective-C(以下简称 OC)代码。在云音乐中集成的创新业务,因为依赖的历史基础库较少,已经投入使用 Swift。但主站业务迟迟没有投入,主要原因是由于大量的 OC 业务基础库和公共基础库不支持 Swift 混编。OC 组件库参与混编的前提是要完成 Module 化。本文主要介绍在支持云音乐 Swift 混编过程中,Module 化阶段的分析与实践。 26 | 27 | 2、[关于 App Store 苹果商店价格的那些事(历上最全版)](https://juejin.cn/post/7205562168358895671 "关于 App Store 苹果商店价格的那些事(历上最全版)") -- 来自:37 手游 iOS 技术运营团队 28 | 29 | [@东坡肘子](https://www.fatbobman.com/): 自 2008 年苹果 iPhone 3G 和 App Store 推出,到如今 App Store 已经是世界最大的软件商店!苹果于 2022 年 12 月 6 日宣布对 App Store 定价机制作出重大升级,新增了 700 个价格点。本文是 37 手游 iOS 技术运营团队对当前 App Store 定价机制的总结和分析。本文在创作过程中使用了 ChatGPT 和 NotionAI 进行了辅助,也算是一项不错的尝试。 30 | 31 | 3、[SwiftUI + Core Data App 的内存占用优化之旅](https://www.fatbobman.com/posts/memory-usage-optimization/ "SwiftUI + Core Data App 的内存占用优化之旅") -- 来自:东坡肘子 32 | 33 | [@东坡肘子](https://www.fatbobman.com/): 尽管 SwiftUI 的惰性容器以及 Core Data 都有各自的内存占用优化机制,但随着应用视图内容的复杂( 图文混排 ),越来越多的开发者遇到了内存占用巨大甚至由此导致 App 崩溃的情况。本文将通过对一个演示 App 进行逐步内存优化的方式( 由原先显示 100 条数据要占用 1.6 GB 内存,优化至显示数百条数据仅需 200 多 MB 内存 ),让读者对 SwiftUI 视图的存续期、惰性视图中子视图的生命周期、托管对象的惰值特性以及持久化存储协调器的行缓存等内容有更多的了解。 34 | 35 | 4、[将 Streaks Apple Watch App 转换为 SwiftUI](https://crunchybagel.com/converting-streaks-apple-watch-app-to-swiftui/ "将 Streaks Apple Watch App 转换为 SwiftUI") -- 来自:Quentin Zervaas 36 | 37 | [@东坡肘子](https://www.fatbobman.com/): Streaks 是一款荣获 Apple 设计奖的代办事项列表应用。经过了 2 年的努力,开发团队将 Apple Watch 版本的开发框架转换成了 SwiftUI。本文讨论了实现这一里程碑改动的一些技术细节,以及本次转换过程的感受。 38 | 39 | 5、[在 SwiftUI 中设置不同的环境:命令行参数和构建配置](https://holyswift.app/best-ways-to-set-up-environment-in-swiftui/ "在 SwiftUI 中设置不同的环境:命令行参数和构建配置") -- 来自:Leonardo 40 | 41 | [@东坡肘子](https://www.fatbobman.com/): 你是否厌倦了在你的 SwiftUI 应用中硬编码配置设置和数据?您想在运行时向你的应用程序传递值,而不需要手动更改代码吗?不妨看看 Xcode 环境变量和命令行参数吧。在这篇文章中,作者将探讨如何使用这些强大的功能来设置配置值,并在运行时向你的 SwiftUI 应用程序传递参数。Leonardo 将介绍如何在 Xcode 构建设置中设置环境变量,以及如何在 SwiftUI 代码中访问它们。并且还将深入探讨如何使用命令行参数,在你的应用程序从命令行启动时向其传递数值。 42 | 43 | 6、[Swift 5.8 的新功能](https://www.hackingwithswift.com/articles/256/whats-new-in-swift-5-8 "Swift 5.8 的新功能") -- 来自:Paul Hudson 44 | 45 | [@东坡肘子](https://www.fatbobman.com/): 一如既往,Paul Hudson 又为我们带来了 Swift 新版本的功能介绍。他认为 Swift 5.8 本身更像是一个清理版本:有一些新增功能,但更多的是改进了已经被广泛使用的功能。在这篇文章中,作者将引导你了解这次最重要的变化,并提供代码示例和解释,以便你可以自己尝试这一切。 46 | 47 | 48 | ## 摸一下鱼 49 | 50 | 整理编辑:[zhangferry](https://zhangferry.com) 51 | 52 | 1、[潮流周刊](https://weekly.tw93.fun/ "潮流周刊"):作者是妙言的开发者,一位前端工程师。潮流周刊已经发到 119 期了,看了下日期,真的是期期不落。周报里是这样定位这份周刊的:「记录每周看到的前端潮流技术,筛选后用接地气方式发布于此」。周报里保留了一定的生活气息,使得个人色彩相对浓厚。 53 | 54 | 这也为我对摸鱼周报如何设定基调起到了一定的参考意义,技术周报不一定就得是板板正正的,也可以有血有肉,有情绪,有个性。 55 | 56 | 2、[roomgpt](https://www.roomgpt.io/ "roomgpt"):利用 AI 技术把你现有的房间生成一个 dream room,只需上传一张当前房间的图片即可。 57 | 58 | ![](https://cdn.zhangferry.com/Images/202303072231277.png) 59 | 60 | 3、[基于 ChatGPT 的 API 能做什么产品](https://decohack.zhubai.love/posts/2244447748458225664 "基于 ChatGPT 的 API 能做什么产品"):这是 DecoHack 周刊的第 50 期内容,ChatGPT 的 API 已经开放一周了,随之而来确实有很多基于此的产品出现,本期内容总结了很多有趣的产品。我关注到的产品有: 61 | 62 | * [一键总结音视频内容](https://b.jimmylv.cn/ "一键总结音视频内容"):主要面向的是 B 站内容,可以自动总结视频信息。 63 | * [roamaround.guide](https://roamaround.guide/ "roamaround.guide"):帮助制定旅游计划,我写了一个要去杭州游玩3天,这是它给的建议。 64 | 65 | ![](https://cdn.zhangferry.com/Images/202303072303406.png) 66 | 67 | * [chatgpt-sidebar](https://chatgpt-sidebar.com/ "chatgpt-sidebar"):一个浏览器侧边栏插件,把一些常用的功能,像是文章总结,翻译,语法检查,代码解释等功能进行了一个聚合。 68 | 69 | 4、[ChatGPT Shortcut](https://newzone.top/chatgpt/ "ChatGPT Shortcut"):总结了 ChatGPT 的常见用法,并把一些使用的快捷指令进行了整理。prompts 是以英文来写的,因为 ChatGPT 语言处理能力非常强,换成中文处理也是可以的。 70 | 71 | 5、[openai-translator](https://github.com/yetone/openai-translator "openai-translator"):基于 ChatGPT API 的划词翻译浏览器插件,支持桌面端,有翻译、润色、总结内容的功能。需要自己提供 Open API Key。 72 | 73 | ![](https://cdn.zhangferry.com/Images/202303092233022.png) 74 | 75 | 6、[watchGPT](https://apps.apple.com/nl/app/watchgpt/id6446047813?l=en "watchGPT"):Apple Watch 端的 ChatGPT 应用上架,可以通过语音来输入命令,大大简化了使用路径。 76 | 77 | ![](https://cdn.zhangferry.com/Images/202303092229450.png) 78 | 79 | ## 关于我们 80 | 81 | iOS 摸鱼周报,主要分享开发过程中遇到的经验教训、优质的博客、高质量的学习资料、实用的开发工具等。周报仓库在这里:https://github.com/zhangferry/iOSWeeklyLearning ,如果你有好的的内容推荐可以通过 issue 的方式进行提交。另外也可以申请成为我们的常驻编辑,一起维护这份周报。另可关注公众号:iOS成长之路,后台点击进群交流,联系我们,获取更多内容。 82 | 83 | ### 往期推荐 84 | 85 | [iOS 摸鱼周报 #85 | ChatGPT 的 API 开放使用](https://mp.weixin.qq.com/s/Hhb7ZCDDqEcpIRTlUKiGTQ) 86 | 87 | [iOS 摸鱼周报 #84 | 开箱即用的云服务 AirCode](https://mp.weixin.qq.com/s/fKutqWAHfzkbbFgYCvPfIA) 88 | 89 | [iOS 摸鱼周报 #83 | ChatGPT 的风又起来了](https://mp.weixin.qq.com/s/Ty95hGBIevHaJQ5TU774aQ) 90 | 91 | [iOS 摸鱼周报 #82 | 去中心化社交软件 Damus](https://mp.weixin.qq.com/s/ck4Jn4Cq-yOs_mjAO-WacA) 92 | 93 | ![](https://cdn.zhangferry.com/Images/WechatIMG384.jpeg) 94 | -------------------------------------------------------------------------------- /WeeklyLearning/iOSWeeklyLearning_87.md: -------------------------------------------------------------------------------- 1 | # iOS 摸鱼周报 #87 | Planning for AGI 2 | 3 | ![](https://cdn.zhangferry.com/Images/moyu_weekly_cover.jpeg) 4 | 5 | ### 本期概要 6 | 7 | > * 本期话题:App Store 的定价机制升级扩展;四位女性开发者与 App Store 的故事 8 | > * 内容推荐:推荐近期的一些优秀博文,涵盖结构化并发、开发者故事、开发经验分享、Swift Builtin 函数等方面的内容 9 | > * 摸一下鱼:Planning for AGI;GPT4 发布;stable-diffusion-webui 尝试;一个 Alfred 插件 AJTools;苹果新版定价解读 10 | 11 | ## 本期话题 12 | 13 | ### [App Store 的定价机制升级现已扩展至所有购买类型](https://developer.apple.com/cn/news/?id=dbrszv62 "App Store 的定价机制升级现已扩展至所有购买类型") 14 | 15 | [@远恒之义](https://github.com/eternaljust):即日起,App Store 最全面的定价机制升级迎来更新,包括新增价格点和按店面管理定价的全新工具。其中,你可在 900 个价格点中选择更灵活的定价,根据你熟悉的国家或地区来生成生成全球均衡价格,也可以为各个市场分发定制的内容和服务。此外,全新的增强定价机制更适用于当地顾客的价格,该机制将会在 2023 年 5 月 9 日更新调整。 16 | 17 | ### [四位女性通过 app 与游戏推动文化发展并创造改变](https://www.apple.com.cn/newsroom/2023/03/meet-four-women-using-apps-and-games-to-drive-culture-and-create-change/ "四位女性通过 app 与游戏推动文化发展并创造改变") 18 | 19 | [@远恒之义](https://github.com/eternaljust):女性开发者在开发者生态圈是一股不可忽视的力量,Apple 也一直在竭尽全力帮助女性开发者获得更好的成长,此前开展了包括 Apple Entrepreneur Camp(苹果企业家培训营)课程活动,以及针对中国女性开发者的“女性开发者社区日”特别活动。本篇内容为国际妇女节的主题特写,Apple 沟通了四位不同女性,这些女性主导的团队正在努力彰显女性的声音,文中分享了她们如何利用技术来鼓舞女性、创造社会变革的心得。 20 | 21 | ## 内容推荐 22 | 23 | 推荐近期的一些优秀博文,涵盖结构化并发、开发者故事、开发经验分享、Swift Builtin 函数等方面的内容 24 | 25 | 整理编辑:[东坡肘子](https://www.fatbobman.com/) 26 | 27 | 1、[神秘的 Swift 内置模块](https://juejin.cn/post/7208534700223250487 "神秘的 Swift 内置模块") -- 作者:ankit 中文翻译:桃红宿雨 28 | 29 | [@东坡肘子](https://www.fatbobman.com/): 如果你已经阅读过 Swift 的 stdlib 库,那大概率注意到了有很多 Builtin.* 类的函数,诸如:`Builtin.Int1`、`Builtin.RawPointer`、`Builtin.NativeObject` 等,这些神秘的 Builtin 到底是什么呢?本文主要解释了 Builtin 存在的原因:加快编译速度(Swift 很多 struct 值类型,最终内部都封装了 IILV IR 基础类型,不需要过多转换);提高运行性能(由于不需要做过多转换,直接使用的 IILV IR 的函数,相当于使用很多类似底层函数在开发,性能更高)。 30 | 31 | 2、[手工打造 HTML 解析器的那些事](https://zhgchg.li/posts/2724f02f6e7/ "手工打造 HTML 解析器的那些事") -- 作者:ZhgChgLi 32 | 33 | [@东坡肘子](https://www.fatbobman.com/): [ZMarkupParser](https://github.com/ZhgChgLi/ZMarkupParser) 是一个纯 Swift 库,可帮助你将 HTML 字符串转换为具有自定义样式和标签的 NSAttributedString。在本文中,ZhgChgLi 详细介绍了开发该库过程中所涉及的技术细节(HTML String 的 Tokenization 转换、Normalization 处理、Abstract Syntax Tree 的产生、Visitor Pattern / Builder Pattern 的应用)以及一些开发杂谈。本文篇幅很长,难得有开发者会做如此详尽的记录。 34 | 35 | 3、[结构化并发](http://chuquan.me/2023/03/11/structured-concurrency/ "结构化并发") -- 作者:楚权 36 | 37 | [@东坡肘子](https://www.fatbobman.com/): 对于异步与并发,一直以来,业界都有着非常广泛的研究,针对特定场景提出了很多相关的技术,如:Future/Promise、Actor、CSP、异步函数等等。本文通过 GOTO 有害论引出编程历史中结构化编程的演化。以结构化编程作为类比,介绍了结构化并发的核心观点,以及结构化并发的设计理念。结构化并发主要包括作用域、异步函数、计算续体、协程等技术,此外还需要运行时系统的调度,才能最终实现理想的结构化并发。 38 | 39 | 4、[通过 vacuuming 优化 CoreData 存储文件尺寸](https://blog.eidinger.info/keep-your-coredata-store-small-by-vacuuming "通过 vacuuming 优化 CoreData 存储文件尺寸") -- 作者:Marco Eidinger 40 | 41 | [@东坡肘子](https://www.fatbobman.com/): 默认情况下,当你从表中删除数据或删除表、视图或索引等数据库对象时,SQLite 数据库不会自动“释放”磁盘空间。因为 SQLite 只是将删除的对象标记为空闲并保留空间以供将来使用。结果,数据库文件的大小总是在增长。在这篇博文中,Marco Eidinger 将解释 VACUUM 这个概念以及如何将这个概念应用到你的 CoreData 存储中来减少存储文件的尺寸。 42 | 43 | 5、[独立开发周报 #4 (0306-0312)](https://mp.weixin.qq.com/s/cEieMaUxSxDAZq0Cm_gwEQ) -- 作者:vulgur 44 | 45 | [@东坡肘子](https://www.fatbobman.com/): vulgur 是“极简时钟”、“极简日记”等 App 的作者,从一个月前开始,每周都通过博客的方式来记录自己的开发生活。通过他的记录,你可以对国内独立开发者的工作、生活状态有更多的了解。 46 | 47 | ## 摸一下鱼 48 | 49 | 整理编辑:[zhangferry](https://zhangferry.com) 50 | 51 | 1、[OpenAI:通用人工智能规划及未来](https://mp.weixin.qq.com/s/Ku97-qx0EGnV9NVU20LyAA):这是 OpenAI 发布的文章[Planning for AGI and beyond](https://openai.com/blog/planning-for-agi-and-beyond "Planning for AGI and beyond")的翻译版。人工智能的等级分三级: 52 | 53 | * ANI(Artificial Narrow Intelligence,弱人工智能),像是 Alpha Go,只能应用在单一领域。 54 | * AGI(Artificial General Intelligence,强人工智能,也叫通用人工智能),可以胜任人类几乎所有工作。目前还没有达到,随着 ChatGPT 的问世,这种能力应该很快就会到来。 55 | * ASI(Artificial Superintelligence,超人工智能)。超越人类智慧的人工智能,拥有任何人都无法企及的智慧,这个会更远一些。 56 | 57 | 技术的发展通常都是一把双刃剑,这篇文章主要就在讲 OpenAI 在考虑和规划 AGI 到来所面临的一系列问题。这个问题不只是 OpenAI 所面临的,而是整个社会都将面临的。 58 | 59 | > 我们希望AGI能让人类在宇宙中最大限度地繁荣。我们不期望未来变成糟糕的乌托邦,我们希望把有利因素的最大化,把不利因素的最小化,让AGI成为人性良知的放大器。 60 | > 61 | > 我们希望AGI的益处、使用和治理能够被广泛和公平地共享。 62 | > 63 | > 我们希望成功应对巨大的风险。 64 | > 65 | > 在面对这些风险时,我们承认,理论上看似正确的事情,在实践中往往表现得比预期的更奇怪。我们相信,我们必须不断地学习和适应,部署功能较弱的技术版本,以尽量减少追求“一次做对”的场景。 66 | 67 | 2、[GPT4 发布](https://openai.com/research/gpt-4 "GPT4 发布"):GPT 4 相比 3.5 训练量大幅提升,训练参数已超万亿,这使其在多种自然语言处理任务上更加强大。它现在可以识别图像含义,可以快速创建一个完成程序,在多项人类的考试中均获得非常好的成绩。它能做的事情更多,做的速度也更快了。更厉害的是,相比于很多产品的概念发布和产品预热,这次发布是针对成品的。New bing 已经确认应用了 GPT4,除了图片识别的功能还在 alpha 阶段,其他文字类功能已经提供了可用的 API 调用。 68 | 69 | 从 3.5 到 4.0 已经是一个非常快的发展,而传言 GPT5 会在年底发布,相比于 GPT 4 它的训练量是这样的: 70 | 71 | ![](https://cdn.zhangferry.com/Images/202303152247544.png) 72 | 73 | 届时会增加对视频和声音的理解,AI 的 进化是飞速的,甚至就是指数级的。如果 GPT 4 的能力能代替 1% 的工作,那下一代的 GPT 5 对应的就不是 %2,而是10%,20%。所以关于 AGI 的到来会对社会有什么影响,如何将现有社会运作方式与 AGI 能力配合起来,都是不得不考虑的问题。 74 | 75 | 3、[stable-diffusion-webui](https://github.com/AUTOMATIC1111/stable-diffusion-webui "stable-diffusion-webui"):Stable-diffusion 的 WebUI 版本,支持 Apple Silicon 设备,参考地址:[Installation on Apple Silicon](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Installation-on-Apple-Silicon "Installation on Apple Silicon")。通常运行起来遇到最多的问题就是环境的安装,大部分参照 Issues 都能解决。运行前给 `webui-user.sh`文件添加一个环境变量: 76 | 77 | ```bash 78 | export COMMANDLINE_ARGS="--skip-torch-cuda-test --upcast-sampling --no-half-vae --use-cpu interrogate --xformers --disable-nan-check" 79 | ``` 80 | 81 | 这表示运行 `webui.sh` 命令时填写的参数,以适用于 mac 设备。 82 | 83 | 运行起来需要现配置模型,再输入关键字。模型有两类,一类叫 base model(底模型),像 SD v1.5 ,这类模型通常比较大,一般几个 G。另一类叫「修正模型」,像 Lora 就属于修正模型,会有很多特征的 Lora 变体模型,它是运行在底模型之上的,这类文件比较小,一般几百 M。模型可以在这个网站下载:[civitai](https://civitai.com/ "civitai"),下面是我跑出来的几张效果图,512 * 512,一张耗时大概 50s。图片非常细腻,只看图,真的很难分辨出是否是真人照片。 84 | 85 | ![](https://cdn.zhangferry.com/Images/00003-1295391836.png) 86 | 87 | ![](https://cdn.zhangferry.com/Images/00007-3265905480.png) 88 | 89 | 4、[AJTools - 开发工具](https://github.com/kaqijiang/AJTools-AlfredWorkflowa "AJTools - 开发工具"):一个 Alfred Workflow 工具集,用 Python 实现,封装了一系列开发常用功能。包含:时间戳转换、URL 解析、copy SHH Key、打开当前窗口在iTerm2中、当前文件夹下快速新建文件、ChatGPT聊天等。 90 | 91 | 5、[苹果内购录:关于新定价规则的理解与思考](https://mp.weixin.qq.com/s/ZQlBFHuRoDYmYpMfgnsp2Q):苹果在 3 月 9 号 发布了[新的定价规则](https://developer.apple.com/cn/news/?id=dbrszv62 "Apple 新的定价规则"),其中有一些修改点可能会对现有业务逻辑带来一些影响。本文对历史规则进行了回顾,同时也对新的定价规则进行了分析解读。 92 | 93 | 除此之外,推荐需要处理内购的同学可以关注一下该 `#苹果内购录` 系列文章。 94 | 95 | ## 关于我们 96 | 97 | iOS 摸鱼周报,主要分享开发过程中遇到的经验教训、优质的博客、高质量的学习资料、实用的开发工具等。周报仓库在这里:https://github.com/zhangferry/iOSWeeklyLearning ,如果你有好的的内容推荐可以通过 issue 的方式进行提交。另外也可以申请成为我们的常驻编辑,一起维护这份周报。另可关注公众号:iOS成长之路,后台点击进群交流,联系我们,获取更多内容。 98 | 99 | ### 往期推荐 100 | 101 | [iOS 摸鱼周报 #86 | 更多基于 ChatGPT API 的产品诞生了](https://mp.weixin.qq.com/s/y1_V0WKfdwsUL2WjP2zPyA) 102 | 103 | [iOS 摸鱼周报 #85 | ChatGPT 的 API 开放使用](https://mp.weixin.qq.com/s/Hhb7ZCDDqEcpIRTlUKiGTQ) 104 | 105 | [iOS 摸鱼周报 #84 | 开箱即用的云服务 AirCode](https://mp.weixin.qq.com/s/fKutqWAHfzkbbFgYCvPfIA) 106 | 107 | [iOS 摸鱼周报 #83 | ChatGPT 的风又起来了](https://mp.weixin.qq.com/s/Ty95hGBIevHaJQ5TU774aQ) 108 | 109 | ![](https://cdn.zhangferry.com/Images/WechatIMG384.jpeg) 110 | -------------------------------------------------------------------------------- /WeeklyLearning/iOSWeeklyLearning_88.md: -------------------------------------------------------------------------------- 1 | # iOS 摸鱼周报 #88 | 把 AI 集成到研发流程 2 | 3 | ![](https://cdn.zhangferry.com/Images/moyu_weekly_cover.jpeg) 4 | 5 | ### 本期概要 6 | 7 | > * 本期话题:Xcode 14.3 RC 版本发布 8 | > * 内容推荐:推荐近期的一些优秀博文,涵盖 CreateML 使用、Runtime 探索、XCTest 性能测试等方面的内容 9 | > * 摸一下鱼:集成 GPT-4 的 Cursor;CopilotX;AI 工具使用提效,Prompt 编写模式 10 | 11 | ## 本期话题 12 | 13 | ### [Xcode 14.3 RC 版本发布](https://developer.apple.com/documentation/xcode-release-notes/xcode-14_3-release-notes "Xcode 14.3 RC 版本发布") 14 | 15 | [@远恒之义](https://github.com/eternaljust):Apple 于 2023 年 3 月 21 日发布了 [Xcode 14.3 RC 版本](https://developer.apple.com/services-account/download?path=/Developer_Tools/Xcode_14.3_Release_Candidate/Xcode_14.3_Release_Candidate.xip "Xcode 14.3 RC 版本下载"),新版本要求 macOS Ventura 13.0 系统及以上,最低兼容:MacBook Pro 2017 款、MacBook Air 2018 款、iMac 2017 款以及 Mac mini 2018 款等 Mac 机型。 16 | 17 | Xcode 14.3 内置 [Swift 5.8](https://www.hackingwithswift.com/articles/256/whats-new-in-swift-5-8 "Swift 5.8 中的新功能"),新版带来了可向后的函数返回部署 API、隐式 self 进行弱自我捕获、改进的结果生成器等新功能,同时内含 iOS 16.4 SDK。 18 | 19 | 本周三我下载好 Xcode 14.3 解压,编译了一下日常开发的 Swift 项目,仅遇到一个单行隐式函数表达式中,包含两个三元运算符的数据类型相加无法正常推导的报错,声明两个变量类型来拆分三元运算符后即通过了编译,目前暂无遇到其他报错信息。 20 | 21 | ## 内容推荐 22 | 23 | 推荐近期的一些优秀博文,涵盖 CreateML 使用、Runtime 探索、XCTest 性能测试等方面的内容 24 | 25 | 整理编辑:[东坡肘子](https://www.fatbobman.com/) 26 | 27 | 1、[CreateML 使用](https://mp.weixin.qq.com/s/FGwv9cvf1lZDaYa9dh_kmQ) -- 作者:王德亮 搜狐技术产品 28 | 29 | [@东坡肘子](https://www.fatbobman.com/): CoreML 框架允许将机器学习模型整合到苹果平台的应用程序中。有许多种方法来创建可用于 CoreML 的模型,其中一种方式便是使用 Xcode 附带的 CreateML 开发者应用程序。本文将展示使用 CreateML 来创建模型的流程。 30 | 31 | 2、[iOS 底层之 Runtime 探索](https://juejin.cn/post/7207330728698806309 "iOS 底层之 Runtime 探索") -- 作者:Joe天青色 32 | 33 | [@东坡肘子](https://www.fatbobman.com/): Runtime 简称运行时,Objective-C 语言将尽可能多的决策从编译时和链接时推迟到运行时。只要可能,它都会动态地进行操作。这意味着该语言不仅需要编译器,还需要运行时系统来执行编译的代码。运行时系统充当 Objective-C 语言的一种操作系统。作者将通过三篇文章来梳理并分享自己对 Runtime 的探索过程。 34 | 35 | 3、[只在视图 Body 中生存的变量](https://www.fatbobman.com/posts/variables-that-only-survive-in-view-body/ "只在视图 Body 中生存的变量") -- 作者:东坡肘子 36 | 37 | [@东坡肘子](https://www.fatbobman.com/): 相信不少开发者都会在视图中使用过 `let _ = print("update")`,但很少有人会在 body 中去使用 var 来定义变量,因为实在找不到使用 var 的理由和意义。本文将探讨在 SwiftUI 的视图 body 中用 var 来创建变量的意义和可能的场景。 38 | 39 | 4、[用结构体包裹函数](https://paul-samuels.com/blog/2023/03/18/wrapping-functions-in-structs/ "用结构体包裹函数") -- 作者:Paul Samuels 40 | 41 | [@东坡肘子](https://www.fatbobman.com/): 我们可以在 Swift 中使用函数来捆绑行为,并在我们的应用程序中方便地传递它。使用函数时,当我们遇到一些特殊的可用性问题,可以尝试通过将函数包装在一个结构中来解决。这篇文章 100% 不是建议把每个函数都包装在一个结构中,而是研究一些可能有意义的情况。 42 | 43 | 5、[使用 XCTest 框架在 Swift 中进行性能测试](https://swiftwithmajid.com/2023/03/15/performance-testing-in-swift-using-xctest-framework/ "使用 XCTest 框架在 Swift 中进行性能测试") -- 作者:Majid 44 | 45 | [@东坡肘子](https://www.fatbobman.com/): 在 Swift 中,我们可以使用 XCTest 框架进行性能测试,它是 Xcode 开发环境的一部分。 XCTest 提供了一套全面的工具,用于编写、运行和分析 Swift 应用程序的单元测试和性能测试。 本周我们将学习如何使用 XCTest 框架在 Swift 中进行性能测试。作者 Majid 善长进行系列创作,本文或许是他有关 XCTest 框架的又一系例作品的开篇,目前已经完成了两篇。 46 | 47 | 48 | ## 摸一下鱼 49 | 50 | 整理编辑:[zhangferry](https://zhangferry.com) 51 | 52 | 本周 AI 领域又迎来新一轮功能迭代:微软将 GPT-4 引入 Office 和 Copilot,将 DALLE2 引入 new bing;Google Bard 上线测试;Midjourney 上线了 V5 版本;多位国内科技圈大佬投身 AI 创业。AI 科技这一轮变化真的太快,还没完全适应,多种全新能力就诞生出来了。 53 | 54 | 1、[Cursor](https://www.cursor.so/ "Cursor"):集成 GPT-4 的代码编辑器,不需要 OpenAI Key,免费使用。体验了一下,感觉真的改变了很多编程习惯。它主要有这几个功能: 55 | 56 | * Generate:用于生成内容,在空白区域键入 Commond + K,输入指令即可。这里即可以生成模版代码,也可以通过提问题的方式,让它给出答案。 57 | 58 | * Edit:代码编辑,这里需要选中代码才能执行编辑操作。我在上一步问了 IDE 一个问题,如果在 Swift 中调用 C 函数,它给了我一个示例。然后我选中这段代码,执行Edit,输入指令:把示例中的 int 参数转成 char 参数。它逐行扫描,还显示出了修改之后的 Diff 信息,点击 Accept 即可以实现替换。 59 | 60 | ![](https://cdn.zhangferry.com/Images/202303212355300.png) 61 | 62 | * Chat:这个也是针对内容选中的功能,它可以支持长段对话。我让它帮我介绍整个文件的含义,有时中文输入的问题,结果还是英文。然后问他代码有没有什么优化的空间,它也很快给了一些建议,也挺符合编程规范的。 63 | 64 | ![](https://cdn.zhangferry.com/Images/202303212334574.png) 65 | 66 | 基于GPT4协作编程这件事,有人总结了一些[可以遵循的要点](https://twitter.com/goldengrape/status/1638049866604777472 "GPT4协作编程要点-Twitter"): 67 | 68 | > 0.建立一个markdown文件记录prompt 69 | > 70 | > 1.写明程序目的 71 | > 72 | > 2.写明程序实现目的的方法/流程 73 | > 74 | > 3.注明编程风格,要求GPT4写出函数的作用描述、输入、输出,但不必列出函数的具体实现。 75 | > 76 | > 4.由GPT4生成函数设计 77 | > 78 | > 5.注明需要使用的库,列出库中的几个典型示例,复制之上所有部分交GPT4生成代码 79 | > 80 | > 6.debug,将代码和报错一起交给GPT4,询问错误出现的原因,并修改。注意GPT4的知识过时,有可能引用不存在的库中的函数方法,可能需要以ChatPDF或者Bing Chat协助或者手动找到对应的函数,并找到说明或者示例,一同交给GPT4生成新代码。 81 | > 82 | > 7.记录debug要点于文件中。 83 | 84 | 2、[CopilotX](https://github.com/features/preview/copilot-x "GopilotX"):之前的 Github Copilot 是基于 GPT-3 实现的,随着 GPT-4 的到来,Github Copilot 随之升级,就是 CopilotX。Github 对于 CopilotX 的定位并非只是代码补全,而是希望它能成为一个为开发全流程赋能的工具。CopilotX 能够在 pull request、终端才做、开发文档等多个常用流程提供帮助。目前 [CopilotX for docs](https://githubnext.com/projects/copilot-for-docs "https://githubnext.com/projects/copilot-for-docs") 和 [Copilot for CLI](https://githubnext.com/projects/copilot-cli "Copilot for CLI") 目前可以加入 waitlist 等待内测。 85 | 86 | 随着 GPT-4 使用成本的降低,借由 CopilotX 的思路,相信会有更多 AI 工具填充到我们的产研链路中。 87 | 88 | ![](https://cdn.zhangferry.com/Images/202303232250503.png) 89 | 90 | 3、[Prompt 编写模式](https://prompt-patterns.phodal.com/ "Prompt 编写模式"):像 ChatGPT、MidJourney 这类 AI 工具,正在一步步颠覆我们之前对工具的使用方式。如何使用 AI,就像是电脑刚出现时,如何使用电脑一样,它很强大,但如何发挥它的强大,如何借助于 AI 让自己的做事效率提升,这是一件差异很大的事情。 91 | 92 | 目前我们跟 AI 的交互基本都是通过 Prompt 进行的,如何编写 Prompt,如果高效的获取我们希望的结果,正是这篇文章想要解答的问题。作者并非按各个用途总结 Prompt 使用方式,而是按照设计模式的形式把跟AI对话的 Prompt 进行了抽象,正如它的目标:**如何将思维框架赋予机器,以设计模式的形式来思考 prompt**。 93 | 94 | ![](https://cdn.zhangferry.com/Images/202303222234824.png) 95 | 96 | 4、[kalos.art](https://lib.kalos.art/ "kalos.art"):一个收集 AI 绘画的网站,支持主流的绘画模型。它还根据绘画风格进行了分类,可以选择喜欢的风格,copy 对应 prompt 应用到自己的绘画描述中。 97 | 98 | ![](https://cdn.zhangferry.com/Images/202303232326509.png) 99 | 100 | ## 岗位推荐:小红书-直播-iOS 101 | 102 | ### 岗位要求 103 | 104 | * 参与小红书直播生态业务建设 105 | * 负责视频录制开播推流,IM交互,礼物打赏,直播带货等完整直播场景的功能研发迭代 106 | * 能够在数据分析的支持下提升直播相关功能的性能,主播开播体验,以及观看,购买和互动体验 107 | * 3年以上工作经验;扎实的编程和数据结构算法基础;有直播项目经验者优先 108 | 109 | ### 岗位介绍 110 | 111 | * 绝对的上升部门,前景光明,机会多多。[晚点独家丨小红书调整组织架构,押注直播电商,结束社区和商业化之争](https://mp.weixin.qq.com/s/O2XYOoYnE7gBJJDkG2DYzw) 112 | * 团队成员多样化,有抖快来的资深大神也有刚毕业的00后应届生,团队氛围轻松愉悦 113 | * 免费三餐 + 免费零食饮料,节日生日周年日各种福利,团建费多多(200/人月+额外奖励) 114 | * 大小周,周六双倍,其他节假日极少加班,如有则三/双倍 115 | 116 | 工作地点:北京 地铁10号线 安贞门站 中海国际中心A座(地下直通) 117 | 118 | 联系方式:hulong1@xiaohongshu.com 119 | 120 | ## 关于我们 121 | 122 | iOS 摸鱼周报,主要分享开发过程中遇到的经验教训、优质的博客、高质量的学习资料、实用的开发工具等。周报仓库在这里:https://github.com/zhangferry/iOSWeeklyLearning ,如果你有好的的内容推荐可以通过 issue 的方式进行提交。另外也可以申请成为我们的常驻编辑,一起维护这份周报。另可关注公众号:iOS成长之路,后台点击进群交流,联系我们,获取更多内容。 123 | 124 | ### 往期推荐 125 | 126 | [iOS 摸鱼周报 #87 | Planning for AGI](https://mp.weixin.qq.com/s/TwugmMEiGoFKYQY9euhg6Q) 127 | 128 | [iOS 摸鱼周报 #86 | 更多基于 ChatGPT API 的产品诞生了](https://mp.weixin.qq.com/s/y1_V0WKfdwsUL2WjP2zPyA) 129 | 130 | [iOS 摸鱼周报 #85 | ChatGPT 的 API 开放使用](https://mp.weixin.qq.com/s/Hhb7ZCDDqEcpIRTlUKiGTQ) 131 | 132 | [iOS 摸鱼周报 #84 | 开箱即用的云服务 AirCode](https://mp.weixin.qq.com/s/fKutqWAHfzkbbFgYCvPfIA) 133 | 134 | ![](https://cdn.zhangferry.com/Images/WechatIMG384.jpeg) 135 | -------------------------------------------------------------------------------- /WeeklyLearning/iOSWeeklyLearning_89.md: -------------------------------------------------------------------------------- 1 | # iOS 摸鱼周报 #89 | WWDC 23 公布 2 | 3 | ![](https://cdn.zhangferry.com/Images/moyu_weekly_cover.jpeg) 4 | 5 | ### 本期概要 6 | 7 | > * 本期话题:WWDC 23 全球开发者大会日期公布 8 | > * 内容推荐:推荐近期的一些优秀博文,涵盖:通过 ReplayKit 录制屏幕、在 SwiftUI 中使用相对比例进行布局、保护小组件中的用户隐私等方面的内容 9 | > * 摸一下鱼:AGI 元年;微软对于 GPT-4 的研究论文;可以自定义数据源的 ChatGPT 插件;国产开源模型 ChatGLM 10 | 11 | ## 本期话题 12 | 13 | ### [WWDC 23 全球开发者大会日期公布](https://developer.apple.com/cn/wwdc23/ "WWDC 23 全球开发者大会日期公布") 14 | 15 | ![](https://cdn.zhangferry.com/Images/89-wwdc23.jpeg) 16 | 17 | Apple 宣布 WWDC 23 将在北京时间 6 月 6 日至 10 日举行,主要内容是为期一周丰富多彩的技术和社区活动,大会仍采用线上播放形式。通过邀请函图片猜测,本次大会 Apple 可能会带来新的 MR 头显硬件。除了 iOS、iPadOS、macOS、watchOS 和 tvOS 等系统新功能的更新,大会上是否会有 xrOS 新系统的推出也值得关注。 18 | 19 | Apple 同时会在 Apple Park 举办面向开发者和学生的全天特别活动,[Swift Student Challenge](https://developer.apple.com/cn/wwdc23/swift-student-challenge/ "Swift Student Challenge ") 也将继续举行,全世界满足条件的学生可以构建自己的 App Playground。完成作品提交截止日期为太平洋夏令时间 2023 年 4 月 19 日,获奖者将会得到 WWDC23 专属夹克、AirPods Pro、定制徽章套装,以及一年开发者会员资格。此外,获奖者还有一次专属的随机抽取出席 Apple Park 特别活动的机会。 20 | 21 | ## 内容推荐 22 | 23 | 推荐近期的一些优秀博文,涵盖:通过 ReplayKit 录制屏幕、在 SwiftUI 中使用相对比例进行布局、保护小组件中的用户隐私等方面的内容。 24 | 25 | 整理编辑:[东坡肘子](https://www.fatbobman.com/) 26 | 27 | 1、[当 matchGeometryEffect 不起作用时](https://chris.eidhof.nl/post/matched-geometry-effect/ "当 matchGeometryEffect 不起作用时") -- 作者:Chris Eidhof 28 | 29 | [@东坡肘子](https://www.fatbobman.com/): 在 SwiftUI 中,视图的 modifier 顺序十分重要,不同的顺序可能会产生完全不一样的结果。作者通过分析一段 matchGeometryEffect 不起作用的代码,从另一个角度阐述了视图的布局逻辑以及 modifier 顺序的重要性。 30 | 31 | 2、[iOS ReplayKit 与 屏幕录制](https://juejin.cn/post/7217692600647254071 "iOS ReplayKit 与 屏幕录制") -- 作者:网易云音乐技术团队 32 | 33 | [@东坡肘子](https://www.fatbobman.com/): 在客户端开发过程中,有时会遇到这样一些场景,需要对用户在应用内的操作做进行屏幕录制,甚至是系统层级的跨应用屏幕录制来实现某种特殊需求,例如在线监考、应用问题反馈、游戏直播等。网易云音乐技术团队在本文中介绍了云音乐 LOOK 直播客户端如何通过 ReplayKit Framework 实现了上述需求。 34 | 35 | 3、[在 SwiftUI 布局中使用百分比](https://oleb.net/2023/swiftui-relative-size/ "在 SwiftUI 布局中使用百分比") -- 作者:Ole Begemann 36 | 37 | [@东坡肘子](https://www.fatbobman.com/): SwiftUI 没有提供使用相对大小进行布局的工具,例如“使此视图是其容器宽度的 50% ”。Ole Begemann 通过 Layout 协议实现了上述的想法,本文提供了思路以及完整代码。有趣的是,在 SwiftUI 1.0 的测试版本中,曾经出现过官方提供的使用相对比例进行布局的 modifier,不过在最终版本中取消了,并且也再没有出现过。 38 | 39 | 4、[onAppear 的调用时机](https://www.fatbobman.com/posts/onAppear-call-timing/ "onAppear 的调用时机") -- 作者:东坡肘子 40 | 41 | [@东坡肘子](https://www.fatbobman.com/): onAppear 是 SwiftUI 开发者经常使用的一个修饰符,但一直没有权威的文档明确它的闭包被调用的时机。本文将通过 SwiftUI 4 提供的新 API ,证明 onAppear 的调用时机是在布局之后、渲染之前。 42 | 43 | 5、[深入了解 NotificationCenter 的实现原理](https://juejin.cn/post/7216340356949459004 "深入了解 NotificationCenter 的实现原理") -- 作者:向辉_ 44 | 45 | [@东坡肘子](https://www.fatbobman.com/): NotificationCenter 是一个系统组件,它负责协调和管理事件的通知和响应。它的基本原理是基于观察者模式。由于 Apple 对其是闭源的,因此无法查看 NotificationCenter 的源码。作者采用了曲线救国的方式,通过分析开源的 Swift 来理解 NotificationCenter 的实现。 46 | 47 | 6、[设备锁定时如何隐藏敏感的小组件数据](https://swiftsenpai.com/development/hide-sensitive-widget-data/?utm_source=rss&utm_medium=rss&utm_campaign=hide-sensitive-widget-data "设备锁定时如何隐藏敏感的小组件数据") -- 作者:Lee Kah Seng 48 | 49 | [@东坡肘子](https://www.fatbobman.com/): 随着 iOS 引入小组件,用户现在可以在锁屏和今日视图中轻松访问他们喜爱的应用程序的信息。尽管看起来不错,但这确实带来了隐私问题 —— 即使设备被锁定,敏感数据也可以被访问。在本文中,作者将介绍如何在小组件上隐藏敏感数据,保护用户隐私。 50 | 51 | 52 | ## 摸一下鱼 53 | 54 | 整理编辑:[zhangferry](https://zhangferry.com) 55 | 56 | 1、2023 AGI 元年:一位爱好 AGI 的同事在公司内做了一次分享,学到一些东西,尝试总结一些精华的内容。他在 12 年就关注 AGI 领域,该领域在当时还非常小众,随着 ChatGPT 的到来,AGI 概念热了起来,2023年可以被称之为 AGI 元年。 57 | 58 | ![](https://cdn.zhangferry.com/Images/202304062357097.png) 59 | 60 | AGI 全称 Artificial General intelligence,通用人工智能,它没有标准定义,可以理解为具有人类智能的能力。那什么是人类智能的能力,人类智能又是什么,这个最早可以追溯到佛经和柏拉图时代,自古以来,人类就一直在思考和探索自己的智慧和思维的本质。到了现代社会,很多学科都与人类智慧的探索相关,心理学、脑科学、认知科学、计算机科学等。 61 | 62 | 我们先了解下人是怎么认知世界的,为什么人能很快的分别出一只猫,一个人?人是如何与这个世界交互的?在认知科学上的解释是在意识层面,存在一个工作记忆,将任务目标、当前注意的实体对象等可操纵的物体都放到一个舞台空间集中加工,并进行动态的建模,预测,推理,溯源,决策。这就是人去理解这个物理世界的主要步骤。 63 | 64 | 回到计算机领域,从简单的状态机,图灵机,现代计算机,从人工神经网络,再到 Transformer, GPT4,逐渐逼近人类的智能。为什么从简单的计算机原理,却可以进化出那么强大的能力,因为这就是人脑就是这种工作模式。单个神经元什么也做不了,但1000亿个神经元的连接就产生了意识。(一种简单的模式,或者叫算法,无限叠加就产生了智能,马斯克说:我们生活的世界不是虚拟世界的可能性不到十亿分之一,用虚拟世界也能解释的通当前社会运行的本质。) 65 | 66 | GPT4 在某些领域已经超过了大多数人,那它还差什么? 67 | 68 | a、跟真实物理世界的连接,它目前仅能接收和处理文字图片内容,不具备运动控制 69 | 70 | b、它还没有面向任务的自驱动架构。这个含义是,它可以自己去分解目标,一步步完成,想象 L5 级别的自动驾驶。这个处理流程更像一个人的思考过程了。 71 | 72 | 这些都是可实现的,只不过还没有人这么搞(太危险了)。AGI 势必会影响社会的方方面面,回顾技术的发展史,科技在进步人类的需求却基本没变,基本就是衣食住行、医教娱金。到了后 AGI 时代,我们的需求不会变,与之相对的产业链会发生重塑,生产力极大释放,社会形态又改如何就不是技术问题而是政治问题了。 73 | 74 | 2、[Sparks of Artificial General Intelligence: Early experiments with GPT-4](https://ask.qcloudimg.com/draft/8642415/na64oeidz2.pdf "Sparks of Artificial General Intelligence: Early experiments with GPT-4"):微软对 GPT-4 能力介绍的论文,里面除了介绍很多 GPT-4 在文字理解上的优化和一些多模态能力。此外还有一个重要结论:GPT-4 已经可以被视为 AGI 的早期版本,它已经初步具备人类意识的雏形。 75 | 76 | 微软研究员还抛出了结论,他们也不知道为什么 GPT-4 会如此智能。之前听过一次分享解释,为什么只有大模型才做到了高效语义的理解,是因为训练量与理解能力不能简单的线性关系,而是到了某个阶段之后会有指数级变化,具体名词叫「思维涌现」。也可以简单的理解为量变产生质变,学了那么多东西,一下子学通了,研究员也不知道它是如何学通的,只是不停地喂数据,它自己就都理解了。这个模式跟人类思考过程很像,也侧面验证了其具备一定的人类意识能力。 77 | 78 | 3、[chatgpt-retrieval-plugin](https://github.com/openai/chatgpt-retrieval-plugin "chatgpt-retrieval-plugin"):一个 ChatGPT 的检索插件,它支持自定义数据源,像是是企业的技术文档、内部资料,个人笔记、收藏文章等等。除了定制向的数据,他还支持添加来自互联网的数据集。汇合这些信息,再用自然语言去检索,就可以打造个人知识库。 79 | 80 | 这个插件让智能化个人助理成为了可能,想象一下我们把自己的日常数据,像是聊天记录、音视频记录、健康数据等等都拿来训练自己的私人助理,我们一切的行为都可以以它为中心建立起来,它将代替手机成为一个新的终端形态。 81 | 82 | 就是这个 plugin waitlist 啥时候能通过啊,真是一直在申请 waitlist 0。0 83 | 84 | 4、[ChatGLM:千亿基座的对话模型开启内测](https://chatglm.cn/blog):一个国产的千亿级别参数的针对中英双语的对话模型,与 ChatGPT 采用的 Generative Pretrained Transformer 架构不同,该模型选用 General Language Model 架构。千亿级别的训练模型 GLM-130B 是开源的,目前公布了其基座模型(这个时间点是 [2022 年的 8 月 4 号](https://keg.cs.tsinghua.edu.cn/glm-130b/zh/posts/glm-130b/ "GLM-130B:开源的双语预训练模型"),所以国内对于大模型的探索是一直就有的)。 85 | 86 | 另一个较小的训练模型 [ChatGLM-6B](https://github.com/THUDM/ChatGLM-6B "ChatGLM-6B")已完全开源(2023 年 4 月 14 号),它经过约 1T 标识符的中英双语训练,辅以监督微调、反馈自助、人类反馈强化学习等技术的加持。62 亿参数的 ChatGLM-6B 已经能生成相当符合人类偏好的回答。 87 | 88 | ![](https://cdn.zhangferry.com/Images/202304052349220.png) 89 | 90 | 91 | 92 | ## 关于我们 93 | 94 | iOS 摸鱼周报,主要分享开发过程中遇到的经验教训、优质的博客、高质量的学习资料、实用的开发工具等。周报仓库在这里:https://github.com/zhangferry/iOSWeeklyLearning ,如果你有好的的内容推荐可以通过 issue 的方式进行提交。另外也可以申请成为我们的常驻编辑,一起维护这份周报。另可关注公众号:iOS成长之路,后台点击进群交流,联系我们,获取更多内容。 95 | 96 | ### 往期推荐 97 | 98 | [iOS 摸鱼周报 #88 | 把 AI 集成到研发流程](https://mp.weixin.qq.com/s/ex3aHSPjKj9woxQwHyRzZA) 99 | 100 | [iOS 摸鱼周报 #87 | Planning for AGI](https://mp.weixin.qq.com/s/TwugmMEiGoFKYQY9euhg6Q) 101 | 102 | [iOS 摸鱼周报 #86 | 更多基于 ChatGPT API 的产品诞生了](https://mp.weixin.qq.com/s/y1_V0WKfdwsUL2WjP2zPyA) 103 | 104 | [iOS 摸鱼周报 #85 | ChatGPT 的 API 开放使用](https://mp.weixin.qq.com/s/Hhb7ZCDDqEcpIRTlUKiGTQ) 105 | 106 | ![](https://cdn.zhangferry.com/Images/WechatIMG384.jpeg) 107 | -------------------------------------------------------------------------------- /WeeklyLearning/iOSWeeklyLearning_90.md: -------------------------------------------------------------------------------- 1 | # iOS 摸鱼周报 #90 | 面相任务的 GPT 项目诞生 2 | 3 | ![](https://cdn.zhangferry.com/Images/moyu_weekly_cover.jpeg) 4 | 5 | ### 本期概要 6 | 7 | > * 本期话题:4 月 25 日起必须使用 Xcode 14.1 构建提交 App 8 | > * 内容推荐:推荐近期的一些优秀博文,涵盖:自定义 Swift Toolchain、软件测试、AI 应用、Dark Sky 设计经验等方面的内容。 9 | > * 摸一下鱼:面向任务的 GPT 项目 Auto-GPT;把 GPT 模型融于模拟角色;把 AI 融于设计流程;Xcode 版本的 Copilot 插件 10 | 11 | ## 本期话题 12 | 13 | ### [4 月 25 日起必须使用 Xcode 14.1 构建提交 App](https://developer.apple.com/cn/news/?id=jd9wcyov "4 月 25 日起必须使用 Xcode 14.1 构建提交 App") 14 | 15 | [@远恒之义](https://github.com/eternaljust):Apple 于 2022 年 10 月 18 日开放了 iOS 16.1 的 App 提交,鼓励开发者利用“实时活动”来适配 iOS 16 上的锁定屏幕和灵动岛功能。同时也提醒开发者,会在 4 月份限制提交至 App Store 的 App 必须使用 Xcode 14.1 或更高版本构建。近日,Apple 确定了具体截止时间为 2023 年 4 月 25 日,开发者还剩十来天完成项目的适配工作,留给同学们的时间不多了。 16 | 17 | 推荐下载 Xcode 14.2 来构建项目,使用最新的 Xcode 14.3 打包会遇到 [CocoaPods 报错](https://github.com/CocoaPods/CocoaPods/issues/11808 "Xcode 14.3 Archive CocoaPods 报错") `rsync: link_stat failed:`,需手动修改 `Pods-项目名-frameworks.sh文件` 中 `source="$(readlink "${source}")"` 为 `source="$(readlink -f "${source}")"`。 18 | 19 | ### [线上讲座:探索 App Store 定价机制升级](https://developer.apple.com/events/view/LMKG9DJV2M/dashboard "线上讲座:探索 App Store 定价机制升级") 20 | 21 | [@远恒之义](https://github.com/eternaljust):本次讲座会探索 App Store 中提供的最新定价功能,Apple 将介绍增强的全球定价机制、按店面管理定价的全新工具、新增价格点以及全球均衡价格功能。同时,Apple 还会分享一些定价的配置示例。 22 | 23 | ## 内容推荐 24 | 25 | 推荐近期的一些优秀博文,涵盖:自定义 Swift Toolchain、软件测试、AI 应用、Dark Sky 设计经验等方面的内容。 26 | 27 | 整理编辑:[东坡肘子](https://www.fatbobman.com/) 28 | 29 | 1、[抖音 Swift 编译优化 - 基于自定义 Toolchain 编译提速 60%](https://mp.weixin.qq.com/s/MT5MHhZIlyrhuVNM3Ckteg) -- 作者:抖音基础技术团队 30 | 31 | [@东坡肘子](https://www.fatbobman.com/): 对于大型项目来说,编译速度至关重要。本文探讨了全部模块化后带来的依赖解析瓶颈问题,并介绍了如何通过自定义工具链来提高抖音的 Swift 编译速度。作者解释了自定义工具链的过程,包括如何增加入参定义、白名单解析和自定义诊断信息等,并分享了如何验证和上线自定义工具链,以及未来可以进一步优化编译速度的方向。本文有助于学习如何提高编译速度,以及如何利用 Swift 工具链进行深度优化。 32 | 33 | 2、[一些关于开发的杂谈话题 —— 测试](https://onevcat.com/2023/04/dev-talk-testing/ "一些关于开发的杂谈话题 —— 测试") -- 作者:王巍(onevcat) 34 | 35 | [@东坡肘子](https://www.fatbobman.com/): 本文讨论了软件开发中测试的各个方面,包括为什么要写测试、测试风格和框架选择等。文章还探讨了使用人工智能生成测试代码所具备的潜力。作者强调在苹果平台上使用 XCTest 的好处,并建议初学者将其作为重点。文章还讨论了如何提高测试质量,例如减少代码耦合、使用依赖注入、Mock 和 Stub 等。最后,作者重申了使用纯函数来简化测试的重要性。 36 | 37 | 3、[为数据可视化杰作 —— Dark Sky 致哀](https://nightingaledvs.com/dark-sky-weather-data-viz/ "为数据可视化杰作 —— Dark Sky 致哀") -- 作者:Srini KadamatiMarch 38 | 39 | [@东坡肘子](https://www.fatbobman.com/): 2023 年 1 月 1 日,苹果公司终止了在 iOS 上运行的 Dark Sky 移动应用程序( 苹果公司在 2020 年初收购了该应用的开发公司 )。作者对 Dark Sky 的设计深感骄傲,认为该应用程序是信息设计的典范。文章还提供了该应用程序微妙设计元素的例子,并分享了前用户的抱怨,他们怀念该应用程序的效率和降水图。在文章最后,作者呼吁开发者应借鉴 Dark Sky 将数据情境化的做法,提供更好的用户体验。 40 | 41 | 4、[我目前正在使用的 AI 服务](https://www.fatbobman.com/posts/AI-Services-I-am-currently-using/ "我目前正在使用的 AI 服务") -- 作者:东坡肘子 42 | 43 | [@东坡肘子](https://www.fatbobman.com/): 本文介绍了作者如何将 AI 服务导入到他的工作流程中以提高工作效率。作者使用了 Github Copilot、Notion AI、Warp AI、ChatGPT 和 MidJourney 等 AI 工具。作者认为,无论是 AI 服务的提供者还是使用者都应该仅将 AI 视为工作或生活助手,无需抵制,也不必过度赞美。就像大多数新技术一样,几年后回首,它们已经完全融入了我们的生活中。人们会感叹由技术更新所带来的便利,同时也会唏嘘因变革所带来的时代阵痛。 44 | 45 | 5、[将 Swift 字符串转换为布尔值](https://useyourloaf.com/blog/converting-a-swift-string-to-a-bool/ "将 Swift 字符串转换为布尔值") -- 作者:Keith Harrison 46 | 47 | [@东坡肘子](https://www.fatbobman.com/): 在某些不规范的文件中,往往会用多种方式来表示布尔值。例如:true、True、Yes、1、False、no、0 、faLse、not true 等,这会对解析造成一定的影响。本文讨论了将 Swift 字符串转换为布尔值的多种方法,包括使用 Swift 标准库和 Core Foundation 的 NSString。作者最终创建了自己的扩展,以满足其特定需求,包括不区分大小写、忽略空格和返回无效输入的 nil 值。 48 | 49 | 6、[在 SwiftUI 中显示可扩展文本字段](https://serialcoder.dev/text-tutorials/swiftui/presenting-expandable-textfields-in-swiftui/ "[在 SwiftUI 中显示可扩展文本字段") -- 作者:Gabriel Theodoropoulos 50 | 51 | [@东坡肘子](https://www.fatbobman.com/): 在 iOS 和 macOS 中,传统上有两种文本输入控件:TextField 和 TextView。TextField 只接受单行文本,而 TextView 则提供了多行文本输入选项。本文介绍了如何在 SwiftUI 中呈现可扩展的文本字段,这是在 iOS 16 和 macOS 13 中引入的功能。同时,还将说明如何限制显示行数以及在 macOS 中的注意事项。作者认为,SwiftUI 4 使创建可扩展和可滚动的文本字段变得容易。 52 | 53 | ## 摸一下鱼 54 | 55 | 整理编辑:[zhangferry](https://zhangferry.com) 56 | 57 | 目前 AI 的演进方向分为两条路,一个是用 AI 覆盖传统的生产流程,一个是探索 AI 更广阔的应用场景。 58 | 59 | 1、[Auto-GPT](https://github.com/Torantulino/Auto-GPT "Auto-GPT"):这是一个实验性的开源项目,由 GPT-4 驱动。它最大的特点是把 LLM 的想法串在一起,以实现设定的目标。这个东西恰好跟上一期内容分享的 GPT4 的能力限制有关: 60 | 61 | > 它还没有面向任务的自驱动架构。这个含义是,它可以自己去分解目标,一步步完成,这个处理流程就像一个人去做一件事的步骤一样。 62 | 63 | 而这个项目就是为了达成这个目标设计的,示例项目中给它的目标是:为接下来要发生的节日创建一个食谱,然后保存这个文件,完成之后你退出程序。以下是 Auto-GPT 的执行流程: 64 | 65 | ![](https://cdn.zhangferry.com/Images/202304132143819.png) 66 | 67 | > 1、Google 搜索即将到来的节日 68 | > 69 | > 2、检索第一个返回的网站信息,没有找到合适的节日信息 70 | > 71 | > 3、检索第二个网站信息,也没有找到合适的节日信息 72 | > 73 | > 4、开始变换策略:直接 Google 搜索当前的日期,然后加上「节日」 74 | > 75 | > 5、检索结果有很多,它为了提高效率,选择了一个带日历视图的网站 76 | > 77 | > 6、检索该网站信息,确认了「地球日」比较适合做目标节日 78 | > 79 | > 7、把地球日和对应的日期,记录到自己的内存里 80 | > 81 | > 8、使用 GPT-4 生成一份地球日主题的食谱,发生命令错误 82 | > 83 | > 9、重新纠正再用 GPT-4 去创建食谱,获得结果 84 | 85 | 这个才是 AGI 所表现出来的智能,它会自我学习,也会自动纠错,这就像人一样去完成一件事。另一方面因为 AI 有很大的自主性,如果为了达成目标需要付出一定的代价,AI 对这个代价的衡量跟人是不同的,所以这个事情的危险性也很大。项目中也多次提到危险性和免责说明,当这项能力被完全打开的时候,打开的会是潘多拉的盒子吗? 86 | 87 | 2、[把GPT模型融入游戏角色里](https://reverie.herokuapp.com/arXiv_Demo):斯坦福大学和 Google 的研究员做这样一个产品,创建一个虚拟小镇,里面有 25 个角色,他们的身份提前在 ChatGPT 里定义好,行为方式由 ChatGPT 自动生成,然后驱动各个角色做各自的事情。 88 | 89 | 各个角色的行为有时间线,且比较多样,像是对话、写作、吃饭、休息、谈恋爱、上班、散步都有。而且他们做的事情时间还可以相互影响,我们关注某一个正在聊天的对象,暂停时间线可以看他聊的啥: 90 | 91 | > GR:我在思考如何把数学模式应用到药物研究上,你有什么想法吗? 92 | > 93 | > RP:我最近刚读了一篇相关的论文,等下发给你。JM 对这个专题很感兴趣,你也可以跟她交流下。 94 | 95 | 这个效果真的很有意思,除了游戏层面人物,也可以把这个场景扩展为一个影视剧,类似《楚门的世界》。还可以在一个大环境里,给两个人塑造两个性格,观察他们以后的行为,用来做心理学行为学的研究等等。 96 | 97 | ![](https://cdn.zhangferry.com/Images/202304112328897.png) 98 | 99 | ![](https://cdn.zhangferry.com/Images/202304112336624.png) 100 | 101 | 3、[designtools.ai](https://designtools.ai/ "designtools.ai"):把 AI 融入设计领域的工具汇总网站。可以发现,现在 AI 的能力已经开始往各个垂类蔓延发扬光大了。 102 | 103 | ![](https://cdn.zhangferry.com/Images/202304112320465.png) 104 | 105 | * 交互类:通过 Figma 设计稿生成可交互网站和 React 组件;Figma 工作流自动化;在Figma 里自动生成素材图片; 106 | * 图像类:生成人物形象;生成产品图、广告营销图;生成 icon,矢量图 107 | * 颜色类:自动生成配色色盘 108 | * 字体类:生成最合适当前布局的字体 109 | 110 | 4、[Copilot for Xcode](https://github.com/intitni/CopilotForXcode "Copilot for Xcode"):Copilot 官方并没有 Xcode 插件,[intitni](https://github.com/intitni) 写了这个 Xcode 版的Copilot 插件,它同时支持 Github Copilot 和 ChatGPT。和大多数 GPT 插件一样,内置了代码建议和聊天功能。 111 | 112 | ![](https://cdn.zhangferry.com/Images/202304122232286.png) 113 | 114 | 115 | ## 关于我们 116 | 117 | iOS 摸鱼周报,主要分享开发过程中遇到的经验教训、优质的博客、高质量的学习资料、实用的开发工具等。周报仓库在这里:https://github.com/zhangferry/iOSWeeklyLearning ,如果你有好的的内容推荐可以通过 issue 的方式进行提交。另外也可以申请成为我们的常驻编辑,一起维护这份周报。另可关注公众号:iOS成长之路,后台点击进群交流,联系我们,获取更多内容。 118 | 119 | ### 往期推荐 120 | 121 | [iOS 摸鱼周报 #88 | 把 AI 集成到研发流程](https://mp.weixin.qq.com/s/ex3aHSPjKj9woxQwHyRzZA) 122 | 123 | [iOS 摸鱼周报 #87 | Planning for AGI](https://mp.weixin.qq.com/s/TwugmMEiGoFKYQY9euhg6Q) 124 | 125 | [iOS 摸鱼周报 #86 | 更多基于 ChatGPT API 的产品诞生了](https://mp.weixin.qq.com/s/y1_V0WKfdwsUL2WjP2zPyA) 126 | 127 | [iOS 摸鱼周报 #85 | ChatGPT 的 API 开放使用](https://mp.weixin.qq.com/s/Hhb7ZCDDqEcpIRTlUKiGTQ) 128 | 129 | ![](https://cdn.zhangferry.com/Images/WechatIMG384.jpeg) 130 | -------------------------------------------------------------------------------- /WeeklyLearning/iOSWeeklyLearning_91.md: -------------------------------------------------------------------------------- 1 | # iOS 摸鱼周报 #91 | 免费的网站托管平台 Vercel 2 | 3 | ![](https://cdn.zhangferry.com/Images/moyu_weekly_cover.jpeg) 4 | 5 | ### 本期概要 6 | 7 | > * 本期话题:线上讲座:探索 Vision 框架;5月9号,App Store定价以美国价格为基准进行更新 8 | > * 内容推荐:推荐近期的一些优秀博文,涵盖:App Clip、CloudKit、Swift ABI 稳定性等方面的内容 9 | > * 摸一下鱼:建了一个交流 AGI 知识的社群;在 Vercel 上部署 ChatGPT 的聊天能力;一个把 AI 拟人化的网站;AI Talk 基于 GPT4 让马斯克和乔布斯进行对话;基于 Apple 健康数据分析的 App HealthGPT 10 | > * 岗位招聘:蔚来汽车 App iOS 研发 11 | 12 | ## 本期话题 13 | 14 | ### [线上讲座:探索 Vision 框架](https://developer.apple.com/events/view/93396BVQ5Y/dashboard "线上讲座:探索 Vision 框架") 15 | 16 | [@远恒之义](https://github.com/eternaljust):Vision 是一款基于 Core ML 封装的图像识别框架,支持人脸检测、文本检测、二维码检测、图像校准和特征追踪等能力。本期讲座将探索学习 Vision 框架在 App 内应用计算机视觉相关的能力,进一步了解如何通过不同的 API 在图片和视频上执行任务。会议时间为 2023 年 5 月 9 日上午 10:00 – 中午 11:00,截止报名时间 2023 年 5 月 8 日前。 17 | 18 | ### [迎接 5 月 9 日推出的增强全球定价机制](https://developer.apple.com/cn/news/?id=74739es1 "迎接 5 月 9 日推出的增强全球定价机制") 19 | 20 | [@远恒之义](https://github.com/eternaljust):Apple 提醒,自 2023 年 5 月 9 日起,App Store 各店面的现有 App 和一次性 App 内购买项目的价格都将以产品当前在美国店面的价格为基础进行更新,除非你在 2023 年 3 月 8 日后进行了相关更新。[全新的增强定价机制](https://developer.apple.com/cn/news/?id=dbrszv62 "全新的增强定价机制")适用于当地顾客的价格,你可以根据你熟悉的国家或地区来生成全球均衡价格,也可以为各个市场分发定制的内容和服务。 21 | 22 | ## 内容推荐 23 | 24 | 推荐近期的一些优秀博文,涵盖:App Clip、CloudKit、Swift ABI 稳定性等方面的内容。 25 | 26 | 整理编辑:[东坡肘子](https://www.fatbobman.com/) 27 | 28 | 1、[苹果的产品经理设计的 App Clip 是有意为之,还是必然趋势,详解 App Clip 技术之谜](https://juejin.cn/post/7219889814116024380 "苹果的产品经理设计的 App Clip 是有意为之,还是必然趋势,详解 App Clip 技术之谜") -- 作者:会飞的金鱼 29 | 30 | [@东坡肘子](https://www.fatbobman.com/): 该文介绍了 PWA、微信小程序和 Clip 应用,并进行了比较。作者认为,在特定的线下场景中,Clip 应用具有相当好的用户体验。虽然 PWA 看起来很美好,但实际上更多是 web 开发者的美好愿景。总的来说,Clip 应用和小程序并不是直接竞争关系,而是在特定场景下对小程序原生能力不足的一种补充。此文拥有本栏目创建以来所推荐文章的最长标题。 31 | 32 | 2、[我在编写自己的 CloudKit 同步库时学到的东西](https://ryanashcraft.com/what-i-learned-writing-my-own-cloudkit-sync-library/ "我在编写自己的 CloudKit 同步库时学到的东西") -- 作者:Ryan Ashcraft 33 | 34 | [@东坡肘子](https://www.fatbobman.com/): 几年之前,还有一些第三方库使用 CloudKit 服务来实现 Core Data 数据的云存储和同步功能。这种情况在苹果推出 Core Data with CloudKit 后就基本停止了,这些库也不再更新。Ryan Ashcraft 则认为官方的解决方案仍无法满足他的需求,为此,重新开发了 CloudSyncSession 库。本文分享了作者创建 CloudSyncSession 的经验。涵盖了 CloudKit 同步的基本概念,预防和处理错误的方法,冲突解决,模式设计以及其他建议。即使你不打算使用该库,仅阅读它的代码也将让你对 CloudKit 的运作机制有更多的认识。 35 | 36 | 3、[Swift 最佳实践之 Generics](https://juejin.cn/post/7219908995338731575 "Swift 最佳实践之 Generics") -- 作者:峰之巅 37 | 38 | [@东坡肘子](https://www.fatbobman.com/): 本文探讨了 Swift 中的泛型,包括泛型类型约束和泛型特化,这些都是 Swift 中非常重要的概念。虽然泛型能够提高代码的复用性,但也可能对性能产生影响,因此需要通过泛型特化来优化代码。此外,本文还介绍了 Phantom Types 的概念和用法,这是一种非常有用的编程技巧,可以帮助开发者更好地利用 Swift 的类型系统。在文章的最后,还讨论了一些与泛型相关的小问题,例如泛型方法参数不应定义为 Optional,以及在 Swift 5.7 中无法将任意类型的实例作为泛型参数等问题。 39 | 40 | 4、[什么时候我可以称自己为高级开发人员?](https://www.kodeco.com/38327766-when-can-i-call-myself-a-senior-developer "什么时候我可以称自己为高级开发人员?") -- 作者:Renan Benatti Dias 41 | 42 | [@东坡肘子](https://www.fatbobman.com/): 尽管 Renan Benatti Dias 认为自己有资格担任高级职位,但他仍在中级开发岗位停留了不短的时间。为此,他花了很多时间思考成为高级开发人员需要什么,以及如何为此做好准备。在明确并掌握了需要能和责任后,他最终实现了理想。在本文中,他概述了高级开发人员所需的必要技能和经验,并提供了一些其他建议,例如建立扎实的技术基础、提升软技能、在公司内寻找机会等。 43 | 44 | 5、[Swift ABI 稳定性探究](https://juejin.cn/post/7223045442891284540 "Swift ABI 稳定性探究") -- 作者:姚亚杰 货拉拉出行研发部-架构组 45 | 46 | [@东坡肘子](https://www.fatbobman.com/): 本文的灵感来源于一个 Bug,通过对 Bug 进行分析和排查,作者介绍了 Swift 5.1 的模块稳定性和库进化特性。其中,模块稳定性通过存储模块信息的 swiftinterface 文件格式来实现,而库进化则通过开启 Library Evolution 特性来实现。在文章最后,还指出了开启 Library Evolution 特性后需要注意与 Objective-C 互操作性的问题。 47 | 48 | ## 摸一下鱼 49 | 50 | 整理编辑:[zhangferry](https://zhangferry.com) 51 | 52 | AI 仍然是科技圈最热的领域,我目前对这个领域非常感兴趣,感觉正在见证一个领域的兴起,可以发现最近几期摸鱼的内容全部变成 AI 相关的了。我获取这些信息的途径,要么是看一些博主分享,要么是去 Twitter 进行定向的筛选。但这种方式获取和分享的途径还是有些单一,一直想有一个合适的交流这方面内容的社群,外部一直没有找到,就决定自己先建一个看看吧。考虑社群的形式,微信群虽然易用,但很容易沦为吹水群,且会受到管制的影响,最终决定建一个 discord 频道,discord 有话题的概念,可以看历史信息,还可以方便的加各种扩展功能。聊天室已经就位,地址是:https://discord.gg/Fz6V2rej,如果感兴趣可以加进来聊一哈。 53 | 54 | 1、[AI playground](https://play.vercel.ai/):Vercel 发布的 AI 模型实验网站,可以选择 OpenAI 的 GPT4,Google 的模型,以及 claude 模型等,还完全免费,缺点也很明显就是不保留聊天记录,不具备上下文能力。 55 | 56 | ![](https://cdn.zhangferry.com/Images/202304192253945.png) 57 | 58 | [Vercel](vercel.com) 是一个免费的网站托管平台,可以部署静态和动态网站,提供免费的域名和 HTTPS 证书。Github 有一个项目[ChatGPT-Next-Web](https://github.com/Yidadaa/ChatGPT-Next-Web "ChatGPT-Next-Web")实现了 ChatGPT 的聊天界面,可以直接部署到 Vercel 上。再关联上自己的域名,就有了属于自己的调用地址:`https://chat.zhangferry.com`,大家感兴趣可以访问体验下。 59 | 60 | ![](https://cdn.zhangferry.com/Images/202304202218678.png) 61 | 62 | 2、[character.ai](https://beta.character.ai/ "character.ai"):一个尝试把 AI 拟人化的网站,他们给 AI 赋予了各种各样的角色,你可以根据自己的需求跟他们对话。这个想法非常好,因为我们需要解决的问题都是具有特定场景的,这省去了自己去培养 AI 的步骤。 63 | 64 | ![](https://cdn.zhangferry.com/Images/202304192324509.png) 65 | 66 | 3、[AI Talk](https://v.douyin.com/D2TDfgW "AI Talk"):这是抖音博主「AI Talk」制作的视频,「AI马斯克对谈AI乔布斯,辩论人工智能对人类的威胁 两位智者谈论AI是否能具有直觉和情感,一场久违的架空对话」。对话均由 GPT4 生成,这个对话的质量非常高,因为声音上也做了对应人物的语音拟合,看上去更像是真实存在的一样。 67 | 68 | 而这也跟数字人的概念非常一致了,在世的人或者逝去但是留有很多资料记录的人都可以根据现有的数据生成一份数字人模型。我们可以随时跟他们交流,他们也能够在网络的世界里永生。 69 | 70 | ![](https://cdn.zhangferry.com/Images/202304192341147.png) 71 | 72 | 4、[HealthGPT](https://twitter.com/varunshenoy_/status/1648374949537775616 "Twitter HealthGPT"):来自斯坦福的一位小哥做的基于健康数据分析的 HealthGPT,目前该项目已经[开源](https://github.com/StanfordBDHG/HealthGPT "HealthGPt")。想象一下,未来每个人都有一个个性化的人工智能健康助手,它可以: 73 | 74 | * 保证隐私的情况下追踪你的信息 75 | 76 | * 了解你身体的独特需求 77 | 78 | * 能够为你的健身目标提供量身定制的建议 79 | 80 | ![](https://cdn.zhangferry.com/Images/202304192346044.png) 81 | 82 | ## iOS 招聘 - 蔚来汽车 APP 83 | 84 | ### 岗位及团队介绍 85 | 86 | 电动车是未来几年最热的技术领域之一,所处行业前景一片光明,详见:https://www.nio.cn/events/shanghai-autoshow 87 | 88 | * 上下班不需要打卡,弹性工作 89 | * 领导 Nice,团队工作氛围很融洽,注重个人发展,很好沟通 90 | * 只要技术 OK,薪资绝对让你满意 91 | 92 | 工作地点:上海市闵行区宜山路 1999 号科技绿洲三期 23 号楼 93 | 94 | ### 职责介绍及岗位要求 95 | 96 | * 负责公司移动产品架构设计,方案的制定,技术可行性研究,系统性能优化及安全加固; 97 | * 责移动技术难题攻关,解决系统中关键架构问题,对系统稳定性负责; 98 | * 项目组开发人员的设计评审,Code Review,以保证代码的可读性、可扩展性、易维护性。 99 | 100 | **职位要求** 101 | 102 | * 本科以上学历,5年以上iOS平台开发经验;有通用中间件SDK相关开发经验优先; 103 | * 熟悉 WKWebView 基础组件,有 Hybrid 框架、JS Binding 经验优先; 104 | * 悉 React Native、Flutter,有动态化框架开发经验者优先; 105 | * 基础 SDK 开发流程,有图片库、埋点、离线包、AB相关开发经验者优先; 106 | * APM 系统,有稳定性、性能、内存优化经验者优先; 107 | 108 | ### 联系方式 109 | 110 | 微信:cuilh2018 111 | 112 | ## 关于我们 113 | 114 | iOS 摸鱼周报,主要分享开发过程中遇到的经验教训、优质的博客、高质量的学习资料、实用的开发工具等。周报仓库在这里:https://github.com/zhangferry/iOSWeeklyLearning ,如果你有好的的内容推荐可以通过 issue 的方式进行提交。另外也可以申请成为我们的常驻编辑,一起维护这份周报。另可关注公众号:iOS成长之路,后台点击进群交流,联系我们,获取更多内容。 115 | 116 | ### 往期推荐 117 | 118 | [iOS 摸鱼周报 #90 | 面相任务的 GPT 项目诞生](https://mp.weixin.qq.com/s/Bx8N9HqMP5HE9mzy6l3QVA) 119 | 120 | [iOS 摸鱼周报 #89 | WWDC 23 公布](https://mp.weixin.qq.com/s/3B_R0j8dpXpR5G9bCRsyXw) 121 | 122 | [iOS 摸鱼周报 #88 | 把 AI 集成到研发流程](https://mp.weixin.qq.com/s/ex3aHSPjKj9woxQwHyRzZA) 123 | 124 | [iOS 摸鱼周报 #87 | Planning for AGI](https://mp.weixin.qq.com/s/TwugmMEiGoFKYQY9euhg6Q) 125 | 126 | ![](https://cdn.zhangferry.com/Images/WechatIMG384.jpeg) 127 | -------------------------------------------------------------------------------- /WeeklyLearning/iOSWeeklyLearning_92.md: -------------------------------------------------------------------------------- 1 | # iOS 摸鱼周报 #92 | Swift Foundation 预览版发布 2 | 3 | ![](https://cdn.zhangferry.com/Images/moyu_weekly_cover.jpeg) 4 | 5 | ### 本期概要 6 | 7 | > * 本期话题:Swift Foundation 预览版发布;App 无障碍功能线上讲座 8 | > * 内容推荐:一些优秀博文,涵盖:Mirror API、网络可达性优化、SwiftLint 等方面的内容。 9 | > * 摸一下鱼:最全 AIGC 工具集;AI 领域几个开源项目;HuggingChat;陆奇演讲总结 10 | 11 | ## 本期话题 12 | 13 | ### [Swift 社区开源了基于 Swift 实现的 Foundation 预览版](https://github.com/apple/swift-foundation "Swift 社区开源了基于 Swift 实现的 Foundation 预览版") 14 | 15 | [@东坡肘子](https://www.fatbobman.com/):几个月前,Swift 社区提出了一个计划,即基于 Swift 实现 Foundation,以改善 Swift 的跨平台开发。现在,这个计划已经得到了很好的落实。这个软件包提供了更快、更安全的 Foundation 实现,并设立了一个新的 Foundation 工作组来协调 Swift 社区的需求和苹果工程的需要。新 Foundation 构建了许多类型的 Swift 实现,包括 JSONEncoder、Calendar、TimeZone 和 Locale 等,还有一个名为 FoundationICU 的单独软件包,用于在非 Darwin 平台上提供国际化支持。这个新实现在 JSON 解码和日期格式化等多方面比之前的 C 和 Objective-C 版本显著提高了性能。 16 | 17 | ### [线上讲座:让你的 App 更加无障碍](https://developer.apple.com/events/view/7F793DZPF3/dashboard "线上讲座:让你的 App 更加无障碍") 18 | 19 | [@远恒之义](https://github.com/eternaljust):Apple 非常关注“有障碍”群体在使用苹果设备上的无障碍使用体验,推出了许多个性化的[辅助功能](https://www.apple.com.cn/accessibility/ "辅助功能"),其中最广为人知的是 Voice Over “旁白”功能。旁白是一种基于手势的屏幕阅读器,适用于失明或弱视用户,为其提供语音播报内容。Apple 针对听障群体强化了视觉反馈,可以通过 iPhone 震动或者快速闪烁的 LED 灯来接受提醒消息。此外,当设备识别到特殊的声音或警示音时,用户也会收到视觉提醒和振动通知。 20 | 21 | 在本次线上讲座中,你将了解如何通过 Apple 操作系统提供的无障碍功能、无障碍 API 和开发者工具,来为每一个人打造卓越的用户体验。参加本次线上讲座,你还能在当天报名参与无障碍适配挑战活动,有机会通过审核并参加 5 月 18 日在上海设计与开发加速器举办的无障碍宣传日线下活动。活动时间 2023 年 5 月 10 日上午 10:00 – 中午 11:00,报名截止时间 2023 年 5 月 9 日前。 22 | 23 | ## 内容推荐 24 | 25 | 推荐近期的一些优秀博文,涵盖:Mirror API、网络可达性优化、SwiftLint 等方面的内容。 26 | 27 | 整理编辑:[东坡肘子](https://www.fatbobman.com/) 28 | 29 | 1、[深入了解 SwiftLint](https://www.kodeco.com/38422105-swiftlint-in-depth "深入了解 SwiftLint") -- 作者:Ehab Amer 30 | 31 | [@东坡肘子](https://www.fatbobman.com/): 该文为使用 SwiftLint 进行 iOS 开发提供了全面的指南。其中详细介绍了如何使用 SwiftLint,包括构建规则文件、排除文件和文件夹、禁用和配置规则、修复违规、创建自定义规则等。此外,还介绍了如何使用远程规则来进行集中管理以及其他的一些技巧和注意事项,以帮助开发者更好地使用 SwiftLint,并避免一些常见的陷阱。 32 | 33 | 2、[针对网络可达性优化应用](https://www.avanderlee.com/swift/optimizing-network-reachability/ "针对网络可达性优化应用") -- 作者:ANTOINE VAN DER LEE 34 | 35 | [@东坡肘子](https://www.fatbobman.com/): 当开发应用程序时,需要重视网络可达性,因为不是所有用户都拥有良好的互联网连接。因此,优化应用程序以适应不良的网络条件是必要的。在本文中,作者认为在发出请求之前预先检查可达性并不是推荐的方式。相反,配置你的网络层等待连接,并仅允许某些类型的连接可能是更好的选择。该文章还介绍了如何根据返回的错误更新用户界面以响应网络错误,如何使用 NWPathMonitor 检查恢复的连接性,以及如何使用 RocketSim 的网络扩展创建稳定的测试环境。 36 | 37 | 3、[使用 Swift 的反射功能](https://useyourloaf.com/blog/using-swift-reflection/ "使用 Swift 的反射功能") -- 作者:Keith Harrison 38 | 39 | [@东坡肘子](https://www.fatbobman.com/): 许多开发者可能认为自己并没有多少机会使用到 Swift 的反射功能,但在实际开发中,它其实可以发挥重要作用。本文介绍了如何使用 Mirror API 迭代结构体的属性并检查它们是否为非空字符串,以及如何使用它来断言特定的字符串属性的方法是否正确工作。通过这些演示,我们可以重新审视反射功能,并在日常开发中更好地应用它。 40 | 41 | 4、[使用 SwiftUI 开发 RSS 阅读器](https://ming1016.github.io/2023/04/24/swiftui-rss-reader/ "使用 SwiftUI 开发 RSS 阅读器") -- 作者:戴铭 42 | 43 | [@东坡肘子](https://www.fatbobman.com/): 本文是作者参加苹果举办的 SwiftUI 技术沙龙交流会后对内容进行的整理。文章介绍了一个使用 SwiftUI 和 Core Data 实现的 RSS 阅读器应用。其中分享了许多实现细节,比如去重、批量插入、iCloud 同步和数据索引等。该应用通过 NavigationSplitView 实现了 iPad 和 macOS 下的多窗口布局模式,并自定义了用于数据提取的 Controller。最终创建出一个功能齐全的 RSS 阅读器应用。 44 | 45 | 5、[打造可适配多平台的 SwiftUI 应用](https://www.fatbobman.com/posts/building-multiple-platforms-SwiftUI-App/ "打造可适配多平台的 SwiftUI 应用") -- 作者:东坡肘子 46 | 47 | [@东坡肘子](https://www.fatbobman.com/): 在构建适用于多个平台的 SwiftUI 应用程序时,提前考虑兼容性和数据源问题非常重要。为了避免重复的代码调整,开发人员可以预先创建一些辅助代码用于所有需要适配的平台。对于数据源,开发者应该考虑哪些状态是整个应用的全局状态,哪些状态仅限于当前场景(窗口)。通过提前了解和规划这些问题,开发者可以节省花费在适配多平台上的时间,将更多的精力用于创建能够凸显平台特点的产品。同上文一样,本文也是作者在参加 SwiftUI 技术沙龙后对交流内容的整理。 48 | 49 | 50 | ## 摸一下鱼 51 | 52 | 整理编辑:[zhangferry](https://zhangferry.com) 53 | 54 | 1、[AIGC 交流工具沉淀](https://bytedance.feishu.cn/base/AIMAbnJxQaNgSGsBAtwcdAkLnvf?table=tblmZTd8VuUOOONh&view=vew0Eo17BB "AIGC 交流工具沉淀"):一位字节的同事整理的 AIGC 相关的工具集,是我目前已知最全的一个整理了。字节很多同学对 AIGC 相关内容的关注热情是非常高的,内部有一个 ChatGPT 的专题大群,每天都会输出非常多比较前沿的信息,目前这里和 Twitter 是我获取相关内容最主要的两个阵地。 55 | 56 | ![](https://cdn.zhangferry.com/Images/202304272227087.png) 57 | 58 | 2、最近几个不错的 Github 开源项目: 59 | 60 | * [MOSS](https://github.com/OpenLMLab/MOSS "MOSS"):MOSS 是一个支持中英双语和多种插件的开源对话语言模型,由复旦大学开发,`moss-moon`系列模型具有 160 亿参数,在 FP16 精度下可在单张 A100/A800 或两张 3090 显卡运行,在 INT4/8 精度下可在单张 3090 显卡运行。 61 | * [bark](https://github.com/suno-ai/bark "bark"):Bark 是基于文本到音频的转换器模型。可以生成高度逼真的多语言语音以及其他音频,包括音乐、背景噪音和简单的声音效果。该模型还可以产生非语言交流,如笑、叹气和哭。英文比较完美,中文有时还比较奇怪,普通话不太标准。 62 | * [pdfGPT](https://github.com/bhaskatripathi/pdfGPT "pdfGPT"):跟 ChatGPT 结合的一个解决 PDF 识别的方案,你可以把 PDF 当做资料源,直接以对话的形式来了解其中的内容。实现思路是,把 PDF 转成文本,然后分割成不同的小块文本,根据提交的问题来匹配结果最相近的 5 个文本内容,然后根据内置的 Prompt 让 ChatGPT 去组织对应的答案。 63 | 64 | 3、[HuggingChat](https://huggingface.co/chat/ "HuggingChat"):HuggingChat 是 Hugging Face 推出的 AI 聊天类工具,简单测试了一下,相比 ChatGPT 还有较大差距,对中文问答的支持也不完善。这个 Chat 项目还不太行,但 Hugging Face 这个公司到值得多说一下,它目前是全球最受欢迎的开源机器学习社区平台。 65 | 66 | 之所以 Logo 是一个非常可爱的笑脸(🤗),是因为 Hugging Face 早期产品是一个针对青少年的聊天机器人。但因为当时的技术还没有突破,聊天机器人业务一直不温不火。在 2018 年的时候,Google 推出了大规模语言训练模型 BERT,但只有 TensorFlow 版本,没有 PyTorch 版本。 Hugging Face 的创始人用了几天时间就完成了 BERT 的 PyTorch 版本,没想到这个仓库在 Github 上大受欢迎,于是 Hugging Face 也改变了产品战略,将更多精力放到了开源模型的建设上,BERT-PyTorch 被命名为 Transformers,它的功能变成了可以快速使用,BERT、GPT 这类的大型模型上。Hugging Face 也不再是做聊天机器人业务了,而是致力于成为人工智能界的 Github。 67 | 68 | ![](https://cdn.zhangferry.com/Images/202304272314542.png) 69 | 70 | 4、[陆奇最新演讲实录:我的大模型世界观](https://mp.weixin.qq.com/s/_ZvyxRpgIA4L4pqfcQtPTQ):这篇文章是张小珺整理的陆奇奇迹论坛[《新范式 新时代 新机会》](https://img.6aiq.com/%E9%99%86%E5%A5%87%E6%B7%B1%E5%9C%B3%E6%BC%94%E8%AE%B2%EF%BC%882023%E5%B9%B44%E6%9C%8823%E6%97%A5%EF%BC%89.pdf "新范式 新时代 新机会")的总结。张小珺是一位播客博主,最近访谈了多位 AI 领域的大佬,我听过很多期,她对国内 AI 目前的发展认知是比较全面的。陆奇因为跟 OpenAI CEO Sam Altman 之前分管美国和中国的 YC,且陆奇是中国 AI 布道人,所以也被很多人给予希望他能成立一个中国的 OpenAI。但即使是这样一个在 AI 领域非常资深且异常勤奋的人都说跟不上大模型时代狂飙的速度了,可见这轮 AI 热潮真的是超出所有人预期了。这篇总结写的也非常好,非常推荐好好读一下。 71 | 72 | 文中提到一个非常重要的观点,人类认知世界的模式:感知 > 思考 > 实现,可以对应到三个系统上:信息系统、模型系统、行动系统,我们把它称之为三位一体的结构演化模式,它可以适用于任何复杂的体系。拿数字化来说,像是 Google、微软他们提供都是信息,这属于第一代系统。当前热门的 ChatGPT、Stable Diffusion 以及其他模型,他们属于模型系统,可以给予信息进行总结,后续还将会有各种各样的模型。而到了第三代,有了模型,装上对应的动力系统,它们就会是自动驾驶系统、各类机器人了。 73 | 74 | ![](https://cdn.zhangferry.com/Images/202304272348197.png) 75 | 76 | ## 关于我们 77 | 78 | iOS 摸鱼周报,主要分享开发过程中遇到的经验教训、优质的博客、高质量的学习资料、实用的开发工具等。周报仓库在这里:https://github.com/zhangferry/iOSWeeklyLearning ,如果你有好的的内容推荐可以通过 issue 的方式进行提交。另外也可以申请成为我们的常驻编辑,一起维护这份周报。另可关注公众号:iOS成长之路,后台点击进群交流,联系我们,获取更多内容。 79 | 80 | ### 往期推荐 81 | 82 | [iOS 摸鱼周报 #91 | 免费的网站托管平台 Vercel](https://mp.weixin.qq.com/s/93YLa8ankkEVcp4pop2A6A) 83 | 84 | [iOS 摸鱼周报 #90 | 面相任务的 GPT 项目诞生](https://mp.weixin.qq.com/s/Bx8N9HqMP5HE9mzy6l3QVA) 85 | 86 | [iOS 摸鱼周报 #89 | WWDC 23 公布](https://mp.weixin.qq.com/s/3B_R0j8dpXpR5G9bCRsyXw) 87 | 88 | [iOS 摸鱼周报 #88 | 把 AI 集成到研发流程](https://mp.weixin.qq.com/s/ex3aHSPjKj9woxQwHyRzZA) 89 | 90 | ![](https://cdn.zhangferry.com/Images/WechatIMG384.jpeg) 91 | -------------------------------------------------------------------------------- /WeeklyLearning/iOSWeeklyLearning_93.md: -------------------------------------------------------------------------------- 1 | # iOS 摸鱼周报 #93 | AIGC 尝试 2 | 3 | ![](https://cdn.zhangferry.com/Images/moyu_weekly_cover.jpeg) 4 | 5 | ### 本期概要 6 | 7 | > * 本期话题:App Store 5 月 9 日增强全球定价机制已更新 8 | > * 内容推荐:模块化架构、Deep Dish Swift 总结、TabularData 框架相关博文。 9 | > * 摸一下鱼:最近利用 AIGC 做的一些尝试;GPT 需求设想方案汇总;一个摘要总结插件 glarity;面向开发者的 ChatGPT Prompt 编写指南 10 | 11 | ## 本期话题 12 | 13 | ### [ App Store 5 月 9 日增强全球定价机制已更新](https://developer.apple.com/cn/news/upcoming-requirements/?id=05092023a " App Store 5 月 9 日增强全球定价机制已更新") 14 | 15 | [@远恒之义](https://github.com/eternaljust):本周二上午,有同事反馈公司的部分 App 内购商品的价格发生了变化,App 商品显示页面价格与实际付款弹窗 App Store 价格不一致,大多相差几元。这个问题是 Apple 于 5 月 9 日升级更新了增强全球定价机制导致的,如果你在 2023 年 3 月 8 日后没有修改选择 App 的基准国家或地区,那么你的 App 和一次性 App 内购买项目的价格都将默认以美国商店美元为基础,自动调整在其他国家和地区的价格。你可通过在 App Store Connect 后台[更改 App 价格的基准国家或地区](https://developer.apple.com/cn/help/app-store-connect/manage-app-pricing/set-a-price "更改 App 价格的基准国家或地区"),此变更会自动同步到 App 所关联的 App 内购买项目,App 的价格以及同步引起的 App 内购买项目价格也会立即更新生效(修改价格的操作账号必须拥有账户持有人、管理或 App 管理的职能)。 16 | 17 | ## 内容推荐 18 | 19 | 推荐近期的一些优秀博文,涵盖:模块化架构、Deep Dish Swift 总结、TabularData 框架等方面的内容。 20 | 21 | 整理编辑:[东坡肘子](https://www.fatbobman.com/) 22 | 23 | 1、[使用 SwiftUI 构建大型应用程序:模块化架构指南](https://azamsharp.com/2023/02/28/building-large-scale-apps-swiftui.html "使用 SwiftUI 构建大型应用程序:模块化架构指南") -- 作者:Mohammad Azam 24 | 25 | [@东坡肘子](https://www.fatbobman.com/): 应用程序架构是一个复杂的话题。最终,项目的最佳架构取决于许多因素,如项目的规模和复杂性、团队的技能和经验、项目的目标和要求。本文介绍了使用 SwiftUI 构建大型应用程序时的模块化架构指南。指南涵盖了单元测试、数据和文件访问、测试视图模型而不验证用户界面以及理想的测试等方面。成功的应用程序架构的关键是选择适合项目独特需求的模式,并随着项目的发展不断对架构进行评估和调整。 26 | 27 | 2、[WWDC 2023, 我期待 SwiftUI 带来的新变化](https://www.fatbobman.com/posts/What-I-Hope-to-See-for-SwiftUI-at-WWDC-2023/ "WWDC 2023, 我期待 SwiftUI 带来的新变化") -- 作者:东坡肘子 28 | 29 | [@东坡肘子](https://www.fatbobman.com/): 还有约 20 天就到 2023 年的 WWDC 了。开发者们都非常期待苹果会在当天带来哪些新功能。在本文中,作者希望 SwiftUI 能够提供更多原生、稳定的底层 API,例如以属性为粒度的视图关联、统一的 Gesture 逻辑、更完善的文字输入和显示、稳定、高效的 ForEach 实现、向前兼容性等。作者希望苹果能够充分利用 Swift 5.8 提供的 @backDeployed 特性,增强老版本的功能并修复 bug。 30 | 31 | 3、[Deep Dish Swift 总结](https://danielsaidi.com/blog/2023/04/30/deep-dish-swift-day-1 "Deep Dish Swift 总结") -- 作者:Daniel Saidi 32 | 33 | [@东坡肘子](https://www.fatbobman.com/): 随着疫情得到控制,越来越多的线下活动得以顺利举办。作者用了三篇博文总结了 2023 年 Deep Dish Swift 会议的演讲内容。第一天的演讲涵盖了独立开发者的讲座、订阅模型、CI/CD 自动化和 ASO。第二天的演讲涵盖了公司销售、Swift 算法、模块化架构、导师制、Swift Playgrounds 和SwiftUI 导航。第三天的演讲涵盖了服务器端 Swift 和 GraphQL、使用 Swift 创建演示文稿、实时活动、代码风格和 DocC 文档。这次会议涵盖了广泛的 Swift 开发相关主题,使与会者从各个角度深入了解 Swift 语言。 34 | 35 | 4、[使用 TabularData 来转储模型数据](https://www.swiftjectivec.com/using-the-tabulardata-framework-to-dump-json-or-csv-data-in-swift/ "使用 TabularData 来转储模型数据") -- 作者:Jordan Morgan 36 | 37 | [@东坡肘子](https://www.fatbobman.com/): TabularData 框架是一种用于解析 .csv 和 .json 文件的工具,可用于将这些文件导入或导出,并将日志转储到你的控制台中。通过使用数据创建 DataFrame,你可以轻松地对数据进行排序、筛选和可视化。该框架还提供了数据增强和格式化的 API,例如组合列以解码你自己的模型,或使用 numericSummary 打印出统计数据。作者分享了使用 DataFrame 进行可扫描性的小技巧,特别是在处理大量数据时。本文提供了如何创建 DataFrame 并操作数据的示例。 38 | 39 | 5、[增强 Turbo Native 应用程序:如何隐藏 Web 渲染的内容](https://masilotti.com/hide-web-rendered-content-on-turbo-native-apps/ "增强 Turbo Native 应用程序:如何隐藏 Web 渲染的内容") -- 作者:Joe Masilotti 40 | 41 | [@东坡肘子](https://www.fatbobman.com/): 该文讨论了如何在 Turbo Native 应用中隐藏 Web 渲染内容,以增强其原生体验。建议隐藏基于 Web 的标题,并依赖本地导航栏来显示页面标题。使用自定义用户代理标识本地应用,并使用 Rails 助手来识别 Turbo Native 应用。提供了使用 CSS 的缓存友好解决方案,并建议将设计和逻辑集中在应用程序的标题栏周围。文章结尾还介绍了其他可以优化 Turbo Native 应用原生感的小技巧。 42 | 43 | 44 | 45 | ## 摸一下鱼 46 | 47 | 整理编辑:[zhangferry](https://zhangferry.com) 48 | 49 | ### AIGC 尝试 50 | 51 | 1、开了一个小红书的账号,发布 AI 生成的图片,图片主题是原神相关人物。目前为止发了有 13 期,粉丝也才涨了 60+,效果不算好。这个东西要做起来,也是体力活,AI 生成的图片不稳定,需要不断调整关键词,还得是手动筛选。 52 | 53 | 我对比了几个粉丝量比较大的号,他们做的比较早,已经有了固定的画风,图片调教的也非常精细,我试了很多办法都没有能做出类似的效果。下面左侧是我的账号,右侧是某一个大佬账号,能感觉出差距。再考虑运营问题,想要做起来绝非易事。 54 | 55 | 做的过程中,对大多数二次元模型都尝试了一遍,也踩了不少坑,如果对这方面有兴趣,也欢迎交流,小红书账号是:zhangferry。 56 | 57 | ![](https://cdn.zhangferry.com/Images/202305102306989.png) 58 | 59 | 2、开发了一个浏览器插件:[SummarAI](https://github.com/zhangferry/SummarAI "SummarAI"),利用 AI 快速阅读,并输出文章摘要。这个需求也是我的日常痛点之一,经常看到一些别人推荐的好的文章,想好好阅读一下,但是信息多,时间少;不读吧,又感觉可惜。要是能有一个人帮我把整篇内容汇总一下,并告诉我里面讲了什么,我再根据这个信息决定再细读,还是就算完了该有多好。特别是整理周报,也需要浏览很多信息,这个想法我很早就有了,只不过一直拖到五一,才算是给实践下来。 60 | 61 | 看下效果,让它帮我总结 [Meta open-sources multisensory AI model that combines six types of data](https://www.theverge.com/2023/5/9/23716558/meta-imagebind-open-source-multisensory-modal-ai-model-research "Meta open-sources multisensory AI model that combines six types of data")这篇文章: 62 | 63 | ![](https://cdn.zhangferry.com/Images/202305102326596.png) 64 | 65 | 当然这个工具还比较初级,还有很多问题需要解决: 66 | 67 | * 标准功能的完善,像是 AI 模型的切换、预制 prompt 的配置等 68 | 69 | * GPT 3.5 英翻中还是会偶尔出现一些语病问题,需要再增加一个修饰步骤 70 | 71 | * 对于较长文本,受限于模型能力,无法一次读取。当前用的 gpt-3.5-turbo,最大仅支持 4096 个token 72 | * 无法二次交互。第一轮对话已经拿到了文本信息,如果对总结内容不满意,或者像再让 AI 补充信息,还无法做到 73 | 74 | ### AI 见闻 75 | 76 | 1、[GPT产品需求设想&解决方案/工具](https://bytedance.feishu.cn/sheets/TcHTsRSczhda3BtpLQ4cMeVNnSf "GPT产品需求设想&解决方案/工具"):AIGC 相关领域的新产品、新想法每天都会出现很多,让人应接不暇。除了有希望寻找对应的 AI 工具来帮助解决问题的人,也会有希望找到痛点,来做出 AI 产品以解决对应问题的人。博主向阳乔木整理了一份飞书文档,刚好应对这两种诉求:GPT产品需求设想&解决方案/工具,文档以需求为维度记录了来管理,并对当前产品形态列了三个档位:基本解决、能用但不好用、暂无解决方案。 77 | 78 | 2、[AI 孙燕姿](https://www.bilibili.com/video/BV1io4y1w73k/?vd_source=f78da65b081aa6d30ae7bf2aded1d695 "AI 孙燕姿"):有人用 [so-vits-svc]("https://github.com/svc-develop-team/so-vits-svc" "so-vits-svc") 这个项目模拟出了孙燕姿嗓音唱周杰伦的歌的效果,后续还「孙燕姿」还翻唱了许嵩、朴树等歌手的作品。孙燕姿的声音自带一种高级感,这歌被她一唱都别有新意。不过这是否构成侵权还没有响应的法律出台,so-vits-svc也因为担心法律风险,已经被 Archive 了。 79 | 80 | 3、[Glarity](https://glarity.app/zh-CN "Glarity"):是最近一个比较火的插件,它可以为搜索引擎的结果、网页甚至 YouTube 视频生成摘要。这个插件跟我想做的效果类似,但还有一些功能并没有达到理想的状态,该插件已经开源:[chatgpt-google-summary-extension](https://github.com/sparticleinc/chatgpt-google-summary-extension "chatgpt-google-summary-extension"),也是我学习的目标之一。它对于视频摘要的处理是通过获取视频字幕,转成文字再生成的。 81 | 82 | 4、[ChatGPT Prompt Engineering for Developers](https://learn.deeplearning.ai/chatgpt-prompt-eng/lesson/1/introduction "ChatGPT Prompt Engineering for Developer"):这个吴恩达的 DeepLearning.AI 和OpenAI 联合推出的面相开发者的 ChatGPT 课程。网上有搬运的中文版视频,但缺少了官网的交互式界面。原版课程会配有 Juptyter 的交互区,可以实时的修改和调试代码,API Key 也都预制进去了,只要一步步运行代码就可以了。 83 | 84 | ![](https://cdn.zhangferry.com/Images/202305110014905.png) 85 | 86 | ## 关于我们 87 | 88 | iOS 摸鱼周报,主要分享开发过程中遇到的经验教训、优质的博客、高质量的学习资料、实用的开发工具等。周报仓库在这里:https://github.com/zhangferry/iOSWeeklyLearning ,如果你有好的的内容推荐可以通过 issue 的方式进行提交。另外也可以申请成为我们的常驻编辑,一起维护这份周报。另可关注公众号:iOS成长之路,后台点击进群交流,联系我们,获取更多内容。 89 | 90 | ### 往期推荐 91 | 92 | [iOS 摸鱼周报 #92 | Swift Foundation 预览版发布](https://mp.weixin.qq.com/s/AQaY2DA2h8S-XEYoQ0u7Ew) 93 | 94 | [iOS 摸鱼周报 #91 | 免费的网站托管平台 Vercel](https://mp.weixin.qq.com/s/93YLa8ankkEVcp4pop2A6A) 95 | 96 | [iOS 摸鱼周报 #90 | 面相任务的 GPT 项目诞生](https://mp.weixin.qq.com/s/Bx8N9HqMP5HE9mzy6l3QVA) 97 | 98 | [iOS 摸鱼周报 #89 | WWDC 23 公布](https://mp.weixin.qq.com/s/3B_R0j8dpXpR5G9bCRsyXw) 99 | 100 | [iOS 摸鱼周报 #88 | 把 AI 集成到研发流程](https://mp.weixin.qq.com/s/ex3aHSPjKj9woxQwHyRzZA) 101 | 102 | ![](https://cdn.zhangferry.com/Images/WechatIMG384.jpeg) 103 | -------------------------------------------------------------------------------- /WeeklyLearning/iOSWeeklyLearning_97.md: -------------------------------------------------------------------------------- 1 | # iOS 摸鱼周报 #97 | 智源大会线下参会体验 2 | 3 | ![](https://cdn.zhangferry.com/Images/moyu_weekly_cover.jpeg) 4 | 5 | ### 本期概要 6 | 7 | > * 本期话题:智源大会线下参会体验 8 | > * 内容推荐:WWDC 2023 相关的新产品与新技术 9 | > * 摸一下鱼:OpenAI API 更新;面向国内的 OpenAI API Key 服务 API2D; 《Design for spatial user interfaces》 Session 总结;每个软件开发都应该知道的事;图解 QUIC 连接 10 | 11 | ## 本期话题 12 | 13 | ### 智源大会线下参会体验 14 | 15 | ![](https://cdn.zhangferry.com/Images/202306160815108.png) 16 | 17 | 北京智源大会是智源研究院主办的国际性人工智能高端专业交流活动,定位于"AI内行顶级省会"。本期的参会人员,都是 AI 领域最顶级的大佬,我是被 Sam Altman 吸引报名的。结果现场并没有见到本人,只有视频连线。连线那一刻现场氛围一下热腾起来了,Sam Altman 的明星属性真的太强了。虽然是 AI 小白去凑热闹,也涨了不少见识。 18 | 19 | ![](https://cdn.zhangferry.com/Images/202306160810986.png) 20 | 21 | 大会所有视频内容已同步到 B 站官号 [2023北京智源大会](https://www.bilibili.com/video/BV1PN411C7JX "2023北京智源大会")。会议涉及主题非常多,强化学习、多模态大模型、AI 开源、AI 系统、认知神经科学大模型、AI 安全 等等。简单说一下参会那天的几点感受: 22 | 23 | * 会议学术性非常强,既有研究成果展示,也有具体技术方案的讨论,国内外专家的交流是非常无私的 24 | * AI 领域不只有大模型,像 AI 编译器、AI 芯片、模型优化、模型评估等有非常多研究方向 25 | * 国内在 AI 领域的投入和产出都很高,不能只通过大模型的差距,来衡量 AI 领域整体的差异。很多 AI 环节涉及的关键技术,都有国内的替代产品。 26 | * AI 领域的发力很多都在走开源路线,借助于社区的贡献和检验来完成 AI 产品本身 27 | * 从事 AI 底层研究的主要还集中在这些研究机构和高校上,科技公司对于底层研究的投入还可以再多一点 28 | 29 | ## 内容推荐 30 | 31 | 苹果在 WWDC 2023 上发布了许多新产品与新技术,本期将推荐几篇相关博客文章。 32 | 33 | 整理编辑:[东坡肘子](https://www.fatbobman.com/) 34 | 35 | 1、[WWDC 23 新增的系统框架](https://juejin.cn/post/7243352406132981797 "WWDC 23 新增的系统框架") -- 作者:ZacJi 36 | 37 | [@东坡肘子](https://www.fatbobman.com/): 每年的 WWDC 都会发布新的系统,其中包括新功能和之前未向开发者开放的功能。为了支持这些特性,新的系统框架通常也会随之发布。这使得开发者能够方便地使用新系统的特性来开发应用程序。在本文中,作者将介绍 WWDC 23 中新增的系统框架,并分享自己的看法。 38 | 39 | 2、[Metal for SwiftUI](https://alexanderlogan.co.uk/blog/wwdc23/09-metal "Metal for SwiftUI") -- 作者:Alex 40 | 41 | [@东坡肘子](https://www.fatbobman.com/): 在本届 WWDC 上,SwiftUI 获得了很多新的 API,其中就包括可以直接在视图中使用 Shader(着色器)的能力。本文介绍了在 SwiftUI 中使用着色器的方法,涵盖了三种类型的效果:颜色效果、图层效果和扭曲效果。对于每种效果,都提供了示例,包括渐变效果、像素翻转效果和圆形加载器效果。 42 | 43 | 3、[使用 Swift 宏自动适配 RawRepresentable 协议](https://otbivnoe.ru/2023/06/13/Automating-RawRepresentable-Conformance-with-Swift-Macros.html "使用 Swift 宏自动适配 RawRepresentable 协议") -- 作者:Nikita Ermolenko 44 | 45 | [@东坡肘子](https://www.fatbobman.com/): 宏是 Swift 5.9 版本中推出的最重要的新特性之一。WWDC 上很多新的 API 都是基于宏来实现的。本文将通过创建一个自动为枚举类型添加 RawRepresentable 协议的宏,来介绍自定义宏的方法。通过使用宏,可以使我们的代码更加优雅、简洁和可维护,让开发者能够专注于应用程序的核心逻辑。 46 | 47 | 4、[深入了解 SwiftUI 5 中 ScrollView 的新功能](https://www.fatbobman.com/posts/new-features-of-ScrollView-in-SwiftUI5/ "深入了解 SwiftUI 5 中 ScrollView 的新功能") -- 作者:东坡肘子 48 | 49 | [@东坡肘子](https://www.fatbobman.com/): 在 SwiftUI 5.0 中,苹果大幅强化了 ScrollView 功能。新增了大量新颖、设计精巧的 API。包括:contentMargins、safeAreaPadding、scrollIndicatorsFlash、scrollClipDisable、scrollTargetLayout、scrollPosition、scrollTargetBehavior、scrollTransition 等。本文将对这些新功能进行介绍。 50 | 51 | 5、[WWDC2023 Session系列:探索 XCode15 新特性](https://juejin.cn/post/7244561312709558330 "WWDC2023 Session系列:探索 XCode15 新特性") -- 作者:京东云技术团队 52 | 53 | [@东坡肘子](https://www.fatbobman.com/): 像往年一样,苹果在 WWDC 2023 上推出了全新的 Xcode 15。在本文中,京东云技术团队将逐一介绍 Xcode 15 引入的新功能。包括更简洁的宏、文档和日志功能,使开发者能够更高效地编写和维护代码。更智能的自动补全和测试分析功能大大提高了开发效率。更方便的包管理功能通过拆分下载和 Git 集成简化了开发流程。此外,Xcode 15 还增强了图片资产和框架的安全性管理,为应用提供更高级的安全保障。这些新功能为开发者带来了更高效、更方便和更安全的开发体验。 54 | 55 | ## 摸一下鱼 56 | 57 | 整理编辑:[zhangferry](https://zhangferry.com) 58 | 59 | 1、[OpenAI API 模型更新](https://openai.com/blog/function-calling-and-other-api-updates):本次更新主要有这几点: 60 | 61 | * 支持函数调用。它的目的是增加模型的灵活度,扩展模型的能力。以「获取 Boston 的天气」这个对话为例,先输入问题和需要的函数及参数类型,调用 `chat/completions` 的接口,这一步获取 Boston 这个地理信息。此时没结束,因为 OpenAI 的模型并不知道实时的天气信息。我们拿到提取的地理信息,请求天气 API 获取实时天气,把实时天气信息,作为函数参数拼接进 role 对应的内容,再调一次 `chat/completions`,就可以完成了整个流程了。这个能力可以突破模型本身的限制,它的能力非常强大,这样各类 AI 插件又有更多新玩法了。支持模型为:`gpt-4-0613`和 `gpt-3.5-turbo-0613`。 62 | * gpt-3.5-turbo 发布了一个支持 16k tokens 的模型:`gpt-3.5-turbo-16k`,3.5-trubo支持的 tokens 数只有 4k。这里的 token 数是把 prompt 和 回复内容一起计算的。 63 | * 因为系统层面的优化,`text-embedding-ada-002`价格下调 75%,`gpt-3.5-turbo` 下调 25%。 64 | 65 | 我把 [SummarAI](https://github.com/zhangferry/SummarAI "SummarAI") 可用的模型也同步扩展了 `gpt-3.5-turbo-16k`,用一篇长文进行分析,发现这个模型识别效果比 3.5-turbo 更好些,而且输出的回复也非常长。之前用 3.5-turbo 经常超过 600 个字符的回复就自动截断了。用 16k 这个模型测试对 OpenAI 这篇文章的总结回复长达 2500 个字符,非常夸张。 66 | 67 | 2、[API2D](https://api2d.com/r/187046 "API2D"):很多基于 AI 的开发工具,都需要提供 API Key 才能使用。但 OpenAI 的 API Key 一是充值麻烦,二是接口被墙无法直接访问。针对这类痛点催生了一批针对国内用户的 API Key 服务,它们即提供便利的充值,也代理了接口国内可以直接访问,API2D 就是这样一个产品。付费方式是按照 Token 数算的,价格上是官方的 1.5 倍。点数的好处是适用于个人,不会出现价格高,自己用不完,找人拼车的问题。而且它还支持 GPT-4 的调用。支持接口有: 68 | 69 | ![](https://cdn.zhangferry.com/Images/202306160021450.png) 70 | 71 | 3、[《Design for spatial user interfaces》 总结](https://twitter.com/zuozizhen/status/1669313088674496514 "《Design for spatial user interfaces》 总结"):来自于博主 [@左子帧](https://twitter.com/zuozizhen) 对于 [Design for spatial user interfaces](https://developer.apple.com/videos/play/wwdc2023/10076/ "Design for spatial user interfaces") 这期 Session 的总结,可以注意到很多 visonOS 设计上的细节,苹果真的是设计怪,以下是其中几点: 72 | 73 | * 在 visionOS 中设计 App 图标时,图标最多可以分为三层(一个背景层 + 两个前景层),每一层尺寸都是 1024*1024px,当使用时系统会自动再加一层玻璃层,给图标增加深度、高光和阴影效果,这样就可以产生官方视频中图标微妙的纵深感 74 | * visionOS 中的窗口主题使用了新设计的玻璃材质,同时系统会自动在边缘处通过高光阴影(环境光的反射)来体现在空间中的位置 75 | * visionOS 中没有明确的亮色和暗色模式,但系统会自动感应环境光线来调整窗口颜色对比度,让内容保证始终可见 76 | * 强调色不要直接应用在前景元素上,同时尽量使用系统颜色(因为系统颜色可以跟随环境光动态适应调整) 77 | * 左右转头要比上下转头更容易,所有不要把东西放太高或太低,界面也要往两边延伸而不是上下延伸 78 | * 系统控件会自带焦点反馈效果(类比桌面端的 Hover 效果,在 visionOS 就是眼睛注视到控件时的效果 ) 79 | * 在 visionOS 中弹出菜单不需要箭头,系统按钮会在选中时显示白色背景,所以需要注意的是尽量也不要设计白色背景的按钮,否则会和系统按钮的选中态混淆 80 | 81 | 4、[every-programemr-should-known](https://github.com/mtdvio/every-programmer-should-know "https://github.com/mtdvio/every-programmer-should-know"):每个软件工程师都应该了解的东西,这是 Github 一个高星项目。它总结了作为软件开发者应该了解的信息,涵盖技术、求职、设计等各个方面。 82 | 83 | ![](https://cdn.zhangferry.com/Images/202306160931680.png) 84 | 85 | 5、[图解 QUIC 连接](https://cangsdarm.github.io/illustrate/quic "图解 QUIC 连接"):QUIC 是一个基于 UDP 的安全流协议,它构成了 HTTP/3 的基础。这个页面通过图文并茂的方式对 QUIC 每一个字节的传输流程都进行了解释和再现。 86 | 87 | ![](https://cdn.zhangferry.com/Images/202306160935911.png) 88 | 89 | ## 关于我们 90 | 91 | iOS 摸鱼周报,主要分享开发过程中遇到的经验教训、优质的博客、高质量的学习资料、实用的开发工具等。周报仓库在这里:https://github.com/zhangferry/iOSWeeklyLearning ,如果你有好的的内容推荐可以通过 issue 的方式进行提交。另外也可以申请成为我们的常驻编辑,一起维护这份周报。另可关注公众号:iOS成长之路,后台点击进群交流,联系我们,获取更多内容。 92 | 93 | ### 往期推荐 94 | 95 | [iOS 摸鱼周报 #96 | Vision Pro 打开空间计算的大门](https://mp.weixin.qq.com/s/BM3SucfO9yhQChIPbnuwrA) 96 | 97 | [iOS 摸鱼周报 #95 | WWDC23 is coming](https://mp.weixin.qq.com/s/hi8Dy2H_iBFWeO0V_tQ5xw) 98 | 99 | [iOS 摸鱼周报 #94 | 前端项目开发流程学习](https://mp.weixin.qq.com/s/f2Z1VRpk4Ehh3KxuY_NrvA) 100 | 101 | [iOS 摸鱼周报 #93 | AIGC 尝试](https://mp.weixin.qq.com/s/ios0QYKmnYtJ8URvZLJ1TA) 102 | 103 | ![](https://cdn.zhangferry.com/Images/WechatIMG384.jpeg) 104 | -------------------------------------------------------------------------------- /WeeklyLearning/iOSWeeklyLearning_99.md: -------------------------------------------------------------------------------- 1 | # iOS 摸鱼周报 #99 | 躺平、摆烂、开心就好 2 | 3 | ![](https://cdn.zhangferry.com/Images/moyu_weekly_cover.jpeg) 4 | 5 | ### 本期概要 6 | 7 | > * 本期话题:macOS Sonoma 体验 8 | > * 内容推荐:Swift 宏、Core Data 新特性、SwiftData 介绍、自动生成 RESTful APIs、iOS 应用保护等内容 9 | > * 摸一下鱼:Public Apple Frameworks;微软提供的面相前端初学者的课程;苹果M2 Ultra:AI大模型的新希望;AI 生成的艺术二维码; 10 | 11 | ## 本期话题 12 | 13 | ### macOS Sonoma 14 | 15 | 体验了一段时间新系统,更新非常小,苹果不告诉我我都不知道发生了哪些变化。说几个比较有意思的变化吧。 16 | 17 | 1、屏保 18 | 19 | ![](https://cdn.zhangferry.com/Images/202307042343315.png) 20 | 21 | 新增了动态屏保,如果你将它作为壁纸同时开启,锁屏时会看到一段航拍风景的视频,解锁桌面,视频缓慢减速,最后定格为桌面壁纸,整个过程自然,舒适。视频地址位于:`/Library/Application Support/com.apple.idleassetsd/Customer/4KSDR240FPS/`,通过目录名也可以看出来,这些屏保是 4K SDR 240帧的规格,每一帧停下来都可以当壁纸。 22 | 23 | 2、Web App 24 | 25 | web app 是 macOS Sonoma 开始引入的新功能,类似 iOS 中的 Home Screen,它可以把浏览器中常访问的网站加到 Dock 栏中。 26 | 27 | ![](https://cdn.zhangferry.com/Images/202307042317428.png) 28 | 29 | 添加到 Dock 之后它就可以向普通的 App 一样供我们使用了。这个 web app 并非简单的网页入口,苹果给它融入了很多原生 App 才有的能力。 30 | 31 | ![](https://cdn.zhangferry.com/Images/202307042324626.png) 32 | 33 | macOS 上的 Web App 要比移动端的 Home Screen 意义大的多,因为移动端并不缺应用,浏览特定网站是一个低频场景。而 mac 端的问题在于应用少,浏览网站是一个高频场景。有很多网站为了做 mac 端都是套壳 H5,有了 Web APP 直接无缝升级为 「Applicaiton」,这对苹果生态和应用本身都是利好的。 34 | 35 | 3、小组件 36 | 37 | 也是同步 iOS 端的 Widgets 功能,可以把小组件直接拖动到桌面上去。主要电脑桌面经常都是满的,会覆盖小组件,所以关注到它们的频率也不高。 38 | 39 | ![](https://cdn.zhangferry.com/Images/202307060855894.png) 40 | 41 | ## 内容推荐 42 | 43 | 推荐近期的一些优秀博文,内容涵盖 Swift 宏、Core Data 新特性、SwiftData 介绍、自动生成 RESTful APIs、iOS 应用保护等方面。 44 | 45 | 整理编辑:[东坡肘子](https://www.fatbobman.com/) 46 | 47 | 1、[一文看懂 Swift Macro](https://juejin.cn/post/7249888320166903867 "一文看懂 Swift Macro") -- 作者:Yasic 48 | 49 | [@东坡肘子](https://www.fatbobman.com/): 在 5.9 版本中,Swift 引入了一个重要的新功能:宏(Macro)。Swift 宏可以在编译时生成源代码,从而避免开发者编写重复的代码。除了 Swift 标准库以及苹果众多的官方库提供的宏外,开发者也可以编写自己的宏。本文作者对宏的特点以及如何自定义宏做了详尽的介绍,并针对不同种类的自定义宏分别给出了示例代码。 50 | 51 | 2、[WWDC 2023,Core Data 有哪些新变化](https://www.fatbobman.com/posts/what's-new-in-core-data-in-wwdc23/ "WWDC 2023,Core Data 有哪些新变化") -- 作者:东坡肘子 52 | 53 | [@东坡肘子](https://www.fatbobman.com/): 虽然在 WWDC 2023 上,苹果将主要精力放在介绍新的数据框架 SwiftData 上,但作为 SwiftData 的基石,Core Data 也得到了一定程度上的功能增强。本文将介绍今年 Core Data 获得的新功能,包括:复合属性( Composite attributes)、在 Core Data 中使用新的 Predicate、VersionChecksum、延迟迁移(Deferred migration)以及阶段式迁移( Staged migration )等内容。 54 | 55 | 3、[使用 Swift 生成 RESTful APIs](https://blog.eidinger.info/generate-restful-apis-with-swift-in-2023 "使用 Swift 生成 RESTful APIs") -- 作者:Marco Eidinger 56 | 57 | [@东坡肘子](https://www.fatbobman.com/): [Swift OpenAPI Generator](https://github.com/apple/swift-openapi-generator) 是一个 SwiftPM 插件,可以根据 OpenAPI 文档生成用于执行 HTTP 调用或处理这些调用的客户端或服务器端代码。本文作者介绍了他的经验,通过以下四个步骤使用 Swift OpenAPI Generator 生成客户端代码:获取后端的 RESTful API 定义,模拟后端,生成 Swift 客户端库,然后在应用程序中使用该 Swift 客户端库。 58 | 59 | 4、[构建 SwiftData 应用的终极指南](https://azamsharp.com/2023/07/04/the-ultimate-swift-data-guide.html "构建 SwiftData 应用的终极指南") -- 作者:Mohammad Azam 60 | 61 | [@东坡肘子](https://www.fatbobman.com/): 作为 Core Data 框架的替代品,SwiftData 在 WWDC 2023 首次亮相。本文将通过几个部分全面介绍 SwiftData 的各项功能,其中包括:SwiftData 的基本概念、架构设计、关系管理、数据查询、数据预览、数据迁移、单元测试以及与 UIKit 集成等。通过本文,作者希望读者能全面了解 SwiftData 的功能和特性,从而在 iOS 开发中充分利用其潜力。 62 | 63 | 5、[iOS 防 dump 可行性调研报告](https://juejin.cn/post/7251501966592917563 "iOS 防 dump 可行性调研报告") -- 作者:ChatGPT(GPT-4) & iHTCboy 64 | 65 | [@东坡肘子](https://www.fatbobman.com/): 在 iOS 平台上,保护 App 的源代码安全是开发者的一项重要任务。由于 App 可能包含敏感信息和重要算法,防止源代码被非法获取和篡改显得尤为重要。本文介绍了如何防止 iOS App 被 dump,包括代码混淆、加密、完整性检查等多层防御策略,以及服务器端验证、动态加载、API 安全性和多因素认证等方案。此外,监控与告警、定期安全审计和安全培训等后置方案也可以提高 App 的安全性。最后,还介绍了禁止越狱设备的实施方案,以及 DeviceCheck 和 App Attest API 等新技术方案。 66 | 67 | 68 | ## 摸一下鱼 69 | 70 | 整理编辑:[zhangferry](https://zhangferry.com) 71 | 72 | 1、[Public Apple Frameworks](https://marcoeidinger.github.io/appleframeworks/ "Public Apple Frameworks"):查看所有 Apple 提供的公共 Framework 在各个平台下是否被支持,以及支持的最低版本。筛选所有的 `Core` 系列框架: 73 | 74 | ![](https://cdn.zhangferry.com/Images/202307060905262.png) 75 | 76 | 2、[Web-Dev-For-Beginners](https://microsoft.github.io/Web-Dev-For-Beginners/#/ "Web-Dev-For-Beginners"):微软提供的面相前端初学者的课程,学习 JS、CSS、HTML,课程公 24 节,包括课后作业,测试,解决方案等。最后会有多个实践项目,浏览器插件、太空游戏、银行应用等。 77 | 78 | ![](https://cdn.zhangferry.com/Images/202307062322477.png) 79 | 80 | 3、[苹果M2 Ultra:AI大模型的新希望](https://www.bilibili.com/video/BV1fh4y1M7DX/ "苹果M2 Ultra:AI大模型的新希望"): 今年各种大模型层出不穷,但大模型对算力要求很高,这俨然已经成了模型发展最大的障碍之一。简单列一下 Nvidia 中经常用于 AI 训练的几种显卡的显存和价格: 81 | 82 | | 显卡 | 显存 | 价格 | 83 | | -------- | ---- | ------- | 84 | | RTX 4090 | 24G | ¥1.3w | 85 | | A100 | 80G | ¥8.1w | 86 | | H100 | 80G | ¥24.2w | 87 | 88 | H100 之所以比 A100 贵那么多是因为 H100 采用了全新一代的琥珀架构,计算性能提升了数倍。所以光看这个价格就知道,大模型训练不是普通人玩得起的。 89 | 90 | 今年苹果发布了 M2 Ultra,最大内存可达 192 GB,在苹果芯片的统一内存架构下, 192 GB 内存就可以是 192 GB 显存。这就意味着原本 8 张 4090才能装得下的 AI 模型,在 M2 Ultra 一张芯片就可以跑起来了。看价格 M2 Ultra 192GB + 4 TB 只有 6 w,怎么越算越感觉便宜呢。 91 | 92 | 理论归理论,视频作者也实践了一波,购买了 128 GB 内存的 M2 Ultra,本地就跑起来了 LLaMA 330 亿参数的大模型。当然完全发挥 M 系列芯片的优势还需要各类软件的适配,这个实现就有赖与开源社区针对 M 芯片在 LLaMA 模型上的特别优化。所以在 AI 芯片领域能打破 Nvidia 垄断的,很有可能就是苹果,这一波苹果属实算是弯道超车了。 93 | 94 | 4、[QR Code AI Art Generator](https://huggingface.co/spaces/huggingface-projects/QR-code-AI-art-generator "QR Code AI Art Generator"):最近 AI 艺术的二维码比较火,它是由 4 名中国大学生开发出来的,项目是 [QR Code ControlNet](https://huggingface.co/ioclab/ioc-controlnet/tree/main/models "QR Code ControlNet")。在 StableDiffusion WebUI 中利用 这个预处理工具 ControlNet 控制灰度和光影,它们保证了二维码的准确性;再利用 Lora 模型实现不同的风格画风,就有了一张特定画风和二维码结合的新图片。AI Art Generator 这个项目可以让你线上体验这种 AI 艺术风格的二维码生成。输入内容,其他参数默认,prompt 是:masterpiece, best quality, cyberpunk city,就有了下面这张图,可以扫一下看出来的是什么: 95 | 96 | ![](https://cdn.zhangferry.com/Images/202307062236345.png) 97 | 98 | 5、[对谈半佛仙人:看似复制成功,实则刻舟求剑](https://www.xiaoyuzhoufm.com/episode/649c0aa1f5604aa55e1491c4 "对谈半佛仙人:看似复制成功,实则刻舟求剑"):这期博客非常欢乐,收获比较大的是半佛老师对待生活的态度。半佛老师有糖尿病,新冠的时候身体反应比较激烈,差点交代过来。从那以后就一下看开了,开始反思,发现这么努力,这么卷的工作没有任何价值,感受到濒死状态后才明白身体健康有多么重要。 99 | 100 | 完整的健康即包括身体健康,也包括心理健康。最近因为李玟轻生的事件越来越多的人又关注到了抑郁症。看到一个数字,我国抑郁症就医率不足 10 %,说明大部分抑郁症患者对于抑郁都是选择逃避的。抑郁症本身是一种病,它是需要药物治疗的,而且大部分抑郁症都是可以治好的。一方面要正视和重视抑郁症,一方面也要注意情绪的宣泄。失业、房贷、家庭等一系列事情都有可能成为负面情绪的源头,不断在心底挤压。 101 | 102 | 这个时候,找一个爱好,快乐的,没有任何心理负担的把时间浪费掉非常重要。别再忙工作了,打球去、跑步去;别再卷了,撸串喝酒去;别再学了,打游戏、刷短视频去,看看修马蹄子的,洗地毯的,挤黑头的,来一个赛博按摩。躺平,摆烂,消磨时间,能让自己开心起来的就是最好的。 103 | 104 | ## 关于我们 105 | 106 | iOS 摸鱼周报,主要分享开发过程中遇到的经验教训、优质的博客、高质量的学习资料、实用的开发工具等。周报仓库在这里:https://github.com/zhangferry/iOSWeeklyLearning ,如果你有好的的内容推荐可以通过 issue 的方式进行提交。另外也可以申请成为我们的常驻编辑,一起维护这份周报。另可关注公众号:iOS成长之路,后台点击进群交流,联系我们,获取更多内容。 107 | 108 | ### 往期推荐 109 | 110 | [iOS 摸鱼周报 #98 | visionOS 模拟器体验](https://mp.weixin.qq.com/s/PNEYW71BfkQ2Y3n7uRdxsQ) 111 | 112 | [iOS 摸鱼周报 #97 | 智源大会线下参会体验](https://mp.weixin.qq.com/s/6HRxZXAJcTZKGZiNX2eBYQ) 113 | 114 | [iOS 摸鱼周报 #96 | Vision Pro 打开空间计算的大门](https://mp.weixin.qq.com/s/BM3SucfO9yhQChIPbnuwrA) 115 | 116 | [iOS 摸鱼周报 #95 | WWDC23 is coming](https://mp.weixin.qq.com/s/hi8Dy2H_iBFWeO0V_tQ5xw) 117 | 118 | ![](https://cdn.zhangferry.com/Images/WechatIMG384.jpeg) 119 | --------------------------------------------------------------------------------