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

最新文章

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

IT 后端/ 2016-03-16 23:42:05 / 累计浏览 2,405

记一次内存泄露的debug过程

这篇讲的是作者在压测“代码在线运行”工具时,遭遇了高并发下内存飙升且无法回落的问题。从自身代码审查无果,他转向使用Go语言内置的pprof工具进行深度剖析。 通过分析堆内存分配的热点,问题指向了goroutine与ioPipe的交互。作者进一步验证,发现大量goroutine因ioPipe未被正确关闭而持续存在,无法回收,从而造成了内存的持续累积。根源在于异常退出前未主动关闭资源。 定位后,解决方案变得清晰:在程序逻辑中确保主动关闭ioPipe的Reader。修复后,作者使用wrk工具进行了长时间压测,并监控goroutine数量,确认内存占用稳定,问题得以解决。文章结尾点出,这个因粗心引起的小bug,修复却需借助专业工具链,提醒开发者熟悉语言提供的诊断工具至关重要。

本机暂存
IT AI/ 2016-03-16 23:36:14 / 累计浏览 2,895

浅谈 WHR 全历史排名

AlphaGo 击败李世石后,围棋积分网站给出的世界排名让作者开始探究这套评分系统的底层逻辑。文章从Bradley-Terry模型讲起,解释了为何需要Elo等级分的指数变换来直观呈现选手间的实力差距,但其本质仍是静态模型,难以适应人类水平的波动。 为解决这一问题,文中对比了多种动态评分方案:简单的增量更新系统计算便捷但信息利用不足;引入历史衰退的系统能综合考量,却可能导致不活跃选手分数跳跃。最终,文章聚焦于WHR(全历史排名),它基于动态Bradley-Terry模型,核心突破是提出了一种近似算法,能通过牛顿插值法在每次比赛后增量更新分数,并在后台进行迭代优化,从而高效地利用全部历史数据推算每个时间点的准确评分。 作者指出,WHR的开源实现还针对围棋让子棋做了胜率修正,这种思路或许可推广到其他竞技场景。整篇文章从一个现象出发,抽丝剥茧地梳理了等级分系统的演进,清晰展示了WHR在精度与效率上的巧妙权衡。

本机暂存
IT 前端/ 2016-03-16 00:00:20 / 累计浏览 3,802

12个很少被人知道的CSS事实

作者从多年积累的CSS实战经验出发,分享了一系列常被忽视的语言细节。这些知识或许不常用于日常开发,但了解它们能帮助我们更深入地理解CSS的运作逻辑。 文章提到,body上设置的color属性不仅影响文本,还会间接应用于图片alt文字、列表边框与标记、hr元素等。visibility属性除了常用的visible和hidden,还有一个很少被用到的collapse值,在表格中能实现真正的空间清除。CSS3让background简写属性扩展到8个值,使用斜杠分隔position和size,编写时需要留意语法。clip属性生效有一个关键前提:元素必须设置为absolute或fixed定位。此外,垂直方向的margin/padding百分比是根据父级宽度而非高度计算的,border和text-decoration的简写也分别包含了更细分的子属性。 这些“冷知识”虽然应用场景有限,却像是CSS世界中的隐藏彩蛋,读来令人会心一笑,也能提醒我们:即便是熟悉的属性,底层规则可能仍有新意。

本机暂存
IT 前端/ 2016-03-15 23:53:08 / 累计浏览 2,846

前后端分离的思考与实践(二)

