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

最新文章

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

IT 算法/ 2014-11-28 23:08:16 / 累计浏览 3,421

如何让玩家相信游戏是公平的

这篇文章从经典赌场骰子游戏的公平性争议出发,探讨了将游戏搬到线上后,如何用技术手段建立玩家信任。作者指出,许多争议源于游戏实现者的贪心而非规则缺陷,并由此引出一个关键问题:如何证明骰子结果在下注前就已确定,而非根据玩家行为动态调整? 文章提出了一套基于MD5哈希的简易验证方案。核心思路是:系统在每局开始前,先生成三个包含随机骰子数字的字符串,计算并公开其MD5值;玩家下注后,系统再公布原文,玩家可自行校验MD5是否匹配。由于MD5的不可逆性,这能在逻辑上保证结果未被篡改。文中进一步探讨了MD5碰撞攻击的可行性,指出单区块碰撞的计算复杂度(约2^50次运算)远超普通设备能力,并建议通过链入上局数据来进一步增强安全性。 整体而言,文章用通俗的案例引出了一个实用的工程信任构建方案,说明即使是复杂的公平性问题,也能通过巧妙、透明的技术设计来赢得用户认可。

本机暂存
IT 后端/ 2014-11-28 23:06:17 / 累计浏览 4,504

使用nginx限制蜘蛛的频繁抓取

这篇讲的是作者如何应对百度蜘蛛异常抓取的问题。上周,百度蜘蛛对“玩客”网站的抓取频率突然飙升至原来的5倍,导致服务器负载急剧升高,影响了正常服务。问题的根源在于单一爬虫的请求量超出了服务器的承载能力。 为了解决这个问题,作者利用了nginx内置的ngx_http_limit_req_module模块,对百度蜘蛛的抓取频率实施了精准限制。核心配置是将百度蜘蛛的请求速率限制在每分钟200次,并设置了最大并发为5的队列缓冲。当短时间内请求量超过此限制时,系统会直接返回503状态码,快速拒绝多余的请求,从而有效保护了后端服务。 文章不仅给出了即用的配置代码,还解释了每个参数的作用,例如burst和nodelay参数如何协同工作。同时,作者点出了该模块背后的“漏桶算法”原理,并提供了源码阅读指引。对于遇到类似爬虫管理问题的运维或开发人员来说,这是一个非常实用且有细节参考的解决方案。

本机暂存
IT 后端/ 2014-11-28 23:03:09 / 累计浏览 2,337

初探Thrift客户端异步模式

这篇讲的是如何为Thrift RPC框架引入异步调用能力。作者从团队广泛使用的同步模式出发,为优化大数据量传输等场景,探索了Thrift原生提供的异步客户端方案。 核心实现围绕生成的异步客户端类与`TAsyncChannel`接口展开。`TAsyncChannel`定义了异步收发消息的接口,目前标准的实现是基于libevent和HTTP协议的`TEvhttpClientChannel`。它的巧妙之处在于,通过将回调函数注册到事件循环中,使得客户端发送请求后无需阻塞等待,可以继续执行其他任务,待服务端响应到达时再触发回调处理结果。 文中一个关键发现是:异步客户端并非必须搭配异步服务器。通过实验验证,只要服务器端使用HTTP传输层(例如通过`THttpServerTransportFactory`),协议层保持一致,即可与异步客户端正常工作。这大大降低了现有同步服务的改造成本。 实验部分展示了一个完整的异步客户端与同步服务器交互的例子,运行结果证实了调用发起与响应接收在时间上是解耦的。不过,作者也指出当前实现限于HTTP传输层,这为后续扩展其他传输协议留下了探索空间。

本机暂存
IT 后端/ 2014-11-28 22:59:58 / 累计浏览 2,651

分布式对象存储系统Sheepdog性能测试

