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

最新文章

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

IT DevOps/ 2016-03-21 23:55:14 / 累计浏览 3,104

centos误删东西的教训

这篇文章源于作者一次惊险的误操作经历。在尝试通过WinSCP向CentOS服务器传输文件时,因Dropbox被屏蔽和软件问题导致传输中断。作者随后移动(mv)了未完成的文件夹,而在清理时,不慎将其中的WordPress程序目录一并删除,险些酿成数据丢失的严重后果。 幸运的是,作者此前在本地测试环境留有备份,得以成功恢复。这次教训促使他立即采取了预防措施:在 `~/.bashrc` 文件中为 `rm` 和 `mv` 命令添加了 `-i`(交互式确认)别名。这意味着未来执行删除或移动操作时,系统会要求二次确认,从而有效避免手滑带来的风险。 这是一个非常典型的运维“手速”事故案例,作者分享的具体补救方法和预防性配置,对于任何使用命令行进行文件操作的开发者和运维人员都具有实用的参考价值。

本机暂存
IT 前端/ 2016-03-21 23:51:06 / 累计浏览 1,441

Web前端文件处理

这篇文章探讨了如何在Web前端高效、友好地处理用户上传的文件。作者从一个常见痛点出发:传统上在服务器端限制文件大小,会浪费带宽并增加服务器负担。理想的方案是在客户端就进行预处理。 文章首先回溯了HTML4时代的无奈之举——利用IE浏览器特定的`fileSize`属性进行检测,但这种方法受安全策略限制且已过时。真正的突破来自HTML5的File API,它让前端获得了强大的文件操作能力。通过在``中添加`multiple`属性,即可支持多文件上传。借助`FileList`接口,开发者能轻松获取文件名、大小等信息。 更进一步,文章展示了如何利用`FileReader`对象实现本地图片预览,甚至能结合Canvas API实现简单的图片裁剪功能。这些能力意味着,诸如文件大小校验、格式过滤、图片压缩和预览等操作,都可以在数据发送到服务器之前完成,极大地优化了用户体验并减轻了后端压力。整体上,这是一篇从具体问题入手,清晰梳理技术演进并给出实用前端解决方案的教程。

本机暂存
IT 后端/ 2016-03-21 23:50:24 / 累计浏览 3,228

PHP内存耗尽错误分析

这篇讲的是一个让人困惑的PHP内存报错问题:明明报错信息显示“试图分配的内存(1.4MB)小于允许的上限(33.7MB)”,脚本却依然因内存耗尽而崩溃。作者从WordPress插件的实际报错出发,通过设计两组对比实验揭开了谜底。 实验首先确认了PHP的`memory_limit`机制本身工作正常。关键在于第二个实验:当设置15MB内存限制并连续加载两次10MB文件时,报错信息显示的是“试图分配10MB”而非累计的20MB。这揭示了根因——PHP报错时只提示引发最终崩溃的那一次内存申请量,而实际内存消耗是整个脚本运行期间所有操作的累加值。那个看起来“小得多”的数字,仅仅是压垮内存配额的“最后一根稻草”。 因此,直接调高`memory_limit`只是治标之策。更稳妥的方式是通过监控(例如在脚本关闭时记录`memory_get_usage`)来分析站点实际内存消耗模式,从而设定一个既安全又够用的合理阈值。这个案例很好地提醒我们,解读错误日志时,需要理解其背后的累计逻辑,避免被表面数字误导。

本机暂存
IT 后端/ 2016-03-21 23:49:02 / 累计浏览 2,859

PHP输出缓冲及其应用

