IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

最新文章

采集自各技术站点的近期文章。

IT 后端/ 2015-01-05 23:27:36 / 累计浏览 3,439

操作系统-进程管理

这篇系统梳理了操作系统进程管理的核心概念。作者从最基础的定义切入,指出进程是程序的一次动态执行过程,并详细对比了它与静态程序在存在形式、生命周期、资源分配角色上的五大关键差异。 文章接着拆解了进程的内部构成,重点呈现了进程状态的演进——从经典的三种状态模型,到更贴近实际的五种、七种状态切换图,这直观反映了现代操作系统对进程调度的精细化控制。在调度层面,文章清晰列举了先到先服务、优先级、最短作业优先、循环轮转以及多级队列这五种经典算法,为理解CPU资源如何公平高效地分配给不同进程提供了具体思路。 此外,文章也涵盖了进程间通信的七种主要方式(如管道、共享内存、套接字等),并最终引向了更轻量的执行单元——线程,明确了进程与线程在资源分配与调度层面的分工关系。整篇内容结构清晰,从定义到组件,再到调度与通信,最后延伸到线程,为构建操作系统进程管理的完整知识图谱提供了扎实的路线。

本机暂存
IT 后端/ 2015-01-05 23:26:49 / 累计浏览 3,163

Linux程序链接时-lpthread对程序正确性的影响

作者线上服务频繁卡死,CPU使用率飙升。通过pstack堆栈分析,发现线程大量阻塞在pthread_cond_signal和mutex解锁操作上,但本应轻量的unlock函数却异常消耗资源。排查指向了链接时未指定-lpthread的隐患。 文章深入剖析了这一常见陷阱背后的机制。在glibc中,pthread相关函数(如mutex、条件变量)存在“空实现”以优化单线程程序性能。只有当程序显式链接libpthread.so后,其正确的多线程实现才会覆盖libc中的符号。作者通过readelf和nm工具对比发现,动态库通过versioned symbol(如pthread_cond_signal@GLIBC_2.3.2)实现这一覆盖,而非静态库使用的weak symbol。 关键在于,若主程序或最终可执行文件未链接pthread库,即使动态库本身依赖多线程,程序启动时加载的仍是libc中的空实现,导致死锁等严重问题。作者通过复现实验证明,只要最终可执行文件链接了-pthread,即便中间动态库未链接,也能通过符号版本机制正确解析到pthread库的实现,从而规避风险。

本机暂存
IT 移动开发/ 2015-01-05 23:24:30 / 累计浏览 2,899

如何做Xcode工程的工程化管理

这篇讲的是如何系统化地管理Xcode工程,解决多人协作时常见的混乱与低效问题。作者从项目代码冲突频繁、依赖管理繁琐、多环境打包易出错等实际痛点出发,分享了一套实战经验。 核心方案分为几个层面:对于大型团队,建议用子Project或Workspace搭配多个Project来划分功能模块,这能有效降低单一project.pbxproj文件的冲突概率。第三方库统一交由CocoaPods管理,显著减少了维护成本。针对多渠道、多测试环境的需求,利用Build Configuration来区分配置,并配合创建与之对应的Scheme来管理打包和执行流程。最后,通过编写xcodebuild命令行脚本,可以一次性完成多个渠道包的构建,大幅提升效率。 整套方法围绕“降低冲突、规范流程、自动化打包”展开,作者强调了共享Scheme和命令行打包在团队协作中的实用性。这些措施将工程管理从依赖个人自觉提升到了流程化的层面,有助于在复杂项目中保持秩序。

本机暂存
IT 开发者/ 2015-01-05 23:23:29 / 累计浏览 3,920

一个程序员的管理思考

