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

最新文章

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

IT 后端/ 2016-03-09 23:40:33 / 累计浏览 2,271

php word 转 html

这篇讲的是如何通过PHP调用Windows Office的COM接口,将Word文档高质量地转换为HTML。 作者开宗明义,指出要想获得“完美”的转换效果(尤其是保留复杂排版),依赖微软Office自身的渲染引擎是目前最可靠的路径,而开源方案如LibreOffice往往会有瑕疵。文章的核心在于一个具体的实现方案:启用PHP的COM模块,并通过几行简洁的代码调用Word应用程序的`SaveAs`方法。 实现的关键在于环境配置。文章详细指导了如何检查并启用`com_dotnet`模块,澄清了关于内置模块的常见误区,并提供了具体的`php.ini`配置示例。核心转换函数代码清晰,直接展示了打开、转换、退出的完整流程。 作者同时给出了极具实战意义的提醒:转换生成的HTML源码结构会比较冗余;进程会实际调用`winword.exe`;如果遇到转换卡死,尝试重命名文档再执行。这些细节正是实践中容易踩坑的地方,让这份简短的指南更具参考价值。

本机暂存
IT DevOps/ 2016-03-09 23:39:27 / 累计浏览 3,012

如何设计软件模块的自动化测试?

这篇指南聚焦于如何为软件模块设计自动化测试,作者从模块的交互模式出发,将测试对象清晰地划分为两大类:消息触发型和主动扫描型。 对于“守株待兔”的消息触发型模块,核心在于开发一个能模拟外部消息的测试程序,让它发送请求并等待响应,从而验证模块处理逻辑的正确性。而对于“主动出击”的主动扫描型模块,测试思路则是通过测试程序向其数据源(如数据库)注入测试数据,然后监听并验证它后续发出的消息或动作。 文章不仅给出了对应的自动化测试框架图和详细的消息流程,还分享了宝贵的实战经验。比如,务必首先确保测试程序的消息接口协议和链路配置无误;测试初期宜用少量数据跑通流程,再逐步放量;为耗时较长的测试用例设置超时机制,避免无限等待;以及规范测试报告的存储与格式,方便结果集成与展示。 自动化测试的终极目标是让机器承担重复的验证工作,在版本迭代中快速捕获回归缺陷。这篇内容为开发者设计针对不同交互模式模块的测试方案,提供了非常具体和可落地的参考框架。

本机暂存
IT 后端/ 2016-03-09 23:38:31 / 累计浏览 2,962

php 去掉 头尾   空格 2种方法

这篇讲的是PHP开发中一个常见但容易踩坑的问题:如何高效去除字符串头尾的空白字符,特别是那些由 生成的特殊空格。文章作者从实际编码困境出发,指出直接使用trim()函数无法处理 这种HTML实体编码的空格,因为它并非标准空白符。 文章核心提供了两种解决方案并做了比较。第一种是使用preg_replace正则替换,通过匹配头尾的 和\s来实现通用去除,作者特别推荐了这种方法。第二种是结合html_entity_decode先解码实体,再用trim配合UTF-8空格字符(chr(0xc2).chr(0xa0))进行去除。 作者进一步指出了编码兼容性的关键细节:第二种trim方法在UTF-8下工作良好,但在GBK或GB2312编码中可能引发乱码,同时也会影响json_encode对中文的处理。因此,文章最终给出了明确建议:在现代Web开发中,推荐统一使用UTF-8编码以避免此类陷阱。整个解析从问题现象到原理,再到具体实现与环境考量,非常贴近实际开发场景。

本机暂存
IT 算法/ 2016-03-09 23:24:02 / 累计浏览 3,206

一道随机数题目的求解