这篇文章对分布式对象存储系统 Sheepdog 进行了一次详尽的性能摸底,特别针对其声称的“零配置、线性扩展”特点,在真实硬件环境下考察了其 IOPS 和吞吐量表现。作者搭建了一个包含 6 个节点的集群,节点配备常见的 7200 转 SATA 硬盘,并创新地利用 SSD 作为对象缓存,虚拟机则运行于基于 KVM 的 QEMU 环境中。 测试聚焦于两个核心指标:使用 fio 工具测量的随机读写 IOPS,以及使用 iozone 测量的顺序读写吞吐量。文章首先澄清了存储介质的基准性能——普通 SATA 硬盘的 IOPS 理论上限仅约 65,而 SSD 则可轻松突破数万。在不启用对象缓存的只读测试中,Sheepdog 展现了其分布式优势:6 节点协同工作,使得虚拟机内的 IOPS 突破了单块 SATA 硬盘的极限,在单线程下达到 100 左右,多任务或异步 IO 场景下更可提升至 230-250。测试文件大小对 IOPS 有显著影响,缩小文件范围能进一步提升性能。 作者通过严谨的控制变量法,对比了启用/不启用 SSD 缓存、不同文件大小以及不同 IO 调度算法下的结果。最终的测试数据清晰地揭示了 Sheepdog 在不同配置下的性能天花板和瓶颈所在,为评估其是否适合特定业务负载(如虚拟机块存储)提供了直接的量化依据。

本机暂存
IT 开发者/ 2014-11-28 22:56:36 / 累计浏览 4,710

函数式编程

这篇讲的是函数式编程(FP)的核心理念与实用技术。作者从函数式编程的“长相”切入,首先梳理了它区别于命令式编程的三大特性:默认不可变的数据、可作为变量传递的函数,以及需要语言支持的尾递归优化。接着,文章重点剖析了几项关键技术,比如用map和reduce替代传统循环来处理集合数据,不仅代码更简洁易读,也更贴近问题的描述本身。pipeline、柯里化(currying)和高阶函数等技术则展示了如何通过组合简单函数来构建复杂逻辑。 文章并未停留在抽象概念,而是通过大量Python和C++代码示例进行了对比演示。例如,通过一个简单的计数器函数,直观展示了“不依赖也不修改外部状态,而是返回新值”这一FP准则。在Map & Reduce部分,作者对比了过程式的for循环与函数式写法在清晰度上的差异,并借助filter、reduce等函数演示了如何更优雅地解决如计算平均值这类实际问题。这种“描述要干什么,而不是怎么干”的风格,正是函数式编程提升代码可维护性的关键。 总的来说,这篇文章系统地拆解了函数式编程的思维模型与工具箱,并通过具体的语言实例阐明了其在提升代码简洁性、可读性以及并行友好性方面的优势,为理解这一编程范式提供了清晰的路径。

本机暂存
IT 后端/ 2014-11-28 22:54:02 / 累计浏览 4,211

OSI 七层模型和 TCP/IP 协议比较

这篇技术文章对比了网络通信中两个经典的模型:OSI七层模型和TCP/IP协议栈。作者首先分别拆解了OSI的物理层、数据链路层直至应用层的七层结构,以及每层对应的核心协议与设备,例如网络层的IP协议与路由器,传输层的TCP/UDP。随后,文章转向实际中更普遍的TCP/IP四层模型,解释了它如何将OSI的底下两层合并、并把会话层与表示层纳入应用层。 文章的核心在于剖析两者的根本差异:OSI是理论完备的通信标准,自上而下设计,强调严谨的服务质量;而TCP/IP则源于互联网实践,是自下而上为解决互联问题而生的实用协议族。这种出身区别导致了架构分野——OSI有七层,TCP/IP仅四层。文中指出,虽然OSI模型概念清晰,但因实现复杂且标准化早于实际需求,应用有限。相反,TCP/IP因其简洁、灵活且与UNIX系统早期的深度结合,最终成为互联网事实上的标准。 通篇来看,作者通过结构、设计哲学和适用场景的并列对比,清晰地勾勒出理论模型与实践协议之间的不同路径与选择。

本机暂存
IT 后端/ 2014-11-28 22:48:05 / 累计浏览 1,546

域名随机大小写导致libevent2的异步DNS解析失败