这篇讲的是PHP里一个常被忽略但挺实用的特性:输出缓冲。作者从计算机科学里“缓冲”这个基础概念切入,清晰区分了缓冲(写时用)与缓存(读时用)的差异,为理解PHP行为打下了基础。 核心内容围绕PHP的“ob_”系列函数展开。文章用简单代码演示了,为什么即使调用了sleep,浏览器也会一次性显示所有内容——秘密就在于PHP脚本执行完后才一次性发送数据。更实用的是,利用ob_start()、ob_get_contents()等函数,我们能在数据发送前“截获”并修改它,比如实现URL协议替换这种操作。 文章还深入探讨了php.ini中的output_buffering配置。有趣的是,即使关闭它,由于系统层面和浏览器的缓冲存在,也无法简单实现分段输出。最终,作者给出了一个结合flush()函数的可行方案,并延伸到一个实际应用:如何用缓冲机制实现简易的服务器推送(Comet),让内容像“挤牙膏”一样分批到达客户端。这让我们看到了缓冲技术从原理到实战的完整链条。

本机暂存
IT 开发者/ 2016-03-21 23:46:42 / 累计浏览 2,603

30条编程名言佳句: 这不是Bug只是未知的特性

不是段子,是真知灼见。这篇汇集了30条来自技术书籍开篇与大佬们(包括松本行弘、Linus Torvalds、Donald Knuth等)的经典编程名言,以一种幽默而犀利的方式,道尽了软件开发的那些事儿。 文章的核心观点是,编程远不止是编写代码,它更是关于人的艺术与复杂的学问。比如Martin Fowler与Kent Beck都在强调,写出人类能理解的“好代码”并养成良好习惯,远比炫技更重要。而控制复杂性则是贯穿始终的主题,Fred Brooks用“九个女人不能生一个孩子”的比喻点破了项目管理的误区,Brian Kernighan则直指其为编程的本质。 文中也不乏那些令开发者会心一笑的“行业真理”,如“它在我的机器上能运行”、“这不是bug,只是未列出的特性”,生动反映了日常困境。从对“过早优化”的警惕到“好代码就是最好的文档”的倡导,这些凝练的句子为技术人提供了思考的支点和会心一笑的共鸣。 这些语录不仅是技术思考的结晶,更像是一个行业文化的缩影,适合放在手边,时常翻阅。

本机暂存
IT DevOps/ 2016-03-21 23:45:43 / 累计浏览 1,997

CentOS web项目维护 FTP环境搭建

这篇教程从作者项目的实际文件维护需求出发,完整记录了在CentOS系统上搭建vsftpd FTP服务器的全流程。作者选择vsftpd正是看中了其在安全性、带宽控制和可伸缩性方面的优势。 文章详细演示了从安装、设置开机启动,到调整防火墙策略以开放21端口的核心步骤。重点部分在于如何修改vsftpd.conf配置文件,为业务人员创建专用的FTP账号,并精确设置其目录访问权限与写入权限。 特别值得一提的是,教程没有回避实战中可能遇到的“坑”。作者明确指出了两个典型问题:一是因SELinux策略导致的“无法切换目录”报错,其根本原因是SELinux默认限制了FTP服务;二是可能因目录权限不足出现的“无法创建文件”错误。针对这两个问题,文章都给出了具体、可操作的解决方案,比如临时禁用SELinux或调整目录权限至777。这些经验对于避免新手配置卡壳非常实用。

本机暂存
IT DevOps/ 2016-03-21 23:44:45 / 累计浏览 1,937

设置 linux 命令缓冲模式

这篇文章讲的是Linux系统中一个容易被忽略但很实用的细节:命令行工具在管道或重定向时的缓冲模式问题。作者从实际场景出发,点明了在使用管道处理实时数据时,命令默认的全缓冲行为会导致输出延迟,影响即时分析。 文章的核心方案是利用`stdbuf`命令来灵活控制标准输入输出的缓冲策略。作者不仅解释了`-oL`(行缓冲)、`-iL`、`-e0`(无缓冲)等参数的具体含义,还通过`stdbuf -oL tcpdump | grep`这个实例,展示了如何为本身不提供缓冲设置的命令“强行”加上行缓冲,从而实现实时输出。 这个工具的价值在于其通用性,无论目标命令是否支持缓冲参数,都能通过它来调整,解决了数据处理流水线中的阻塞等待问题,让调试和监控更即时高效。

