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

最新文章

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

IT 安全/ 2015-09-04 21:35:34 / 累计浏览 3,784

Android安全–加强版Smali Log注入

这篇讲的是如何在Android逆向或调试时,更高效地向Smali代码注入日志打印。作者从实际场景出发:当我们需要在Smali中插入`Log.d()`来输出某个变量的值时,常规做法很繁琐,往往需要手动修改方法的寄存器数量,再添加多行指令,容易出错且效率低下。 为了解决这个痛点,作者提出了一种巧妙的“加强版”方案。核心思路是自己创建一个`crack.smali`工具类,并在其中预先定义好几个好用的日志输出函数(如`log1`、`log2`等)。这样一来,在需要注入日志的地方,只需简单调用这个类中对应的方法,并将要打印的变量作为参数传入即可。 这种方法将通用操作封装成了模块,避免了每次注入时重复编写和调整基础的Log代码,既降低了出错概率,也大幅提升了逆向分析或调试的效率。文章通过具体的Smali代码示例,清晰展示了从繁琐到简洁的转变过程,对于经常需要动态分析APK的开发者来说,是一个非常实用的技巧。

本机暂存
IT 前端/ 2015-09-04 21:33:36 / 累计浏览 3,191

我的npm笔记

这篇文章整理得很实在,作者从日常使用Node.js的经验出发,把npm这个包管理工具的核心用法做了一次清爽的备忘。文章开篇点明了npm作为包管理器的核心功能,随即直面一个国内开发者常遇到的痛点:官方源访问缓慢或不稳定。 针对这个问题,作者给出了多种解决方案,包括临时指定淘宝镜像安装、全局配置国内镜像源、设置Linux别名,以及直接安装cnpm客户端。每种方法都附上了可直接复制的命令,非常实用。 文章的重点是“常用命令”部分,系统性地罗列了从安装、卸载、搜索到发布、配置管理等一系列高频操作命令。这些命令并非枯燥罗列,而是结合了版本指定、全局安装等实际场景,相当于一份简洁的npm速查手册。对于需要在日常开发中快速回顾或查找特定命令的开发者来说,这比冗长的官方文档要友好得多。整篇文章篇幅不长,但覆盖了从环境配置到日常操作的关键环节,读完就能上手。

本机暂存
IT 开发者/ 2015-09-04 21:30:42 / 累计浏览 2,045

互联网创业的地域鄙视链

这篇文章讲的是互联网创业圈里一个心照不宣的“地图炮”:很多投资人心里,对创业团队的地域存在一条鄙视链。 作者从投资人那句“你们是哪里的团队”的提问切入,指出这本质上是投资人在信息过载下,采用的一种基于概率的粗暴筛选策略。虽然会错过潜力股,但确是无奈之举。 接着,文章拆解了一个城市成为“创业之都”所需具备的五个核心要素——创业公司氛围、大公司人才储备、投资机构、优质高校和政策支持。作者特别修正了一点:在当下,当地用户的成熟度与接受度是至关重要的第六要素,它直接影响产品能否“线上+线下”结合打深壁垒。 基于这套标准,文章主观排出了北京、杭州、深圳、广州等城市的创业生态等级。对于不在这些城市的创业者,文章直指他们会在“人、财、物”三个核心环节面临巨大挑战:难以组建高质量团队、缺乏专业资本与放大效应、以及对行业动态的视野滞后。 文章的启发在于,它既揭示了地域差异造成的客观劣势,也给出了务实建议:要么迁徙并接受积累期,要么利用时间差深耕区域市场,要么清醒认知创业本就是Hard模式。最后用马云当年在杭州起步的例子,点出时间会改变一切,只是过程漫长。

本机暂存
IT 后端/ 2015-09-04 21:29:29 / 累计浏览 3,312

线上PHP问题排查思路与实践

