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

最新文章

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

IT DevOps/ 2013-10-29 23:03:22 / 累计浏览 3,289

代码审查不是用来……

这篇文章讲的是代码审查在实践中常被误用的几个典型姿势。作者从自己公司的长期实践出发,总结了四个容易让代码审查变味的陷阱。 首先,别把代码审查当成控制代码的流程关卡。在团队内部,信任比强制审批更重要,流于形式的审查只会引发抵触。其次,它不该是追究责任的审判厅,揪出某个审查者来背锅会彻底摧毁团队的信任。第三,不要将其变为程序员必须完成的枯燥任务,这会扼杀其作为学习与交流机会的乐趣。最后,对代码的批评应当对事不对人,避免演变成互相讽刺的人身攻击。 文章指出,代码审查的真正价值在于促进学习、获得反馈与团队交流。作者通过具体场景描述了这些误区如何发生,旨在提醒团队避开这些坑,让审查回归提升代码质量与团队协作的正途。

本机暂存
IT 后端/ 2013-10-29 23:02:33 / 累计浏览 4,003

Web 开发程序员谈网游服务器开发

这篇讲的是作者在参加一次网游开发团队交流后的思考。他敏锐地捕捉到,传统网游服务器开发因逻辑与存储高度绑定,往往忽视了动态扩展与容灾能力,而这些恰恰是Web开发领域的强项。 作者的核心观点是,网游服务器可以借鉴Web架构的“服务无状态化”原则。关键在于将服务拆分为“逻辑(指令)”和“存储(状态)”两部分。一旦逻辑层本身无状态,就能像典型的Web应用(如PHP + MySQL)一样,实现服务器的弹性增减。即使面对“用户切换服务器后状态丢失”这类网游特有疑问,通过分离设计和将存储层集群化,同样能构建出高可扩展、高容灾的系统。 这个视角为游戏后台架构提供了一条清晰的优化路径:用Web成熟的工程思想,去解耦游戏服务器的紧耦合状态。

本机暂存
IT DevOps/ 2013-10-29 23:01:45 / 累计浏览 24,415

Bash的模式和配置文件加载

这篇讲的是Bash启动时如何加载配置文件的“冷知识”,作者坦言自己早年也一知半解,于是从`man`手册出发,把这个绕人的机制捋清楚了。核心在于理解运行中的Bash有两种“模式”:交互式(是否直接与终端对话)和登录式(是否作为用户登录会话的起点)。两者独立组合,决定了启动时加载哪些文件。 文章清晰列出了加载路径:登录Shell会依次尝试`/etc/profile`、`~/.bash_profile`等;而交互式非登录Shell则主要加载`~/.bashrc`。这些规则直接解释了日常中的两个典型困惑:为什么在`crontab`里配置的环境变量常常不生效?因为非交互、非登录的Shell压根不会加载这些配置文件。同样,为什么在Mac终端里修改`~/.bashrc`没反应?因为它的终端默认启动的是登录Shell(`$0`以`-`开头),本应配置`~/.bash_profile`,而不像某些Linux发行版那样在`~/.profile`里隐式地加载了`~/.bashrc`。 搞清楚这个加载逻辑,就能精准定位Shell脚本的环境问题,无论是定时任务还是跨平台开发。作者用亲身踩坑的例子把这份“手册知识”讲得生动实用,帮读者建立起正确的心智模型。

本机暂存
IT 算法/ 2013-10-29 23:00:59 / 累计浏览 14,153

二维码的生成细节和原理

这篇讲的是二维码背后的生成细节和原理,带读者像解密一样,拆解这个日常生活中处处可见的“黑方块”。作者从QR Code能存储字符、数字、中日文等丰富信息的特点入手,指出其生成过程犹如一套精密的编码与纠错算法。 文章系统梳理了二维码从结构到编码的完整流程。它首先解释了二维码的40个版本尺寸及其矩阵构成,然后详细剖析了用于定位的图案、存放格式信息的区域,以及核心的数据码与纠错码区域。重点在于数据编码部分,文章对比了数字、字母数字、字节、日文(Kanji)等不同模式的编码规则与转换过程,并用“HELLO WORLD”等实例具体演示了如何从文本一步步转换为二进制序列。 此外,文章还揭示了二维码能够部分破损仍可识别的关键——纠错码机制,介绍了L、M、Q、H四种纠错级别的不同容错能力。整体而言,这是一篇深入底层原理的技术解读,将二维码的生成拆解为清晰的步骤,适合希望理解“扫一扫”背后发生了什么的读者。