这篇文章深入剖析了libevent2内置异步DNS解析器的一个潜在陷阱。作者从实际遇到的DNS解析失败问题出发,指出根源在于libevent默认启用了“DNS-0x20 encoding”这种防投毒机制——它会将请求域名中的字母随机大小写化,但现实中的许多DNS服务器或中间网络设备(如ISP)并不严格遵守RFC规范,会在回复中将域名统一转为小写。这导致libevent在核对请求与响应域名时因大小写不匹配而判定解析失败。 作者通过抓包实验清晰地展示了这一过程,并深入libevent源码,定位到`global_randomize_case`开关及其导致严格字符串匹配的关键逻辑。文中还对比了Google Public DNS的做法:它也使用0x20 encoding,但通过引入白名单机制,仅对兼容的服务器启用,从而避免了全面故障。最后,作者向libevent社区提交了修改默认行为的补丁请求。这篇文章不仅讲清了一个技术故障的排查脉络,也揭示了理论标准与实际实现之间的常见鸿沟。

本机暂存
IT 设计/ 2014-11-28 22:43:16 / 累计浏览 2,648

解读眼动的12个误区

这篇讲的是眼动追踪技术在用户研究中的常见认知陷阱。作者从实际项目经验出发,揭示了12个典型误区,帮助从业者避免“踩坑”。 比如,很多人以为“眼动就是热区图和轨迹图”,但文章指出,脱离停留次数、时间范围和页面结构的热区图意义有限。同样,“眼动的红点就是用户看的确切位置”也不准确,因为采样率、头部移动和人眼的高清视觉区(中央窝)范围都会让数据产生偏差。文章特别强调,“眼动数据很容易解释”是一种错觉,它只能回答“看了什么”,却很难直接说明“为什么看”,需要结合其他方法挖掘根源。 作者还澄清了实践中的误解:眼动并非所有可用性测试的“万能药”,它更适合解答具体疑问;学会操作设备不等于能做好研究,设计、方法论和分析能力更重要;不能只靠看轨迹视频来分析,因为海量数据和记忆偏差会让结论失真。甚至,样本量也并非一成不变,要根据是比较组内差异还是组间差异来决定。 这篇文章的价值在于,它把漂亮的数据图表背后的限制因素和科学分析方法讲透了。它提醒我们,正确运用眼动技术,关键在于明确目标、理解其能力边界,并与深度访谈等方法结合,才能真正读懂用户行为背后的原因。

本机暂存
IT 前端/ 2014-11-28 22:41:33 / 累计浏览 2,137

关于html5本地存储

这篇文章聚焦于HTML5本地存储中的localStorage,以Chrome浏览器为例,深入揭示了其存储机制的细节。作者从存储位置入手,指出在Windows系统下,数据保存在%appdata%\Local\Google\Chrome\User Data\Default\Local Storage\目录中,并通过SQLite命令行工具演示了如何查看本地数据库——例如运行sqlite3命令查询ItemTable表,直观展示数据以键值对形式存储,如示例中的name|phpor。 文章还明确了localStorage的大小限制为5MB,这对于开发者规划前端存储策略具有实际参考价值。参考资料部分列出了多个技术博客链接,包括HTML5中国网、CSDN和ITeye上的相关文章,为读者提供了进一步探索的资源。整体上,这篇内容从实践角度出发,将抽象的HTML5存储概念转化为具体可操作的步骤,帮助开发者快速理解localStorage的底层实现和应用要点。

本机暂存
IT 后端/ 2014-11-28 22:39:58 / 累计浏览 1,769

FastDFS使用经验分享

