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

最新文章

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

IT 算法/ 2013-09-04 22:57:02 / 累计浏览 3,584

趣题:把比萨分成若干等份使得至少有一份不含边

这篇文章讲的是一个看似简单的比萨分割挑战:如何把一个圆形比萨分成若干全等的部分,同时确保至少有一块完全不包含披萨的“边儿”(即圆周)。问题本身很有画面感,立刻能引发读者的动手兴趣。 作者从问题出发,展示了两种巧妙的几何解法。第一种方案通过弧线将圆分割成12个全等的“鱼尾形”小块,其中有6块完全不含圆周。不过,这种方案有个特点:某些部分需要经过翻折才能与其他部分完全重合。 紧接着,文章提出了一个更苛刻的递进问题:是否存在一种方案,让所有小块不仅能全等,而且仅通过旋转和平移(无需翻折)就能彼此重合?作者给出了肯定的答案,通过更复杂的弧线切割与排列,实现了这一目标。两种方案的对比,清晰地揭示了问题中“全等”在不同操作限制下的实现难度差异。 这篇文章通过一个趣味盎然的几何谜题,巧妙地展示了对称、旋转与平移在分割问题中的应用。它让读者看到,即使是“分比萨”这样的生活场景,也能引出严谨而有趣的数学思考。

本机暂存
IT 算法/ 2013-09-02 13:33:02 / 累计浏览 2,792

数据映射–有序数组

这篇讲的是有序数组作为一种基础数据结构,在实现快速映射查找时的基本原理与技术特性。作者从二分查找需要的两个核心前提——数据有序和可快速取中值——切入,通过一个具体例子(如从有序集中查找4对应的数据),演示了如何通过折半排除逐步定位目标,并解释了其对数级时间复杂度 O(log2N) 的惊人效率。 但文章并未止步于算法演示,而是深入分析了这种简单结构在实际作为存储映射方案时的各项表现。它支持高效的范围查找,但在处理动态插入时会遇到巨大瓶颈,因为保持有序性意味着每次插入可能需要移动大量数据,写入代价极高。同时,纯粹的数组结构并不面向磁盘优化,其二分查找过程依赖的随机读取对磁盘性能是严峻挑战。 作者最后总结道,选择数据结构需基于具体场景,没有绝对的好坏,只有是否合适。这种从基础算法延伸到系统设计考量的分析,为理解存储产品的内部取舍提供了一个清晰的起点。

本机暂存
IT 算法/ 2013-09-02 13:32:31 / 累计浏览 2,212

数据映射–映射概述

作者从“映射”这一计算机基础数据结构出发,梳理了从CPU到文件系统无处不在的映射关系。文章首先明确了映射的数学定义,并列举了它在查找文件、网络数据、数据库记录等场景中的关键作用。 接着,作者用一组简单对应(如2->4, 1->2)作为示例,对比了三种实现映射的方式:使用集合(如数组)存储键值对、定义一个数学函数、以及编写穷举算法。文章指出,后两种方式因需理解数据规律或硬编码而适用性有限,从而将讨论聚焦于更通用的集合类数据结构。 为了优化最基础的数组线性遍历效率低下的问题,文章深入介绍了两种核心的查找算法:要求数据有序的二分查找(时间复杂度O(log₂N)),以及利用哈希函数实现近乎O(1)效率的哈希查找。作者以哈希查找为例,解释了如何通过键值计算快速定位,并详细说明了“哈希碰撞”问题及使用链表解决的常见方法。 最后,文章总结道,不同的应用场景(如是否需要范围查询、自动扩展、磁盘存储或并行处理)将决定对映射集合的具体技术选择,而这些底层选择正是各类数据库性能差异的根源。

本机暂存
IT 数据库/ 2013-09-02 13:31:54 / 累计浏览 4,251

从需求出发来看关系模型与非关系模型–关系模型与非关系模型概述