本机暂存
IT 算法/ 2013-10-29 12:24:22 / 累计浏览 2,430

怎样把一个钝角三角形分成若干个锐角三角形

这篇讲的是一个经典的几何谜题:能否把一个钝角三角形分割成若干个锐角三角形?文章从这个引人入胜的问题出发,带读者经历了一场从直觉尝试到严谨证明的思维旅程。 作者首先指出,单纯尝试划分很难成功,关键在于必须从钝角内部引线,并且这条线在中途分岔。他以一个顶角108°的等腰三角形(由正五边形构造)为例,给出了一个确切可验证的分割方案。 但这仅解决了“某一个”钝角三角形的问题。更关键的是,任意钝角三角形是否都能如此分割?文章接着介绍了1960年Wallace Manheimer提出的通用解法:利用内心和内切圆,可以将任意钝角三角形稳定地分为7个锐角三角形。 有趣的故事还未结束。1961年,Verner Hoggatt Jr. 提出了一个更强的结论:不仅能分成锐角三角形,还能分成全是等腰的锐角三角形!他利用以内心和顶点距离为半径的圆进行构造,并巧妙地处理了初始条件不满足的情况,最终证明总能将任意钝角三角形分为不超过8个等腰锐角三角形。 文章最后还延伸讨论了“一个正方形最少能分成多少个锐角三角形”这个问题,提到了马丁·加德纳的思考以及它作为国际数学奥林匹克候选题的历史,展现了数学趣题背后严谨而迷人的推导逻辑。

本机暂存
IT 后端/ 2013-10-29 12:23:14 / 累计浏览 23,594

一种常见的并发编程场景的处理

这篇讲的是并发编程中一个容易被忽略的典型场景:当一个“守护线程”提供共享资源,多个业务线程频繁读写,而主线程仅偶尔需要介入(比如统计数据、做快照)时,如何设计才能兼顾性能与数据安全? 文章指出,如果主线程和业务线程使用同一把锁(如 `synchronized`),在绝大多数(99.9%)主线程不介入的时间里,业务线程之间会产生不必要的锁竞争,拖累性能。作者给出的方案是引入 `AtomicBoolean` 和 `AtomicInteger` 两个原子变量(volatile 变量的实现)来协调状态:一个标志主线程是否正在独占操作,另一个统计当前正在写入的业务线程数。这样,业务线程只需在主线程介入时等待,而彼此之间几乎无需竞争锁,从而在大多数时间里实现近乎无锁的并发写入。 文章以 `ConcurrentHashMap` 为例给出了核心代码,并坦承在 Java 中这点性能差异或许可以忽略,且方案本身有一定复杂度。但作者认为,这种在“性能和数据保护之间寻求最大平衡”的设计思路,其实践意义是利大于弊的。

本机暂存
IT 设计/ 2013-10-29 12:21:06 / 累计浏览 2,803

如何有效避免大量重复的switch分支

这篇文章从一个典型的C语言编程场景切入:代码中需要根据类型(如图形形状)调用不同函数,导致出现冗长的switch-case分支。作者结合学习设计模式的体会,尤其是DRBD源码分析的经验,展示了如何利用表驱动编程模式来重构这类代码。 核心对比在于两种优化路径:首先,是通过定义一个包含类型和函数指针的“基类”结构,让不同形状的对象“符合”该结构,从而在循环中直接通过函数指针调用,跳过了显式的switch判断。但这引入了类型强转和运行时错误的风险。 更进一步,文章介绍了经典的表驱动方法:维护一个函数指针数组(调用表),以类型作为索引。代码通过`*(d + (b + i)->t)`直接从表中取出并执行对应的函数,彻底消除了分支判断逻辑,让流程更为清晰高效。不过,作者也坦诚指出,这种方式虽然简洁,但在可读性上有所降低。 因此,这类重构适合在分支逻辑复杂、追求执行效率且愿意为性能适度牺牲直接可读性的场景。文章的价值在于具体演示了从“条件分支”到“数据驱动”的思维转换,为处理类似多态调用问题提供了实用的C语言解决方案。