这篇探讨了一个经典的随机数构造问题:如何基于均匀的1~5随机数函数,实现均匀的1~7随机数函数。作者从直观的思路入手,展示了通过二维数组映射与拒绝采样的核心方案,并提供了对应的Java实现。 然而,文章的价值不止于算法本身。作者在千万次数据测试中,意外发现生成结果的分布并不均匀,某些数字的出现频率显著偏高。经过深入排查,问题被追溯到随机数种子的精度上——即使使用纳秒级时间戳,快速连续调用时获取的种子值仍可能相同,导致随机序列重复,进而破坏了分布的均匀性。 文章通过对比实验(如将种子改为毫秒级、增加调用间隔)验证了这一猜想,揭示了用“小随机”合成“大随机”时,底层伪随机数生成器的缺陷会被放大。这对于理解拒绝采样的实际应用边界,以及随机性工程实现中的细节陷阱,提供了非常具体的参考。

本机暂存
IT 后端/ 2016-03-09 13:00:37 / 累计浏览 1,091

“NodeJS在大搜车” 之 应用部署篇

作者从团队实际需求出发,分享了NodeJS应用在大搜车的部署实践。文章的核心在于解决不同环境下Node进程的稳定管理与高效部署问题。 针对工具选型,作者解释了为何线上环境选用功能全面、进程管理更稳定的PM2,而在需要频繁变更端口的测试环境,则采用更轻量灵活的Forever。本地开发则配合nodemon实现代码热更新。这套组合策略平衡了稳定性与灵活性。 在环境划分上,文章详细介绍了测试、预发、生产三套环境各自的作用与配置。生产环境依托阿里云ECS、SLB、RDS等一整套云服务,基本免除了底层运维烦恼。部署流程则通过自定义Bash脚本实现:从代码拉取、打包上传,到服务器上的解压、备份、覆盖及PM2重启,整个过程在预发服务器上执行,并通过间隔部署配合负载均衡,确保线上服务零宕机。 文章最后坦诚,这套部署体系仍在不断进化,未来计划引入Docker优化测试环境,并着手应对多环境自动部署、性能优化等新挑战。

本机暂存
IT 后端/ 2016-03-09 12:59:48 / 累计浏览 2,215

“NodeJS在大搜车” 之 MVC基础结构

这篇讲的是大搜车团队如何在实际项目中落地NodeJS的MVC架构。作者从前端是否适合直接转向NodeJS服务端开发这个话题切入,提出了一个颇具启发性的观点:服务端开发所需的架构、性能、运维等综合能力,可能让一名经验丰富的PHP工程师转型得更顺畅。这其实引出了本文的核心——扎实的服务端思维与架构设计至关重要。 文章随后详细拆解了他们项目中的MVC实践。除了Controller、Model、View这些基本要素,重点阐述了几个关键扩展层。例如,Service层被定义为整个架构中最重的一环,它封装了跨数据库、跨缓存的复杂数据操作,为Controller提供简洁的“服务”。Route层则通过自研的rainbow库,实现了基于文件目录的自动化路由管理与API文档生成,便于维护成百上千个接口。此外,团队还在ORM之上封装了SuperModel,旨在统一MySQL和MongoDB的操作接口,并提供类似Mongoose的链式调用体验。 这些细节不仅展示了一套清晰、可维护的NodeJS项目结构,也体现了团队在工程化方面的深度思考。对于正探索NodeJS服务端开发的前端工程师,或是寻求不同技术视角的后端开发者,文中关于架构分层与工具封装的具体实践,提供了扎实的参考案例。

本机暂存
IT 前端/ 2016-03-09 12:58:41 / 累计浏览 2,426

浅析line-height和vertical

这篇从基础的居中问题出发,深入剖析了两个常被误解的CSS属性:line-height和vertical-align。作者首先厘清了line-height的本质——它影响的是行框高度,并通过一系列对比实验揭示了关键差异:无单位数值(如1.5)会将比例传递给子元素,而百分比(如150%)则会将父元素计算后的固定值传递下去,这正是为何“1”与“100%”效果不同的根源。 文章还通过设置line-height:0等边界情况,直观展示了它对块级元素和行内元素影响的根本区别:块级元素的高度会随之收缩,而行内元素(如span)的高度则保持不变。关于vertical-align,作者明确指出它仅对inline和inline-block元素生效,并图解了top、middle、text-bottom等不同对齐值的具体依据(如middle是与父元素基线加上1/2 x高度对齐),帮助读者理解这些值在垂直方向上的精确定位逻辑。