这篇讲的是关系模型与非关系模型的选择根源。作者从当前对 NoSQL 的盲目追捧现象切入,指出许多项目初创团队都在纠结如何选择 NoSQL,却忽略了模型本身的本质。 文章的核心是帮读者理清 RDBMS、NoSQL、CAP、BASE 这些概念的本源,并用一个“车”的例子清晰地对比了层次模型和关系模型的差异。关键在于,关系模型通过集合运算抽象了数据“关系”,让用户无需像层次模型那样关心从“车”到“轮子集合”再到“具体轮子”的存取路径,只需关注查询逻辑本身,这使得它严谨且被广泛接受。 然而,随着面向对象编程的普及,关系模型带来了“阻抗失配”问题——将对象中的继承、组合映射到关系表变得非常痛苦。为解决此问题,业界尝试了 ORM 工具、在数据库层支持对象,以及利用脚本语言的动态特性来简化映射。这些方案各有代价,ORM 学习成本高且易导致低效查询,而用 Map 则会破坏封装性。 随着互联网发展,对高性能和灵活数据结构的需求,让层次模型的变种——NoSQL 重新受到关注。文章接下来将从具体应用场景出发,剖析关系模型在哪些地方力不从心,以及 NoSQL 为何又能满足新的需求。

本机暂存
IT 数据库/ 2013-09-02 13:30:54 / 累计浏览 1,670

Solr之缓存篇

这篇讲的是Solr搜索引擎中“看不见”却至关重要的性能支柱——缓存系统。作者没有停留在配置层面,而是直接钻进源码,剖析了Solr四种核心缓存(filterCache、documentCache等)的生命周期是如何被 `SolrIndexSearcher` 牢牢掌控的。 文章清晰地展示了,一次索引提交(commit)如何像一个开关,触发 `getSearcher()` 方法关闭旧的 `IndexReader`,并构建新的 `SolrIndexSearcher`。而新的Searcher一旦构建,它所管理的所有缓存实例便会随之重建。这意味着缓存并非永久存在,其生命周期与底层的索引阅读器严格绑定。 更巧妙的部分在于“预热”机制的设计。文章通过代码片段揭示,当新Searcher被构建时,系统会在后台线程中将老缓存中的热点数据预先加载到新缓存中。这个过程有效避免了缓存“冷启动”带来的性能断崖,确保了搜索服务在索引更新后的平滑过渡。这种从实现原理出发的解读,让读者不仅能配置缓存,更能理解其背后的运行逻辑与优化思想。

本机暂存
IT DevOps/ 2013-09-02 13:30:13 / 累计浏览 3,721

关于Rsyslogd 的一些配置 (高性能、高可用 rsyslogd)

这篇讲的是作者公司日志传输服务器因带宽调整引发的日志堵塞实战。他们遇到的情况是,业务通过PHP syslog接口写日志时被“卡住”了,根源在于rsyslog默认配置追求“不丢任何数据”,但当传输链路异常时,队列堆积反而拖垮了业务。 排查发现,原有配置仅有基础传输逻辑,进程、队列、传输效率等关键参数全部使用了默认值。这种配置在理想环境下能运行,一旦出现网络波动或突发流量就暴露出问题。文章分享了如何通过调整队列参数来破解困境:例如定义`$MainMsgQueueFilename`和`$MainMsgQueueMaxDiskSpace`来控制磁盘队列大小,利用`$QueueHighWatermark`触发磁盘存储,并通过`$MainMsgQueueDiscardMark`与`$MainMsgQueueQueueDiscardSeverity`配合实现有策略的消息丢弃,避免业务被阻塞。 作者还附上了关键配置的截图和几份深入阅读的官方文档,特别是关于rsyslog队列机制的那篇。此外,文末也提及了RELP(可靠事件日志协议)等更健壮的传输方案,以及社区开发的syslog-safer工具作为补充。这是一次从故障现象到配置调优的完整经验梳理,对于使用rsyslog的日志架构很有参考价值。

本机暂存
IT 算法/ 2013-09-02 13:28:14 / 累计浏览 4,576

数据映射–平衡二叉有序树