这篇文章来自一位资深工程师在技术大会上的分享,系统地梳理了线上PHP问题的排查方法论。作者从最让用户头疼的“裸奔错误页面”切入,指出工程师需要看到502错误背后PHP-FPM进程失效等深层原因。 其核心思路是一个清晰的四步闭环:先恢复服务(通过摘机、回滚、重启或降级等手段),再保留现场(像警察保护案发现场一样记录日志与系统状态),接着排查问题(结合PHP内核、网络协议等知识和工具分析数据),最后验证结果。作者强调,恢复与保留往往同步进行,例如用gcore保存进程core文件后立即重启。 文章还分享了三个来自不同层面的实战案例,包括用tcpdump排查MySQL TPS飙升、追查导致CPU100%的PHP进程,以及一个由echo引发的系统崩溃。文末附有PPT下载,可供深入研习这套从理论到实践的完整排查框架。

本机暂存
IT 后端/ 2015-09-04 21:25:14 / 累计浏览 1,786

记一次因错误的500页面引发的血案

这篇文章记录了一次线上故障的完整排查过程。某业务活动页的一个固定链接,会导致部分用户被强制跳转至首页,且一旦跳转就“卡”在首页,无法再访问原链接。 排查过程颇具戏剧性:开发者通过抓包发现,浏览器根本没请求那个出问题的链接,而是直接请求了首页。查看缓存,其内容竟是一句 `meta http-equiv="refresh"` 跳转代码。这个行为在开发环境无法复现,最终矛头指向了生产环境的 Nginx 配置。 根因在于生产环境配置了 `error_page 500 = /50x.html;`,而这个自定义的 50x.html 页面内容恰好就是跳转到首页的 meta 标签。在系统上线替换文件期间,可能因文件不完整触发了 500 错误,导致浏览器缓存了这个跳转页面,从而陷入无限循环。 文章给出的解决方案很明确:一是为这个错误页面添加禁止缓存的 HTTP 头,从根源上阻止缓存;二是提供一个真正友好的 500 错误提示页,而非简单粗暴地跳转。这个案例生动地说明了,一个看似不起眼的、设计不佳的错误处理页面,在特定条件下可能演变成影响用户体验的持续性故障。

本机暂存
IT 后端/ 2015-07-23 14:05:06 / 累计浏览 1,520

细说云计算之外的雾计算与流计算

这篇文章探讨了数据中心领域里,除了广为人知的云计算之外,另外两种重要的计算范式:流计算和雾计算。 作者首先指出,许多“云数据中心”名不副实,云计算在落地过程中面临诸多挑战,催生了对多样化计算模式的需求。文章的核心在于对比这三者的特点与适用场景。云计算被定义为一种集中式的计算模式,它通过将大量普通计算机联网,用软件调度形成强大的并行计算能力,从而摆脱了对单一高性能巨型机的依赖。 相比之下,流计算(由IBM提出)则专注于处理来自各种源头的实时数据流。它跳过了传统“先存储后查询”的模式,直接对流经系统的数据进行即时过滤、分析与关联,非常适合需要对市场警报或事件做出快速反应的业务场景。 而雾计算(由思科提出)则显得更为“接地气”。它并非追求云端的强大算力,而是将计算、存储和网络功能分散到更靠近用户的网络边缘,由大量性能较弱但分布广泛的设备共同完成。这种分布式架构,使得中小型数据中心能够轻松部署,也更符合互联网去中心化的趋势。 简而言之,这篇文章清晰地勾勒出:云计算强在集中算力,流计算强在实时数据处理,雾计算强在边缘与分布式部署。它们并非互相替代,而是为不同需求的数据中心建设提供了多元化的技术路径。

本机暂存
IT 后端/ 2015-07-23 14:03:51 / 累计浏览 4,509

“集群和负载均衡”的通俗版解释

