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

最新文章

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

IT 后端/ 2016-02-21 22:57:40 / 累计浏览 3,479

一个Laravel队列引发的报警

作者从一次诡异的服务器报警说起:集群中某台服务器内存飙高,但通过常规命令却查不到内存大户。通过对比不同服务器的进程列表,线索最终指向了 Laravel 队列。 深入排查后发现,问题的根源并非进程自身,而是 Laravel 队列在默认的监听模式下,其子进程会频繁重启。每次重启都会创建并删除大量临时文件,导致 Linux 系统内核中的 dentry 缓存(目录项缓存)被急剧撑大,从而“吃掉”了大量内存。文章通过 strace 跟踪清晰地捕捉到了这一过程。 针对这一问题,作者提供了两个层面的解决方案:一是应用层面,强烈推荐启用 Laravel 队列的守护进程模式,避免不必要的进程重启;二是系统层面,在无法避免频繁文件操作时,可以通过调整内核参数如 `vfs_cache_pressure` 来尝试缓解。整篇文章完整展现了从现象入手,借助工具抽丝剥茧,最终定位到内核缓存层面问题的精彩排查思路。

本机暂存
IT 数据库/ 2016-02-21 22:55:45 / 累计浏览 2,352

MySQL processlist中最哪些状态要引起关注

排查MySQL性能问题时,盯着processlist看哪些SQL在跑只是第一步。更重要的是,通过连接的状态判断其是否正在经历瓶颈。这篇讲的就是那些需要特别警惕的processlist状态,以及背后对应的优化方向。 文章列举了从“copy to tmp table”、“Sending data”到“Waiting for lock_type lock”等12个关键状态。比如,看到“copy to tmp table”频繁出现,意味着你的ALTER TABLE操作可能在业务高峰锁表,建议使用pt-osc工具或移到凌晨执行。“Sending data”则常因查询扫描数据量过大,核心解法是创建合适的索引并添加LIMIT。而一旦出现各种“Waiting for... lock”,特别是全局读锁或元数据锁,就说明有DDL操作在阻塞整个实例,必须调整维护窗口。 作者将每个状态与具体的数据库行为(如磁盘IO差、临时表溢出、锁等待)和明确的优化动作(如调参数、加索引、换引擎)直接关联起来。下次当你发现数据库响应慢,除了看慢查询日志,不妨也看看processlist里的这些“状态信号灯”,往往能更快定位到问题根源。

本机暂存
IT 开发者/ 2016-02-21 22:54:19 / 累计浏览 4,000

手滑的故事

这篇讲的是程序员们“手滑”引发的线上惊魂时刻。作者从自己和同行的经历出发,提到了忘带WHERE条件的UPDATE和DELETE、误执行`rm -rf`,以及误杀重要的线上Hadoop任务、误删生产文件等真实案例。那些操作失误后瞬间“浑身颤抖”的体感,相信很多工程师都似曾相识。 文章不仅罗列事故,更着重讨论了事后反应的光谱:从最糟糕的当众批评、追责到底,到更理性的对外冷处理、对内聚焦问题根因而非个人。作者认为,责任主体往往已懊悔万分,过度追责反而导致“不做不错”的消极心态;而复杂的Checklist或繁琐的审批流程,也只是笨拙且降低效率的补救。 他更推崇那些“不知不觉”规避风险的实践,例如建立不同权限的Linux用户,以及做好充分的备份与容错机制。核心观点是:在系统维护中,人远不如机器可靠。与其纠结于事后惩处,不如构建鼓励坦诚报告、聚焦系统性改进的工程文化,因为“没有手滑的人生,是不完整的”。

本机暂存
IT 开发者/ 2016-02-21 22:51:27 / 累计浏览 3,361

程序员如何写出一份好的文档?

程序员的工作不止是写代码,文档质量同样影响项目协作效率。这篇经验分享文章直接切入痛点,从四个实用技巧出发,教你如何写出清晰、易懂的技术文档。 作者首先强调了结构化的重要性——杂糅的信息会变成“云里雾里”,而将功能点逐条列出,逻辑立刻清晰。其次,对于socket通信这类流程性内容,一张流程图比大段文字更直观,读者能迅速把握整体逻辑。第三,当涉及连续的数据对比(如每月bug修复量)时,用图表替代文字描述,数字变化一目了然。最后,避免直接堆砌代码,转而使用伪代码或流程图来说明设计思想,能显著降低阅读门槛,让文档更具普适性。 这些技巧的核心,正如文中引用爱因斯坦的话,都指向一个原则:简单就是美。好的技术文档也应如此,用最直接的方式传递信息,让读者轻松理解复杂的内容。