这篇讲的是如何用平衡二叉排序树高效实现数据映射。作者从很多人觉得二叉树“有什么用”的困惑出发,指出其核心价值在于构建一种既能快速查询、又能灵活更新的映射结构。 文章的核心在于阐释平衡二叉排序树如何“麻雀变凤凰”。它在普通二叉排序树的基础上增加了“平衡”条件(左右子树高度差不超过1),使其树高维持在O(log2N)。这直接对应了二分查找的时间复杂度——父节点恰好是左右子树的“中值”,使得查询可以快速排除一半数据。与上周讨论的有序数组相比,两者查询效率相当,但关键差异在于更新能力:数组不支持高效插入,而平衡树通过指针调整(如旋转)即可保持有序与平衡,更新代价同为O(log2N),Java中的TreeMap就是基于此的红黑树实现。 最后,作者从工程视角全面评估了这种结构:它支持范围查找(通过中序遍历)和自动扩展,内存占用通常优于自动扩容的数组。但也明确指出了短板:因指针跳跃特性,它不是面向磁盘的结构;且在调整结构时难以保证原子性,因此并行处理能力较弱。整篇文章通过清晰的对比和特性分析,将经典数据结构与实际应用紧密结合。

本机暂存
IT 移动开发/ 2013-09-02 13:15:49 / 累计浏览 2,833

[Android]用WebView访问证书有问题的SSL网页

这篇讲的是在Android开发中,使用WebView加载SSL证书有问题的网页时,如何绕过其默认的安全拒绝机制。核心问题在于,当网页证书过期、不正确或不被信任时,WebView会直接阻止页面加载,不像PC浏览器会弹出警告让用户选择。 要解决这个问题,关键在于重写WebViewClient的onReceivedSslError()方法。作者指出了一个极易踩坑的细节:在重写的方法里,必须直接调用handler.proceed()来忽略错误继续加载,并且**千万不要**调用super.onReceivedSslError()。这是因为父类的实现中包含了handler.cancel(),会导致加载失败,甚至可能引发段错误崩溃。 通过这个简单但实用的技巧,开发者就能让WebView加载那些因证书问题被系统拦截的网页,这在开发调试或处理特定网络环境时非常有用。

本机暂存
IT 算法/ 2013-09-02 13:14:59 / 累计浏览 2,573

五种常用基数估计算法效果实验及实践建议

这篇讲的是作者对五种常用基数估计算法——Linear Counting、LogLog Counting、Adaptive Counting、HyperLogLog Counting和HyperLogLog++ Counting——进行的系统性实验对比。作者依托团队的开源库ccard-lib,在均匀哈希的数据集上,对它们在不同数据规模下的估计误差、内存占用及收敛速度进行了详尽的图表化展示。 实验揭示了每种算法独特的性能区间与权衡。例如,Linear Counting在基数较小时精度高但内存消耗大;而HyperLogLog++在处理海量数据时展现了卓越的稳定性与空间效率。文章不仅直观呈现了算法从理论走向实践时的表现差异,更基于这些一手数据,提炼出了极具参考价值的选型与调优建议。 如果你正在为特定业务场景(如实时流统计、大规模日志分析)选择基数估算方案,或是想理解不同算法在工程实现中的真实效能,这篇结合了定量实验与实用结论的深度对比,能为你提供清晰的技术路线参考。

本机暂存
IT 设计/ 2013-09-02 13:10:22 / 累计浏览 3,580

产品汪想跳槽

这篇谈的是产品经理遇到职业瓶颈时,该不该跳槽的经典困境。作者从三封真实来信切入,这三位产品汪的痛点各有不同:有的苦于薪资倒挂和决策权缺失,有的被僵化的考核制度和团队氛围拖垮,还有的因为短期经历过多而陷入自我怀疑。 作者没有直接给出“跳或不跳”的答案,而是点出了问题的核心:产品汪的成长极度依赖“好项目环境”——项目合理、资源到位、上司懂行。但这类环境在整个行业中占比可能不到30%。许多有潜力的产品人并非天赋不足,而是被糟糕的管理、不懂产品的上司和消耗性项目给废掉了。 文章也提醒,来信中呈现的多是“一面之词”。产品决策高度依赖经验与直觉,冲突在所难免。与其断定上司愚蠢,不如尝试像作者的朋友那样,抛开立场,理性对比方案,或许会发现自己与上司的判断本就一致。最终,这篇文章提供的不是解决方案,而是一种更冷静的思考框架:在冲动离职前,先理性评估环境是否真的已无成长空间,以及自己是否已尽力沟通与适应。好的选择,往往伴随着痛苦的思考过程。