这篇讲的是“集群”和“负载均衡”这两个常被提及却未必真懂的计算机技术概念。作者没有堆砌术语,而是从实际困惑出发,力求用最通俗的语言帮大家理清它们。 文章核心是通过生活化的比喻来拆解技术。比如,用“超市收银员高峰期增开出口”来解释负载均衡的核心——“分摊压力”;用“兄弟开裁缝铺接单、做手工家具”的故事,生动区分了负载均衡集群、高可用集群与高性能计算集群的不同目标和工作方式。这种写法让抽象概念立刻变得可感可知。 作者不仅解释了基本概念,还对比了三种主要集群类型在解决“分摊任务”、“保障持续服务”、“并行复杂运算”等不同场景问题时的侧重点。文章最后也点明了这类知识的实践门槛,强调了从架构、运维到开发视角的差异。 它像一份清晰的技术概念地图,帮助读者快速建立直观理解。对于那些常听到这些词但一直没机会系统梳理的开发者和技术爱好者,这种深入浅出的解读正是所需的入门钥匙。

本机暂存
IT DevOps/ 2015-07-23 14:03:12 / 累计浏览 1,812

fabric执行在后台运行的命令

这篇讲的是在使用Fabric执行远程命令时,后台进程可能无法正常运行的坑点及解决方案。作者在用Fabric的run()执行nohup命令启动压力测试时,发现命令并未在后台成功运行。文章分析了这背后涉及Fabric对shell交互模式的处理机制,并指出直接使用“&”符并非可靠做法。 为解决此问题,文章推荐了三种更鲁棒的替代方案:优先使用systemd等系统守护进程管理工具,或借助screen/tmux实现进程detach,最后才是尝试nohup(但成功率不稳定)。作者特别指出使用screen时需设置pty=False以避免问题。 文中还附上了一个管理JMeter压力测试的fabfile完整示例,展示了如何实际应用screen命令来部署和启动测试。对于常与自动化部署工具打交道的读者来说,这篇结合踩坑经验与具体代码演示的分享,能提供切实的参考。

本机暂存
IT 后端/ 2015-07-23 13:57:34 / 累计浏览 4,247

“集群和负载均衡”在实战当中的运用技巧

这篇文章通过生动的比喻和生活中的实例,系统讲解了集群与负载均衡这些听起来高深、实则贴近实际的核心技术概念。 作者从最常见的误解切入,解释了集群的本质是多台计算机“联合工作”,而负载均衡的核心则是“分摊压力”。最巧妙的部分在于用“兄弟开店”的比喻清晰区分了三种集群类型:负载均衡集群如同“老大接单,兄弟们分工干活”;高可用集群则通过“兄弟互相备份”来保障服务不中断,并详细解释了双机热备、双工、互备等模式;高性能计算集群则好比“父子齐上阵,合力赶制复杂家具”。这些比喻让抽象的架构概念变得异常直观。 文章并非泛泛而谈概念,而是明确了它们各自的典型应用场景,比如超市收银对应负载均衡,早餐铺高峰时段对应高可用保障。同时也指出了掌握这些技术的门槛,强调其需要运维、架构、开发等多方面的实践知识积累,而不仅仅是理论理解。

本机暂存
IT 前端/ 2015-07-23 13:52:57 / 累计浏览 1,463

为什么 IE 不支持(子)域名含有下划线

作者分享了一个让他“永远不会忘记”的调试经历:为什么在IE浏览器中,一旦(子)域名包含下划线,PHP的会话cookie就会完全失效,即使最新的IE11也不例外。 问题的根源追溯到一个2001年的安全补丁(MS01-055)。微软为修补早期漏洞,实施了非常严格的DNS名称校验,要求必须遵循早期的RFC标准(如RFC606/608)。而早期标准并未包含下划线这个字符,因此IE会拒绝设置任何域名部分含有下划线的Cookie。作者指出,微软在此可能混淆了“主机名”与更广义的“域名”概念,因为RFC2181已表明DNS协议本身对标签字符没有限制,但微软的严格校验成为了IE独有的“遗留问题”。 由于这是浏览器端的强制策略,对于开发者而言,唯一的解决方案就是在域名命名中主动避免使用下划线。作者最后抛出了一个观点:在坚持看似“正确”的标准与适应已经普遍接受的实践之间,浏览器厂商该如何选择?