本机暂存
IT 前端/ 2016-03-21 23:43:54 / 累计浏览 1,752

OPTIONS 方法在跨域请求(CORS)中的应用

这篇讲的是 OPTIONS 方法在跨域请求(CORS)中的具体应用,尤其聚焦在跨域文件上传这个实际场景中。作者从自己开发中遇到的情况切入:当使用 XMLHttpRequest 发起一个绑定了 upload 事件(用于监听上传进度)的跨域 POST 请求时,浏览器会自动先发送一个 OPTIONS “预请求”。 文章的核心在于解释这个预请求的作用与服务端的应对方式。这个 OPTIONS 请求携带了诸如 Access-Control-Request-Method 和 Origin 等头部,相当于向服务器“探测”:接下来要发的 POST 请求是否被允许。作为响应,服务端必须正确设置 Access-Control-Allow-Methods、Access-Control-Allow-Origin 等响应头,并返回 204 状态码来告知客户端预检通过,且无需返回多余的响应体。 作者还以 Node.js 的 Koa 框架为例,给出了具体的路由处理代码,指出了其中设置状态码为 204 的实际意义——这是一个节省流量的细节,也常在面试中被考察。整个过程完整展示了如何在实际开发中处理这种浏览器自动发起的 CORS 预检请求。

本机暂存
IT 前端/ 2016-03-21 23:43:12 / 累计浏览 2,627

React 应用的架构模式 Flux

这篇讲的是React应用架构中的Flux模式,它专为解决组件间非父子关系的通信难题而生。当应用复杂度上升,传统的回调或事件方案会导致数据流混乱,而Flux通过强制实现单向数据流,让状态管理回归清晰可控。 Flux的核心由四个部分构成:作为动作分发中心的Dispatcher、代表交互的Actions、集中管理数据的Stores,以及负责渲染的Views。文章通过一个包含下拉菜单和内容展示的组件Demo,具体演示了数据如何从视图层发起Action,经由Dispatcher分发,最终由Store更新并通知视图刷新。其中特别处理了异步操作,将一个网络请求拆解为“请求开始”、“成功”和“失败”三个独立的Action类型。 作者并没有照搬MVC,而是阐释了Flux如何更好地契合React只关注View的理念。Store中的数据被严格封装,任何修改都必须通过Action触发,这种设计虽然增加了初期代码量,但为大型应用提供了极高的可预测性和可维护性。

本机暂存
IT 后端/ 2016-03-21 23:42:29 / 累计浏览 2,040

从 Nginx 默认不压缩 HTTP/1.0 说起

这篇讲的是,Nginx 默认只为 HTTP/1.1 启用 GZip 压缩,而对 HTTP/1.0 请求关闭压缩,这背后并非配置疏忽,而是 HTTP 协议特性在服务端实现中的一个关键权衡。 文章从移动端异常高比例的 HTTP/1.0 流量这一现象切入,深入剖析了原因。Nginx 默认采用即时压缩(On-The-Fly Compression)以优化首字节时间,但这导致无法预知响应大小,无法设置 Content-Length。在 HTTP/1.0 中,没有 HTTP/1.1 的 Transfer-Encoding: chunked 分块传输机制,客户端只能依靠 Content-Length 或断开连接来判断结束。因此,Nginx 为了在 HTTP/1.0 上尽可能保持持久连接(keep-alive),默认选择了放弃压缩。一旦启用 HTTP/1.0 压缩,Nginx 就只能返回 Connection: close 来结束传输。 文章通过对比测试验证了这一机制,并给出了务实建议:对于动态内容(如 PHP 输出的 HTML),因其本身无法预知大小,不妨启用 GZip 以节省流量;对于可预知大小的静态文件(JS、CSS),则建议将关键资源内联,非关键资源用外链并启用压缩,接受连接断开以换取流量节省。一个看似简单的 Nginx 配置,背后其实是 HTTP/1.0 与 1.1 在协议能力上的深刻差异。

本机暂存
IT 安全/ 2016-03-21 23:39:37 / 累计浏览 3,696

