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

最新文章

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

IT AI/ 2017-03-01 23:11:39 / 累计浏览 3,434

看历史:下一波伟大公司已经诞生,就在企业服务和AI

这篇文章从历史周期出发,梳理了互联网行业“伟大公司”的诞生与演变规律。作者通过自制一张覆盖经济周期、公司决策和投资热点的详图,发现了几个核心趋势:伟大公司总是在经济低谷期集中诞生,并在上升期壮大;而能否提前布局下一个浪潮(如阿里从电商延伸至云计算、物流与金融科技),决定了公司能否穿越周期。 作者的结论极具启发性:当前正处于又一个经济低谷与迷茫期,各种概念涌现,但真正的下一波浪潮已经清晰,那就是**企业服务(To B)与人工智能**。文中以阿里近年来的战略布局和谷歌对AI的押注为例,指出这些领域正是伟大公司正在下重注的方向。文章最后提出,在低谷期,“活着”并看清趋势、专注正确赛道,比追逐短期热点更为重要。

本机暂存
IT 设计/ 2017-03-01 23:09:02 / 累计浏览 2,806

聊聊设计模式(4):装饰模式

这篇文章讲的是设计模式中看起来简单却容易把代码搞复杂的“装饰模式”。作者从四个核心角色——抽象构件、具体构件、抽象装饰类、具体装饰类——的定义出发,指出了这个模式的易错点。 随后,文章通过一个代码发布平台迁移的实际案例,清晰展示了为何需要装饰模式。原本只需简单“发布”的代码平台,随着业务发展,需要依次加入构建、测试、日志、安全监测等新功能。如果不断修改原有类,代码会迅速膨胀失控。而装饰模式允许我们像“穿衣服”一样,动态地将新功能(具体装饰类)一层层叠加到核心对象(具体构件)上,既不修改原有代码,又能灵活扩展。 值得注意的是,文章还介绍了 ECMAScript 2017 新增的修饰器语法。它通过 `@` 符号从语言层面简化了传统装饰模式的实现,掩盖了复杂的包装类结构,让代码更直观。作者通过一个“激活”电子狗能力的例子,生动说明了这种新语法如何让装饰逻辑一目了然。 总的来说,这篇文章不仅解析了装饰模式的“是什么”和“怎么用”,更通过场景演进深入浅出地阐释了“为什么用”,帮助开发者理解如何通过组合而非继承来优雅地扩展对象功能。

本机暂存
IT 后端/ 2017-03-01 23:06:03 / 累计浏览 2,184

【死磕Java并发】—–Java内存模型之重排序

这篇文章深入探讨了Java内存模型中的重排序机制,解释了编译器和处理器为何以及如何在不破坏程序最终结果的前提下调整指令顺序。 作者从“as-if-serial”语义出发,结合具体代码示例(如`int a=1; int b=2; int c=a+b;`),清晰地阐述了在单线程环境下,只要不影响最终结果,操作间的顺序可以被优化重排。文章还特别指出了JVM对异常处理的特殊照顾,以确保`try-catch`块中的逻辑不被重排序破坏。 然而,文章的重点在于揭示重排序对多线程程序的潜在风险。通过一个使用了`volatile`的经典示例,作者展示了当两个线程共享变量且没有同步控制时,指令重排序(如赋值操作的顺序调换)可能导致其他线程观察到“中间状态”,从而破坏了程序预期的执行语义。这明确区分了重排序在单线程与多线程环境下的不同影响。 对于开发者而言,理解重排序是掌握Java并发编程中可见性问题的基础,它解释了为何在多线程场景下必须谨慎使用同步工具(如`volatile`或锁)来建立必要的内存屏障。

本机暂存
IT 后端/ 2017-03-01 23:01:17 / 累计浏览 2,980

【死磕Java并发】—–Java内存模型之分析volatile