这篇讲的是一位有两年管理经验的程序员,回顾了自己从带领小团队到推动30人团队时所经历的深刻转变与思考。作者认为,管理本质上是“管”结果与“理”过程的结合。随着团队规模扩大,管理者必须从早期身先士卒的“带领者”,转变为更多依靠机制和授权的“推动者”,甚至要达到“在与不在一个样”的境界。 文章的一个核心观点是将管理与技术架构进行类比。就像技术积累需要将解决方案抽象为框架和平台一样,管理也需要对具体问题进行抽象,形成可复制的规范、流程等“术”。更进一步,“术”的制定应由团队“道”层面的价值观来指导,例如作者团队基于“简单、直接、信任、效率”的价值观,推行了保障开发效率的会议规范。 作者也坦诚,实现让团队成员能站在自己角度思考问题的“双向同理心”是一条漫长之路。文中通过让开发轮流处理用户反馈来提升质量意识的实例,生动说明了如何将价值观落地为具体实践。对于正处于技术向管理转型期的读者而言,这些源自一线实践的观察与抽象思考,提供了非常具体的参照。

本机暂存
IT 移动开发/ 2015-01-04 23:39:10 / 累计浏览 3,846

iOS 8/Android/WP 系统设置的用户体验对比

这是一篇关于三大移动操作系统设置界面对比分析的知识点类文章。作者从屏幕空间占用、内容长度等实际维度切入,剖析了iOS 8、Android KitKat与Windows Phone 8.1在交互设计上的核心取舍。 文章指出,iOS的固定菜单与Home Button组合仅占11%屏幕空间,是最高效的方案。Android因虚拟按键占用达18%,但通过沉浸模式等方案寻求突破。而Windows Phone的系统栏占用了高达23%的屏幕,空间效率最差。在设置项结构上,iOS采用清晰的层级分类,Android依赖长列表,Windows Phone则通过横向 pivot 实现扁平化导航。 作者的结论很明确:设计不仅是美观,更是对空间、效率和复杂功能的平衡。这篇文章没有空谈理论,而是用数据和交互细节说话,为产品设计者提供了关于如何在约束条件下构建清晰信息架构的实战思路。

本机暂存
IT 移动开发/ 2015-01-04 23:37:16 / 累计浏览 2,031

使用CocoaPods进行Xcode的项目依赖管理

这篇讲的是如何用CocoaPods管理Xcode项目的依赖关系。作者首先将CocoaPods类比为iOS生态中的Maven,但强调了其更大的灵活性——它不仅能管理官方仓库的库,还支持直接依赖本地库或指定的Git仓库,这一点与Gradle的思路相似。 文章接着从安装讲起,提示了Mac系统自带Ruby的便利性,并特别指出国内网络环境下安装和更新时可加上`--verbose`参数以观察进度。核心部分围绕`Podfile`展开,通过具体代码示例演示了如何声明对不同来源库的依赖。一个实用的技巧是:若项目存在多个Target,需要为每个Target单独声明依赖关系,否则配置仅对首个Target生效。 对于希望发布自定义库的开发者,文章详细解析了如何编写`PodSpec`文件。它不仅指导如何指定源文件、头文件和ARC设置,还给出了依赖`.framework`、打包资源文件以及利用`subspec`实现项目模块化的进阶示例。这些细节让文章超越了基础入门,提供了可直接参考的实战配置方案。

本机暂存
IT 后端/ 2015-01-04 23:35:40 / 累计浏览 3,403

nginx中location的匹配和rewrite

这篇文章来自一位工程师的实战经历,他在调整线上 Nginx 规则时,遇到了一个关于 `location` 匹配的“诡异”问题:明明配置了精确的路径规则,流量却匹配不上。 问题的根因在于 Nginx 对待 URL 的两个阶段存在处理差异。用户直接请求的 URL 会先进行“归一化”处理(例如合并多余的斜杠),但在配置文件中使用 `rewrite` 指令跳转后生成的新 URL,却不会再经历这一过程。这种不一致,极易导致配置失误。 文章用一个具体例子清晰演示了这一点:当 `rewrite` 规则不小心多写了一个斜杠,形如 `/newapi//api`,直接访问 `/api`(归一化后)就无法命中 `/newapi/api` 这个 `location`;而直接请求未归一化的 `/newapi//api` 反而可以匹配上。 作者通过这个踩坑经历,揭示了 Nginx 转发机制中一个容易被忽略的细节。对于需要编写复杂规则的运维和后端同学来说,理解这个机制差异,能帮助避免一些难以排查的线上配置故障。