本机暂存
IT 开发者/ 2013-10-23 12:59:38 / 累计浏览 2,732

代码重构方向原则指导

这篇讲的是,当代码重构没有像“消除代码异味”那样现成的、明确的方向时,开发者可以遵循哪些具体的原则来指导决策。作者将重构比作爬山,指出在缺乏明显路径时,我们常陷入罗列更多“坏味道”模式的讨论,却鲜少给出建设性意见。 文章的核心价值在于提供了一套清晰的重构决策清单。它首先厘清了重构的两个基本方向:通过“归纳方法”分解组件以实现复用,或通过“内联方法”消除琐碎函数。随后,针对“如何知道哪种方法是正确道路”这一编程艺术中心问题,作者直接抛出了17条可操作的原则。 这些原则极具针对性,例如:偏向用多态(多形)替代switch语句;不确定时优先使用组合而非继承;用guard语句和封装来简化条件逻辑;甚至建议尽量将代码逻辑放在model层而非controller层。这些指导超越了简单的“代码整洁”,直指提升代码可维护性、降低耦合的工程实践。对于在重构中感到迷茫的开发者,这份清单提供了一张值得参考的路线图。

本机暂存
IT 开发者/ 2013-10-23 12:58:46 / 累计浏览 19,404

如何写好一封邮件

这篇讲的是把“写好一封邮件”这件看似人人都会、却常常被忽视的职场基本功,拆解成一套可执行的系统。作者从知乎上的讨论出发,提炼出邮件沟通的三大核心原则。 首先是“礼貌原则”,它强调基本的尊重与专业,比如正确使用收件人与抄送栏、保持用词正式、及时回复。其次是“战地记者原则”,要求直切主题、内容单一、长度精简,确保信息高效传递。最后是“金字塔原理”,主张邮件结构应中心明确、分层叙事,并在开头用“四个W和一个H”(谁、什么、何时、为什么、如何)说清核心,引导收件人快速理解意图。 文章后半部分深入到容易忽视的格式细节。从标点符号的误用(如连续多个问号显得情绪化)、字体的谨慎选择,到段落对齐、行间距的视觉优化,都给出了具体建议。特别强调了工作邮件用词需朴实准确、多用短句、避免术语堆砌。 此外,文中还分享了重要的职场沟通智慧:邮件如同“白底黑字”,发出前需深思;避免在邮件中陷入多轮争论;抄送名单要精简且有关联。文章最后给出一个实用的写作顺序建议:先处理附件,再写正文,然后标题,最后填收件人,并在发送前出声朗读一遍。整篇文章将常见问题与解决方案结合,把邮件写作从习惯动作提升到了专业技能的高度。

本机暂存
IT DevOps/ 2013-10-23 12:58:13 / 累计浏览 1,728

使用 lsyncd 同步本地和远程目录

这篇讲的是如何解决文件同步的实时性与服务器资源消耗之间的矛盾。作者从常见的 rsync + cron 方案切入,指出其“定时轮询”的固有局限——间隔设得太短则频繁启动 rsync 增加负担,设得太长则同步不及时。 文章的核心方案是引入基于 Linux inotify 事件驱动的 lsyncd 工具。它不同于 cron 的定时执行,而是像一位尽职的哨兵,持续监测本地目录的变动。一旦捕捉到文件或目录的变更事件(默认触发条件是每20秒或累积1000次写入),便立即触发 rsync 或 rsync+ssh 进行精准同步。这种“按需启动”的模式,从根本上避免了无谓的资源消耗。 作者用清晰的步骤,演示了从安装、手动创建配置目录,到编写 Lua 配置文件(重点指明 source、host、targetdir 三个参数)和设置无密码 SSH 登录的全过程。配置完成后,lsyncd 服务启动即可自动守护同步任务。 最终,文章指出通过简单修改配置文件(将远程同步改为本地目录同步),lsyncd 同样能胜任本地目录镜像备份的任务,提供了灵活的文件同步选项。

