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

最新文章

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

IT AI/ 2019-03-25 23:27:39 / 累计浏览 3,741

机器学习算法之LightGBM

这篇讲的是GBDT模型的又一个高效实现:LightGBM。文章没有停留在简单介绍,而是从“既然XGBoost已经很好,为什么还需要LightGBM”这个问题切入,详细拆解了后者在工程上为应对海量数据所做的核心优化。 作者对比了两者的关键差异:XGBoost采用预排序算法,虽然精确但内存与时间开销巨大;LightGBM则引入了直方图算法,将连续特征离散化,使内存消耗降为原来的1/8,计算复杂度也从O(#data*#features)大幅优化。同时,它还摒弃了传统的按层生长策略,改用带有深度限制的按叶子生长,进一步提升了效率。 文章通过实验数据直观展示,这些改进让LightGBM的训练速度提升近10倍,内存占用仅为XGBoost的1/6,且准确率有所提高。这对于处理工业级大规模数据,同时追求模型性能与资源效率的场景,提供了非常切实的解决方案。全文对技术动机和实现原理的剖析,对于想理解模型“快”与“准”如何兼得的工程师很有启发。

本机暂存
IT 后端/ 2019-03-25 23:24:30 / 累计浏览 2,005

区块链将会如何影响开源

这篇文章探讨的是区块链技术可能为开源社区带来的范式变革。 文章从开源当前的协作与商业模式入手,指出了一个核心痛点:开源生态中,价值(尤其是资金激励)在开发者与用户之间的传递往往是间接且单向的。虽然商业化公司和基金会扮演了重要的中介角色,但许多有潜力的项目仍因无法形成有效的价值交换而难以维系。 作者的核心观点是,区块链和智能合约能为开源引入一种新的、去中心化的激励与治理模型。通过代币机制,用户可以直接资助项目、通过投票影响方向,开发者也能因提交代码、修复缺陷、完善文档等贡献获得透明量化的奖励。这并非要取代现有模式,而是为那些商业公司难以覆盖的项目,提供一种“自我供给”的补充路径,构建一个更直接的价值交换网络。 文章还列举了GitCoin、oscoin等一系列已有的探索实践,说明这一结合正在快速发展。最终,它描绘了一个图景:未来的开源项目可以自由选择许可证、基金会管理,以及基于代币的激励模型,从而让整个生态系统更加多元和充满活力。

本机暂存
IT AI/ 2019-03-25 23:07:36 / 累计浏览 1,927

你是如何了解或者进入NLP这个领域的?

这篇讲的是AINLP公众号发起的一次赠书留言征集活动,却意外收获了超过200条关于“如何进入NLP领域”的真实分享。作者将这些充满个人色彩的故事做了汇总,为我们勾勒出一幅生动的NLPer入行图景。 从留言中可以看到,许多人的起点充满了“偶然”:数学系的背景被导师安排做统计机器翻译,英语专业的学生因无法忍受纯人工内省而自学编程切入,甚至有心理学和文科背景的同学为了解决论文中的文本分析难题,独自摸索着走进了这个领域。另一个共性是强烈的自驱力——在缺乏系统指导的情况下,通过啃经典教材(如《统计自然语言处理》)、刷公开课、关注技术社区,从零搭建起知识体系。 这些故事背后,是一个个具体的技术探索:从Lucene分词的好奇,到词性标注与概率统计的实践,再到BERT、知识图谱的前沿追踪。它们共同指向了NLP领域的迷人之处:它用数学和代码为语言赋予了可计算的维度,而通往这个大门的道路却向所有充满热情和毅力的人敞开。活动本身也通过赠书和互动,完成了一次社区内宝贵的连接与传承。

本机暂存
IT 移动开发/ 2019-02-21 21:53:48 / 累计浏览 2,247

Swift ABI 稳定对我们到底意味着什么

这篇讲的是随着 Xcode 10.2 与 Swift 5 发布在即,Swift ABI 稳定这项重大变化对开发者意味着什么。作者采用问答形式,从多个实际角度剖析了这一事件。 对于 App 开发者,最直接的影响是升级到 Xcode 10.2 后,App 包体积将显著减小。例如,一个空 App 针对 iOS 12.2 的打包大小可从 2.4MB 降至 26KB,同时应用启动速度和内存使用在新系统上也会有所优化。然而,这也意味着一种“博弈”:开发者享受更小体积的同时,将无法在旧版系统(如 iOS 12.2)上使用未来 Swift 版本引入的、与运行时相关的新特性,必须等待部署目标提升。 文章进一步探讨了这对生态的深远影响。对于框架开发者,ABI 稳定只是实现二进制分发的第一步,还需要等待“模块稳定性”的达成。作者最终将视野拉高,指出 ABI 稳定为 Apple 在系统框架中全面使用 Swift 奠定了基础,可能是 Apple 平台对抗其他技术生态的关键一步,并预示了未来数年值得关注的几个趋势,如首个纯 Swift 系统框架的诞生。

本机暂存
IT 算法/ 2019-02-21 21:49:23 / 累计浏览 2,396

一些不常见但是很重要的数据结构

这篇源自Stack Overflow高赞讨论的整理,系统梳理了那些在日常编程中不常被提及、却在特定领域发挥关键作用的数据结构。文章并非泛泛而谈,而是紧扣具体应用:比如Bloom filter如何在BigTable、Cassandra中用于快速存在性检查,Skip list作为Redis有序集合的底层实现原理,以及Rope数据结构如何通过高效的字符串拼接操作,在Java等语言中胜任繁重的文本处理任务。 作者将这些结构与经典方案对比着介绍,突出了各自的核心价值:Splay tree的简洁与良好性能,Suffix tree用于字符串搜索的O(n)构建优势,以及Cuckoo Hashing利用多哈希函数提升空间利用率的巧妙思路。同时,文章也涵盖了并查集、Merkle tree、无锁数据结构等并发与特定场景下的利器,甚至提及了缓存参数无关、左偏红黑树等更前沿的方向。 整篇文章更像一份精心挑选的“数据结构工具箱”清单,它不仅扩充了开发者的知识库,更揭示了在解决特定性能或规模问题时,超越常规选择的可能性。对于想夯实基础、或寻找更优解方案的技术读者,这份清单提供了明确的索引和深入探索的起点。

本机暂存
IT 前端/ 2019-02-13 17:16:23 / 累计浏览 3,496

Rax 系列教程(长列表)

这篇讲的是Rax框架下长列表组件的选型与实战指南。面对scrollview、recyclerview、listview、waterfall等多个列表组件,新手往往不知如何选择。作者结合Rax 0.5版本,对这些组件的特性、适用场景与性能差异进行了清晰梳理:例如水平滚动推荐scrollview,但要注意内容过多时的性能瓶颈;追求高性能的垂直长列表则应首选recyclerview。 文章不止于理论对比,更深入讲解了关键组件的实用技巧。比如,针对recyclerview中因列表数据更新导致onEndReached失效的问题,提供了使用`resetScroll`方法重置状态的解决方案。同时,它也剖析了下拉刷新(RefreshControl的放置位置)、appear事件(在滚动容器内绑定并注意性能影响)以及onScroll动画(推荐使用BindingX降低通信成本)等基础能力的实现要点。 最后,文章展示了多种典型的页面组织模式——从简单的全屏滚动、部分固定区域布局,到复杂的模块吸顶和横滑切换多页面,均给出了具体的代码结构参考。对于需要在Web与Native端实现一致滚动体验的开发者而言,这篇教程提供了从组件选择到场景落地的系统性思路。

本机暂存
IT 后端/ 2019-01-01 21:04:14 / 累计浏览 2,717

PHP非阻塞实现方法

这篇讲的是如何让PHP在后端执行耗时任务时,仍能快速响应前端请求,避免阻塞页面加载。文章集中对比了8种实现非阻塞的技术方案。 作者从最简单的PHP-FPM内置函数`fastcgi_finish_request()`切入,它能立即结束会话,让后续代码在后台静默执行。对于需要发起异步HTTP请求的场景,介绍了利用`fsockopen()`设置非阻塞模式,以及使用cURL多句柄`curl_multi_*`函数的方法。 更进阶的方案涉及扩展与架构:`pcntl_fork()`能创建子进程来处理任务,优点是方便,但需要小心处理可能产生的僵尸进程;而Gearman和Swoole等异步框架则提供了更成熟的分布式任务处理能力。文章还提到了在高并发场景下常用的缓存与队列(如Redis)方案,将耗时操作解耦到后台执行。最后,也提及了通过系统命令或PHP原生协程(Coroutines)来实现的可能性。 总的来说,文章从不同技术层面剖析了PHP的非阻塞之道,为需要优化长任务处理的开发者提供了从快速实现到架构设计的多重选择。

本机暂存
IT 开发者/ 2019-01-01 21:00:47 / 累计浏览 3,108

10个最“牛叉”的代码注释

这篇文章汇总了StackOverflow上“你见过的最棒的代码注释”投票前10名,展示了程序员们在严谨逻辑之外,极具人文色彩与黑色幽默的另一面。 这些注释远非简单的功能说明。有的像“警告牌”,如耗时39小时优化失败的前人,留下计数器警示后继者;有的则像“骑士宣言”,用史诗般的语言鼓励接手棘手代码的勇士,告诉他“永远不要放弃”。双关与冷幽默也随处可见,比如 `throw up;` 这样的异常抛出,既是代码动作,也是情绪吐槽。还有用 `#define TRUE FALSE` 来捉弄调试者的恶作剧,或是“写的时候只有上帝和我知道,现在只剩上帝知道”的无奈自白。 这些看似不正经的注释,其实深刻揭示了软件开发中的真实场景:面对遗留代码的无力感、与同事跨时空的隔空对话,以及程序员特有的、用代码表达的情感宣泄。它们提醒我们,代码库不仅是功能的集合,也承载着开发者的故事、挫败与坚韧,是理解技术文化一个鲜活而有趣的窗口。

本机暂存
IT 数据库/ 2019-01-01 20:44:30 / 累计浏览 2,593

图数据库简介

这篇讲的是图数据库的核心概念与适用场景。作者从NoSQL的大家族中引出图数据库,指出它用节点和边来存储高度关联的数据,比如社交网络中用户之间的关注关系。文章重点解释了当前流行的“带标签的属性图”模型,节点和边都可以拥有多个属性和标签,这使得数据建模非常灵活。 文章将图数据库与传统关系数据库进行了对比。核心差异在于:关系数据库擅长处理结构规整的事务,但在进行多层、反向的关联查询(比如“谁的朋友的朋友买了什么”)时,会产生大量表连接,导致性能骤降。而图数据库将节点和关系视为一等公民,采用原生存储和双向指针,使得这类复杂关系遍历的查询速度能保持在很高水平。 因此,作者得出的结论是,图数据库并非要取代关系型数据库,而是为社交网络、推荐系统等依赖复杂关系图谱的场景提供了更高效的解决方案。它的优势在于更自然的数据建模、更快的关联查询性能以及更灵活的Schema调整。

本机暂存
IT 算法/ 2019-01-01 20:39:34 / 累计浏览 1,899

美团面试经历,贡献出来一起学习

这篇讲的是一位程序媛分享她应聘美团大数据研发实习生的四轮技术面试经历。文章按时间顺序,详细还原了从简历筛选到最终HR面的完整过程,像一份真实的面试笔记。 面试内容覆盖面非常广。一面由部门主管在会议间隙进行,侧重项目架构与设计模式;二面长达一小时,深入考察了Spring机制、多线程、JVM内存与GC、MySQL优化等核心知识;三面是交叉面试,增加了在线编码环节;最后的HR面则异常“硬核”,面试官对项目细节和科研经历进行了深度追问。 作者在应对面试时有不少值得借鉴的思路。例如,面对不熟悉的问题(如服务器配置)坦诚相告;在解释Spring IOC/AOP时,用项目实例来证明理解;遇到不确定的技术点(如Java异步IO)时,坦然说明并向面试官展示自己的推理过程。文章也记录了面试官“边面试边给反馈”这类有助于候选人调整状态的细节。 文末,作者总结了对此次面试的反思:技术基础(算法、框架原理)需要扎实,面试中要主动引导节奏展示自己的知识体系,而对于高并发、分布式等工程经验,在校生只能通过理论学习先行铺垫。这为准备技术面试的读者提供了切实的参考。

本机暂存
IT 算法/ 2019-01-01 20:23:19 / 累计浏览 2,013

哈希函数介绍 | 哈希算法

这篇讲的是哈希函数的核心概念与各类算法的应用对比。作者从哈希函数作为关键字到存储地址的“映射”本质出发,重点解析了哈希应用中需要解决的“冲突”问题。 文章的核心在于系统梳理了几类主流的加密哈希算法。它介绍了MD5、SHA-1、SHA-2、SHA-3及RIPEMD-160的基本原理,并结合Node.js代码示例,直观展示了它们的输出。关键点在于对比了它们的安全状态与适用场景:例如,MD5因碰撞问题已不适合安全用途,更多用于文件校验;SHA-1正被各大厂商逐步弃用;而SHA-2与SHA-3则代表了当前更安全的选择。 除加密算法外,文章也简要提及了用于高速查找的非加密算法,如MurmurHash,拓宽了“哈希”的应用图景。整体上,文章清晰地梳理了“为何用哈希”以及“如何根据场景选择不同哈希算法”这两个核心问题。

本机暂存
IT 前端/ 2019-01-01 20:20:55 / 累计浏览 1,980

多个动画间存在部分相同动画的优化方案:gka

当多个Web动画包含部分相同内容时,直接加载所有帧图片会导致资源冗余。作者从一个“抓娃娃”的交互动画切入,发现“成功”与“失败”两个结果动画中,抓杆的初始滑动和晃动部分其实是完全相同的。问题在于,肉眼无法高效识别这些重复帧。 为此,文章推荐使用开源工具gka来解决。这款工具能一键处理多个帧动画,其核心亮点在于支持图片去重(-u参数)。对于上述例子,只需简单运行命令`gka ./workspace/img/ -u`,工具便会自动分析并合并相同帧,让不同动画共享这部分图片资源,从而大幅减小总体积。 通过这个具体的优化实践,文章不仅展示了一个实用的性能优化思路,也介绍了gka这款高效的帧动画生成与处理工具。

本机暂存
IT 前端/ 2019-01-01 20:10:13 / 累计浏览 2,495

React一线问题十问十答

这篇精选自开源中国问答活动的技术盘点,直面开发者在React实践中踩过的“坑”与真实的困惑。文章通过十个典型问答,覆盖了从入门学习到框架对比、从组件设计到技术选型的多个维度。 作者没有空谈理论,而是结合具体场景给出建议:比如在谈React与Vue时,指出二者会长期并存,关键在于面向问题编程而非局限于框架;在讨论组件设计时,提出应根据库代码与业务代码区分粒度,业务组件保持合理大小。文章也探讨了React的生命周期、SSR的适用场景(如需要SEO的内容类网站)、表单处理的优化思路以及技术选型时对业务形态的考量。 整篇文章的价值在于,它呈现了一线开发者的真实问题图谱与务实的解决思路,对正在使用或考虑引入React的团队有直接的参考意义。

本机暂存
IT DevOps/ 2019-01-01 20:06:40 / 累计浏览 2,821

如何在 Linux 上安装设备驱动程序

这篇讲的是,那些从 Windows 或 macOS 切换到 Linux 的朋友,面对设备驱动安装时可能会懵——因为 Linux 上这事儿确实更复杂。作者从三种根本原因出发:Linux 发行版种类繁多、大多数开源驱动已内置、以及不同发行版对闭源驱动的许可策略不同,清晰地解释了为什么一个通用的安装指南很难实现。 文章没有停留在抱怨上,而是给出了两种切实可行的解决方案:一种是通过 Ubuntu 的“附加驱动”等图形化向导进行傻瓜式安装;另一种是针对进阶用户的命令行途径,包括添加软件仓库、更新源并安装,甚至涉及手动下载源码编译。作者还贴心地列举了 `lspci`、`dmesg` 和 `lsmod` 等关键命令,教你在动手前如何高效地检查系统是否已存在或加载了目标驱动,避免重复劳动。 整篇文章像一份务实的路线图,它先帮你理解问题的来龙去脉,再提供从简到难的工具选择,最后附上了必不可少的诊断步骤。对于想踏足 Linux 但又怕被驱动问题劝退的新手来说,这是一份很清晰的入门指引。

本机暂存
IT 开发者/ 2019-01-01 20:04:32 / 累计浏览 2,275

如何使用多种编程语言而又不失理智

如今,许多开发组织都成了“数字多语种组织”。正如人类通晓多种语言能与更多人沟通,开发者引入不同的编程语言,也是为了用最合适的工具完成特定任务。然而,这种多语言环境常是因收购、技术迭代等原因渐进形成的,是一把典型的双刃剑。 文章犀利地指出,失控的多语言堆栈会演变为“数字巴别塔”,给企业带来三重挑战:一是**可见性缺失**,当关键漏洞出现时,企业甚至不清楚哪些应用、哪些库受到了影响;二是**更新成本高昂**,工程团队大量时间被耗费在更新和修复开源工具上,而非编写新功能;三是**重复造轮子**,漏洞修复时常因依赖链变化而需要重新构建环境,白白浪费开发周期。 为此,作者提出了一系列最佳实践:持续监控生产环境代码的风险、保持依赖更新、为老旧技术栈寻求商业支持、标准化构建流程,以及建立统一的包管理源等。这些措施旨在将开发者从繁琐的工具链维护中解放出来,让他们能聚焦于创造业务价值。最终目标是在拥抱语言多样性的同时,通过有效的治理,让技术团队和管理层的工作都变得更轻松高效。

本机暂存
IT 开发者/ 2019-01-01 20:04:27 / 累计浏览 2,244

如何使用多种编程语言而又不失理智

这篇讲的是多语言编程环境这把“双刃剑”——它如何让企业变身“数字多语种组织”,又可能因失控而扼杀业务。作者从企业技术栈的自然演进(如并购、技术迭代)切入,指出核心矛盾:开发者为追求“用对工具”而引入多种语言,却给组织带来了可见性缺失、更新维护成本激增、环境难以重建等三大棘手问题,最终可能拖垮整个软件开发生命周期。 文章没有停留在提出问题,而是给出了一套寻找“罗塞塔石碑”的实践方案:从持续监控生产代码风险、建立集中化包管理与更新机制,到通过标准化构建来提升一致性。其核心观点是,企业不应剥夺开发者的工具选择权,但必须用系统化的方法驾驭复杂性,让团队精力聚焦于创造业务价值,而非陷入无尽的工具维护。这对于任何面临技术栈膨胀困扰的团队,都提供了清晰的诊断框架与解决思路。

本机暂存
IT DevOps/ 2019-01-01 20:01:48 / 累计浏览 1,780

Python检查和同步本地时间北京时间

这篇讲的是如何用Python快速检查与同步本地服务器时间到北京时间。作者从一个实际运维痛点出发:当本地时间与标准时间偏差较大时,传统的NTP时间同步过程会非常缓慢,影响服务。 为了解决这个问题,文章提出了一种轻巧的替代方案:利用大型网站(如百度、淘宝)响应的HTTP头中包含的Date时间戳。因为这些网站的时间通常非常准确,我们可以将它们作为一个可靠的时间源。核心思路就是通过代码获取这个GMT时间戳,将其解析并转换为北京时间,然后直接设置系统时钟。 具体实现上,代码使用了Python标准库urllib2以确保兼容性,而没有依赖需要额外安装的requests库。它封装了两个主要功能:检查本地时间与互联网时间的偏差,以及直接校准本地时间(包括将系统时间同步到硬件时钟)。作者提供了完整的脚本,并在CentOS 7.4的Python 2.7环境下验证通过。 这个方案虽然简单,但对于网络受限或对NTP同步速度有要求的场景,提供了一种快速、有效的应急选择。

本机暂存
IT 后端/ 2019-01-01 19:59:27 / 累计浏览 2,107

TCP 滑动窗口 与窗口缩放因子(Window Scaling)

这篇讲的是TCP滑动窗口协议中一个常被忽略但影响重大的参数:窗口缩放因子(Window Scaling)。文章指出,TCP窗口字段本身只有16位,最大值为65535字节。在“高带宽-长延迟”的网络中,这个上限会成为性能瓶颈——比如在10Mbps、单向延迟80ms的链路上,理想窗口需要约100KB,但65KB的窗口迫使发送方必须等待确认,白白浪费了带宽。 为了解决这个问题,窗口缩放选项被引入。它通过在TCP握手中协商一个“缩放因子”,将接收到的窗口值左移该因子位,从而将最大窗口理论上扩展至约1GB(缩放因子最大为14)。文章通过计算示例说明,原先65KB的窗口经过缩放后,能够匹配高带宽网络的实际吞吐需求。 作者在实战中也验证了其效果:对一个上传服务进行调优,增大TCP缓冲区并启用窗口缩放后,上传一个8MB视频文件的时间从1分30秒显著缩短至20秒,体现了在特定网络环境下对此参数进行调优的实际价值。

本机暂存
IT 后端/ 2019-01-01 19:57:27 / 累计浏览 2,514

流量引导:网络世界的负载均衡解密

这篇讲的是大型互联网系统如何把用户流量合理分配到多台服务器上。作者从早期云计算服务商简单地将域名指向一个服务器IP出发,指出这本身并非负载均衡,进而引出高可用和扩展性带来的挑战。 文章梳理了负载均衡技术的核心演进路线。首先分析了简单DNS轮询的弊端,比如DNS缓存导致故障切换缓慢,TTL设置也令人左右为难。接着,引入了四层(L4)网络负载均衡器,通过一个虚拟IP(VIP)和基于五元组的哈希算法,快速、高效地在多台服务器间分配连接,并具备了健康检查能力。为了应对数据中心级容灾,又引入了利用BGP泛播(Anycast)将同一VIP宣告到多个站点的方案,但也面临流量控制和就近访问的难题。最终,为了支持更复杂的应用逻辑(如缓存、限速、基于Cookie的分发),七层(L7)负载均衡器被加入架构,它能解析请求内容,做出更智能的决策,但其更高的计算成本也需通过前置L4均衡器来缓解。 文章指出,负载均衡是一个随云计算不断发展的复杂课题,从L4到L7,从单站点到多站点,其演进始终围绕着高可用、灵活性和控制力的权衡。

本机暂存
IT 后端/ 2019-01-01 19:45:43 / 累计浏览 3,566

救命!我的电子邮件发不到 500 英里以外!

这篇讲的是一个听起来像都市传说,却又真实得令人哭笑不得的邮件故障。作者接到统计系主任求助,对方煞有介事地表示:“我们的邮件发不出520英里。”经过一番测试,问题居然是可复现的,近的纽约能到,远的波士顿就失败。 排查最终指向了一个看似“打补丁”的维护操作。服务顾问在升级服务器OS时,不慎将系统自带的Sendmail 8降级回了老版本的Sendmail 5。新的sendmail.cf配置文件中许多高级选项被旧版程序当作“垃圾”跳过,其中就包括SMTP连接超时——它被默认设成了0。作者通过计算发现,在0毫秒超时下,数据包依靠光速所能传播的极限距离,恰好就是这500多英里。一个系统配置的乌龙,竟意外地与物理定律产生了美妙的巧合。这个故事不仅是个绝佳的故障排查案例,也提醒着每一次“例行维护”都可能埋下意想不到的彩蛋。

本机暂存