本机暂存
IT 后端/ 2013-09-02 13:07:02 / 累计浏览 2,013

阅读.NET源代码那些事

这篇讲的是如何通过直接阅读.NET框架源代码,来深入理解其内部实现机制。作者以自己在项目“Tmc”中借鉴BCL代码的经历为例,指出虽然.NET大部分组件不开源,但微软已公开了参考源代码库,并保持与版本的同步更新。 文章重点对比了反编译工具(如.NET Reflector)与直接阅读源代码的差异。作者指出,反编译会丢失变量名、注释等关键信息,而源代码中保留的详细注释,例如Hashtable实现中关于哈希算法选择的说明,更能清晰揭示设计思路和实现背景。 作者还通过Dictionary类的代码实例,揭示了一个巧妙的实现细节:在特定编译条件下,当插入操作的哈希碰撞次数超过阈值,Dictionary会随机化其比较器。这一机制正是为了应对曾引发安全关注的哈希碰撞DoS攻击,展现了框架在安全与性能上的权衡。 最终,作者将这些源于阅读源代码的经验应用到自己的项目中,通过参考和修改BCL代码来构建自定义的HashDictionary,证明了这种方法在提升代码质量与理解深度上的直接价值。

本机暂存
IT 设计/ 2013-09-02 13:05:11 / 累计浏览 1,984

产品的可用性、易用性、高效性

这篇文章探讨了产品设计中一个常被忽视的层次优先级:实用功能先于易用流程,易用流程又先于美观愉悦。作者从一个核心矛盾切入——为什么“丑”产品反而拥有大量用户,并以此构建了产品价值的递进框架。 首先,文章强调“可用性”是产品的及格线。在RSS阅读器的例子中,这意味着产品必须能顺畅地帮助用户完成阅读文章这一核心任务,界面的华丽与否在此阶段是次要的。接着,“易用性”是优化的重点,旨在减少操作步骤、提升效率,例如通过权重设置让用户更快获取重要内容。最后,“高效性”(文中对应“愉悦性”)才是追求卓越的关键,它关注视觉协调、交互顺滑带来的整体美感,是那决定成败的最后“25分”。 作者用60分、75分到100分的比喻,清晰地勾勒出产品价值的阶梯:先确保“能用”,再追求“好用”,最终抵达“令人愉悦”。这为设计师和产品经理提供了一个务实的评估路径,提醒我们在沉迷于像素级的美化之前,应先回归用户的根本任务。

本机暂存
IT 数据库/ 2013-09-01 21:54:25 / 累计浏览 5,907

nosql数据库选型

作者翻阅了《七天七数据库》一书后,结合自身多个项目从MySQL迁移到NoSQL的实际需求,分享了一套具体的数据库选型方案。他指出,不同的业务场景需要不同的数据库来发挥最大价值。 对于社区网站中复杂的关系数据(如用户关注、图片关联),他摒弃了传统关联表,选择了原生支持图关系的Neo4j,这不仅简化了数据模型,也提升了查询性能和开发体验。而面对网站丰富且结构多变的内容模型(如用户、站点),他看中了MongoDB对复杂索引查询的良好支持,认为其能完美替代MySQL的大多数功能,并可能简化缓存层,甚至取代部分Redis的角色。 在处理高写入、弱一致性要求的微博本地缓存时,他对比后认为Cassandra在写性能和可用性上优于MongoDB。对于极高并发的API服务,他则在Cassandra和Riak之间权衡,前者在列式存储和写性能上可能更具优势。 整篇文章从具体业务痛点出发,详细对比了不同NoSQL数据库在一致性、查询能力、性能及运维复杂度上的关键差异,并给出了清晰的选型结论。这为同样面临类似技术过渡的开发者,提供了一个非常实用且可参考的架构思路。

本机暂存
IT 算法/ 2013-08-29 13:42:02 / 累计浏览 3,424

Reddit排名算法工作原理