本机暂存
IT 后端/ 2015-01-04 23:34:32 / 累计浏览 3,048

打造高性能高可靠的块存储系统

作者从为云计算提供底层支撑的角度出发,分享了如何构建一个高性能、高可靠的块存储系统。文章指出,为了解决云主机创建缓慢、物理硬件维护困难以及OpenStack原生架构中存储资源内耗等问题,他们选择了基于Ceph来搭建统一的分布式块存储。 方案的核心是将OpenStack的计算(Nova)、镜像(Glance)和云硬盘(Cinder)三大服务的后端存储统一到Ceph。这带来了显著的收益:虚拟机创建时间从分钟级大幅缩短至10秒以内,并支持了快速热迁移。同时,系统提供了灵活的云硬盘类型(性能型与容量型),单盘性能可达6000 IOPS、延迟低于2ms,并通过三副本机制实现了高达10个9的持久性。 文章还详细介绍了他们在软硬件选型(如全面转向SSD)、最小部署架构(12节点起步)以及集群平滑扩展方面的实践经验。通过这一系列改造,他们成功打造了一个既满足云主机快速供给,又能承载高性能数据库需求的存储基础设施。

本机暂存
IT 数据库/ 2015-01-04 23:33:18 / 累计浏览 3,872

复杂关联SQL的优化

这篇讲的是如何将一个耗时 750ms 的复杂关联 SQL 优化到毫秒级的过程。作者从一个真实案例出发,通过分析执行计划,精准定位了性能瓶颈:一条只返回一行数据的查询,却因为驱动表选择不当和索引缺失,导致在两张表上发生了全表扫描。 优化过程分为两步走。首先,针对 `left join` 的 d 表添加了缺失的 `yh_id` 索引,使其扫描行数从 5 万多行骤降至 272 行。但整体耗时并未改善,因为优化器仍坚持选择 a 表作为驱动表。作者进一步深入分析,发现根本原因在于关联字段 `yh_id` 在 b 表上没有索引,导致优化器认为以 a 表驱动的代价更低。于是,第二步是为 b 表和过滤性极强的 c 表分别添加了 `yh_id` 和 `yh_dm` 索引。 索引齐全后,优化器终于“回心转意”,转而选择数据量更小、过滤条件更强的 c 表作为驱动表,执行计划彻底改变,查询时间从 0.75 秒直接降为 0.00 秒。这个案例清晰地展示了,优化复杂 SQL 不能只看单表索引,更要理清表间关联逻辑与数据分布,通过分析执行计划来引导优化器做出正确选择。

本机暂存
IT 开发者/ 2015-01-04 23:27:08 / 累计浏览 3,486

python数组使用说明

这篇文章系统梳理了Python中三种常用的序列类型:list、Tuple和Dictionary,并详细讲解了它们各自的定义方法、核心技巧与常用API。 文章首先厘清了三者的基本特性:list是动态链表,初始化后可以灵活增减元素;Tuple是固定长度的元组,一旦定义便不可更改;Dictionary则是基于键值对的哈希表,提供快速的数据检索能力。随后,作者分别深入展示了每种类型的具体用法。 对于list,文章重点演示了如何通过索引切片获取或删除多个元素,如何利用enumerate高效遍历,以及append、insert、pop等关键操作方法,还特别提示了列表复制时的引用与克隆区别。Tuple部分则简明介绍了其初始化、访问以及与列表的相互转换。Dictionary章节聚焦于其丰富的内置方法,如get提供安全的键值获取、keys/values/items用于遍历、update用于合并字典等,并说明了如何为同一个键赋值多个值。 这些内容的讲解都附带了清晰的代码示例,非常实用。文章最后帮助读者理解:当你需要动态调整集合内容时,list是首选;当需要确保数据不被意外修改时,可选Tuple;而当需要基于唯一标识快速查找数据时,Dictionary则最为高效。

本机暂存
IT 后端/ 2015-01-04 23:24:21 / 累计浏览 5,040

编程珠玑番外篇-Q 协程的历史,现在和未来