这篇讲的是FastDFS在实际使用中遇到的两个痛点,并给出了经过验证的解决方案。第一个问题是文件下载时显示的哈希文件名对用户不友好。作者从存储机制分析,指出FastDFS本身不保留原始文件名,核心解决方法是结合应用数据库与Nginx:上传时记录FID与原始文件名,下载时在URL中通过`attname`参数携带原始文件名,再利用Nginx配置拦截该参数,写入响应头的`Content-Disposition`字段,从而让浏览器展示正确的文件名。 第二个经验是管理图片的多分辨率备份。作者利用了FastDFS的“主从文件”机制,即主文件与从文件仅在ID上有关联(从文件ID包含主文件ID),服务端并不维护其关系。通过先上传源图,再以指定主文件ID和后缀名上传缩略图,即可建立关联。文章特别提醒,这种关联是逻辑上的,删除主文件时需要应用层自行处理从文件的清理,避免资源孤立。 两篇分享都聚焦于FastDFS默认功能与实际业务需求之间的 gap,并提供了简单有效的工程化实现路径。

本机暂存
IT 移动开发/ 2014-11-28 22:35:09 / 累计浏览 5,896

什么是二维码?有什么用?

这篇讲的是我们每天都在用的二维码究竟是怎么回事。作者从QR码(Quick Response code)的起源切入,由日本Denso-Wave公司发明,它相比传统一维条码,优势在于能存储更大容量的数据、支持中英文混合编码,并且拥有强大的容错能力——即使部分污损也能被正确识别。 文章详细拆解了QR码的“身体构造”。它从一个由黑白方块组成的矩阵说起,解释了那些关键图形的作用:角落的三个“定位图案”用于确定二维码的位置和方向,“定位图形”和“校正图形”则保证了大尺寸二维码能被准确扫描。这些设计共同支撑了QR码360度任意角度读取的便利性。 接着,文章将生成一个二维码的过程梳理成清晰的步骤,包括确定数据类型(如数字、字母、汉字)进行编码,以及加入纠错码来提升鲁棒性。作者指出,QR码的尺寸(版本)从21x21的Version 1到177x177的Version 40共有40级,可以根据数据量灵活选择。 如果你对日常接触的这个黑白方块背后的原理感到好奇,这篇文章提供了一个系统且易于理解的技术视角。

本机暂存
IT 移动开发/ 2014-11-28 22:26:50 / 累计浏览 3,705

移动设备的用户行为数据如何追踪

这篇讲的是后PC时代,移动设备上追踪用户行为所面临的独特挑战和现有技术路径。作者从一个核心矛盾出发:我们既想沿用PC端的成熟方法,又不得不面对用户在手机、平板、电脑之间,在App和浏览器之间频繁切换的现实。 文章深入剖析了为解决“跨域”与“跨界”追踪难题所衍生的技术。比如,在App端,平台曾依赖Android_ID、IMEI等持久性设备标识,但因隐私争议,苹果已弃用UDID并转向开发者自建标识。在移动网页端,第三方Cookie的有效性因平台而异,Safari默认关闭它,迫使行业转向“数字指纹”或利用第一方Cookie配合IP等临时标识进行关联。 最棘手的部分在于如何打通App与移动网站这两个孤立的“沙盒”。文中详细说明了通过广告点击中的唯一URL参数进行映射的方法,但也点明了这些方案普遍受制于操作系统严格的隐私政策和技术限制。总的来说,这篇文章清晰地勾勒出了移动追踪的技术图景——它是一场在用户体验、数据准确性与隐私保护之间不断寻求平衡的复杂博弈。

本机暂存
IT 开发者/ 2014-11-28 22:25:12 / 累计浏览 1,960

对屌丝要抱有敬畏之心

这篇讲的是作者从亲身经历出发,对社会中努力奋斗的普通人应抱有敬畏之心的观点。文章通过两个故事展开:一个是去哪儿网在上市成为巨头前,其核心高管曾是一名在技术社区活跃的“屌丝”,却因追求被拒而错过缘分;另一个是作者目睹一位辛苦看守电瓶车停车场的收费员,凭借认真负责的态度,后来转型成为业绩出色的房产经纪人,收入远超作者。 作者借这两个“屌丝逆袭”的案例指出,在中国特别是互联网行业的大变迁时代,机遇无处不在。今天看似平凡甚至处于困境的人,明天就可能凭借努力创造出改变生活的产品,或获得更自由的人生选择。因此,他提出,无论你是正在奋斗中的普通人,还是已有所成者,都应对身边每一个认真、偏执的个体保持尊重与敬畏,因为他们蕴藏着不可小觑的潜力。