这篇讲的是Reddit两大排名算法的实现原理——文章热榜与评论置顶,它们背后的数学逻辑截然不同。 文章排名算法旨在让新内容快速脱颖而出。它用对数函数弱化后期高票数的权重,使得前10票的影响力堪比后续100票,这让早期获得一定认同的内容能迅速升至顶部。同时,算法将提交时间直接纳入公式,新提交的文章天然享有更高的初始分数,确保社区内容的时效性。有趣的是,该算法对争议性内容“不友好”,因为得票数计算为净赞数,导致高赞高踩的激烈讨论反而可能排名靠后。 评论排序则采用了完全不同的“信任评级”算法。它由xkcd作者提出,基于统计学中的Wilson得分区间,旨在找出最受读者信任、而不仅是最早出现的评论。该算法将投票视为对真实支持率的一次抽样,即使投票数少,也能给出一个相对可靠的置信评分。这种设计巧妙地忽略了发布时间的影响,让一条优质评论无论何时提交,都有机会在获得足够投票后登顶。 两种算法体现了不同的设计目标:文章算法追求社区活跃度与新内容的曝光,评论算法则致力于挖掘经得起数据验证的最佳讨论。

本机暂存
IT 算法/ 2013-08-29 13:36:59 / 累计浏览 7,533

Hacker News 排名算法工作原理

这篇深入剖析了Hacker News标志性的排名算法。作者从HN开源代码中提取出核心公式:得分 = (投票数-1) / (提交时间+2)^比重。这个简洁的公式,通过“比重”参数G(默认值1.8)巧妙地平衡了热门内容和时效性——G越大,老内容得分衰减越快,新文章越容易获得曝光。 文章不仅解读了公式,还通过Wolfram Alpha绘制的曲线图,直观展示了时间T和比重G如何影响分数衰减。它进一步揭示了算法中针对不同类型内容(如无链接帖子、轻量级内容)的系数调整,以及如何用Python几行代码实现它。最后,文章还附上了Paul Graham公布的、更为复杂的修正版算法,展示了实际工程中的权衡。 这篇文章的价值在于,它拆解了一个看似简单却极其有效的排名系统,揭示了如何用数学方法同时解决内容冷启动和热度衰减这两个社区产品的核心难题,对任何想构建内容推荐或排序系统的人都有直接的启发。

本机暂存
IT 前端/ 2013-08-29 13:34:04 / 累计浏览 2,869

设置双核浏览器的浏览模式

这篇讲的是前端开发者长期以来的一个“幻想”——双核浏览器能否智能识别页面技术,自动切换到更适合的内核。作者从一个知乎问题出发,发现不少开发者都期望浏览器能自动处理CSS3兼容性,但现实中多数双核浏览器并无此“智能”。 文章的核心发现在于,虽然自动识别不普遍,但开发者可以主动“告知”浏览器。具体来说,以360安全浏览器6.5版本为例,只需在网页的``标签内添加一行``代码,即可强制使用极速(Webkit)内核渲染页面。`content`属性支持`webkit`、`ie-comp`和`ie-stand`三个值,分别对应极速、兼容和IE模式。 作者实测该方法有效,但也指出一个小缺陷:修改代码后需要刷新页面才能生效。文章最后提到搜狗、QQ等浏览器尚未跟进此特性,并呼吁它们支持,以惠及更多用户。这篇短文为开发者提供了一个明确、可操作的兼容性配置方案。

本机暂存
IT 后端/ 2013-08-29 13:28:42 / 累计浏览 1,707

erlang和其他语言读文件性能大比拼

这篇讲的是不同语言在处理大文件读取时的性能较量,主角是Erlang。作者从公司一次技术比武的真实案例出发——有同事用Erlang处理1.1GB文本的词频统计耗时55秒,而用C只需2.6秒,Java为3.2秒——引出了一个普遍疑问:Erlang读文件真的这么慢吗? 为了重新验证,作者准备了一个1GB的测试文件,详细对比了多种读取策略的性能。数据很有说服力:在单线程缓冲读取模式下,Erlang耗时0.322秒,与C语言的dd命令(0.264秒)处于同一量级;而启用多线程并发读取后,耗时缩短至0.214秒,性能甚至超越了C语言。但反例也很明显,如果以4KB小块读取,耗时会骤增至3.56秒,性能急剧下降。 文章揭示了性能差异背后的核心机制:Erlang的文件IO通过efile驱动实现,本质是轻量级的C封装,但每次操作都涉及“发消息→驱动执行→等待结果”三个阶段。这种设计在IO操作粒度过小时,消息传递开销会被放大,违背了Erlang“小消息,大计算”的原则。因此,性能的关键在于使用大块缓冲区读取,并充分利用异步线程池并行化IO,从而将Erlang的IO性能推到理论极限。