本机暂存
IT DevOps/ 2013-10-23 12:57:19 / 累计浏览 23,404

Git subtree 要不要使用 –squash 参数

这篇讲的是,作者在使用 Git subtree 管理多层代码包含关系时,遇到了一个持续困扰的冲突问题,并深入分析了 --squash 参数背后的机制与应对策略。 作者从实际项目(Gregarius 管理 MagpieRSS,后者又管理 Snoopy)出发,指出使用 subtree 的 --squash 参数虽然能让主项目提交历史更清爽,却会在后续更新(subtree pull)时,反复引发需要手动解决的冲突。反之,不用 --squash 虽然更新顺畅,但子项目的历史会“污染”主项目。 文章清晰地剖析了根因:--squash 会合并并消除子项目的历史提交,导致下次合并时 Git 找不到共同的父提交,从而无法自动处理冲突。作者引用并评估了 StackOverflow 上的一种平衡方案:在一个专用分支上进行不带 --squash 的更新以保留历史、避免冲突,然后在合并到主分支时使用 `git merge --squash` 将其压缩为一个简洁的提交。 文章最后总结了两种典型的使用场景:如果只是单向接收子项目更新,任选一种方式均可;如果是拆分大项目(如 Symfony2),则建议避免 squash,主项目主导开发再 split 出子项目发布。作者的实践表明,专用分支方案虽然略增复杂度,但能有效兼顾提交历史的整洁与更新的顺畅。

本机暂存
IT 移动开发/ 2013-10-21 22:31:29 / 累计浏览 5,567

移动APP开发过程

这篇讲的是移动APP开发的完整流程。作者将从构思到上线的漫长旅程,梳理成了九个关键步骤,像一份实用的路线图。 文章强调,一切应从清晰定义“为谁解决什么问题”开始,比如为业余摄影者提供便捷的分享工具。核心原则是“好的设计是一个解决方案,而不是一堆功能的堆砌”,要为最核心的80%用户设计,并持续与真实用户交流。 流程中穿插了诸多生动建议:不要迷恋第一个设计,不妨尝试画出10种草图方案;原型阶段牢记“Fail early to succeed sooner”;甚至要有勇气将“还行”的设计推倒重来。最终,发布并非终点,基于用户反馈的迭代才刚刚开始。 整个清单将设计思维贯穿始终,提醒开发者投入大量时间进行前期设计和用户验证,远比直接投入编码更能规避后期重构的风险。

本机暂存
IT 设计/ 2013-10-21 22:25:21 / 累计浏览 2,544

做产品到底要不要听用户反馈?

从一句关于乔布斯是否听用户的玩笑话出发,这篇文章直击产品经理的老问题:到底要不要听用户反馈?作者的观点很犀利——要听,但只听“事实”,不接受“建议”。 他把用户反馈清晰地分为两类:一类是客观事实,比如“登录功能出错了”;另一类是用户主观给出的解决方案,比如“为什么不这样收费呢”。作者的核心逻辑是,反馈事实是用户的权利,而判断问题、设计方案是产品经理的专业职责,两者不可混淆。他强调,绝大多数用户并不了解产品背后的战略和数据,他们的“建议”往往并不可靠。 不过,作者并非完全拒绝倾听。他指出,在扔掉那些“建议”之前,必须深挖其背后隐藏的事实:用户究竟遇到了什么场景?现有功能为何失效?这些挖掘往往能直接指向产品的设计缺陷。这个原则同样适用于来自老板或资深同事的建议——对结果负责的,始终是产品经理自己。 这篇文章为产品决策提供了一个清晰的过滤框架:专注于识别真实问题,同时勇敢捍卫自己的专业判断权。

本机暂存
IT 设计/ 2013-10-18 12:33:15 / 累计浏览 3,905

触屏键盘设计准则(内附绝密小抄)【译】