本机暂存
IT 数据库/ 2016-02-21 22:50:46 / 累计浏览 2,732

教你如何查询当前主流数据库及其排名?

查询数据库流行度排名有捷径吗?作者直接指向了db-engines.com这个权威榜单。这篇文章带我们快速浏览了2015年6月的数据库流行度前十名,像Oracle、MySQL、SQL Server这些巨头稳居前列,但有意思的是,微软的Access依然高居第七,让不少开发者感到意外。同时,Redis作为新贵闯入了前十,而国产的巨杉数据库排名则从186位滑落至235位,引发了讨论。 榜单的排名并非凭空而来,它综合了277个数据库在资讯网站、谷歌搜索、技术讨论、招聘市场以及社交网络上的热度数据。通过这些多维度的积分统计,这个榜单真实反映了当时各类数据库在开发者社区和行业中的实际关注度与应用情况。对于需要了解数据库技术趋势或进行技术选型的人来说,这提供了一个非常直观的参考视角。

本机暂存
IT 开发者/ 2016-02-21 22:47:37 / 累计浏览 2,263

从Java和JavaScript来学习Haskell和Groovy(DSL)

这篇讲的是如何借助Java和JavaScript的已有知识,来理解Haskell和Groovy中DSL(领域特定语言)的实现思路。文章开篇厘清了DSL的概念——它专注于特定领域,追求简洁与表达力,而非通用性。 作者首先剖析了Java实现DSL的路径与局限。Java主要依赖链式调用和嵌套函数来构建结构,但受限于冗长的语法。随后,文章深入讲解了JDK8的闭包与Lambda表达式如何让Java拥有函数式编程的可能,使代码(如排序逻辑)得以大幅简化,并解释了`@FunctionalInterface`注解背后的原理。 转向JavaScript时,文章指出其核心优势在于函数可作为“一等公民”,使得DSL能以更灵活、更具表现力的形式被编写,例如通过高阶函数实现数据流的流畅操作。 最后,文章展示了Groovy为何是DSL的“天选之语”。它不仅语法糖丰富、代码接近自然语言,更提供了`MethodMissing`等特性,能优雅地构建如HTML生成器这样可读性极强的DSL示例。通过对比这三种语言的特性,文章清晰地呈现了它们在DSL实现上各自的适用场景与表达能力。

本机暂存
IT 数据库/ 2016-02-21 22:46:50 / 累计浏览 3,189

一次临时表空间大量占用问题的处理

这篇讲的是如何诊断和解决一个核心交易系统临时表空间暴涨至600GB的问题。作者从实际案例出发,发现占用临时空间的大量排序段,并非由当前执行的SQL产生,而是源于大量会话打开了需要复杂排序的查询游标后,一直没有关闭,导致Oracle必须维持这些游标的状态和已排序的数据,从而长期占用临时段。 文章详细展示了排查过程:通过v$sort_usage定位到大量会话关联同一个SQL_ID,但发现该SQL本身并不需要排序。真正的“元凶”是这些会话中打开的另一个游标——一条对千万级数据进行排序的业务查询。由于应用在取数后未正确关闭游标,使得排序段无法释放。作者甚至用PL/SQL代码复现了这一过程,清晰演示了临时空间是如何被一个未关闭的游标“泄漏”出去的。 这篇案例的精彩之处在于,它纠正了一个常见误区,并提供了一套实用的诊断思路:当遇到临时表空间异常时,应重点检查会话的打开游标,特别是那些有大量排序操作且未完成处理的SQL,而不仅仅是看当前正在执行的语句。

本机暂存
IT 移动开发/ 2016-02-21 22:45:35 / 累计浏览 1,246

iOS开发Extra系列:NSString***

这篇讲的是 iOS 开发中最基础也最常用的对象之一:NSString。作者从实际开发角度出发,指出它在 iOS 系统中的许多用法与其他语言存在差异,并系统梳理了相关的实用技巧。 文章首先介绍了使用 `stringWithFormat:` 和 `initWithFormat:` 进行格式化创建字符串的方法,并详细列出了 `%@`、`%d`、`%f` 等常用替换符。接着,重点讲解了用于表示和操作字符串范围的结构体 NSRange,包括其定义、通过 `NSMakeRange` 函数创建,以及在查找子字符串时的返回值应用(如 `rangeOfString:` 方法,以及使用 `NSCaseInsensitiveSearch` 等选项进行精细化查找)。 此外,文章还涵盖了字符串的截取(`substringToIndex:`、`substringWithRange:`)、比较(前缀 `hasPrefix`、后缀 `hasSuffix` 以及 `isEqualToString:` 完全比较)、替换、按分隔符分离成数组,以及读写文本文件等一系列核心操作。这些方法覆盖了日常开发中处理字符串的主要场景。 对于 iOS 开发者而言,这篇内容相当于一份 NSString 的高效查阅手册,快速回顾了这些不可或缺的 API 及其使用要点。

