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

最新文章

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

IT 数据库/ 2013-09-23 13:54:28 / 累计浏览 3,544

关于sqlite的事务的使用

SQLite以读性能出色著称,但写入性能有时会让开发者头疼。这篇来自作者实践经验的文章,就从一个具体问题切入:批量插入500条小记录居然需要20多秒,异常缓慢。 问题的根源是什么呢?作者通过strace工具追踪系统调用发现,高达88.73%的耗时(超过27秒)都花在了`fdatasync`系统调用上,调用次数多达2064次。这正是因为SQLite默认的“每次写入都落盘”的安全策略所致,频繁的磁盘同步成为了性能瓶颈。 文章给出的解法很直接:使用事务。将多次写入操作包裹在一个事务中,使得数据能够一次性批量提交。优化效果立竿见影:`fdatasync`调用从2064次骤降至12次,整体耗时从27.6秒猛降到209毫秒,性能提升了百倍以上。 作者也进一步探讨了相关话题,比如无法批量操作时可选用的nosync版本,以及面对超大数据量时分批提交事务的考量。这篇文章的价值在于,它用非常实证的数据,清晰展示了SQLite写入慢的核心原因以及事务优化带来的巨大提升。

本机暂存
IT 前端/ 2013-09-23 13:53:52 / 累计浏览 2,560

IE6下经典的请求abort问题

作者掉进了一个坑:在IE6下给`a`标签绑定事件来切换验证码图片,但图片总是刷不出来,抓包一看请求状态是**abort**。问题出在IE6对`a`标签的执行顺序上——它先执行`onclick`里的事件处理函数,紧接着就会执行`href`属性定义的跳转。如果你没有在事件里阻止这个默认的跳转行为,浏览器会认为页面即将导航离开,从而把刚才在`onclick`中发起的请求(比如获取验证码的AJAX请求)给强制中止了。 解决办法很直接:在事件处理函数的最后加上`return false;`,或者把`href`属性改成不会跳转的锚点,比如`javascript:void(0)`或`#`。最稳妥的做法是两者结合使用。文章通过这个具体的bug,把IE6下事件流与页面跳转之间的微妙关系讲得很清楚,虽然现在IE6已罕见,但其中关于浏览器默认行为会干扰异步请求的原理,在其他场景下依然值得留意。

本机暂存
IT 开发者/ 2013-09-23 13:49:40 / 累计浏览 3,965

我是如何变成一个Loser的