本机暂存
IT 后端/ 2015-07-23 13:46:05 / 累计浏览 1,912

Node.js Web应用代码热更新的另类思路

这篇讲的是Node.js开发者长期面临的一个痛点:代码修改后必须重启进程才能生效。作者从Erlang语言的热更新机制中汲取灵感,提出了一种在Node.js中实现“零重启”代码更新的思路。 核心方案不依赖PM2或node-supervisor这类工具,而是直接操作Node.js的模块加载机制。关键在于理解并干预`require.cache`,通过清除指定模块的缓存,强制`require`重新加载最新文件。作者进一步指出,要将此方法应用于Web应用,需要将基础框架代码与频繁变动的业务路由代码进行隔离。以Express为例,通过文件监听触发缓存清理,并巧妙利用闭包特性,使主应用总能获取到最新的路由模块。 文章不仅解决了“如何更新代码”和“如何使用新代码处理请求”这两个关键问题,还深入讨论了如何避免老模块导致的内存泄漏,确保新旧模块切换后资源能被正确回收。整篇文章提供了一套最小化改造的实用方案,旨在让Node.js应用的开发体验更接近PHP的灵活修改。

本机暂存
IT 后端/ 2015-07-23 13:43:49 / 累计浏览 6,648

如何设计用户登录

这篇讲的是如何设计一个灵活可扩展的用户登录系统。作者从最常见的用户名+密码登录入手,指出当需要集成微博、QQ等第三方登录时,传统做法——在Users表中不断新增列来存储OAuth信息——会导致表结构日益臃肿,维护成本很高。 核心解决方案是将“用户资料”与“认证信息”进行分离。具体来说,将Users表精简为只存放用户个人资料(Profile);而将登录认证(Authentication)过程独立出来。本地密码登录维护一个LocalAuth表,而微博、QQ等第三方OAuth登录则统一到一个OAuth表中,通过`oauth_name`字段区分不同来源。 这种设计的好处显而易见:添加新的登录方式(如SAML)只需新增记录或表,无需改动用户主表;一个用户可以绑定多种登录方式;同时,由于Users表不再存放口令等敏感数据,系统安全性也得到了提升。

本机暂存
IT 开发者/ 2015-07-23 13:40:38 / 累计浏览 2,168

拒绝修复 bug 的几个正当理由

这篇讲的是:在软件开发中,一味地、立即修复所有 bug 可能并非最佳实践。 作者从代码质量与项目长期健康度的视角出发,提出了四个可以“正当”拒绝 bug 修复的理由。首先,草率的修复常通过删除或跳过单元测试来让构建通过,这实质上降低了测试覆盖率,为系统埋下隐患。其次,一个合格的修复应包含能重现该 bug 的测试用例,否则只是掩盖问题,无法防止修复行为本身引入更多“熵”。再者,bug 修复应保持小而专注,避免与代码重构混杂在一起,否则会使补丁难以审查和理解。最后,一次 pull request 应只处理一个 bug,确保修改的纯粹性和可追溯性。 作者的核心观点是,bug 修复的纪律比程序员良好的重构意图更重要。有时,要求提交者完善测试、拆分补丁,是比简单合入代码更负责任的选择。文章通过具体的技术场景,为团队代码评审和维护流程提供了一套清晰的思考框架。

本机暂存
IT DevOps/ 2015-07-21 23:39:31 / 累计浏览 1,972

一些LVS实验配置、工具和方案