本机暂存
IT 前端/ 2016-02-21 22:44:07 / 累计浏览 2,720

小谈inline-block的那点空隙

这篇文章从一个常见困惑出发:明明没设置边距,`inline-block` 元素间却总出现难看的空隙。作者首先点明问题根源在于 HTML 代码中的空白符(如换行、空格)被浏览器渲染成了可见间距。 在剖析了 `inline-block` 同时具备行级与块级特性的本质后,文章系统地介绍了几种解决方案。从需要牺牲代码结构的“彻底消除空白符”,到利用 CSS 特性但需注意浏览器兼容性的 `font-size:0` 方法,再到利用 `word-spacing` 和负 `margin` 的调整技巧,甚至探讨了去掉闭合标签这种“非常规手段”。每种方案都配有代码与效果图进行直观对比。 文章的价值不止于解决问题。它还对比了 `inline-block` 与 `float` 的适用场景:前者更适合需要文档流参与、利用 `text-align` 水平居中或实现垂直对齐的布局,而后者则可能脱离文档流影响周围元素。文末附带了深入阅读资源,为进一步学习提供了入口。

本机暂存
IT 后端/ 2016-02-21 22:42:33 / 累计浏览 2,783

[Java基础教程]第十章-Java容器

这篇讲的是如何用“小明打酱油”这个生活化例子,来拆解Java核心容器(List、Set、Map)的用法与区别。作者从重构打酱油流程出发,先让商店用`ArrayList`持有酱油列表,并详细演示了增、删、改、查的基本操作。 很快代码暴露了问题:商店用List卖酱油,居然反复给了小明同一瓶!这个错误生动地引出了`List`有重复、有序的特性。于是,文章引入了`Set`(以`HashSet`为例)来解决去重问题,重构代码后小明终于拿到了正确的5瓶酱油。这部分对比了List与Set在数据结构和适用场景上的关键差异。 文章并未止步于此,它进一步扩展场景:当商店要支持多品牌酱油时,简单的集合不够用了。这时,`Map`(以`HashMap`作为实现)登场,通过“品牌名(key)-酱油列表(value)”的映射关系,优雅地解决了分类存储和查找的需求。整个过程自然融入了泛型、接口与实现类、以及遍历方式(普通循环与foreach)等知识点。 作者通过一步步迭代代码、暴露问题并修复,让读者在贴近生活的业务逻辑中,直观掌握了Java常用容器的核心特性和典型应用场景。

本机暂存
IT 后端/ 2016-02-21 22:40:23 / 累计浏览 2,562

[Java基础教程]第九章-Java日期处理

这篇讲的是Java日期处理的基础入门。作者从“Java中时间如何表示”这个问题切入,解释了系统以1970年1月1日为基准,用毫秒数记录时间的本质。文章演示了如何通过 `System.currentTimeMillis()` 和 `Date` 类获取当前时间戳,同时也指出了直接打印 `Date` 对象会输出类似“Mon Feb 01 ...”的默认格式,对不熟悉这种表达的开发者来说不够直观。 为了解决这个格式化问题,文章重点介绍了 `DateFormat` 工具类及其常用子类 `SimpleDateFormat`。通过一个具体的代码示例,作者展示了如何用一行简单的格式化模式(如 `"yyyy-MM-dd HH:mm:ss"`)将时间戳转换为我们熟悉的“年-月-日 时:分:秒”格式。文章还附上了一张详尽的表格,列出了从 `G`(纪元)、`y`(年)到 `M`(月)等所有格式化字母的含义与示例,方便读者随时查阅。 对于刚接触Java时间API的开发者,这篇文章清晰地走通了从获取原始时间到输出友好格式的完整路径。它把散落在官方文档中的零散知识点(时间戳、Date类、格式化规则)串联成一个实用的操作流程,帮助读者建立起处理日期时间的第一块基石。

本机暂存
IT 后端/ 2016-02-21 11:32:24 / 累计浏览 2,408

[Java基础教程]第八章-Java字符串