这篇讲的是协程这个概念如何从解决上世纪60年代一个具体工程难题中诞生,并在编程思想的变迁中沉浮的故事。 作者从COBOL编译器的编写困境出发,指出在依赖磁带存储、无法做中间文件随机读写的年代,词法与语法解析必须协同推进,这直接催生了“让出”与“恢复”控制流的协程思想。然而,协程在随后数十年并未成为主流命令式语言的“一等公民”,因为它与当时奉行的“自顶向下”设计哲学格格不入——在层次化的子过程调用范式下,协程独特的控制流切换机制显得无用武之地。 文章的核心观点在于,协程的复兴与现代动态语言(如Python)和异步编程的兴起密切相关。Python的生成器就是协程思想的典型体现,通过一个简洁的`yield`关键字,就实现了状态的保存与恢复,并能优雅地串联起复杂的数据处理流水线。作者认为,无论实现形式是“有栈”、“无栈”还是基于通道,其内核都是控制流的协同调度,这正是协程在并发编程和流处理中展现强大生命力的原因。 文章最后指出,随着硬件并行性能的提升和用户态任务调度模型的普及,协程这种轻量、高效的抽象正重新变得至关重要。理解其历史脉络,有助于我们更好地把握现代编程语言中各类协程模型设计的本质。

本机暂存
IT 后端/ 2015-01-04 23:21:53 / 累计浏览 4,726

关于FIN_WAIT1

这篇讲的是TCP连接关闭过程中FIN_WAIT1状态持续时间的问题。作者从TCPCopy社区的一个讨论切入,先通过经典的四次挥手流程图帮我们回忆TCP关闭的步骤,重点解释了主动关闭方在发出FIN包后所处的FIN_WAIT1状态。 文章核心是纠正一个常见误解:很多资料会说tcp_fin_timeout控制FIN_WAIT1的超时,但实际上这个参数控制的是FIN_WAIT2状态的持续时间。真正的关键参数是tcp_orphan_retries,它决定了当FIN包的ACK确认未收到时,系统会进行多少次重试。作者通过一个用netcat和iptables搭建的实验,清晰地展示了FIN包被丢弃后的重试行为——每次重试间隔翻倍(约200ms,400ms,800ms...),并引用了Linux内核源码来证明当tcp_orphan_retries设为0时实际生效值为8。 因此,对于线上出现大量FIN_WAIT1连接的服务器,解决方案很明确:根据网络状况适当调低tcp_orphan_retries的值。文章最后还延伸了一点,讨论了FIN_WAIT1状态可能被利用进行DoS攻击的风险,使话题更深入。

本机暂存
IT DevOps/ 2015-01-04 23:20:13 / 累计浏览 4,979

Kubernetes – Google分布式容器技术初体验

这篇讲的是作者对Google开源容器集群管理系统Kubernetes的初步体验。文章从分布式服务框架的配置管理、调度等核心需求出发,审视了Kubernetes如何解决这些痛点。 作者重点分享了几个关键概念的实际感受。比如,作为基本部署单元的Pod,以及通过Replication Controller实现自动化的实例管理与故障恢复——定义好副本数后,系统能自动维持服务实例的总量稳定。针对分布式系统的服务发现难题,Kubernetes的Service通过一个固定的虚拟IP来代理一组Pod,并解耦了具体的配置服务。 不过,体验过程并非一帆风顺。作者指出,目前Kubernetes版本迭代快、文档滞后,推荐新手直接使用GCE(谷歌计算引擎)环境以减少障碍。同时,他也客观指出了现有实现的一些局限,比如Service发现依赖环境变量、大规模服务下的iptables性能挑战,以及生产环境所需的高可用性仍有待验证。 总体来看,文章清晰地勾勒出了Kubernetes令人兴奋的设计理念与自动化能力,同时也坦诚地探讨了其当前阶段面临的环境易变性与成熟度挑战,为有意尝试的开发者提供了一份非常务实的体验报告。

本机暂存
IT 算法/ 2015-01-04 23:18:57 / 累计浏览 2,030

HLLC基数估算算法在腾讯数据仓库TDW中应用