这篇讲的是volatile关键字在Java内存模型(JMM)中的深层实现原理。作者从volatile的两大核心特性——可见性与禁止重排序出发,深入剖析了JMM是如何通过“内存屏障”这一底层机制来保证这些语义的。 文章通过一个经典的`VolatileTest`代码示例,生动演示了volatile读写操作如何与happens-before原则配合,确保跨线程的数据可见性。更硬核的部分在于对内存屏障插入策略的详解:JMM采取了保守策略,在volatile读/写前后精确插入StoreStore、StoreLoad、LoadLoad、LoadStore等屏障指令,以此强制维护操作的顺序性。 但巧妙之处不止于此。作者引用《Java并发编程的艺术》中的例子进一步说明,编译器在实际执行时会进行优化,只要不破坏volatile的内存语义,就可以省略部分冗余的屏障指令。这让我们看到,JMM的实现既保证了正确性,也蕴含着对性能的考量。对于想弄清楚volatile“凭什么”能起作用的开发者来说,这篇文章从理论到图解都梳理得相当清晰。

本机暂存
IT 后端/ 2017-03-01 22:58:18 / 累计浏览 2,184

【死磕Java并发】—–Java内存模型之从JMM角度分析DCL

这篇讲的是Java并发编程中一个经典而隐蔽的陷阱——双重检查锁定(DCL)在实现单例模式时,看似高效完美,实则潜藏因指令重排序导致的对象未初始化即被引用的严重问题。 作者从一个常见的错误懒汉式单例写法入手,逐步推导到试图优化性能的DCL写法。其核心矛盾在于:对象实例化包含“分配内存”、“初始化对象”和“引用赋值”三个步骤,而JVM或CPU可能对后两步进行重排序。这就意味着,在多线程环境下,其他线程可能看到一个已完成引用赋值、但尚未完成初始化的对象“半成品”,导致程序行为不可预期。 文章进而给出了两种标准解决方案。一种是利用`volatile`关键字的内存屏障语义,禁止实例初始化步骤的重排序,从而确保对象完全构造完毕后对其他线程才可见。另一种则是利用类加载机制,通过静态内部类延迟初始化,借助JVM对类初始化过程加锁的保证,来实现线程安全的单例。后者巧妙地将同步问题委托给了JVM本身,代码也更为简洁。 理解DCL的问题根源及解决方案,对于掌握Java内存模型中多线程可见性与指令重排序的实际影响至关重要。

本机暂存
IT 开发者/ 2017-02-20 00:16:04 / 累计浏览 1,315

2016 年度盘点(完整版)

这篇年度盘点里,作者分享了2016年在家庭、工作和生活上的多重变化与思考。技术篇幅主要围绕一次漫长而曲折的前端重构:最初目标只是将大型CSS文件变量化,却在过程中发现选择器与逻辑混乱,最终演变为前后端代码的全面重写。文章详细描述了项目如何因过度设计、人员变动和实际复杂度而一度失控,又如何在下半年通过聚焦功能完成、样式适配与浏览器兼容,最终在年末成功上线。 在工作层面,除了代码实践,作者也坦诚地谈到团队管理上的学习——认识到只注重过程不够,结果才是关键,同时也需要提升沟通技巧。生活方面,记录了新房装修、孩子莫莫出生带来的重心转移,以及由此引发的消费观念转变:败家重心从个人数码产品(如为家人购置红米手机、小米空净)转向家庭开支与育儿投入。 整体而言,这不仅是一份技术项目的复盘,更像是一位开发者对工作与生活平衡的观察。作者在结尾反思了理财与买房决策,流露出对“结果导向”与“人生自主”的朴素理解,让技术人的年度总结多了几分生活温度。

本机暂存
IT 算法/ 2017-02-20 00:11:59 / 累计浏览 4,441

研发面试最常用的10大算法