这篇文章从一次大规模可用性测试出发,聚焦于一个被广泛忽视却影响深远的细节:移动端触屏键盘的交互设计。作者指出,尽管触屏交互被认为更直观,但手机打字体验却常常令人沮丧,容易出错。 核心问题在于,许多网站在表单输入中未能巧妙利用触屏键盘的特性。文章提炼出5条关键设计准则,并揭示了残酷的现实——在测试的头部电商网站中,92%在地址输入框未禁用自动更正,导致“weathermen”这类错误更正被用户忽略并提交;60%在需要输入电话、信用卡号时,仍调出笨拙的标准键盘而非更大、更精准的数字键盘。 作者不仅给出了问题分析,还提供了具体的HTML代码解决方案,如使用``和`type="tel"`来调用专用键盘。这些准则超越了电商场景,适用于任何涉及触屏输入的移动网页设计,旨在通过微小的技术调整,显著降低用户输入错误率,提升交互的流畅感与用户信任。

本机暂存
IT 移动开发/ 2013-10-18 12:30:20 / 累计浏览 3,751

移动互联网系统架构十大陷阱

这篇讲的是移动互联网系统架构中常见的陷阱,作者54chen基于三年一线开发经验,梳理了十个具体问题及其解决方案。比如,早期移动网络连通性差,应用频繁掉线,根因在于运营商网络不稳定,解法是选择有“背景”的机房以确保访问。HTML5在弱网环境下性能糟糕,即使现在也存在瓶颈,建议暂缓使用。DNS解析失败会导致请求不可达,客户端可缓存多个域名和IP作为备用。运营商HTTP拦截会擅自插入广告,开发者需在header中明确声明内容类型。 App设计上要克制按钮数量,避免功能泛滥,确保核心操作一键可达。传统web引导到app的转化极其困难,不应依赖。数据同步如sqlite与mysql不一致是大麻烦,最好用统一同步机制隔离业务逻辑,或将数据逻辑完全交给客户端处理。下载渠道必须通畅,上CDN时需注意缓存限制,防止下载速度陡降。更新频率要平衡,内部开发可天天迭代,对外发布则控制在月度或季更新。此外

本机暂存
IT 开发者/ 2013-10-17 12:30:06 / 累计浏览 7,260

一张图让你看懂各开源License

对于许多开发者来说,开源协议(License)那精炼却晦涩的条款读起来颇为费劲,而且像GPL、MIT、Apache这些常见的名称,它们之间的关键区别又在哪?这篇内容就聚焦于此。它没有进行冗长的文字解读,而是直接引用了一张广为流传的清晰图表,直观地拆解了各类主流开源协议的核心限制点。 图表将不同协议在“是否必须开源衍生作品”、“是否允许闭源商业使用”、“是否要求保留原作者版权”等几个关键维度上进行了横向对比。比如,MIT协议最为宽松,几乎不做限制;而GPL则有着强烈的“传染性”,要求任何修改或衍生作品都必须以相同协议开源;Apache 2.0则在提供明确专利授权的同时,也对保留修改声明有清晰要求。 通过这张图,开发者能迅速根据项目的具体需求(是希望最大程度推广,还是希望保护自身专利,或是要求回馈社区),来选择最适合的开源协议,避免了因理解偏差而带来的法律风险。它将复杂的法律文本,转化成了可直接参考的技术决策工具。

本机暂存
IT 设计/ 2013-10-17 12:29:30 / 累计浏览 3,256

进行用户研究的五步法【译】

作者从一个常见的误区切入:我们掌握了用户的年龄、设备、消费记录等“是什么”的数据,却常常无法回答“为什么”——为什么用户要换银行?这种对用户行为深层动机的困惑,正是需要系统性用户研究来解决的。 这篇文章详细介绍了由Frog设计公司创造的“调研学习螺旋”。这是一套结构化的五步法,旨在填补团队在设计过程中的知识空白。核心步骤包括:首先明确要回答的“目标”问题;接着梳理团队已有的“设想”与假设;然后选择合适的“方法”来收集数据;再进行“实施”调研;最后“综合”分析数据,验证或推翻假设。 文中以设计一个电视节目短片分享功能为例,具体展示了如何应用这个螺旋。例如,在“目标”阶段,团队需要用“谁、什么、何时、何地、为什么、如何”这类问题来界定调研范围,并将问题转化为明确的研究目标。这个框架强调,在开始具体工作前,先花时间厘清已知与未知,能有效指导后续调研,避免盲目行动。 这个螺旋流程的价值在于,它帮助设计师跳出自身偏见,通过理解真实用户的生活与需求,发现那些数据无法揭示的设计机会点,从而产出更具针对性和灵感的解决方案。