本机暂存
IT 安全/ 2014-11-28 22:20:10 / 累计浏览 3,815

如何获取用户访问过哪些网站

这篇文章探讨的是如何在用户不知情的情况下,间接推断其浏览器历史记录,这在分析用户习惯或竞品时很有价值。直接读取历史或通过Cookie获取是行不通的,但作者介绍了几个巧妙的“曲线救国”技术方案。 最经典的是利用CSS的 `:visited` 伪类。已访问链接默认为紫色,未访问为蓝色,通过JS检测这种颜色差异,理论上就能判断用户是否访问过特定网站。不过,由于隐私安全考量,Chrome、Safari等主流浏览器已修复此漏洞,目前该方案可能只在IE上仍有效。 另一个更前沿的思路来自2013年的黑客大会,利用HTML5的 `requestAnimationFrame` API进行“时间差攻击”。浏览器渲染已访问和未访问的链接时,从数据库查询URL是否存在会有微小的时间差异,通过高精度计时就有可能推断出访问历史。此外,文章还提到了一个未验证的思路:尝试请求网站的 `favicon.ico` 文件,通过缓存命中导致的响应时间差异来辅助判断。 这些方案从不同角度切入,共同揭示了浏览器在历史记录处理上存在的隐私泄露风险,也提醒开发者需持续关注相关安全更新。

本机暂存
IT 开发者/ 2014-11-28 22:18:43 / 累计浏览 1,646

Perl 中信号量不能创建的问题解决方法

这篇讲的是作者在多进程 Perl 程序中遇到的一个棘手问题。为了通过 P、V 操作控制 UUID 生成的唯一性,程序使用了共享内存信号量。起初运行正常,但后来创建信号量对象时总是失败,调用 `setall` 方法会报出“未定义值”的错误。 排查过程颇具启发性。作者使用 `strace` 追踪系统调用,最终在错误信息中发现了关键线索:“No space left on device”。这并非指磁盘空间,而是暗示操作系统级的信号量资源已经耗尽。通过 `ipcs -s` 命令查看,果然存在大量已创建的信号量数组。 问题的根源是系统资源限制被触及,导致新的信号量无法分配。解决方案也很直接:清理掉那些不再使用却占用资源的旧信号量。文章给出了一个非常实用的组合命令,可以一键列出并生成删除指令,快速恢复环境。 这种因资源耗尽导致的“奇怪”故障在系统编程中并不少见,作者从现象到根源的排查路径,以及使用 `strace` 和 `ipcs` 进行诊断的方法,值得参考。

本机暂存
IT 开发者/ 2014-11-28 22:17:50 / 累计浏览 4,775

职业素养:如何管理好你的上级

这篇讲的是,不少职场人习惯“向上管理”是领导的事,作者从一次与领导的谈话出发,反思了主动“管理上级”的重要性与方法。 文章认为,上下级是“代理商与厂家”的利益共同体,管理上级能直接提升工作效率与个人发展。针对常见的沟通猜疑、被动等待等问题,作者给出了几条很具体的建议。核心方法是“帮上级做决策”——不是简单汇报问题,而是带着分析、选项和明确的行动请求去沟通,让上级能像用“傻瓜相机”一样高效处理。同时要“尽量少打扰”,尊重上级的时间与情绪,避免让其感到意外。此外,把握上级的思维倾向(如控制型、人际型、行动型、概念型),用对方能接受的方式沟通,也能事半功倍。 文章还提醒,在产生分歧时应寻找共赢方案,避免“宁折不弯”。整体上,这并非教你操控上级,而是倡导建立基于信任与理解的协作关系,最终实现团队与个人的双赢。

本机暂存
IT DevOps/ 2014-11-28 22:15:21 / 累计浏览 2,742

误删大文件的一个可能解救办法