算法题是研发面试中躲不过的一道坎。这篇没有泛泛而谈,作者直接从实际面试需求出发,为你梳理了程序员在代码面试中最常遇到的10大算法类型。 文章重点以 **String/Array/Matrix**(字符串/数组/矩阵)这一类为例,点明了面试的“陷阱”——题目表面看很简单,但解决往往需要动态规划、递归等高级算法思维。文中还贴心地附上了Java中操作字符串和数组的常用方法代码片段,非常实用。 除了数组字符串,文章还涵盖了如排序、二叉树、图、动态规划等核心题型,并列举了大量经典例题,例如“Two Sum”、“单词分割”、“最长回文子串”等。对于每个类别,它都点出了核心考察点和需要深入理解的原理。 这更像一份高效的面试算法备战地图,帮你厘清重点,把有限的精力投入到真正需要花功夫去理解的算法原理上,而不是盲目刷题。

本机暂存
IT AI/ 2017-02-20 00:07:01 / 累计浏览 1,980

软件工程在Google

这篇文章揭秘了Google的软件工程实践体系。作者Fergus Henderson是Google资深工程师,曾是构建工具Blaze的核心开发者,他系统梳理了Google内部支撑其庞大业务运转的工程方法论。 内容从微观的代码级实践切入,详细介绍了Google如何管理其统一的源码仓库、构建系统,以及强制推行的代码审查与测试流程。文章也深入到宏观层面,剖析了发布工程、线上故障复盘,甚至是“频繁重写代码”这一颇具Google特色的文化。这些实践共同构成了一套确保大规模软件交付质量与效率的完整系统。 不同于一般的方法论文章,本文的实践细节非常扎实,涵盖了从日常开发、调试分析到项目管理的全流程,为读者提供了一个观察顶级科技公司如何“做软件”的珍贵窗口。对于希望提升工程化能力的技术团队,这些源自实战的经验与教训,具有很强的参考意义。

本机暂存
IT 前端/ 2017-02-19 23:59:26 / 累计浏览 2,600

JavaScript: 2016年回顾

这篇讲的是2016年JavaScript世界里那些值得关注的变化。作者从语言本身的演进出发,提到ES6/2015规范终于开始被广泛支持,开发者可以通过Babel等工具平稳过渡,而ES7/2016带来的async函数更是让异步代码的编写变得清晰直观。 文章重点回顾了渐进式Web应用(PWA)在这一年的成熟。随着Chrome 52的发布,PWA提供了离线优先、快速启动等关键能力,让Web应用首次能与原生应用在体验上直接竞争,而且改造步骤相对简单:启用HTTPS、创建应用清单和服务工作者。尽管当时苹果的支持尚不明确,但作者认为这已是移动端Web体验的一次重要突破。 此外,文章也提及了前端框架的竞争格局,React在当时备受瞩目,而Vue.js的第二版发布也标志着其影响力的上升。整体来看,这篇文章捕捉到了JavaScript在语言特性、应用形态和生态工具上共同向前迈进的一个关键节点。

本机暂存
IT 后端/ 2017-02-19 23:54:58 / 累计浏览 1,907

Springboot 实现 Restful 服务,基于 HTTP / JSON 传输

这篇讲的是如何用Springboot快速搭建一个标准的Restful API服务。作者从一个完整的Web案例切入,演示了从数据库准备、项目结构解析到运行测试的全过程。核心聚焦在控制层的实现上,作者通过一个城市的增删改查Demo,清晰展示了如何使用`@RequestMapping`来映射不同的HTTP动词(GET/POST/PUT/DELETE),并配合`@PathVariable`和`@RequestBody`注解优雅地处理URL参数和请求体。文章还对REST风格的五大要素和HTTP方法做了简要知识梳理,帮助读者理解背后的设计理念。这是一个很典型的、即开即用的Springboot RESTful入门示例,体现了框架在简化Web服务开发上的便捷性。

本机暂存
IT 后端/ 2017-02-19 23:53:55 / 累计浏览 3,067

为什么 Windows 的文件系统会有盘符,使用反斜杠分割路径