本机暂存
IT DevOps/ 2016-03-09 12:53:37 / 累计浏览 3,630

腾讯资深运维专家周小军:QQ与微信架构的惊天秘密

这篇来自腾讯资深运维专家周小军的深度访谈,从一位“运维老兵”的视角,揭开了支撑QQ与微信海量社交数据背后那套复杂而精巧的存储与运维体系。 访谈的核心亮点在于对微信与QQ核心存储架构差异的剖析。周小军详解了二者背后的NoSQL系统:微信消息业务依赖强调强一致性的Quorum_KV,它面向写多读少场景,通过Quorum协议保证数据可靠;而QQ的Grocery则采用最终一致性模型,优化读写均衡性能。这种“量体裁衣”的设计思想,正是应对不同社交产品数据特性的关键。此外,文章还清晰梳理了腾讯如何通过“全网调度”、SET标准化单元部署、以及华南/华中/华北三地同步等机制,构建起应对单机房故障的高可用容灾体系。 除了硬核架构,周小军也毫无保留地分享了个人从天涯到腾讯的十余年运维心路,强调了运维的终极目标是提供“超出预期的服务能力”,并坚持通过“一万小时定律”与持续突破舒适区来锻造专业度。

本机暂存
IT 后端/ 2016-03-09 00:16:23 / 累计浏览 2,685

系统设计典型问题的思考

系统设计面试题没有标准答案,但思考过程有章可循。这篇文章就从“问题该怎么想”入手,梳理了一套从外到内的解题框架。作者的核心观点是:不要急于画架构图,而是反复沟通澄清需求——优先搞定2-3个核心用例,明确用户与数据规模,并识别请求模型(比如读远多于写)。 在此基础上,先定义核心模型与API,再划分系统层次与组件,最后逐层细化。在细化过程中,文章重点讨论了存储选型(关系型分库分表 vs. NoSQL的CAP权衡)、集群策略、消息队列与缓存设计这几个关键环节,并强调所有优化都应建立在明确的系统瓶颈识别之上。 文章后半部分将这套思路应用到了三个经典案例中:设计微博信息流时,需权衡消息推送的push模型与拉取模型,并设计分级的缓存;设计短网址系统时,核心挑战是如何在分布式环境下高效生成全局唯一ID;而设计实时聊天系统,则需解决服务端到客户端的消息推送问题,比如采用Comet技术维持长连接。 最终,文章落脚于工程师对这类开放性问题的反复琢磨与沉淀。这些思考虽不像算法题有唯一正解,却能在实际工程中建立起至关重要的宏观设计直觉。

本机暂存
IT 设计/ 2016-03-07 23:57:54 / 累计浏览 2,727

从Java和JavaScript来学习Haskell和Groovy(元编程)

这篇文章深入探讨了四种主流编程语言在元编程领域的不同实现路径。作者首先定义元编程为“用程序写程序”,即运行时动态修改类结构的能力,并从Java的静态限制出发,介绍了其依赖JDK 5注解(如Lombok)和Spring框架(AOP、IoC)扩展元编程的方式;对于Haskell,则聚焦于Template Haskell通过抽象语法树(AST)和QuasiQuotation在编译期生成代码的方法,例如用`[| |]`构造自定义语法片段。 对比动态语言,JavaScript的元编程基于对象自省和eval关键字,以极简性著称——通过prototype和动态属性添加实现灵活扩展;而Groovy则提供了更丰富的特性,如MethodMissing处理未知方法调用、GroovyInterceptable实现AOP拦截、Categories提供类似Objective-C的临时能力注入,以及Magic Package自定义元类(如通过命名规约修改String逻辑)。文章揭示了静态语言与动态语言在元编程灵活性上的核心差异:前者受限于编译期,后者则能自由操纵运行时环境。 最终,作者对比了JavaScript的简洁设计与Groovy的功能多样性,指出语言选择如同工具取舍,关键在于程序员如何平衡需求与偏好。这种跨语言视角帮助读者理解元编程的本质,并为项目技术选型提供了清晰参考。

本机暂存
IT DevOps/ 2016-03-07 23:56:39 / 累计浏览 1,816