这篇讲的是前后端分离中“模板”这个模糊地带的梳理与实践。作者从传统开发模式切入,指出当模板逻辑堆积在服务端或浏览器端时,都会导致前后端职责不清、维护困难。文章的核心方案是,在 Java 服务与浏览器之间,引入一个前端可掌控的 NodeJS 中间层,将前后端的分割线从“硬件环境”重新定义为“工作职责”。 通过这个中间层,团队得以实现模板与路由的共享。前端使用一致的模板语言(如 XTemplate)和渲染引擎(JavaScript),决定是在 NodeJS 服务端渲染,还是交给浏览器端渲染,从而针对不同场景选择最优解。例如,对于复杂交互应用,首次进入时由 NodeJS 做全页渲染以避免白屏,后续交互则在浏览器端局部刷新,始终使用同一份模板,保证了体验一致性。 文章进一步通过多个案例(如单页面应用的 SEO 解决方案、跨终端页面的统一管理),展示了这一架构如何具体解决白屏等待、路由不匹配、SEO 困难等现实痛点。其本质是利用 NodeJS 的灵活性,让前端开发更聚焦于 UI 与交互,并与后端通过服务化接口进行清晰协作,最终提升整体项目可维护性与用户体验。

本机暂存
IT 前端/ 2016-03-15 23:51:42 / 累计浏览 3,630

前后端分离的思考与实践(一)

这篇讲的是如何通过引入NodeJS层来真正实现前后端职责分离,解决传统Web开发中前后端代码混杂、沟通成本高、性能优化受限等顽疾。 作者团队认为,仅靠浏览器端的SPA模式不够通用,真正的分离应该从职责划分:前端负责View和Controller,后端只负责Model与业务数据。为此,他们提出在后端服务和浏览器之间增加一层NodeJS应用。这层Node让前端能掌控Controller,自由决定服务端渲染、异步接口或BigPipe等输出方式,同时后端可以专注于业务逻辑。文章解答了常见的疑问,比如“为何多一层”:它并非多余,而是为了解锁前端的控制权,通过集中代理请求、优化通信来提升整体性能,尤其在移动端效果显著。 淘宝已在部分项目中实践该架构,初步验证了其在开发效率和性能上的收益。他们认为,技术实现并非难点,关键在于打通开发流程、积累最佳实践,使这种分离模式能稳定落地。

本机暂存
IT 前端/ 2016-03-15 23:46:25 / 累计浏览 2,130

让我们写快速的JavaScript,JS性能优化小窍门

这篇讲的是如何写出更快的JavaScript代码。作者从JS性能尚未达到极限的现状出发,直指在混合应用等场景中,性能优化仍是必要的“伎俩”。 文章没有空谈理论,而是用一系列直观的对比测试来揭示优化窍门。它告诉你,动态类型虽灵活,但会拖慢速度,保持变量类型一致(尤其是数组)是关键;`delete`运算符比赋值为`null`慢得多,而动态添加对象属性也会带来巨大开销。对于字符串拼接,`+=`运算符在主流浏览器上都胜过`concat`和`join`。在正则表达式使用上,`RegExp.prototype.exec`通常也比`String.prototype.search`更快。 更重要的是,这些结论都附带了跨浏览器(如Firefox与Chrome)的性能测试数据,比如位运算在Firefox上极快但在Chrome上却更慢。这些基于具体测试的发现,能帮助开发者在编写或优化JS代码时做出更明智的选择,避免那些“昂贵”的操作,让代码真正跑得更快。

本机暂存
IT 后端/ 2016-03-15 23:37:22 / 累计浏览 3,381

[Java基础教程]第十三章-Java多线程

这篇讲的是Java多线程,作者从“如何让服务器同时处理多个客户端”这个实际问题出发,解释了并发编程的必要性。文章用一个生动的买票比喻,把“串行”、“并行”和“并发”这三个容易混淆的概念讲得明明白白:排队是串行,多窗口同时卖票是并行,而一个售票员同时应付多个询问者则是并发。 更深入一点,作者还探讨了为什么在多核CPU普及的今天,讨论并发时常常仍基于单核模型,点明了任务调度、内存访问等现实约束。核心部分是用Java的Thread类重构服务器代码,展示了如何为每个新连接创建独立线程来处理。文章不仅给出了基础实现,还进一步模拟了10个用户同时连接的场景,并加入了一个将聊天记录缓存后批量写入文件的ChatLogManager类,让示例更贴近生产环境中的考量。 整体而言,这篇教程从概念辨析到代码实践,一步步带着读者理解并发的本质,并快速掌握Java多线程编程的入门要点。