这篇讲的是作者在LVS环境下验证的一种不中断业务的RealServer升级方案。核心目标是在不中断前端服务的情况下,对后端真实服务器进行维护或重启。 作者选用了LVS的DR(直接路由)模式进行实验。文章详细列出了网络规划,包括两台RealServer和一台Director Server的IP分配。关键在于具体的配置实践:在Director上,通过ipvsadm工具设置VIP和采用加权轮询调度算法;在RealServer上,则通过脚本在本地绑定VIP并设置ARP抑制,这是DR模式正常工作的基础。 作者验证的流程是:通过脚本控制,让需要升级的RealServer自动从LVS集群中移除,待维护完成并检查健康后,再自动重新加入集群。整个过程对客户端保持透明,实现了业务不中断。文章提供了可用的脚本片段,将配置步骤代码化,方便读者参考和复现。对于需要在生产环境中安全维护LVS节点的运维人员来说,这个实验记录提供了一套切实可行的操作思路和工具参考。

本机暂存
IT 前端/ 2015-07-21 23:36:13 / 累计浏览 1,978

-webkit-border-radius圆角属性

这篇文章聚焦于 CSS 中的 `-webkit-border-radius` 圆角属性,详细拆解了其语法、参数和实际应用中的注意事项。作者从基础语法讲起,说明了属性值可以是单个长度(形成四角相等的圆角),也可以是“水平半径 / 垂直半径”的形式(形成椭圆角)。 文章特别强调了使用的细节和兼容性问题。例如,该属性支持动画;参数取值范围广泛,支持各种长度单位;并且提醒读者注意书写方向(如 `tb-rl`)对参数顺序的影响,在某些浏览器中顺序会反转。此外,作者指出这份参考手册主要针对 `-webkit` 内核浏览器,如果需要兼容其他内核,还需查阅其他资料。 文中还穿插了一个在 Chrome 开发版中遇到的有趣 bug,并附有简单的代码示例,让讲解更具体。整体而言,这是一篇实操性很强的属性指南,为前端开发者提供了清晰的使用参考。

本机暂存
IT 设计/ 2015-07-21 23:30:56 / 累计浏览 4,777

给自己的字体课(一)——英文字体基础

这篇讲的是作者从实际设计需求出发,为自己梳理的英文字体入门知识。核心是解析衬线体与无衬线体这两大分类下的“情绪”差异与应用场景。 文章首先厘清了衬线体(Serif)的演变脉络:从笔划对比缓和、带有手写痕迹的旧风格字体(Old style),到线条锐利、对比强烈的现代字体(Modern)。通过《Kinfolk》杂志的排版和阿玛尼、华伦天奴等奢侈品牌的Logo案例,展示了前者如何营造传统、柔软的诗意感,后者如何传递现代、高冷的优雅。 而无衬线体(Sans Serif)则被形容为更简明有力。文章重点以Helvetica为例,剖析其“中性”特质——既适用于地铁导视系统,也能融入时尚品牌,成为信息传达的“透明容器”。作者也指出,字体的情绪是相对的,比如板状衬线体(Slab Serif)就能呈现出现代、年轻的感觉,打破了“衬线体一定古典”的刻板印象。 整篇文章像是一份清晰的笔记,从衬线有无的基础分类切入,最终落脚到字体如何服务于品牌气质与内容调性,为设计初学者提供了一个实用的认知框架。

本机暂存
IT 移动开发/ 2015-07-17 13:24:44 / 累计浏览 4,564

聊聊移动端跨平台开发的各种技术

这篇讲的是移动端跨平台开发技术的全景分析。作者从React Native的流行切入,将现有的解决方案梳理为四大流派:Web(Hybrid)、代码转换、编译和虚拟机,并深入剖析了各自的原理、优劣与适用场景。 在Web流中,文章跳出了“DOM性能差”的常见误解,指出其根本瓶颈在于早期Android WebView实现粗糙、CSS计算复杂以及上层API限制了底层优化能力。而代码转换流则介绍了如J2ObjC等工具如何在不改变官方技术栈的前提下,实现iOS与Android间高达70%的代码复用(以Google Inbox为例),同时也分析了不同转换方向与目标语言工具的成熟度差异。 作者并未止步于技术罗列,而是结合具体项目(如React-Canvas、HTML-GL)和历史案例,点明了各种路径的现实挑战。例如,Web流在享受CSS丰富表现力的同时,面临着功能滞后于原生API的困境;而代码转换的效率则高度依赖工具链的完成度。整篇文章为开发者在“一次编写,处处运行”的理想与平台差异化的现实之间,提供了清晰的技术路线图与决策参考。