使用whiptail在shell脚本中创建交互式对话框?

这篇文章介绍了一个让Shell脚本“活”起来的实用工具——whiptail。它能帮助你在纯终端环境下,快速创建出直观的用户交互界面,就像许多Linux软件安装过程中弹出的对话框一样。 作者详细演示了whiptail的多种对话框类型,包括最基础的消息确认框(msgbox)、提供是/否选项的决策框(yesno),以及能接收用户文本输入的表单框(inputbox)。对于需要处理敏感信息的场景,还专门讲解了密码输入框的实现方法。 更进一步,文章展示了如何用whiptail构建复杂的选择逻辑:创建单选菜单(menu)、单选列表(radiolist)供用户选择一项,以及多选清单(checklist)让用户勾选多个偏好。最后,它甚至支持在脚本中显示一个实时进度条(gauge),让长时间的任务反馈更友好。 whiptail是一个预先安装在大多数Linux发行版中的工具,这意味着你可以直接在脚本中调用它,无需额外安装。掌握它,就能轻松将你的脚本从简单的命令行工具,升级为具备良好用户体验的交互式程序。

本机暂存
IT 安全/ 2016-03-07 23:54:19 / 累计浏览 1,591

Android安全–ELF文件格式解析

这篇文章深入解析了Android安全中的核心——ELF文件格式。作者从ELF(可执行与可链接格式)的起源和三种目标文件类型(可重定位、可执行、共享目标)讲起,清晰地勾勒出这种二进制格式为程序链接和执行分别提供的“节区”与“段”两种并行视图。 文章的核心是对ELF文件结构的逐层拆解。它以Android NDK中的hello-jni.so文件为实例,详细剖析了ELF头部(包含魔数、文件类型、机器架构等关键标识)的数据结构与各字段含义,并进一步阐述了程序头部表(定义进程映像如何创建,如可加载段PT_LOAD)和节区头部表(描述代码、数据、符号表等链接信息)的作用。文中还贴心地指出了数据对齐规则等实现细节。 整篇文章逻辑清晰,结合了结构定义、字段注释和具体示例,将看似复杂的二进制文件组织方式讲得透彻明了。对于从事Android底层开发、安全分析或逆向工程的技术人员来说,这是一份扎实的ELF格式入门与参考指南,有助于理解从编译到链接再到加载运行的完整过程。

本机暂存
IT 前端/ 2016-03-07 23:49:07 / 累计浏览 2,768

《web前端最佳实践》—高维护性css

这篇讲的是如何让CSS代码更易维护。作者指出,CSS虽然上手简单,但若不加规范,很快就会变得混乱难改。文章从几个核心实践出发,探讨如何组织和书写高维护性的CSS代码。 首先是代码组织,建议将CSS文件按通用和业务模块分类,并单独处理浏览器兼容和基础重置样式。其次是书写规范,比如对属性进行逻辑排序、合理使用CSS Reset来统一浏览器默认样式。在选择器方面,应尽量避免高权重的ID选择器,多用组合类选择符以降低耦合。文章还提及了IE兼容代码的分离技巧,以及在em、px和%之间如何选择更合适的相对单位。 总的来说,作者通过这些具体、可操作的建议,为前端开发者提供了一套提升CSS项目质量与效率的实践框架,帮助团队写出更整洁、更灵活的样式代码。

本机暂存
IT 前端/ 2016-03-07 23:48:37 / 累计浏览 2,482

《web前端最佳实践》—高性能css