本机暂存
IT 后端/ 2016-03-15 23:35:34 / 累计浏览 3,401

[Java基础教程]第十二章-Java输入输出流

这篇文章从计算机底层二进制存储与字符编码的原理切入,为理解Java的输入输出流(IO)体系打下了基础。作者指出,由于文件存储和网络传输的本质是字节,而文本处理需要字符,这导致了Java IO设计中经典的“三层包装”结构:先通过`FileOutputStream`等获取字节流,再用`OutputStreamWriter`指定编码(如UTF-8)转换为字符流,最后再套上`BufferedWriter`提升效率。 文章的核心部分通过清晰的代码示例,详细演示了如何操作文件:从创建、检查是否存在、获取路径,到使用缓冲字符流写入和读取内容。特别强调了`flush()`操作的重要性以及流必须正确关闭的原则。此外,内容还扩展到了网络通信场景,利用`ServerSocket`和`Socket`结合输入输出流,演示了简单的服务器与客户端(通过telnet)交互过程。 整体而言,这篇教程不仅展示了“怎么用”,更着重解释了“为什么这么设计”,将看似繁琐的流转换过程与计算机底层的数据表示逻辑联系起来,帮助初学者建立起更清晰的认知框架。文末的小练习也提供了实践巩固的机会。

本机暂存
IT 后端/ 2016-03-15 23:33:40 / 累计浏览 3,567

[Java基础教程]第十一章-Java类和对象

这篇讲的是Java面向对象编程中类与对象的核心机制。作者从Object类的方法重写说起,强调了继承中`hashCode`与`equals`必须协同重写的规范,并用`toString`的重写来解释如何让对象打印变得友好。 文章的重点在于辨析继承与接口这两种实现代码复用的方式。通过一个“小明的妈妈”既需要继承`Person`类又能烹饪的例子,作者生动地引出了`extends`单继承与`implements`多实现的语法区别与设计思路,这比单纯罗列语法要直观得多。 此外,内容还系统梳理了四种访问修饰符(`private`到`public`)的权限范围,这常常是初学者容易混淆的地方。文章并未止步于此,而是进一步延伸到了反射、抽象类和枚举`enum`这些进阶主题,特别是通过反射操作`Materfamilias`类的代码示例,让“类本身也是对象”这一抽象概念变得可感。 整体而言,这不仅仅是一章语法罗列,而是围绕“类”这个核心,将继承、多态、封装以及动态特性串联起来,构建了一个完整的认知框架。

本机暂存
IT 移动开发/ 2016-03-15 23:31:20 / 累计浏览 2,769

iOS可视化编程 Tips 之“消灭重复又无聊的代码之 UITableView 篇”

这篇讲的是如何利用Storyboard的可视化特性,去掉iOS开发中一些重复又琐碎的UITableView编码工作。作者从两个高频场景切入:一是在非UITableViewController里,手动添加UITableView后那两行必须写的代理设置代码(delegate和dataSource),其实可以通过在Storyboard中连线直接省掉,让代码更干净。二是处理“数据不足时隐藏空白行”这个需求,作者指出了常见的tableFooterView = UIView()写法可能引发刷新浪费和崩溃的隐患,并提出了一个更稳健的可视化方案:直接在Storyboard里为表格放一个占位cell和一个同级空view。通过调整空view的高度,不仅能达到隐藏效果,还能灵活控制底部边框的显示与否,甚至可以用于实现表格底部固定视图这种特殊UI,避免了许多额外编码。本质上,这是在用Xcode的界面工具代替手写样板代码,让开发更直观健壮。

