• 如何在终端中显示程序的实时输出 -- stream buffering

    // main.swift
    import Foundation
    
    print(123)
    sleep(1)
    print(456)
    sleep(1)
    print(789)
    

    上面是一段可以执行至少两秒钟的 Swift 代码, 我们可以在命令行中以 nohup swift main.swift &>output.txt & 命令执行, 然后在另一个命令行窗口中使用 tail -f output.txt 命令实时查看文件内容变化. 按照我们直觉, 程序会在执行的第 0 秒打印 123, 第 1 秒打印 456, 第 2 秒打印 789, 但是结果是直到第 2 秒一次性打印了所有内容, why?

  • 如何在 Swift 命令行程序执行异步代码

    最近在学习多线程底层源码, 为了方便验证各种多线程案例, 我是直接在一个 main.swift 文件中编写异步代码, 然后终端中使用 swift main.swift 命令来执行看输出的. 然后就遇到了一个很基础的问题: 命令行程序不像 iOS 或 macOS 应用, 默认是没有 runloop 的, 这就代表提交到主线程的同步代码执行完成后整个程序就退出了, 我们添加到其他线程的或者在主线程异步执行的代码就没有机会被执行了.

    这个问题解决不了的话就无法使用终端程序验证多线程代码了, 经过一番学习, 发现是有多种方式能使终端程序不退出执行的, 这篇文章将我谈索道的这些方式做一下总结

  • App 日志系统方案选型分析

    最近我们的 app 被反馈了几个不同的生产问题, 都属于偶现, 由于不能稳定复现, 因此排查起来比较困难, 只能猜测问题出现在哪里, 尝试进行修改, 改完之后也不知道有没有彻底解决, 很痛苦. 造成这种现象的原因是我们 app 目前缺乏一个日志系统, 结合前段时间的面试经历, 我意识到大型的 app 一般都会配备有日志分析系统, 而这正是我们 app 目前所欠缺的, 我觉得是时候考虑加入日志系统了

    首先内部调研了一下, 同部门的安卓组倒是有日志系统, 他们采用的上报方案是通过 http 请求实时上报到后端, 后端将上报来的日志信息输出到 kibana 日志平台供安卓开发人员查询. 这种方案会频繁请求网络造成耗电, 且上报数据有限. 在我看来安卓的这种日志上报更像是埋点上报, 可能比较适合前端网页, 因为网页随时可能被用户关闭, 而且不能在磁盘进行存储, 只能进行实时上报了. 我认为应该充分利用 app 客户端的优势, 将日志写入到本地文件中, 在用户遇到问题时将日志进行上传供开发人员分析.

    说干就干, 先把大致思路捋清楚吧