这篇讲的是腾讯数据仓库TDW如何用一个巧办法,又快又省地计算海量数据里的“不同值个数”(基数)。背景很实际:传统精确去重在大数据面前太耗资源了。文章的核心方案,是引入了HLLC(HyperLogLog Counting)基数估算算法,并将其封装成一个极其简单的SQL聚合函数`est_distinct`。 文章不仅告诉你“是什么”,还深入拆解了“怎么做”。从HQL如何翻译成MapReduce作业,到Map端如何用一个64K桶的数组进行局部聚合,再到Reduce端如何合并数组并套用HLLC公式计算,整个过程图文并茂。其中的难点和巧妙之处在于内存管理:当数据分布不均、单个Key记录海量时,TDW采用“分而治之”策略动态分配内存块,并设计了专用的序列化(SerDe)方式来高效处理溢写到磁盘的Hash表片段,有效平衡了内存与IO开销。 最后通过实测对比给出了明确结论:在数据分布集中的较理想条件下,使用64K桶的HLLC估值计算(精度超99.4%),相比精确去重能带来数倍的效率提升。对于需要在大规模数据上快速获得近似唯一值计数的场景,这提供了非常清晰且可落地的实践参考。

本机暂存
IT 前端/ 2015-01-04 23:15:00 / 累计浏览 27,115

css3:box-shadow边框阴影属性值详解

这篇讲的是CSS3中`box-shadow`属性的完整用法。作者从自己U盘损坏、资料丢失的经历说起,引出了重新整理这篇属性详解文章的缘由。 文章核心围绕`box-shadow`展开,将其定义为“CSS模型边框阴影”,并详细拆解了其W3C规范中的每个参数值。从可选的`inset`(内阴影)开始,到必须设置的水平(`offset-x`)与垂直(`offset-y`)偏移量——作者用数轴坐标系进行了形象比喻。接着解释了`blur-radius`(模糊半径,值越大阴影越模糊)和`spread-radius`(扩展半径,正值扩大阴影,负值缩小)这两个控制阴影形态的关键值。 值得注意的是,文章不仅列出了属性语法,还提供了可交互的代码示例,直观展示不同参数组合产生的视觉效果。作者在序言中强调的“实践是检验真理的唯一标准”的学习态度,也贯穿了这篇注重实操的教程中。

本机暂存
IT 后端/ 2015-01-04 23:13:34 / 累计浏览 2,787

大规模Hadoop集群在腾讯数据仓库TDW的实践

这篇讲的是腾讯数据仓库TDW如何将多个小集群合并为单个超大规模Hadoop集群的实战。作者从集群碎片化导致的数据共享困难、资源利用率低以及运维成本高等痛点出发,剖析了从400台节点扩展到4000台时遇到的核心挑战——Hadoop的单点瓶颈。 为解决JobTracker的调度瓶颈,他们借鉴YARN和Corona,将计算引擎重构为三层架构。关键优化包括将单路心跳拆分为任务和资源两路心跳,引入细粒度的资源管理概念,并将调度模式从基于心跳的拉取变为ClusterManager主动下推。这使平均调度时间从80ms降至1ms,极大提升了扩展性与效率。 针对存储层的NameNode单点风险,TDW设计了“一主两热备”的高可用方案,通过日志同步保证热备节点能随时接管,将计划内服务停止时间从近2小时大幅缩短。 整个改造在未大幅变动外围调度系统的前提下,成功支撑了数千节点规模的单集群,体现了在工程复杂度与系统收益间的务实权衡。

本机暂存
IT 后端/ 2015-01-04 23:07:06 / 累计浏览 3,877

Feed消息队列架构分析

这篇讲的是微博为应对实时Feed流挑战而构建的消息队列架构。作者从数据流处理从离线走向实时的行业趋势切入,详细拆解了支撑海量社交信息流的底层架构。 核心是一个由三部分构成的体系:中间是feed主流程处理,通过MQ worker异步写入缓存和数据库,完成核心的削峰填谷;左侧是流式计算,用于大数据实时分析;此外还有负责多机房数据同步的“虫洞”模块。整个系统建立在几个关键单元上:单机队列MQ、支持一对多投递的统一通道Firehose(具备基于社交关系的fan-out能力),以及无状态的Worker。 架构设计上,文章强调了其高实时性(要求100ms内处理完成)、线性可扩展性与超高可用性(99.999%)。最后,文章还对比了LinkedIn Databus、Apache Storm和Kafka等技术路线,解释了为何其业务主动写入事件的方案在复杂分库场景下,比数据库触发方案更具原子性和简洁性。