本机暂存
IT 移动开发/ 2016-03-15 23:28:22 / 累计浏览 3,414

iOS下自己动手造无限循环图片轮播

这篇讲的是如何用Swift从零搭建一个类似支付宝首页的无限循环图片轮播组件。作者从界面搭建入手,详细演示了如何使用`UIScrollView`配合`UIPageControl`,并利用Auto Layout完成基础布局。 实现无限轮播的核心思路非常巧妙:在真实图片序列的首尾各拼接一张额外的图片。当用户滑动到最前或最后这张“辅助图”时,代码会在`scrollViewDidScroll`代理方法中,悄无声息地将`contentOffset`重置回真实图片序列的起始位置,从而在视觉上创造出可以一直朝一个方向滑动的错觉。文章也具体展示了如何通过计算滑动偏移量来同步更新底部小圆点的指示位置,并解决了由此带来的小圆点错位问题。 文章最后附有完整的代码示例和最终效果GIF,思路清晰,步骤具体,对于想要理解滚动视图高级用法或实现自定义轮播组件的iOS开发者来说,是一份非常实用的实战指南。

本机暂存
IT 移动开发/ 2016-03-15 22:45:25 / 累计浏览 2,322

Swift类型转换

这篇讲的是 Swift 类型转换的实践与考量,核心矛盾源于 Swift 强类型安全特性与遗留 Cocoa 框架 API 之间的磨合。 文章从 Objective-C 灵活的 `id` 类型出发,对比了 Swift 中更严格的类型系统。由于大量 Cocoa API 返回的是 `AnyObject` 或 `[AnyObject]`,在 Swift 中处理这些对象时,我们常常需要进行向下类型转换。作者详细展示了三种常见做法:使用 `as!` 进行强制转换、使用 `as?` 结合 `if let` 进行安全可选转换,以及对整个数组进行转换。 关键差异在于安全性:`as!` 在类型不匹配时会导致运行时崩溃,而 `as?` 会在失败时优雅地返回 `nil`。文章进一步指出,对数组的整体转换(如 `as? [UIView]`)要求所有元素都是目标类型,否则整个结果就是 `nil`,这与单个元素的转换行为并不等同。 最终,文章探讨了在明确知晓类型(如确定 `subviews` 数组全是 `UIView`)的场景下,为了代码简洁可以谨慎使用强制转换,但同时也警示了这种做法牺牲了部分类型安全,在代码演化或意外情况下可能存在风险。

本机暂存
IT 移动开发/ 2016-03-15 22:42:50 / 累计浏览 3,523

iOS可视化编程 Tips 之“无需代码设置圆角”

这篇介绍的是iOS开发中的一个实用技巧:通过Xcode的User Defined Runtime Attributes来设置视图圆角,无需编写任何代码。 传统上,开发者可能在代码中设置layer.cornerRadius属性来添加圆角,这需要额外的代码编写和编译过程。而作者从提升开发效率的角度出发,展示了如何在Interface Builder中直接操作:在属性检查器

本机暂存
IT 移动开发/ 2016-03-15 22:40:04 / 累计浏览 2,423

翻译篇:10 Things You Need to Know About Cocoa Auto Layout

这篇译文源自Ole Begemann 2013年的博客,讲的是开发者第一次接触Cocoa Auto Layout时,如何快速掌握核心思维。作者开篇就点明,Auto Layout和传统的springs-struts模式差异很大,但别被复杂度吓倒——其实只需理解几条关键规则就能上手。 文章梳理了十条必备知识。它首先澄清通用概念:一个视图在每个方向上至少需要两个约束来明确定位,并善用控件的“固有大小”来减少约束数量。随后,文章深入分析了Interface Builder(IB)在Auto Layout下的行为逻辑,比如IB为何会“阻止”你删除某些约束(因为会导致布局模糊),以及如何正确添加新约束。这些内容虽然针对Xcode 4.x,但IB的核心设计理念依然有参考价值。最后,文章转向代码实践,强调在代码中使用Auto Layout时必须“忘记frame”、手动禁用Autoresizing Masks,并通过约束动画而非直接修改frame来实现界面动效。 尽管部分IB操作细节已更新,但文章对Auto Layout底层逻辑的剖析——从约束的完备性、固有大小的作用,到IB与代码开发思路的转换——至今仍是理解这套系统的坚实起点。