Mac下.apk的反编译

这篇教程详细演示了如何在Mac环境下对Android应用的.apk文件进行反编译。作者从准备一个.apk文件开始,核心方案是结合使用三个关键的开源工具来逐步剥离应用内容。 第一步是使用 apktool,通过指定路径的命令,对.apk文件进行解码。这个过程会提取出资源文件,并解码出 AndroidManifest.xml 等XML内容。第二步则是使用 dex2jar 工具,它能将apk中的classes.dex文件转换成通用的Java归档文件(.jar)。作者提示,生成jar包后需要耐心进行下一步。第三步,用 JD-GUI 这个Java反编译器打开上一步生成的.jar包,此时就能直观地浏览应用的Java源代码了。 整个流程清晰地串联了三个工具,各自负责不同层面的解包与反编译工作。作者通过具体的命令行示例和输出反馈,将原本可能复杂的逆向过程分解成了可跟随的操作步骤。最终,读者可以掌握一套完整的组合技,从资源到代码,实现对APK文件的深度查看。

本机暂存
IT 数据库/ 2016-03-21 23:24:03 / 累计浏览 5,876

MYSQL分页limit速度太慢优化方法

这篇讲的是MySQL在大数据量下分页查询的性能瓶颈问题。当表数据达到百万级别时,使用`LIMIT offset, length`进行分页(如`LIMIT 200000, 10`)会导致查询极其缓慢,因为数据库需要扫描并丢弃offset前的所有行,造成了严重的资源浪费。 文章的核心方案是通过改变SQL写法来规避“大偏移量扫描”。例如,不再使用`LIMIT 100000, 20`,而是记录上一页的最大ID,然后查询`WHERE id > last_max_id LIMIT 20`,这样就将扫描行数从十万级降至仅数十行。作者用一个实际例子展示了优化效果:将一条3.21秒的查询,通过子查询改写并建立复合索引后,降低到了0.11秒。 此外,文章还总结了其他几种实用的优化思路,包括子查询优化法、倒排表法、反向查找法以及限制偏移量等。每种方法各有其适用场景和限制,比如子查询法要求数据连续,反向查找法则更适合页数超过一半的情况。这些具体的方法和对比,为开发者在不同场景下选择最佳分页策略提供了清晰的参考。

本机暂存
IT 移动开发/ 2016-03-21 23:22:03 / 累计浏览 1,150

一种动态为apk写入信息的方案

这篇讲的是如何动态、高效地给Android APK写入信息,以解决用户从H5页面或二维码下载APP后无法直接返回原页面的体验割裂问题。 作者发现APK文件本质是ZIP格式,而ZIP结构的中央目录文件头中有一个未被Android系统使用的“Comment”区域。利用这一特性,可以在不破坏APK完整性、不重新打包的前提下,直接向该区域追加自定义数据,从而实现信息的动态写入。 具体实现上,文章展示了如何通过Java API在APK末尾写入结构化的Comment数据,并在APP启动后读取这些数据。关键点在于自定义了数据长度的存储方式,以兼容早期Android版本。经过测试,被修改的APK可以正常安装,数据读取也准确无误。 这个方案的优势在于服务端操作仅为文件写入,效率极高,特别适合动态生成APK的场景。它能够无缝地将H5流量引回客户端,保持了用户体验的连贯性。

本机暂存
IT 前端/ 2016-03-21 23:18:09 / 累计浏览 2,430

深入理解JavaScript定时机制