这篇技术博客从一个轻松的讨论切入——Windows系统在挂载大量盘符后会出现双字母命名的“诡异”现象,进而探讨其背后的设计逻辑。作者指出,虽然从现代视角看,盘符和反斜杠似乎是冗余的历史包袱,但其根源深植于MS-DOS的早期发展。 文章追溯到MS-DOS 1.0时代,当时主流软盘没有层级目录。盘符(A:、B:)的设计直接借鉴了更早的CP/M系统,方便用户在两个软盘驱动器间操作。随着IBM PC/XT引入10MB硬盘,盘符扩展到了C:。而路径分隔符选用反斜杠“\”而非Unix的“/”,是因为MS-DOS的开发者继承了DEC系统使用“/”作为命令行参数分隔符的惯例,为避免混淆,只能选择其他符号作为目录分隔符。 作者通过这段历史对比了Windows与Unix系系统的设计哲学:Unix将物理存储通过挂载点透明地整合进统一文件树,而Windows保留了显式的盘符概念。这些早期设计决策,最终形成了我们今天看到的、让不少程序员感到“深恶痛绝”的Windows路径风格。

本机暂存
IT 前端/ 2017-02-19 23:52:34 / 累计浏览 2,697

ECMAScript 6 Modules(模块)系统及语法详解

这篇文章梳理了 JavaScript 模块化发展的关键节点:ES6 模块。作者指出,在 ES6 之前,模块化由互不兼容的 CommonJS(语法简洁、同步加载,主导服务器端)与 AMD(语法复杂、异步加载,主导浏览器)两大标准割据。 ECMAScript 6 模块的目标正是融合二者的优点:提供类似 CommonJS 的简洁单值导出语法,同时保留对 AMD 异步加载的支持。更重要的是,作为语言原生标准,ES6 模块在结构上支持静态分析(便于工具检查和优化),并能更优雅地处理循环依赖,从而超越了前代方案。 文章系统讲解了 ES6 模块的语法细节,包括如何使用 `export` 进行“命名的导出”(一个模块可导出多个值),以及对应的 `import` 导入方式,并配有清晰的代码示例。

本机暂存
IT 后端/ 2017-02-06 23:18:08 / 累计浏览 3,242

关于TCP可靠性的一点思考,借此浅谈应用层协议设计

这篇讲的是,作者从网络游戏开发转向网络存储、机器学习等场景后,对TCP“可靠性”的重新审视。他提出,在需要重连重试的严肃应用中,TCP的ACK机制和操作系统的发送成功通知并不可靠——比如网络故障后,应用层无法获知哪些数据丢失,已提交的缓冲区也可能被释放,导致数据无法重发。 文章的核心,是剖析了三个基于TCP的应用层协议设计陷阱:发送方无法确认接收状态、无法区分“成功”与“未失败”、以及重试可能导致数据重复。针对这些“坑”,作者给出了具体的应对方案:必须在应用层设计确认应答(ACK);对于大文件追加,应采用带偏移量的positioned write;对于重复消息,则需在应用层进行去重。 最后,文章也讨论了优雅关闭连接的原则:应由接收最后一条消息的一方主动发起关闭。整篇文章从实际场景中的问题切入,深入浅出地阐明了在设计RPC协议时,不能盲目信任传输层,而必须在应用层构建自己的可靠性机制。

本机暂存
IT 移动开发/ 2017-02-06 23:14:23 / 累计浏览 2,686

AlloyTouch实现下拉刷新

这篇讲的是如何利用AlloyTouch库,在移动端Web页面中实现一套高度可定制的下拉刷新功能。文章背景源于手机QQ客户端原生下拉刷新的局限性——它无法满足跨平台体验统一、自定义动画以及与页面DOM元素联动等需求,因此需要一套纯Web的解决方案。 作者详细拆解了实现过程。核心思路是利用AlloyTouch处理滑动,并结合CSS transition和SVG动画来构建视觉反馈。页面骨架通过精巧的zIndex层级管理,确保下拉区域位于可滚动内容之上。下拉动画的关键在于预定义CSS类(如.arrow_up),通过JS切换类名来触发箭头旋转和提示文字变化,而Loading动画则使用了SVG的`animate`元素,通过12个矩形依次改变透明度来形成流畅的加载效果。 文章最后附上了简洁的核心代码和完整Demo链接。其价值在于不仅提供了“能用”的方案,更清晰地展示了“如何优雅地实现”,从动画细节到交互逻辑都给出了可复用的具体实现思路,对前端开发者很有参考价值。