本机暂存
IT 前端/ 2016-03-15 22:35:29 / 累计浏览 1,780

使用 Sass (Using Sass)-插件,缓存,配置选项,语法选择及编码格式

这篇整理自官方文档的指南,深入浅出地介绍了 Sass 的三种核心使用方式:作为命令行工具、Ruby 模块以及 Rack/Rails/Merb 框架的插件。文章首先从安装 Sass gem 讲起,然后逐步展开不同场景下的具体用法。 在命令行部分,它演示了如何快速编译单个文件,以及使用 `--watch` 命令实时监控文件或整个目录的变化并自动更新 CSS,这对提升开发效率很有帮助。文章还展示了如何在 Ruby 代码中直接调用 `Sass::Engine` 进行编译。 对于框架集成,内容覆盖了 Rails 2、Rails 3、Merb 以及 Rack 应用的具体配置步骤,比如在 `Gemfile` 或 `config.ru` 中添加必要的代码。这些细节对于在实际项目中落地 Sass 非常实用。总的来说,无论你是想在本地环境快速上手,还是将 Sass 嵌入已有的 Web 框架,这篇文章都提供了清晰、可操作的路径。

本机暂存
IT 前端/ 2016-03-14 23:59:22 / 累计浏览 4,443

用CSS代码写出的各种形状图形的方法

用CSS“画”图形,这篇是个实用的手册。作者一共整理了20种常见图形的CSS实现方法,从基础的正方形、长方形,到需要利用border技巧“掰”出来的各种方向的三角形、梯形,再到运用了`transform`变形和伪元素组合而成的六角星、五角星、五边形等复杂形状。 文章的核心价值在于它并非空谈理论,而是为每个图形都附上了可以直接使用的代码和效果预览。比如,实现一个平行四边形只需要一个`skew`变形,而画一个五角星则需要精巧地组合主元素与`before`、`after`伪元素,并配合旋转角度。这些示例清晰地展示了如何通过属性的叠加与变换,将简单的矩形“雕刻”成所需的任何形状。 对于前端开发者而言,这既是一份方便查阅的代码清单,也是一个学习CSS几何与变形技巧的趣味案例集。它直观地体现了CSS的灵活性,证明了无需依赖图片,仅用代码就能创造出丰富的视觉元素。

本机暂存
IT 前端/ 2016-03-14 23:58:23 / 累计浏览 2,154

正确使用HTML title属性

这篇讲的是 HTML 的 title 属性,一个存在了超过 14 年却问题重重的特性。作者开篇点明,在某些场景下(例如对辅助技术和移动设备用户隐藏内容,只对键盘用户显示)title 属性似乎是合理的选择,但随即指出其本身存在广泛且严重的缺陷。 文章的核心在于揭示 title 属性的“鸡肋”本质:随着触摸设备的普及,其作用被进一步削弱。关键问题在于,它对手机用户、仅键盘操作者、以及依赖屏幕阅读器、屏幕放大器等辅助技术的用户群体非常不友好。浏览器缺乏支持,无法通过键盘或移动端触发显示其内容,屏幕阅读器也普遍不予播报,这使得它无法可靠地传递信息。 在有限的“有用”场景中,文章建议仅在为 frame/iframe 贴标签,或提供需要程序实现才能在特定情况下显示的辅助标签时使用。相反,作者详细列举了多种“无用或有害”的用法,例如用它来替代表单标签、为图片添加标题、提供与可见文本重复的信息,或作为缩写扩展等,并解释了这些做法为何对可访问性和用户体验没有帮助甚至造成干扰。 因此,这篇文章为前端开发者和内容创作者提供了一个清晰的避坑指南:在为元素添加额外信息时,应优先考虑确保内容对所有用户可见且可访问,而不是仅仅依赖这个支持度不足的 title 属性。