这篇讲的是开发者在JavaScript定时器上常踩的“认知坑”。文章从一个经典困惑出发:为什么设置为0毫秒的setTimeout并不会立即执行?为什么用setInterval设置的回调有时会“卡住”? 作者没有停留在解释现象,而是带我们深入浏览器内核的后台,揭示了真相:JavaScript引擎本身是单线程运行的。所有异步操作,包括定时器回调、用户点击、网络请求,都是由浏览器的其他线程(如定时触发线程、事件触发线程)处理后,将回调函数放入一个“任务队列”中。JavaScript引擎只有在当前执行栈清空后,才会按顺序从队列中取出下一个任务执行。 文章通过几个递进的代码案例,清晰展示了单线程模型如何影响定时器的执行时序。例如,一个耗时操作会阻塞所有后续任务,包括定时期望的回调;而用setTimeout递归调用来模拟setInterval,可以避免回调堆积。 核心在于理解“异步不等于多线程”。文章最终将定时机制与Ajax请求统一在同一套事件循环模型下,帮助读者建立起对JavaScript并发模型的完整认知,从而写出更健壮、高效的异步代码。

本机暂存
IT DevOps/ 2016-03-21 23:16:36 / 累计浏览 3,206

Docker在Mac下挂在/Users之外的目录

这篇讲的是在 Mac 上使用 Docker 时遇到的一个常见坑:明明想把项目代码目录挂载进容器,Kitematic 却提示“Invalid directory. Volume directories must be under your Users directory”,死活不让选 `/Users` 之外的路径。 问题的根源在于,早期 Docker for Mac 的底层是通过 VirtualBox 虚拟机来运行的。出于安全考虑,虚拟机默认只和宿主机共享 `/Users` 这一个目录,所以所有挂载操作都被限制在了这个范围内。 文章作者分享了突破这个限制的完整解决方案。核心思路是手动给 Docker 虚拟机“开通权限”:首先在 VirtualBox 的设置里,添加一个新的共享文件夹,指向你想要挂载的宿主机目录。然后,通过 SSH 进入虚拟机,修改启动脚本 `bootlocal.sh`,让这个新目录在每次虚拟机启动时都能自动挂载成功。需要注意的是,Kitematic 本身还是禁止添加这些目录的,所以必须使用 `docker run` 命令行来创建容器才能顺利挂载。 文章提供了从修改设置到执行命令的每一步操作,并附上了具体的命令示例和 StackOverflow 上的参考链接,对于需要在 Mac 上管理非默认目录下 Docker 数据的开发者来说,这是一份直接可用的踩坑指南。

本机暂存
IT 前端/ 2016-03-21 23:15:57 / 累计浏览 1,472

各种浏览器全屏模式的方法,video、img全屏等

这篇讲的是前端开发中一个很实际的问题:如何实现跨浏览器的全屏显示功能。作者直接给出了可以复制使用的代码解决方案。 文章的核心是分享了几个关键的JavaScript函数,用于兼容各主流浏览器的全屏API(如`requestFullscreen`和`exitFullscreen`)。它不仅展示了如何对视频、图片或整个页面元素启动全屏,还特别强调了必须处理的浏览器前缀差异以及用户授权问题。 除了基础功能,文章还深入到了实际应用中容易忽略的细节:如何通过`fullscreenElement`和`fullscreenEnabled`属性检测全屏状态,如何监听`fullscreenchange`事件来响应状态变化,以及如何使用对应的CSS伪类(如`:-webkit-full-screen`)为全屏元素定制专属样式。 对于需要实现沉浸式媒体播放或交互式展示的前端开发者来说,这篇文章把一个涉及多浏览器适配的复杂点,拆解成了清晰、可直接套用的步骤和代码,为快速实现功能提供了可靠的参考。

本机暂存
IT 移动开发/ 2016-03-21 23:02:52 / 累计浏览 2,963

iOS 高性能异构滚动视图构建方案 —— LazyScrollView

这篇文章讲的是如何解决iOS开发中一个棘手的性能问题:当滚动视图需要展示大量异构(非统一Cell)的视图内容时,传统的UITableView或UICollectionView方案会显得不够灵活或性能不足。作者从天猫客户端首页的实际需求出发,详细介绍了他们自研的LazyScrollView方案。 LazyScrollView继承自UIScrollView,其核心设计思想是在初始状态就通过一个DataSource协议,预先获知所有子视图在滚动视图内的绝对布局坐标(Rect)。这使得框架能在滚动过程中精准计算哪些视图应该被加载或回收,实现了跨不同视图层级的复用,效果类似于TableView的复用机制,但适配性更广。 文章不仅阐述了背景和原理,还提供了清晰的使用指南,包括实现特定的数据源协议以及调用关键API。通过实际Demo演示,直观展示了视图在滚动时被复用标记的变化。内部实现的核心在于根据预先计算好的布局信息进行视图管理,这种思路为处理复杂、动态布局的滚动视图提供了一个高效的解决路径。