这篇讲的是作者在服务器上误删一个10GB大文件后,如何利用Linux文件系统特性紧急抢救的过程。 当时作者正在对镜像文件计算md5校验和,另一个窗口误操作执行了rm删除。好在大文件删除需要时间,作者迅速暂停了md5sum进程。关键点在于:Linux系统中,只要还有进程打开并占用着这个文件,即便已执行rm命令,文件数据也不会被立即清除。 通过查看被暂停进程(PID 30888)在/proc文件系统中的文件描述符,作者找到了那个指向“已删除”文件的链接(/proc/30888/fd/3)。最后用简单的cp命令,就成功将文件内容复制出来保存为save.img,完成了数据恢复。 文章还补充道,对于文本文件可以用grep尝试恢复,而exe、图片等二进制文件则可借助TestDisk、PhotoRec等专业工具。整个过程清晰地展示了Linux文件删除的底层逻辑和一个实用的应急技巧。

本机暂存
IT 数据库/ 2014-11-28 22:13:57 / 累计浏览 2,945

分布式全文检索系统SolrCloud简介

这篇文章讲解的是面向大规模搜索场景的分布式方案——SolrCloud。作者从Solr的部署演进讲起,指出单机和传统Master-Slaver方式的局限性,而SolrCloud基于Zookeeper实现了真正的分布式协同。 摘要重点突出了它的核心特性:集中式配置管理,让集群配置变更全局生效;自动容错与分片,单个节点故障不影响服务,并能自动重建副本;近实时搜索支持秒级数据可检索;查询时自动负载均衡,可通过横向扩展缓解压力。文章也提到了索引存储于HDFS、通过MapReduce批量建索引等高阶能力,以及强大的RESTful API和管理界面。 最后,文章对Collection、Shard、Replica等核心概念进行了阐释,帮助读者建立清晰模型。整体来看,这是一篇对SolrCloud分布式架构、关键技术点和适用场景的扎实入门介绍。

本机暂存
IT DevOps/ 2014-11-28 22:06:21 / 累计浏览 3,294

使用tar+lz4/pigz+ssh更快的数据传输

这篇讲的是,如何通过压缩管道来突破服务器间大文件传输的速度瓶颈。作者在之前优化SCP速度的基础上,进一步测试了结合不同压缩算法与SSH的方案。 核心对比了lz4与pigz这两种高速压缩工具。在“打包-压缩-传输-解压-拆包”这一完整流程中,解压速度是最大的性能短板。lz4虽然在压缩率上略逊于pigz,但其解压速度达到了惊人的264MB/s,是gunzip的三倍,这使它在需要即时解压的传输场景中成为关键。 实测结果显示,使用 `tar | lz4 -B4 | ssh` 的组合,传输速度从原始SCP的约40MB/s提升到了249MB/s。这意味着原本需要3小时的400GB数据迁移,现在仅需27分钟。文章不仅给出了最终可用的命令行方案,还分析了磁盘IO、网络带宽及管道开销等各环节的实际表现,并发现了调整lz4块大小(-B4)能对性能产生显著影响。对于运维和开发人员来说,这是一个非常实用且经过验证的加速技巧。

本机暂存
IT 安全/ 2014-11-28 12:47:39 / 累计浏览 2,700

如何安全的Include文件

这篇讲的是PHP开发中一个容易被忽略的陷阱:include外部文件时可能引发的变量污染问题。作者从一个看似简单的调试开关案例出发,揭示了配置文件中的临时变量如何悄悄覆盖主脚本的变量,导致程序行为异常——就像二战时阿登高地被绕过一样,安全之处往往藏着隐患。 文章指出,问题的根因在于include操作时文件内的变量直接进入了当前作用域。作者提供的解决方案很简洁:将include语句包裹在匿名函数中执行,利用函数创建独立的作用域。这种用call_user_func执行闭包来隔离变量作用域的做法,在JavaScript中很常见,但在PHP代码里却很少有人刻意运用。 对于日常编写PHP代码的开发者来说,这个技巧能有效避免因include文件带来的隐蔽bug,尤其在多文件协作或修改第三方配置文件时特别实用。作者通过这个具体场景提醒我们,那些“简单”的基础操作,恰恰需要多一分警惕。

本机暂存