这篇讲的是Java里无处不在的String类,堪称“第九种基础数据类型”。作者从字符串的初始化开始,对比了直接赋值和通过new关键字创建的区别,并指出前者更为常用。在字符串拼接部分,文章对比了直观的“+”运算符与性能更高的StringBuilder,建议在拼接超过5个字符串时考虑后者。 文章重点厘清了几个常见误区。首先是基本类型与String的相互转换,详细列举了int转String的多种方式,以及String转int的两种常用方法。更关键的一点是字符串比较的陷阱:用“==”比较两个值相同的字符串可能返回false,这是因为涉及到了JVM的存储机制。作者明确指出,必须使用equals()方法来比较字符串的内容,以确保结果符合预期。 此外,文章还快速介绍了length()、substring()、charAt()等常用字符串操作方法,并通过一个统计字母出现次数的练习来巩固知识。整体内容扎实,对于刚接触Java字符串的开发者来说,能有效避开几个初期容易踩的坑。

本机暂存
IT 后端/ 2016-02-21 11:13:28 / 累计浏览 3,499

DLNA家庭高清视频组网方案

这篇讲的是怎么用DLNA技术,在家庭Wi-Fi环境下,让手机、平板和电视都能流畅播放电脑或硬盘里的高清视频。 作者从最常见的需求出发:视频存在PC或移动硬盘上,想在手机、iPad和智能电视上随时播放,还能控制进度,并且支持AVI、MKV、MP4等常见格式。文章先横向对比了三种主流方案:土豪用NAS一体机,折中选带USB接口的智能路由器,以及最省钱的“穷人方案”——在PC上搭建DLNA服务器。 文章的核心就是详细拆解这个成本最低的PC方案。具体来说,需要在PC端安装像TwonkyMedia server这样的DMS软件,配置好共享视频的目录;然后在手机或iPad上安装支持DLNA的播放器,比如iPad上推荐oPlayer,安卓端推荐VLC。这样,只要PC开机并处于同一网络,移动设备就能发现服务器并播放里面的影片。 作者通过具体的软件配置截图和播放器界面展示,把搭建步骤讲得比较清楚。这个方案的关键在于,它绕过了购买专用硬件的门槛,用一台常用电脑就能搞定家庭影音的无线共享,对预算有限但又想享受便利的用户来说,是个切实可行的起点。

本机暂存
IT 前端/ 2016-02-20 16:56:08 / 累计浏览 3,298

常用跨域方法实践(二)

这篇讲的是作者在《常用跨域方法实践》系列的第二篇中,深入介绍了document.domain、URL.hash、cross-fragment、window.name和postMessage这五种经典但相对“非主流”的跨域通信方案的具体实现。与依赖CORS或JSONP的常见方案不同,这些方法往往利用了浏览器的一些底层特性或历史遗留机制,解决特定场景下的问题。 例如,document.domain适用于具有相同父域名的子站点(如www和sample.myapp.com),通过修改这个属性即可实现内部应用的直接通信。URL.hash和其升级版cross-fragment,则利用了hash变化不触发页面刷新的特性,通过监听和修改iframe的hash值,甚至借助代理页面,实现了双向消息传递。作者为每种方式都提供了可运行的测试页面代码和效果演示,清晰地展示了从消息发送、监听到响应的完整流程。 文章不仅展示了如何“做”,也隐含了这些方案的适用边界与取舍:document.domain限于同父域;基于hash的方案虽然巧妙,但可能与其他业务逻辑中的hash使用产生冲突。对于理解浏览器安全模型的历史脉络,以及在特定约束下(如需兼容老旧环境或处理同父域子站通信)如何灵活选择技术方案,这些实践案例提供了非常扎实的参考。

本机暂存
IT 后端/ 2016-02-20 16:47:13 / 累计浏览 2,244

nodejs文件无刷新上传

这篇讲的是在Node.js环境下如何实现文件无刷新上传,改善传统表单提交带来的页面刷新问题。作者从ExpressJS和multiparty工具包出发,详细拆解了基于RFC1867协议的两种异步上传方案。 第一种方案利用隐藏的iframe接收服务器响应,避免页面跳转,并通过JavaScript跨窗口调用实现结果回传。这种思路兼容性极佳,适合需要覆盖老旧浏览器的场景。第二种方案则拥抱现代Web技术,使用XMLHttpRequest第二版和FormData对象实现真正的Ajax异步上传,但需要浏览器对相关标准有较好支持。 文章并未止步于方案罗列,而是进一步展示了如何通过路由参数合并两种方式的后端逻辑,体现了代码复用的工程思维。无论是对iframe这一“老技术”新用的剖析,还是对前端上传演进思路的梳理,对开发者在实际项目中选择合适方案都有清晰的参考价值。

本机暂存
IT 前端/ 2016-02-20 16:46:18 / 累计浏览 3,497

常用跨域方法实践(一)

作者从阅读《跨终端Web》一书得到启发,重新梳理并实践了两种经典的前端跨域方案:JSONP与CORS。这篇文章详细拆解了两者的实现原理与代码细节。 对于JSONP,核心在于利用 `