本机暂存
IT 移动开发/ 2016-03-14 23:54:31 / 累计浏览 3,200

iOS并发编程(Concurrency Programming)系列之一:Run Loop

这篇讲的是iOS并发编程系列开篇的Run Loop深度解析。作者没有从线程基础讲起,而是直接切入实际开发中更需要理解的线程管理机制。他用了一个工厂流水线的生动比喻:线程是流水线,而Run Loop就是决定何时启动、何时暂停的主管,避免资源空转或浪费。 文章重点剖析了Run Loop的核心作用——它本质上是一个事件处理循环,负责在“有事做时保持线程繁忙,无事时让其休眠”。作者指出,在大多数异步任务中,我们无需手动管理线程生命周期,但当需要长驻线程处理持续事件时,Run Loop就是关键的控制枢纽。 值得注意的实战细节是:启动Run Loop前必须先为其添加输入源或Timer事件,否则`run`方法会立即返回,线程无法保持。这个常见的初学者陷阱被明确点出。文章还简要对比了Run Loop与其他平台(如Android Looper)的共通机制,说明它是多线程编程中的普遍需求。作为系列首篇,它为后续探讨Operation Queues、GCD和锁等主题奠定了重要的概念基础。

本机暂存
IT 移动开发/ 2016-03-14 23:46:31 / 累计浏览 3,836

Swift 性能探索和优化分析

Swift 编程语言在发布时被寄予了超越 Objective-C、媲美 C 语言的性能厚望,但许多开发者在实际使用中发现其效率并未如预期般突出,甚至容易不慎陷入性能陷阱。这篇长文正是从这一实际矛盾出发,系统剖析了 Swift 的性能内核与优化之道。 文章首先阐明了 Swift 值得期待的性能基础:其通过编译期方法绑定取代了运行时消息发送,强类型系统为编译器优化提供了充足信息,尤其是引入了 Swift 中间代码(SIL)作为关键优化层。同时,Swift 对值类型(struct)的巧妙运用,在保证不可变性优势的同时避免了不必要的内存开销。 针对“如何发现问题”,作者详细介绍了实战中的性能测试方法。从最直接的 `CACurrentMediaTime` 打点计时,到封装成便捷的 `measure` 函数,再到利用 Instruments 的 Time Profiler 进行宏观分析,以及使用 XCTest 的 `measureBlock` 建立性能基准测试,形成了一套从快速诊断到持续监控的完整工具链。 文中还结合了开发者超过一年的实战经验,不仅解释了“为什么”性能重要,更给出了“怎么做”的具体考量与避坑指南,是一篇将语言原理、工具使用与工程实践紧密结合的深度探讨。

本机暂存
IT 移动开发/ 2016-03-14 23:44:56 / 累计浏览 3,519

iOS 开发 UI 搭建心得(二)—— 善用 xib

作者从iOS开发的实际操作出发,展示了如何善用xib来搭建UI。文章以创建一个可复用的图片文字按钮为例,详细演示了从创建xib文件、直观地设置按钮样式与圆角,到将按钮载入故事板或通过代码动态加载,最后响应点击事件的完整流程。作者指出,xib能极大地减少纯代码量,让许多界面属性通过可视化拖拽和简单配置即可完成,从而降低维护成本。尽管StoryBoard减少了单独xib文件的数量,但理解xib的原理并掌握其用法,对于构建灵活、可复用的UI模块依然至关重要。文章最后建议,在开发中应优先考虑使用xib或StoryBoard来搭建界面。

本机暂存