这篇讲的是一个技术团队管理者,通过复盘自己亲手将部门带向解散的全过程,为我们总结出了一份“避坑指南”。 作者坦诚地分享了自己在担任部门主管一年间的四大失误:对新加入的实习生队友缺乏足够的引导与关怀,未能形成团队凝聚力;在团队技术栈上反复摇摆(C#/PHP/Python/Node.js),导致多人多语言、项目零散,严重消耗了本就紧张的人力;在薪酬竞争力不足时,没有为团队描绘清晰的愿景,致使士气低落、成员相继离职;以及陷入“功能实现”的技术自嗨,忽略了产品本身的体验和价值。 这些看似是管理“大忌”的错误,恰恰构成了真实而宝贵的反面案例。文章没有空谈理论,而是用具体的项目选择、团队配置和个人心路历程,刻画了技术驱动型团队可能面临的典型困境。对于每一位带团队或即将带团队的技术人来说,这些从“Loser”视角提炼出的教训,或许比成功经验更值得引以为戒。

本机暂存
IT 前端/ 2013-09-23 13:48:42 / 累计浏览 1,816

实现一下webapp的手机摇一摇功能

作者一开始也以为在WebApp里实现“摇一摇”必须依赖Hybrid框架,直到他发现了浏览器原生的DeviceMotion API。这篇文章就记录了他利用这一接口实现纯前端摇一摇功能的过程,思路清晰且实用。 核心实现并不复杂:通过监听设备的`devicemotion`事件,可以获取到`accelerationIncludingGravity`属性下的`x`、`y`、`z`三个方向的加速度数据。作者通过分析这三个数值的变化,来判断手机是否发生了“摇动”行为。文章给出了关键的事件监听和数据获取的代码示例,展示了如何用短短几行代码搭建起这个交互的基础框架。 这篇分享的巧妙之处在于,它证明了对于一些常见的设备交互需求,不必立刻上重型方案。利用好浏览器提供的标准Web API,往往就能以更轻量、更跨平台的方式达成目标。对于前端开发者来说,这为丰富移动端WebApp的交互体验提供了一个低成本的可行思路。

本机暂存
IT 后端/ 2013-09-23 13:46:24 / 累计浏览 3,603

文本与二进制方式打开文件的区别

这篇讲的是编程中一个容易被忽略却至关重要的细节:以文本方式和二进制方式打开文件究竟有何不同。 文章首先点明,在Windows系统下,这种差异直接体现在对换行符的处理上——文本模式会默默进行“/n”与“/r/n”的相互转换,而二进制模式则原样读写。在Unix/Linux下,两者则没有区别。作者进一步深入到底层,解释了差异的根源:文本文件是基于字符编码(如ASCII),而二进制文件是基于值的自定义编码。这也决定了文本文件通常有更好的通用可读性(记事本就能打开),而二进制文件则更节省空间且灵活。 文章通过一个生动的例子说明,用记事本打开一个二进制文件(比如包含数字1的二进制表示),会因为解码方式不匹配而显示乱码。而在C语言编程层面,核心区别也仅仅在于换行符的转换,当数据不包含换行符时,两种模式的读写结果其实是一样的。最后,通过展示数字“5678”在两种模式下截然不同的存储形式(ASCII码占四字节,二进制仅占两字节),直观地揭示了它们的空间效率差异。理解这点,能帮助开发者在处理配置文件、日志或跨平台数据交换时,做出更合适的选择。

本机暂存
IT 设计/ 2013-09-23 13:45:12 / 累计浏览 3,029

拟真设计与扁平化设计

这篇讲的是苹果iOS 7告别拟真设计、拥抱扁平化设计背后的思考与两种风格的核心差异。作者从拟真设计(Skeuomorphism)的定义与历史讲起,它通过模拟真实世界的材质与动作(如iBooks的书架和翻页效果)来营造亲切感,从而大幅降低用户对陌生界面的学习成本。但这种“以貌取人”的倾向也催生了用户只重外观而忽视功能体验的问题。 当拟真设计热度减退,以微软Metro UI为代表的扁平化设计开始兴起。它脱胎于瑞士版式设计,摒弃纹理和光影,用纯粹的形状和色彩追求视觉简约与信息的高度整合。然而,这种极简化也可能带来新的困惑,比如用户难以区分按钮与静态图片的交互状态。 文章最终指出,无论是拟真还是扁平化,都不是完美终点。设计思路的演进始终与屏幕技术、用户认知水平紧密绑定,关键在于根据具体场景选择最恰当的方案。

本机暂存
IT 开发者/ 2013-09-23 13:44:19 / 累计浏览 2,496

那些被大佬带进沟里的名言

这篇探讨的是技术圈里那些被“大佬”名言带偏的经典案例。文章以轻松又不失犀利的口吻,剖析了诸如“注重用户体验”、“小步快跑”、“不断试错”、“做轻做小”和“接地气”等流行理念,如何因片面理解而沦为产品开发中的陷阱。 作者用“旋风将军”攻城却不守的比喻,戳破了“小步快跑”只跑不顾运营的幻想;以《三体》的“黑暗森林法则”提醒,“试错”并非毫无章法的冒险,首战即败的代价往往致命。文章指出,这些口号被剥离了关键前提——小步快跑需兼顾运营,试错需谨慎开局,做轻只是切入手段,而“接地气”更不等于恶俗。 最终,作者将讨论引向更深层的认知:产品设计的内核并非优雅的界面,而是切实的价值创造。真正的成功,始于创意,成于持续、深度的运营设计。那些起势汹涌却无疾而终的产品,大多败在了对“运营”这一脏活累活的轻视上。

本机暂存
IT 前端/ 2013-09-23 13:39:52 / 累计浏览 2,035

总结一下本站(忘我的追寻/WordPress)用到的插件、主题以及自己做的一些优化特性

这篇博客是作者对其WordPress站点运行一年来所做的优化和开发的总结。作者从自身需求出发,将默认英文主题进行了汉化和细致的视觉调整,形成了现在的界面风格。 在插件方面,文章详细介绍了SEO优化、百度统计与Google Analytics双备份、移动终端适配、反垃圾评论等核心插件的选择与配置经验,甚至提到了为评论区开发支持代码高亮功能的具体实践。其中,作者还分享了使用“简单算术题”插件并微调参数来对抗垃圾评论的巧思。 更值得关注的是作者自行开发的多个特性。例如,亲手制作了透明背景的favicon,并实现了返回顶部按钮。在分享功能上,作者不满足于现成方案,通过调用Google API自行生成文章二维码并保存至本地,同时利用短链接解决了微信扫描时的信任警告问题。此外,大量基于个人审美的CSS调优,以及为评论和归档页面增加的实用功能,都体现了对易用性和细节的深度打磨。 文章最后还列举了开发中使用的调试工具链和版本管理方案。从这些实践出发,为其他博主提供了一份实用的优化参考。

本机暂存
IT 开发者/ 2013-09-23 13:36:30 / 累计浏览 3,147

打开视野

这篇讲的是作者在ThoughtWorks做面试官时,观察到一种普遍的成长瓶颈。许多在原公司表现不错的程序员,面试时却在宏观思考和问题陈述上显得零散,因为他们长期只负责执行被“嚼碎”的具体问题,视野被日常项目所限。 作者指出,视野的局限会让程序员误把“局部峰值”当成自己的水平。他给出的解药是主动打破环境限制:通过互联网接触更广阔的天地和高手的思维方式;阅读经典书籍进行系统学习;以及走出去参加技术聚会,以近乎零成本的方式与不同经验的人交流。 文章最后,作者用自己早年的故事做了印证:当他在东软感到能力“过饱和”时,正是凭借对外部世界的好奇和探索,最终加入了能持续激发成长的ThoughtWorks。他想提醒的是,具体学什么、怎么学是后话,程序员最怕的是固步自封,第一步永远是把视野打开。

本机暂存
IT 安全/ 2013-09-23 13:35:29 / 累计浏览 1,716

基于语法分析的PHP webshell扫描工具–Pecker Scanner

这篇讲的是一个PHP webshell扫描工具——Pecker Scanner的开发思路与实现。作者从早年基于正则匹配的扫描尝试出发,反思了当时工具的不足,比如容易把注释或非恶意代码中的危险函数也标记为误报。为此,他详细对比了三种扫描方式:最基础但漏洞最多的特征关键字匹配、更精确但仍有漏报的正则表达式匹配,以及通过语法分析剥离注释、字符串和变量,仅对实际执行的危险函数进行检测的语法语义分析。 文章的核心在于介绍Pecker Scanner的设计选择。这款工具首先采用语法分析来解决漏报问题,并结合服务器云端判断,通过比对已知的恶意代码指纹和项目上下文,来进一步降低误报率。作者还展示了工具生成的扫描报告样例,并分享了其GitHub开源项目、最新版本下载地址以及如何参与贡献。 作为一个从个人遗憾中诞生的项目,Pecker Scanner的诞生故事也反映了作者对开源社区的热情,以及对代码安全检测技术从简单到严谨的演进思考。

本机暂存
IT DevOps/ 2013-09-23 12:27:57 / 累计浏览 3,477

Linux内核代码中的脏话统计

这篇讲的是作者从一个已停更的“the linux kernel fuck count”项目获得灵感,对Linux内核的C、H及汇编源代码进行了一次系统的脏话统计分析。作者按版本号,分别从脏话的绝对数量和代码行的脏话密度两个维度绘制了图表。 数据呈现了一个有趣的趋势:从2.4版本开始,脏话的绝对数量显著攀升。然而,考虑到同期内核代码总量也在激增,折算下来,平均每行代码的“脏话密度”反而是在下降的。文章坦诚地分享了统计方法的局限,比如会将词中包含的词也计入,以及受FreeBSD正则引擎内存泄漏的影响未能优化。 作者最终开源了统计脚本,但也自嘲其代码质量混乱。这本质上是一次用独特视角审视开源社区文化的趣味实践,既看到了开发者情绪的外露,也反映了代码库膨胀带来的稀释效应。

本机暂存
IT 数据库/ 2013-09-23 12:20:01 / 累计浏览 1,434

Oracle中的Low HWM与 High HWM 高水位

这篇讲的是Oracle数据库在ASSM存储管理下,如何通过引入Low HWM和High HWM两个高水位标记来优化存储空间利用与并发性能。作者从传统MSSM模式下单一高水位标记的局限性切入,指出了其可能引发的锁竞争与IO性能问题。 文章核心聚焦于ASSM的解决方案:通过两个高水位将数据块区域划分为已格式化(Low HWM以下)、未格式化但可能被重用(Low HWM与High HWM之间)以及完全未格式化(High HWM以上)三个区域。这种设计精妙之处在于,它允许在HWM以下存在未格式化的“空洞”,从而在直接路径加载数据时,能更灵活地复用空间,避免因频繁提升高水位而导致的锁等待和不必要的格式化IO开销。 作者进一步解释了这一机制的关键细节:只有当当前extent及之前extent中的所有块均被格式化后,Low HWM才会上升;而High HWM的提升则与一级位图块管理的范围相关。在顺序读取时,系统以High HWM为终点,同时忽略其间未格式化的块,保证了查询效率。整篇内容深入到底层实现原理,为理解Oracle复杂的存储管理提供了清晰的视角。

本机暂存
IT 设计/ 2013-09-23 12:19:00 / 累计浏览 3,306

用QQ邮箱发一封求职信

这篇讲的是最近关于“用QQ邮箱发求职信是否合适”的热议。作者从这场争论出发,没有陷入情绪化的站队,而是冷静地剖析了“QQ邮箱”在求职场景下的多面性。 文章核心观点是:绝大多数情况下,用QQ邮箱发求职信并无不妥,其负面影响充其量只有20%,关键还是简历质量。但在一些特定场景下,它确实可能带来减分。比如,在大公司的商务职位或科技媒体编辑岗位,使用Gmail等更具国际感和商务气质的邮箱,可能在第一印象上更得体。作者甚至指出,在产品经理等技术岗位,Gmail优雅的设计语言本身就能传递一种对产品细节的敏感度。这些判断源于对HR筛选习惯的观察(比如数据发现“QQ邮箱”是简历未通过的强特征之一)和对不同品牌气质的理解。 作者也提醒,这场争论中许多“地图炮”式的互怼是不理性的。无论是批评QQ邮箱还是捍卫它,过早的愤怒往往会遮蔽对复杂场景的认知。就像文章最后举的支付宝支付密码的例子,很多看似“荒谬”的设计背后,都有其特定的用户逻辑和妥协。因此,他建议不必对号入座,了解这个世界的复杂性,比简单地评判对错更有价值。

本机暂存
IT 算法/ 2013-09-15 22:40:29 / 累计浏览 4,253

Spark:一个高效的分布式计算系统

这篇讲的是Spark这个基于内存的分布式计算框架,作者从Spark与Hadoop的对比出发,深入介绍了其核心优势和关键特性。文章指出,Spark通过将中间结果保存在内存中,避免了Hadoop MapReduce频繁读写HDFS的瓶颈,从而在迭代运算密集的数据挖掘与机器学习任务中效率显著提升。 其核心创新在于RDD(弹性分布式数据集)的抽象,它使得开发者能以操作本地集合的方式来处理分布式数据,支持丰富多样的转换和行动操作,编程模型比Hadoop的Map和Reduce更加灵活。文章还剖析了RDD的存储、分区、容错机制(通过血缘信息和检查点)及其11种存储级别,这些共同构成了Spark高效、可靠的基础。 此外,文章梳理了Spark的生态系统,包括兼容Hive的Shark、用于流处理的Spark Streaming以及图计算框架Bagel,并列举了其多种运行模式与在业界的早期应用。总体而言,Spark并非Hadoop的替代品,而是一个更通用、更适合迭代计算的补充,它直接读写HDFS并支持在YARN上运行,为处理海量数据提供了新的高效选择。

本机暂存
IT DevOps/ 2013-09-15 22:39:34 / 累计浏览 1,924

敏捷就是“团队快乐”

这篇讲的是敏捷的核心在于“团队状态”,而非机械执行流程。文章直面传统职能组织中“各扫门前雪”的协作困境,指出目标冲突导致相互推诿的痛点。 作者将真正的敏捷拆解为四个支柱:一是“团结一致”,团队共享同一目标,必要时主动补位,比如产品与技术共同细化需求、开发介入测试;二是“纪律严明”,角色分工、每日站会、可视化工具是为协作服务的清晰约束,而非推责的规矩;三是“快速反应”,摒弃“憋大招”的完美主义,通过小步快跑的迭代(如两周一个版本)尽早交付价值、获取用户反馈;四是“乐在其中”,让成员在消灭任务卡片、并肩作战的即时反馈中获得成就感与快乐。 文章最后强调,快乐不是结果,而是敏捷实践的驱动力。高效协作与积极心态形成的良性循环,才是团队能持续适应变化、交付价值的根本。

本机暂存
IT 后端/ 2013-09-15 22:37:57 / 累计浏览 1,036

以keystore方式为play!应用建立单向/双向SSL

这篇讲的是如何在Play!框架中配置SSL安全连接,而且特别澄清了官方文档的不足之处,避免读者被过时资料误导。 作者先理清了SSL的核心:用对称加密传输数据,非对称加密(RSA)安全传递密钥。在此基础上,解释了单向SSL(服务端验证)和双向SSL(服务端与客户端互相验证)的区别,后者适用于需要严格控制访问权限的内部服务。 配置的关键在于正确设置keystore。文章详细演示了生成服务端密钥库(certificate.jks)的命令,并特别指出密钥库口令与密钥口令必须一致这个容易忽略的坑。对于单向SSL,配置到此即可。 如果需要双向SSL,流程还涉及在客户端生成并导出证书,然后将该证书导入服务端的密钥库进行“授信”。整个过程通过具体的keytool和openssl命令逐步拆解,甚至涵盖了使用curl和浏览器进行测试的不同方法,非常实操。 文章用清晰的步骤,把Play!应用如何建立从单向到双向的SSL连接,从原理到命令都讲透了。

本机暂存
IT 后端/ 2013-09-15 22:36:04 / 累计浏览 2,930

Nginx与Gzip请求

这篇讲的是Nginx如何处理客户端发来的Gzip压缩请求。作者从移动端同事的需求出发——为了节省流量和提升传输速度,需要让服务端解压缩客户端发送的Gzip数据。但Nginx自带的Gzip模块都是处理响应(Response)的,对于请求(Request)的解压缩并无直接支持。 文章详细探索了两种可行的技术方案:一是使用lua-zlib库直接解压;二是通过LuaJIT的FFI接口封装系统的zlib库来实现。作者不仅给出了具体的代码示例,还贴心地解决了在Linux环境下可能遇到的动态库加载路径不匹配的问题。最后,文章在PHP后端架构下进行了测试,对比了两种方案的性能,发现lua-zlib的效率反而略高于理论上更优的FFI方案。 核心结论是,借助OpenResty和Lua的强大扩展能力,可以在Nginx的access阶段灵活处理特殊的压缩请求,为异构系统(如PHP后端)解压数据,是一个高效且实用的解决方案。

本机暂存
IT 设计/ 2013-09-15 22:33:59 / 累计浏览 3,018

标准化之路:关于产品设计规范

这篇讲的是产品设计规范在互联网团队中的意义与实践之道。作者从产品与业务的平衡关系切入,指出好的规范能定义如何设计出一个既满足业务目标、又让用户易用的产品。 文章的核心观点是,设计规范并非死板的约束,而是通过简约、清晰、高效的体系在纷繁中建立秩序。它详细拆解了规范的三大价值:指导性(凝聚经验,让团队各安其职)、有效性(基于业务与场景穷尽可能,形成合理模板)、可复用(提升视觉、前端及整体协作效率,并保障用户体验一致性)。文中以“赞”按钮的交互设计为例,生动说明了如何从简单反馈进化到优雅且考虑周全的体验。 作者也清醒地指出,规范的约束往往来自人,而非规范本身。它需要与时俱进,避免成为“古董”,并站在一定高度具备前瞻性。最后强调了实施时机的重要性:规范化是产品迭代中自然沉淀的“进化”,而非在产品未准备好时强行推行的“革命”,磨刀不误砍柴工。

本机暂存
IT 前端/ 2013-09-15 22:33:22 / 累计浏览 4,196

10分钟尝试10种编程语言

作者为想快速体验不同编程范式的开发者整理了一份清单,核心观点是:不必耗时安装环境,直接在浏览器里就能“尝鲜”多种编程语言。文章分类介绍了10种语言,从Lua这类擅长游戏脚本的动态语言,到Erlang这种构建高容错系统的函数式语言,再到Elm这样的响应式Web语言,甚至Brainfuck这种纯属娱乐的秘教语言都涵盖其中。 文章强调,这些在线环境通常附带教程,能帮你快速了解一门语言的“性格”。例如,想体验LISP家族的现代变体可以尝试Clojure,它的社区项目Overtone能实现有趣的音频编码;而R语言则专精于统计图表。除了语言本身,文章还推荐了Cloud 9等浏览器IDE,让你连开发环境都不用本地配置。 作者最后指出,通过解决像FizzBuzz或生命游戏这样的经典小任务,可以进一步巩固新学语言的技能。整篇文章像是一份有趣的“编程语言游乐园”导览图,从动态脚本到纯理论探索,路径清晰,旨在激发读者探索新范式的兴趣。

本机暂存
IT 后端/ 2013-09-15 22:29:26 / 累计浏览 4,183

Nginx HttpMemcModule和直接访问memcached效率对比测试

这篇实测对比了两种访问memcached的方式:通过Nginx的HttpMemcModule模块代理,以及由PHP直接连接。作者搭建了具体的测试环境,使用不同配置的服务器,从64到2048的并发线程发起压力测试。 测试揭示了几个关键差异。首先,在效率上,即使经过优化,通过Nginx HttpMemc代理的平均效率大约只有直接访问的72.6%左右,存在一定的性能损失。但更重要的是稳定性:直接连接memcached时,失败的请求数会显著增加,而借助HttpMemc模块(并配置了keepalive),连接失败的情况得到明显改善。 文章还补充了调整TCP内核参数(如开启tcp_tw_recycle和tcp_tw_reuse)后的测试结果。调整后,不仅失败请求完全归零,整体TCP效率也得到提升。最终结论是,尽管HttpMemc模块会带来一些性能损耗,但其在连接复用和对上层应用透明方面的优势,使得这个损耗在可接受范围内,尤其是在需要高连接稳定性的场景下,它依然是一个值得考虑的方案。

本机暂存