本机暂存
IT DevOps/ 2015-07-16 23:28:12 / 累计浏览 2,360

浅谈运维工具体系

运维体系庞大且复杂,这篇梳理的是支撑高效运维背后的工具全景图。作者从运维的三大核心场景——流程管理、发布变更与监控告警——出发,系统性地拆解了每个环节所需的工具类别与作用。 文章指出,运维工具并非铁板一块。在流程层面,工具负责衔接与审批,确保变更闭环与故障可追溯;在发布变更层面,从版本管理、配置下发到资源隔离,形成了一套从代码到线上状态的完整管控链路,尤其强调了以版本管理为起点、杜绝直接拷贝的规范做法。而在监控告警层面,则构建了从数据采集、异常检测到自动修复、通知的完整流水线,提到了 Logstash、StatsD 等具体技术选型,并区分了本地与远程拨测的不同价值。 整体来看,文章并未空谈理论,而是将各类工具按功能归类,并点明其解决的具体问题,比如配置漂移、故障定位、资源利用率等。它为读者勾勒出一个从操作界面到底层资源、从流程规范到技术实现的立体工具体系,适合正在搭建或优化自身运维体系的团队参考。

本机暂存
IT 开发者/ 2015-07-16 23:24:28 / 累计浏览 3,675

如何写简历

这篇讲的是一位技术招聘者看了200多份简历后,从“收件人视角”总结的简历优化指南。 作者从日常招聘中遇到的实际问题切入:比如HR需要快速分发简历给不同岗位的面试官,而很多应聘者连简历文件名都只写“个人简历”。他建议将命名规范化为【姓名-应聘岗位-城市】,这一个小动作就能大幅提升协作效率。对于加分项,作者提到附上活跃的GitHub或博客链接是很好的补充,但长期不更新的反会减分;项目经验则强调与岗位要求直接挂钩,并尽量提供可在线访问的URL,避免让面试官花费额外精力去搜索验证。 文章最后点出核心:简历的本质是换位思考。用通用的PDF格式、为在线作品提供便捷入口、保持稳定的职业经历,这些细节都在为阅读者降低信息获取成本。当一份简历让招聘方觉得“舒服”,offer的可能性就大大增加了。

本机暂存
IT 数据库/ 2015-07-16 23:23:18 / 累计浏览 2,623

使用审计功能记录错误密码登陆信息

这篇讲的是如何利用Oracle数据库内置的审计功能,来定位UAT环境中用户频繁被锁定的根本原因。 在一次UAT环境恢复后,业务用户不断反映账户被锁定,且每个人都坚称自己输入的密码无误。作者原本打算新建触发器来记录错误登录尝试,但在检查配置时发现,当前使用的Oracle 11.2.0.4数据库,默认的审计功能实际上是开启的。 通过执行`show parameter audit`命令确认状态后,作者直接从审计日志入手,查询了`dba_audit_trail`视图。最终清晰地定位到问题根源:某个应用程序在连接时持续使用了错误的密码。审计日志详细记录了尝试登录的客户端程序、操作系统用户、终端以及具体时间,证据确凿。这不仅快速解决了“谁在用错密码”的罗生门,也避免了额外编写监控代码的开销。 这个案例提醒我们,在进行故障排查时,先摸清数据库现有功能与配置至关重要。Oracle默认开启的审计机制,就像一位默默工作的哨兵,在无需额外开发的情况下,为我们保留了关键的现场证据。

本机暂存