本机暂存
IT 后端/ 2013-08-29 13:27:39 / 累计浏览 5,025

遭遇php的in_array低性能

这篇讲的是 PHP 中 `in_array` 函数的一个性能陷阱。作者从一次真实的接口优化经历出发,发现将重复的缓存读取移出循环后,接口响应时间虽从 5 秒降至 2 秒,但仍未达到预期。通过编写测试代码重现,问题被定位到 `in_array` 函数本身。 性能杀手在于 `in_array` 默认的“松散比较”模式。当数组元素和待查找值均为“字符串型的数字”时,PHP 引擎会尝试将它们转换为长整型再进行比较。这个过程中频繁调用 `strtol` 系列库函数,消耗了大量时间,导致仅 3000 次循环就耗时超过 1 秒。 解决办法很简单:为 `in_array` 添加第三个参数 `true`,启用严格比较模式,同时比较值与类型。这避免了 PHP 内部不必要的类型转换,性能因此提升数倍,测试用例的执行时间从 1.132 秒骤降至 0.267 秒。文章通过 `strace` 和 `ltrace` 工具深入剖析了问题根源,对于处理大量数据的 PHP 开发者而言,这是一个值得警惕的细节。

本机暂存
IT 开发者/ 2013-08-28 22:22:29 / 累计浏览 6,793

在命令行快速切换目录

这篇讲的是如何告别在命令行中反复输入冗长的 `cd` 路径。作者从日常开发中频繁切换到 `~/some/very/deep/often-used/directory` 这类深层目录的痛点出发,分享了一个通过修改 shell 配置文件来实现的“目录书签”方案。 核心思路是利用 `mark` 命令为当前目录创建一个别名,之后只需输入 `g 别名` 即可瞬间跳转。此外,`gs` 命令可以一览所有已标记的目录。实现上非常巧妙,作者在 `/etc/profile` 文件尾部添加了一组 shell 函数,包括 `g`(跳转)、`mark`(标记)、`unmark`(取消标记)和 `gs`(列表),并利用 `ln -s` 创建符号链接来持久化这些书签,最终还为 `g` 命令配置了命令行补全功能。 这个方案完全用原生 shell 脚本实现,无需安装额外工具,却能极大提升在复杂目录结构中导航的效率。对于经常在终端工作的开发者来说,花几分钟配置一下,就能永久解决路径切换的烦恼。

本机暂存
IT 设计/ 2013-08-28 22:19:28 / 累计浏览 1,813

移动用户体验设计新要素

这篇讲的是,如何将经典的动画艺术原则,巧妙转化为移动用户体验设计的利器。 作者从移动端场景切换中动效处理的难题出发,指出好的动效不仅是装饰,更是传达层级、引导操作的关键要素。文章的核心,是引入了迪士尼动画大师Ollie Johnston和Frank Thomas在其著作《动画的生存法则》中总结的12条基本原则,并论证了这些源于影视动画的原则在今天移动界面上的全新价值。 例如,文章通过对比Flipboard的“硬质”翻页与iBooks的柔性翻页,生动阐释了“挤压与拉伸”原则如何定义元素的物理质感;又以相机App的拍照预备动画为例,说明“预期”原则如何为用户提供操作线索。它强调,恰当运用这些原则,能让界面过渡流畅、层级清晰,甚至带来愉悦感;反之,过度或夸张的动效则会破坏体验。 因此,这篇文章不仅是在推荐一套经典理论,更是在为UX设计师提供一套可操作的“动效心法”。它告诉你,理解动画的原则,是精妙运用动效、提升移动端体验质感的第一步。

本机暂存