本机暂存
IT 安全/ 2013-10-17 12:20:06 / 累计浏览 2,853

webgame中常见安全问题、防御方式与挽救措施

这篇讲的是网页游戏开发者在实际项目中遇到的安全“坑”与应对策略。作者从知乎上一个关于游戏安全的问题出发,结合自身经历(包括一次因整型溢出导致的刷钱bug),决定从研发者视角系统梳理安全问题。 文章聚焦几个核心场景:登录认证中hash字符串的时效性与绑定信息设计;联运游戏充值接口的签名验证,并以腾讯接口为例展示了严谨的签名逻辑;以及由于参数未过滤直接include导致的远程文件引入漏洞(RFI)。针对RFI,作者分享了其项目通过Gateway统一入口、结合类反射机制进行严格过滤的解决方案。此外,文章也简要提到了SQL注入在AMF等特定消息格式下可能被忽视的风险,并指出了解决方向。 作者特别强调,他修改了原知乎问题的描述,将重点从“如何入侵”转向“如何防御”与“事后最小化损失”,这也正是文章的核心价值:它不仅揭示漏洞原理,更侧重于提供可落地的防御编码实践与架构改进思路,旨在加固游戏安全壁垒,减少厂商与玩家损失。

本机暂存
IT 算法/ 2013-10-16 22:37:43 / 累计浏览 4,549

正则表达式简要入门

这篇讲的是正则表达式的基础入门。作者从一道腾讯笔试中判断QQ号码的选择题出发,分享了从“蒙答案”到主动学习并整理笔记的过程,希望能帮到同样在准备校招或平时用得不多的开发者。 文章核心是用实例拆解正则表达式的关键概念。从 `rm *.png` 这样的通配符讲起,逐步引入了反斜杠转义、元字符(如 `\d` 匹配数字、`^$` 锚定首尾)、字符组(如用 `[^4]` 排除特定数字)以及分组与分支(如 `(QQ|qq)` 匹配大小写)。所有知识点都紧密围绕“查找与替换”这一实际需求展开。 最精彩的部分是实战演练。作者用一段包含干扰信息的“妹纸联系方式”文本,演示了如何编写正则 `QQ:\d{5,12}$` 精准提取5到12位的QQ号,又如何通过 `\(0(\d{2}|\d{3})[)-]?(\d{7}|\d{8})$` 这种组合拳,灵活匹配区号格式各异的固定电话号码。文末还贴心地整理了多份学习资源,从中文入门教程到英文付费课程均有涵盖。

本机暂存
IT DevOps/ 2013-10-16 22:37:03 / 累计浏览 24,845

Git log diff config高级进阶

这篇文章从一个已有的《更好的git log》分享出发,延续了Git效率提升的主题,重点聚焦于git log、git diff、git blame和git config这四个常用命令的深度配置与使用。 作者系统梳理了它们的进阶用法:对于git log,可以结合`--oneline`、`--stat`、`--graph`和`--pretty=format`等参数,实现从单行简洁显示、文件变更统计到图形化分支历史的多种视图,并支持按精确时间区间进行筛选。git diff部分则扩展了比较范围的灵活性,不仅能对比HEAD、特定提交(HEAD^)或不同分支,甚至能结合时间参数进行比较。git blame命令被用来追溯文件的每一行修改历史。 文章的亮点在于将重心引向了git config。它清晰地解释了Git配置的三层优先级体系(系统级、全局用户级、项目级),并详细演示了如何通过全局配置进行个性化定制:从基础的用户信息、终端颜色渲染(支持对diff、status等不同命令设置不同配色方案),到利用alias功能创建如`git mylog`和`git lol`这样的自定义快捷命令。最终,所有这些技巧都指向一个实用目标:通过精心配置,让Git这套强大的工具在日常工作中变得更顺手、更高效。

本机暂存