本机暂存
IT DevOps/ 2016-03-21 22:57:30 / 累计浏览 1,612

shell实现ssh自动登录

作者因为在Mac下没找到顺手的SSH客户端,干脆自己用expect写了一套自动登录方案。这篇分享的核心是一个名为`ssh_auto_login`的expect脚本,它能自动处理SSH连接中的密码验证,甚至支持通过通道机(跳板机)进行动态密码认证和内网服务器跳转,省去了手动输入的繁琐。 配合一个更上层的shell启动器脚本,作者实现了通过简单命令(如`./launcher 49`)快速连接不同服务器(如联通、电信线路或特定IP)的功能。整个方案无需复杂配置,特别适合需要频繁通过跳板机访问内网服务器的运维或开发场景。虽然脚本中的服务器IP和通道机逻辑是为特定环境编写的,但其处理SSH交互、动态密码匹配的核心思路清晰,稍作修改就能适配其他服务器。作者用这个实用小工具,演示了Shell脚本在自动化运维中解决具体痛点的灵活价值。

本机暂存
IT 前端/ 2016-03-21 22:53:39 / 累计浏览 2,005

浅析 JavaScript 中的 “闭包”

这篇讲的是JavaScript中一个既重要又容易让人困惑的概念——闭包。作者没有直接抛出定义,而是从维基百科和百度百科两种不同的解释视角切入,对比了其理论抽象与编码实体的侧重点,巧妙地引出了核心问题:闭包在JS中究竟是什么? 要理解闭包,必须先理解JS独特的“函数级作用域”。文章通过清晰的代码示例,指出JS没有块级作用域,这意味着if、for等花括号并不能创建独立的变量空间,与Java、C++等语言行为迥异。在解释了函数作用域后,文章指出,当内部函数引用了外部函数的变量时,闭包便自然产生。最经典的莫过于for循环与setTimeout结合的案例:由于异步执行,回调函数共享同一个最终的循环变量i。文章解析了用立即执行函数(IIFE)为每次循环创建独立作用域的经典解决方案,正是通过闭包“捕获”并保存了当时的变量值。 最终让读者明白,闭包不是刻意为之的“黑魔法”,而是理解JS作用域链和执行上下文后,解决特定作用域问题的自然工具。

本机暂存
IT 前端/ 2016-03-21 15:04:04 / 累计浏览 2,307

iframe异步加载技术及性能

这篇讲的是四种iframe加载技术的性能对比与最佳实践。作者从“如何不让iframe阻塞主页面onload事件”这一核心问题出发,详细剖析了普通加载、onload之后加载、setTimeout动态加载以及异步加载这四种方法的实现与表现。 对比的关键在于各方法对主页面加载进程的影响。普通方法简单直接,但iframe加载会阻塞主页面的onload,对用户体验和页面评分不利。将iframe加载推迟到主页面onload之后,或使用setTimeout,可以避免阻塞onload,但浏览器仍可能长时间显示忙碌状态,尤其在IE8下setTimeout方案存在兼容问题。 文章重点推荐了“异步加载iframe”技术。其巧妙之处在于先创建一个空的iframe,利用其body标签的onload事件立即触发的特性,再在回调中动态创建script标签来加载实际内容。这种方法能真正实现无阻塞加载,iframe加载时浏览器不再显示忙碌状态,综合性能表现最佳。作者也客观指出,该技术因某些原因未受足够关注,但仍值得开发者在需要无阻塞加载第三方内容(如插件、广告)时深入了解和采用。

本机暂存