本机暂存
IT 移动开发/ 2017-02-06 23:12:26 / 累计浏览 2,218

在 Unity3D 的 Mono 虚拟机中嵌入 Lua 的一个方案

这篇文章探讨了在 Unity3D 中嵌入 Lua 时,如何设计一个既简洁又完备的跨虚拟机交互方案。作者指出,市面上已有的许多方案存在过度繁琐或细节不完备的问题,他从 C/S 架构的通讯模型出发,提出了核心思路:将 Mono 与 Lua 间的交互抽象为一次“异地函数调用”。 这个方案的核心精巧之处在于,它不直接暴露 Lua 的 C API,而是通过一个中间层的 struct 来传递所有数据。调用函数和参数被编码进这个 struct,统一由一个 C 函数传递给 Lua 虚拟机。这种设计极大地提高了模块的内聚性,并严格控制了 Mono 和 Lua 两套异常机制的边界,防止异常泄漏。 文章还深入剖析了方案中最具挑战性的部分:两个虚拟机间的对象循环引用管理。作者详细讨论了如何利用 Lua 的弱表(weak table)和 ephemeron table 来检测仅被外部虚拟机引用的对象,并最终解除循环引用。同时,他也务实地建议,在多数项目中,保持清晰的单边引用关系(Lua 长期持有 C# 对象,C# 短期持有 Lua 对象)是更简单有效的做法。 基于这套理念,作者在周末实现了一个名为 sharplua 的轻量级方案。它提供了极简的 API:一个创建 Lua 虚拟机,两个核心的 CallFunction 和 GetFunction 用于双向调用,以及一个 CollectGarbage 用于管理跨语言对象的内存。整个实现代码开源,结构清晰,为希望自定义嵌入方案的开发者提供了一个干净的基础模板。

本机暂存
IT 安全/ 2017-02-06 23:09:48 / 累计浏览 3,041

真假百度蜘蛛的甄别

这篇讲的是如何从海量访问日志中,揪出伪装成百度蜘蛛的非法爬虫。 问题在于,仅凭请求头里的User-Agent字段判断并不可靠。真正的解决方法,其实百度官方早就给出了:对所有自称Baiduspider的访问IP进行反向DNS查询,只有其域名以 *.baidu.com 或 *.baidu.jp 结尾的,才是正品。作者通过一段精巧的shell脚本,在历史日志中批量执行这个验证,最终成功提取出了数百个真实百度蜘蛛的IP地址。 为了让这份数据更实用,作者进一步将这些零散IP聚合成了几个24位的CIDR网段,比如 119.63.195.0/24 和 123.125.71.0/24。这样,日后只需一条简单的IP归属网段判断规则,就能实现精准放行或封禁,而不再需要逐个IP核查。文章不仅提供了可直接复用的验证脚本,也给出了最终可供运维配置的实用数据,对于网站安全与流量分析都有参考价值。

本机暂存
IT 前端/ 2017-02-06 23:07:35 / 累计浏览 5,197

Chrome开发者工具的小技巧

这篇文章收录了多个实用但鲜为人知的 Chrome 开发者工具技巧,适合前端开发者和测试人员提升调试效率。比如,面对被压缩的 CSS/JS 代码,点击左下角的“{ }”图标即可一键格式化,让阅读调试更轻松;想观察元素在 hover 或 focus 状态下的样式?使用 CSS 面板上的“:hov”按钮就能强制切换 DOM 状态,无需手动悬停。 文章还介绍了动画调试的“慢动作”模式、通过一行命令将整个网页变为可编辑状态、模拟低速网络环境等实用功能。其中,“复制为 cURL”功能尤其值得一提,它在 Network 面板中能将 Ajax 请求直接导出为命令行 curl 命令,便于复现和自动化测试(但需注意隐私信息泄露风险)。此外,从给 DOM/XHR/事件监听器设置断点,到在 Console 中使用 jQuery 风格语法选择元素并监控事件,这些技巧覆盖了日常调试的多个常见痛点。整体而言,这是一篇聚焦细节、实操性强的工具指南。

本机暂存
IT 后端/ 2017-02-06 22:55:51 / 累计浏览 7,038

使用Mitmproxy分析接口

这篇讲的是如何使用开源的Mitmproxy来抓包分析移动端接口,作者从Charles收费、Fiddler Mac版不稳定的现状出发,引出了这款免费且稳定的替代工具。 文章不仅讲了安装,更重点演示了如何配置证书以拦截HTTPS请求。作者以汽车之家APP为例,完整展示了从配置代理、捕获流量到分析接口的实战过程。过程中有个有趣的发现:APP并非直接调用域名,而是通过HttpDNS获取IP,并在请求头中携带Host信息。直接访问截获的IP地址会无效,必须补充Host才行。 更精巧的是,在尝试获取品牌数据时,作者发现即使地址正确,返回结果也是空的。通过仔细比对请求与响应中的时间戳,他推测APP实现了一套自定义的缓存机制。主动调低请求中的ts参数后,成功拿到了完整的品牌列表数据。照此方法,他最终顺利获取了车系和车型的全部接口。 虽然演示基于特定版本的APP,但文章提供的这套从工具配置到逆向分析接口参数的方法论,具有很强的通用性,为服务端开发者打开了一扇观察移动端数据流向的窗口。

本机暂存
IT DevOps/ 2017-02-06 22:53:51 / 累计浏览 2,421

ubuntu系统root用户不能通过ssh远程登录问题

这篇讲的是Ubuntu系统中一个常见的SSH登录障碍:明明知道root密码,在虚拟机内能正常登录,但通过SSH远程连接时却总是报错“Password Authentication Failed”。问题根源往往藏在sshd的配置文件里——默认设置中`PermitRootLogin`被设为`without-password`,这意味着root用户只允许使用密钥认证登录,拒绝了所有密码验证请求。 解决方法直截了当:通过`vim /etc/ssh/sshd_config`编辑配置,将这一行改为`PermitRootLogin yes`,从而开放root用户的密码登录权限。修改完成后,只需重启sshd服务或重启系统,再次尝试远程连接就能顺利进入。 这篇内容虽然不长,但精准切中了一个实际运维中容易忽略的配置陷阱。对于刚接触Linux服务器管理的用户来说,理解认证方式与权限配置之间的对应关系,是排查连接故障的基础一步。

本机暂存
IT 后端/ 2017-02-06 22:52:02 / 累计浏览 2,375

【死磕Java并发】—–深入分析synchronized的实现原理

这篇讲的是Java开发者最熟悉的synchronized关键字,但深入到了它鲜为人知的底层实现。文章从开发者早期对synchronized“重量级锁”的刻板印象出发,系统剖析了JDK 1.6对其进行的一系列优化,彻底改变了这一认知。 作者首先拆解了同步代码块与同步方法在JVM字节码层面的不同实现(monitorenter/monitorexit指令与ACC_SYNCHRONIZED标志),并指出这一切的基础在于Java对象头中的Mark Word和Monitor结构。其中,Mark Word被设计成可随锁状态动态复用的高效数据结构,是理解锁升级的关键。 文章的核心价值在于清晰梳理了JVM的锁优化机制:从通过“自旋等待”避免线程频繁挂起,到引入“适应性自旋”让虚拟机智能调整等待次数;从利用逃逸分析“消除”不必要的锁,到将连续操作“粗化”为更大范围的锁。最终,重点阐释了锁状态如何从无锁、偏向锁、轻量级锁一步步升级到重量级锁的完整路径,以及每一步升级的触发条件与设计意图。这不仅是理解synchronized的百科全书,也为开发者在实际编程中合理使用同步工具提供了底层视角。

本机暂存