这篇讲的是如何让CSS代码跑得更快。作者没有停留在理论层面,而是直击开发者日常编码中的常见痛点,给出了非常具体的优化指南。 文章开篇点破一个常见误解:很多人以为CSS选择器是从左向右匹配的,但事实恰恰相反——浏览器是从最右侧的选择器开始遍历的。基于这个原理,作者给出了几条黄金准则,比如避免使用通配符和标签选择器,层级不宜过多等。不过他也提醒,在性能影响不明显的小项目中,代码的可维护性应放在首位。 在图片处理上,文章对比了两种方案:一是不要随意用CSS缩放图片,而是准备合适尺寸的图片资源;二是谨慎使用CSS雪碧图。虽然雪碧图能减少HTTP请求,但它在制作和维护上都比较复杂,用不好反而会因内存消耗过大拖累性能。作者给出了非常落地的实践建议,比如将雪碧图尺寸控制在2500像素以内、200KB以下。 文章后半部分聚焦于代码瘦身和CSS3的兼容性处理。前者教你怎么合并与精简规则,删除无效代码;后者则详细剖析了浏览器前缀的使用策略,以及如何通过Modernizr等工具稳妥地应用新特性,避免为兼容性付出过高的性能代价。 总的来说,这篇文章将“高性能CSS”这个大话题拆解成了一个个可操作的具体动作,不仅告诉你“不该做什么”,更重点阐明了“应该怎么做以及为什么”,是前端工程师在追求卓越用户体验路上一份扎实的参考清单。

本机暂存
IT 前端/ 2016-03-07 23:48:02 / 累计浏览 2,283

图片以及其他替换元素的空隙问题

这篇讲的是开发者经常遇到的一个小困扰:明明没设置任何边距,图片(或其他替换元素)之间却莫名出现空隙。 作者从一个具体场景切入——“图片右边和底部总有神秘缝隙,把 margin、padding 全清除了也没用”,然后点明了问题的根源:图片作为行内替换元素,默认的 `vertical-align` 基线对齐方式与父元素基线之间存在一段距离,这便是“空隙”的来历。 针对这个“不听话”的空隙,文章梳理了六种主要解法。核心思路包括改变元素的行内特性,比如将 `font-size` 设为 `0`,或者干脆把图片设为 `display: block`;也可以利用浮动 (`float`) 让元素脱离文档流。此外,调整 `vertical-align` 的值(如设为 `top` 或 `bottom`)也能消除空隙,但作者提醒需注意其对页面其他内容可能产生的影响。最后还提到了给父容器定高以及在代码上让标签“无缝拼接”的格式化方法。 文章的一个亮点是将讨论从 `img` 扩展到了 `input`、`textarea` 等所有替换元素,解释了它们具有相同的空隙特性,帮助读者建立更完整的认知。整篇内容直击痛点,提供的解决方案具体且可操作,能帮助开发者从原理上理解并彻底处理这类布局问题。

本机暂存
IT 数据库/ 2016-03-07 23:42:18 / 累计浏览 3,219

[JavaWeb教程]第四章-java数据库开发

这篇教程从关系型数据库的基本概念切入,解释了数据持久化的重要性,并聚焦于Java Web开发中常用的MySQL数据库。作者没有停留在理论层面,而是手把手地演示了从安装MySQL、配置客户端Navicat,到创建数据库和表的全过程。 文章的核心部分在于通过一个“学生信息表”的实例,详细拆解了SQL语言的五种核心操作:使用`CREATE TABLE`定义包含自增主键、时间戳和备注的表结构;用`INSERT INTO`添加数据并讲解了`now()`函数的用法;通过`SELECT`进行单表与多表查询,展示了模糊匹配`LIKE`和表关联`JOIN`的应用;利用`UPDATE`修改特定记录;以及用`DELETE`按主键清理数据。每个操作都附带了语法要点和注意事项,例如更新和删除时务必使用`WHERE`子句限定范围。 教程最后延伸到开发实践,介绍了如何通过JDBC在Java代码中连接数据库,并提供了示例代码框架。整体来看,这是一篇面向初学者、步骤详实的实战指南,涵盖了从环境搭建到基础操作的全链路。

本机暂存
IT 后端/ 2016-03-07 23:37:40 / 累计浏览 3,079

[JavaWeb教程]第三章-Servlet开发