本机暂存
IT 数据库/ 2015-01-04 23:05:15 / 累计浏览 1,735

NUMERIC和DECIMAL的区别是什么?

这篇讲的是SQL Server中两个容易混淆的精确数值类型:NUMERIC和DECIMAL。文章开篇就点明,在功能上它们是完全同义的,都用于精确存储数值,最大精度都是38位,主要区别体现在类型定义的细微处。 核心差异在于精度(p)和小数位数(s)的约束关系:对于decimal(5,2)这样的定义,p=5代表总位数(小数点左右数字之和),s=2指定小数位数。文章特别强调,p和s必须满足 0 ≤ s ≤ p ≤ 38。另一个关键点是,在Transact-SQL看来,decimal(5,5)和decimal(5,0)会被视为不同的数据类型,这种对精度组合的严格区分影响着存储和计算。 在数据转换方面,文章给出了明确的警示:从decimal/numeric转换到float/real会导致精度损失,而从整数或货币类型转换过来则可能引发溢出。这些细节对于设计需要严格数值一致性的金融或科学计算系统尤为重要。 总的来说,这篇文章厘清了这两个类型的表面相似与本质联系,适合所有需要处理精确数值的数据库开发者,帮助他们在定义表结构时做出更清晰、无歧义的选择。

本机暂存
IT 开发者/ 2015-01-04 23:02:00 / 累计浏览 7,390

树莓派(Raspberry Pi)使用小记

这篇讲的是一位硬件门外汉从零开始折腾树莓派(Model B+)的实战记录。作者从淘宝采购全套配件讲起,详细分享了在Mac和Windows双系统下烧录Raspbian镜像时遇到的卡点(比如读卡器识别问题),并给出了具体的解决方案。 文章的核心价值在于其“踩坑”后的经验提炼:作者强烈建议先组装好亚克力外壳再连接网线,以保证连接稳定;在配置无线网卡环节,他指出若执行常规的`ifup wlan0`命令无效,可以尝试用`sudo /etc/init.d/networking restart`重启网络服务,并附上了亲测有效的配置教程链接。 整个流程从SSH首次登录(默认用户名pi/raspberry)、运行`raspi-config`扩展分区与修改密码,到最终实现无线网络连接,步骤清晰,提供了路由器后台查IP、终端命令操作等具体截图。对于想低成本上手Linux硬件开发的爱好者,这些从自身实践中总结的细节和排障思路,能有效缩短点亮树莓派的摸索过程。

本机暂存
IT 后端/ 2015-01-04 23:00:49 / 累计浏览 8,738

Feed架构-我们做错了什么

这篇讲的是微博技术团队在Feed架构演进中的一次坦诚复盘与反思。作者从团队过去几年成功解决的工程挑战切入——包括通过冷热分区设计应对长尾数据访问、利用数据库拆分实现存储扩展、依托缓存分级支撑百万级QPS,以及建设高可用的SLA体系。 但文章的重点不在这些成就,而是深入剖析了基于用户关系的分发架构在用户侧引发的“信息过载”问题。核心观点是:架构在解决了可扩展性与性能问题后,却造成了内容组织与消费效率上的新瓶颈。具体表现为:当前架构天然基于用户关系维度组织数据,这很难服务于更高效的“兴趣阅读”需求;同时,低质内容识别、实时反垃圾算法仍面临巨大技术挑战;此外,社交关系带来的“可解释性”要求(用户期望看到好友内容)也与纯粹的算法排序存在矛盾。 作者通过这次复盘,揭示了一个关键认知:Feed架构的难题已从纯粹的后端扩展性问题,转向了如何通过技术更好地理解与满足用户兴趣,同时平衡产品体验的复杂层面。这对于思考推荐系统与社交产品架构的未来方向,提供了很有价值的视角。

本机暂存