Archive


Category: Uncategorized

  • 我的三六九原则

    模式和框架应该简单,一旦有复杂化的迹象就需要做抽象和分解,核心要点限制在 3 点, 核心步骤限制在 6 步, 核心方法限制在 9 个.

  • boost asio note – Executors

    Every asynchronous agent has an associated executor. An agent’s executor determines how the agent’s completion handlers are queued and ultimately run. 每个异步代理都有一个关联的执行器。 代理的执行者确定代理的完成处理程序如何排队并最终运行 Example uses of executors include: Coordinating a group of asynchronous agents that operate on shared data structures, ensuring that the agents’ completion handlers never run concurrently[5]. Ensuring that agents are run on […]

  • Application Limitation Region Detector

    @startuml struct AlrDetectorConfig { double bandwidth_usage_ratio = 0.65; double start_budget_level_ratio = 0.80; double stop_budget_level_ratio = 0.50; std::unique_ptr<StructParametersParser> Parser(); } class AlrDetector { void OnBytesSent(size_t bytes_sent, int64_t send_time_ms); void SetEstimatedBitrate(int bitrate_bps); absl::optional<int64_t> GetApplicationLimitedRegionStartTime() const; const AlrDetectorConfig conf_; absl::optional<int64_t> last_send_time_ms_; IntervalBudget alr_budget_; absl::optional<int64_t> alr_started_time_ms_; RtcEventLog* event_log_; } AlrDetectorConfig –o AlrDetector @enduml

  • WebRTC 如何知道 RTX Stream 的 SSRC

    Overview 每个流都有一个配置 struct StreamConfig { StreamConfig(); StreamConfig(const StreamConfig& other); ~StreamConfig(); bool operator==(const StreamConfig& other) const; bool operator!=(const StreamConfig& other) const; uint32_t local_ssrc = 0; uint32_t remote_ssrc = 0; uint32_t rtx_ssrc = 0; std::string rsid; bool remb = false; std::vector<RtpExtension> rtp_extensions; RtcpMode rtcp_mode = RtcpMode::kReducedSize; struct Codec { Codec(absl::string_view payload_name, int payload_type, int rtx_payload_type); bool operator==(const […]

  • 监控模式

    USE Utilization 利用率 Saturation 饱和度 Error 错误率 RED Rate 每秒接收的请求数 Error 每秒失败的请求数 Duration 每个请求的耗时 Gold metrics Latency 处理请求所需的时间 Traffic 处理请求所需的流量 Error 请求的错误率 Saturation 服务的资源使用情况

  • 无处不在的发布订阅模式(TBD)

    订阅一份报纸,到时候就会投递给你。 订阅一个新闻频道,一有新闻就会推送给你。 本质上,它是一种异步通信的架构模式 与之对应的代码模式就是观察者模式,其注册 register 对应于 subscribe, notify 对应于 publishe subscribe subscriber -> router: subscribe router–>subscriber: ack publisher publisher -> router: event router–>publisher: ack router –> subscriber: event subscviber–>router: ack 典型用例有 Ingestion user interaction and server events. To use user interaction events from end-user apps or server events from your system, you might forward them […]

  • 拒绝摆烂

    这个世界再烂,也拒绝摆烂,写书,写代码,写评论,我写故我在。 与朋友去交流,跑步,打球,让自己流汗,不让自己流泪。

  • WebRTC RTX

    在 WebRTC 中常用的 QoS 策略有 反馈:例如 PLI , NACK 冗余, 例如 FEC, RTX 调整:例如码率,分辨率及帧率的调整 缓存: 例如 Receive Adaptive Jitter Buffer, Send Buffer 这些措施的采用需要基于拥塞控制(congestion control) 及带宽估计(bandwidth estimation)技术, 不同的网络条件下需要采用不同的措施。 Webrtc 默认是开启 RTX (重传),它一般采用不同的 SSRC 进行传输 RTX 包的 Payload 在 RFC4588 中有详细描述,一般 NACK 和 Bandwidth Probe 也可能走 RTX 通道。 FEC 用作丢包恢复需要占用更多的带宽,即使 5% 的丢包需要几乎一倍的带宽,在带宽有限的情况下可能会使情况更糟。 RTX 不会占用太多的带宽,接收方发送 NACK 指明哪些包丢失了,发送方通过单独的 RTP […]

  • C++ 程序 Crash 的分析

    1) 是否容易重现 如果容易,它的复现步骤是什么 如果不容易,它在什么条件下的出现机率比较大,有没有可能缩小排查的范围 2) 是否最近才引入的,发现的时机和频率如何 找出 crash 出现的时间范围,时机,和频率 根据 backgrace 和 git log, 回顾 crash 相关代码的修改记录 3) 灵活运用演绎法,归纳法和二分法 演绎法: 从一般到特殊,从常见的 crash 问题和解决方案推断 归纳法: 从特殊到一般,从最近频发的 crash 问题找出共性特征 二分法: 用二分法合理划分问题域,不断缩小范围 4) 大胆假设,小心求证 假设条件,测试,排除,不断重复,缩小范围 有必要时画一张思维导图,记下每条排查路径 5) 君子性非异也,善假于物也 查询 google, stackflow, 听取同事的意见 最后一条,看看破案和推理小说及剧情,学学侦破技术 如何找线索, 如何勘查现场, 如何排查嫌疑 如何查询积案,进行并案 有一些惯犯和惯用作案手段值得研究 多线程处理不当 多个线程操作一块内存区域,没有安全地加锁和串行化 合局和单例对象是重点排查对象 内存处理不当 内存管理不当,用到的内存却给别人破坏了,例如 试图释放已经释放了的内存 试图释放并未分配的内存 试图读写已经释放了的内存 试图读写并未分配的内存 内存分配错误, […]

  • 前端工具链

    脚手架工具 生成模板代码,例如 yeoman 依赖管理工具 管理依赖代码,例如 bower 构建工具 预处理代码,例如 gulp