这篇教程从 form 表单的 action 属性切入,讲解了服务器端如何用 Java Servlet 处理提交的数据。作者首先演示了在 Eclipse 中配置 Tomcat 服务器并运行 Web 工程的基本流程。 核心部分是通过两个实例介绍 Servlet 开发:第一个是创建 HelloWorldServlet,利用 resp.getWriter() 向客户端输出当前时间,展示了 doGet 和 doPost 方法的对应关系以及 web.xml 中的 URL 映射配置。第二个实例更进一步,构建了一个 SubmitStudentInfoServlet 来处理学生信息表单提交。这里详细演示了如何通过 req.getParameter() 获取表单参数、用 req.getParameterValues() 获取多选框数组值,并将数据封装到 StudentVo 对象中。同时,文章指出了解决中文乱码的两个关键点:req.setCharacterEncoding("UTF-8") 和 resp.setContentType("text/html; charset=UTF-8")。 最后,通过将学生信息列表存入 Session 来实现跨请求的数据共享,引出了 Session 的基本用法。整个过程清晰地完成了从静态页面访问到动态数据处理与存储的过渡。

本机暂存
IT 安全/ 2016-03-07 23:34:07 / 累计浏览 3,964

深入解析DLL劫持漏洞

这篇文章深入剖析了DLL劫持这项古老但依然实用的技术。作者从Windows DLL加载机制的核心漏洞出发,对比了Windows XP SP2前后搜索顺序的关键差异,特别是SafeDllSearchMode开启与否对“当前目录”优先级的影响。 文章重点区分了三种主流的利用场景:针对应用程序安装目录的劫持(需要写权限,常用于持久化或“白加黑”免杀)、针对文件关联的劫持(只需用户打开特定文件,如PDF,条件最简单),以及针对安装程序的劫持。通过Notepad++安装包的ProcMon抓包实例,具体展示了如何识别和利用漏洞。 此外,文章还结合了HaifeiLi关于Chrome/Edge浏览器“自动下载”漏洞的案例,拓展了DLL劫持在现代软件环境中的攻击面,并简要提及了新版Edge对DLL注入的缓解措施。整体来看,它系统梳理了从原理、挖掘(如使用ProcMon过滤)到利用的完整链条。

本机暂存
IT 后端/ 2016-03-07 23:30:48 / 累计浏览 2,424

java8新特性——Lambda表达式

作者从Lambda表达式的定义出发,剖析了这个Java 8中被称为“闭包”的新特性。文章核心在于展示Lambda如何通过表达式直接代替功能接口,并用简洁的`->`语法连接参数列表与函数体,从而大幅提升代码可读性。 文中通过生动的代码对比,直观呈现了Lambda的简化效果:无论是排序任务中用一行表达式替代冗长的匿名内部类,还是在集合转换场景下,结合Stream API使用Lambda进行链式操作,代码都变得极为精炼。文章不仅介绍了基础语法,还具体展示了`java.util.function`包与`java.util.stream`包如何与之配合,实现对集合数据的批量处理。 作者最终总结,Lambda表达式与Stream的结合,是自泛型和注解以来对Java生态影响最深远的变化之一,它让开发者能以更声明式、更简洁的方式编写代码,也为并行类库的编写奠定了基础。

本机暂存
IT 前端/ 2016-03-06 23:07:09 / 累计浏览 1,479

当前端也拥有 Server 的能力

这篇从 Fetch API、ServiceWorker 到 Cache API 出发,探讨了前端如何借助这些新接口获得传统上属于服务器端的能力。作者以 XMLHttpRequest 的繁琐写法作为对比,引出了基于 Promise 的 Fetch API 在处理请求与响应时的简洁与直观,例如只需两步即可完成 JSON 数据的获取与解析。同时,文章也客观指出了 Fetch 当前尚不支持请求中断、进度上报等局限。 文章的重点在于 ServiceWorker,它被描述为一个位于前端的“HTTP 拦截器”。通过注册一个 Worker 脚本,开发者能够完全控制特定 URL 的请求与响应,甚至可以模拟出服务端不存在的内容,清晰展示了前端如何拦截并处理网络流量,这是实现离线访问与高效缓存策略的基础。最后提及的 Cache API,则作为 ServiceWorker 的协作工具,提供了精细管理浏览器请求/响应缓存的能力。 总体来看,这篇文章串联起了三个关键 API,展示了现代前端从单纯的请求发起方,转变为能够管理请求生命周期、拦截网络通信并缓存资源的“轻量级服务端”角色。

本机暂存