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

最新文章

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

IT 后端/ 2014-11-19 23:07:06 / 累计浏览 3,511

分布式消息系统尝试(rabbitmq, celery, redis)

作者从统一游戏后台架构的需求出发,尝试使用Celery任务队列,并分别以RabbitMQ和Redis作为消息代理,来探索这套方案能否替代以前自研的C++ server通信模式。文章详细记录了在macOS下通过Homebrew安装RabbitMQ、启用其管理插件,并配置Redis和Celery的过程。 随后,作者通过一个简单的“加法”任务,对两种消息代理的性能进行了初步对比。在相同配置下,使用RabbitMQ时任务完成耗时约0.545秒,使用Redis时则约0.604秒。结果显示,在这个简单场景中两者的性能表现相近。 这篇文章为考虑引入任务队列的团队提供了一个具体的实践起点,展示了如何快速搭建并初步评估Celery+RabbitMQ或Celery+Redis这一组合。作者也指出,这只是初步测试,后续还需要对更多复杂场景和更高并发下的性能进行深入验证。

本机暂存
IT 设计/ 2014-11-19 23:04:31 / 累计浏览 5,051

《部落冲突》的设计

这篇讲的是,一位作者如何通过深入体验《部落冲突》,重新理解了手机游戏设计的精妙之处。作者从个人视角出发,拆解了这款全球流行游戏的设计逻辑。 文章首先对比了《部落冲突》与国内一些游戏的教学设计,指出其仅通过十几次点击的情景引导,就高效完成了初期教学并赋予玩家使命感,避免了冗长乏味的机械引导。作者特别分析了游戏对移动设备特性的深度适配:建造和升级需要真实等待时间,工人数量有限,这完美契合了用户碎片化的使用场景,促使玩家在一天中多次登录,收集资源。 核心的设计智慧体现在对生态的平衡上。游戏通过“奖杯”系统区分玩家等级,减少了高玩对新手的无意义碾压;被攻击后的保护机制与资源损失上限,则有效控制了挫败感,保护了玩家积极性。同时,部落系统引入了协作与对抗的社交维度,而付费点则被巧妙地融入游戏进程(如增加工人、加速),成为自然选择而非强行弹窗。 整体来看,作者揭示了《部落冲突》如何通过简洁教学、碎片化时间管理、多维度的平衡设计以及自然的付费引导,共同构建了一个吸引玩家长期沉浸并愿意付出的成功闭环,这对思考如何设计一款成功的移动游戏很有启发。

本机暂存
IT 前端/ 2014-11-19 23:01:54 / 累计浏览 1,933

jQuery 设置复选框选中状态的 BUG

这篇讲的是 jQuery 开发中一个容易被忽略的“坑”。作者从一个过去一直正常工作的全选/全不选功能代码突然失效说起——使用 `attr('checked')` 设置复选框状态,代码却只在第一次点击时生效,之后无论怎么点击都无效,让人非常困惑。 经过反复测试,作者发现问题出在 jQuery 版本兼容性上。在新版本中,`attr()` 方法对 `checked` 这类布尔属性的处理与浏览器原生属性不同步,导致状态无法被正确切换和识别。文章指出,正确的做法是使用 `prop('checked')` 来显式地设置 DOM 属性,或者采用更直接的原生 JS 遍历赋值,以确保所有 jQuery 版本都能兼容。 这个案例典型地揭示了 jQuery 早期版本中 `attr()` 和 `prop()` 在语义上的一个重要区别:前者侧重于 HTML 属性(attribute),后者侧重于 DOM 对象属性(property)。对于像 `checked`、`selected`、`disabled` 这类状态属性,直接操作 DOM 属性才是稳定可靠的方式。

本机暂存
IT 后端/ 2014-11-07 10:28:54 / 累计浏览 3,654

全平台大文件断点续传上传技术 ( 开源项目 Stream )

这篇讲的是一个名为Stream的开源项目,旨在解决全平台大文件断点续传上传的难题。背景是传统上传方案在不同浏览器中兼容性差,大文件传输时容易中断或失败。Stream的核心方案是同时支持HTML5和Flash两种上传方式,实现了跨域上传、多文件上传、断点续传和拖拽等新特性,兼容IE7+、Firefox 3.6+、Chrome、Safari4+等主流浏览器,为开发者提供了一个全功能的上传平台。 作者在Stream基础上,用Perl的Mojolicious框架实现了后端接口。这个后端采用异步流式处理,单进程就能高效处理多个上传请求,内存占用极低。配置方面,只需调整StreamUpload.conf文件中的端口、存储目录和跨域域名等参数,然后通过hypnotoad启动服务器即可运行。整个方案从兼容性到性能都经过优化,展示了一个实用且易于部署的大文件上传解决方案。

本机暂存
IT 前端/ 2014-11-07 00:08:43 / 累计浏览 1,794

js 面向对象日历实现原理详解

这篇教程拆解了如何用JavaScript手写一个动态日历组件。作者从实际开发需求出发,比如表单日期选择场景,提出了一个清晰的实现思路:只需解决两个关键问题——确定目标月份第一天是星期几,以及该月总天数。 基于Date对象的方法,这两个问题都能被优雅地解决。文章提供的核心代码展示了一个自包含的calendar对象,它封装了获取日期信息、渲染日历网格以及处理月份切换的逻辑。巧妙之处在于,通过动态生成HTML和简单的CSS高亮,就能实现今日标记和月份导航等基础交互功能。 整体来看,文章将万年历这一常见组件的原理讲得透彻且可操作。这种面向对象的实现方式也让代码结构清晰,便于根据业务需求扩展样式或功能。对于想理解DOM操作与日期API结合应用的前端学习者,这篇提供完整代码和在线演示的教程,是一个不错的实践起点。

本机暂存
IT 安全/ 2014-11-07 00:05:39 / 累计浏览 3,452

有趣的面试题

这篇讲的是几道经典的算法与逻辑面试题,每道题都藏着巧妙的思维切口。文章通过具体题目拆解,带你看清解题背后的逻辑链条。 例如“药物传递”题考察的是信息与权限的动态传递,通过两次上锁与解锁,利用C的行为规则完成了安全投递;而“25匹马竞速”题则是一个典型的算法优化问题,关键在于通过两轮筛选排除无关选项,将全局排序问题降维为局部竞争。软件公司人员比例题本质是集合运算,硬币游戏题依赖对称策略,切蛋糕题则抓住了“过中心点的直线平分面积”这一几何性质。 这些题目覆盖了逻辑推理、概率统计、算法设计与几何直观,没有炫技的公式堆砌,却处处体现着“把复杂问题分解为可操作步骤”的思维习惯。它们共同指向一个事实:好的技术面试题,往往不在知识的记忆量,而在面对模糊约束时构建解决方案的能力。

本机暂存
IT 后端/ 2014-11-07 00:03:24 / 累计浏览 2,257

Java泛型:类型檫除、模板和泛型传递

这篇讲的是Java泛型的核心机制与实用陷阱。作者从JDK 5引入泛型的背景出发,直指其“历史包袱”——为兼容旧版本而采用的**类型擦除**实现。这意味着编译后泛型信息会被抹除,导致许多反直觉的限制:比如无法创建泛型数组、静态变量不能使用类型参数,以及`List`无法直接赋值给`List`。 文章详细解释了通配符`?`及其上下界(`extends`/`super`)如何解决类型灵活性问题,并对比了Java泛型与C++模板的本质区别。通过实例分析,说明了编译器如何通过禁止某些操作来保障类型安全,避免运行时出现`ClassCastException`。 此外,文章梳理了引入泛型后Java类型系统新增的两个维度,并提及了“泛型传递”这一进阶用法。最后给出避免混用原始类型与泛型类等最佳实践,帮助开发者规避常见错误。整体是一篇从原理到实践、剖析Java泛型设计利弊的深度解析。

本机暂存
IT 后端/ 2014-11-07 00:00:46 / 累计浏览 2,867

在 Django/Flask 开发服务器上使用 HTTPS

这篇讲的是,如何在 Django 或 Flask 的开发服务器上,提前实现并测试 HTTPS 连接,而无需等待部署到生产环境。 作者指出,框架自带的开发服务器默认不支持 HTTPS,这给需要在本地验证加密通信的开发者带来了不便。为了解决这个问题,文章引入了 **stunnel** 这个外部工具。stunnel 的核心作用是充当一个“加密翻译”,它监听 HTTPS 请求(如443端口),解密后转发给实际运行的 Django/Flask 服务(如8000端口),再将响应加密返回,从而为开发服务器“套上”一个安全通道。 文章详细给出了实现步骤:首先在系统中安装 stunnel;其次,使用 OpenSSL 命令生成一个用于测试的自签名证书;然后,编写一个简单的 stunnel 配置文件,定义监听与转发的端口;最后,分别启动 stunnel 服务和 Django/Flask 开发服务器。值得注意的是,针对 Django 需要设置环境变量,而 Flask 则只需指定相同的监听端口即可。 整体方案简洁实用,它通过一个轻量的外部组件巧妙地绕过了开发服务器的限制,让开发者能在本地完整模拟 HTTPS 环境,方便调试 Cookie、重定向等与安全协议相关的问题。

本机暂存
IT DevOps/ 2014-11-06 23:59:43 / 累计浏览 1,624

Xen 虚拟机的 NAT 网络配置

这篇讲的是Xen虚拟机配置NAT网络的实用指南。当只有一台物理服务器且仅有一个公网IP,却需要运行多个虚拟机上网时,传统的桥接模式就显得无能为力了——它把每个虚拟机都直接暴露在外部网络。而NAT模式能完美解决这个问题,让多个虚拟机共享这个公网IP访问外部,同时外部无法主动访问它们,形成一个更安全的内部网络。 文章从桥接模式的局限性说起,清晰对比了NAT模式的适用场景。核心配置步骤其实不复杂,但有几个关键点:需要修改Xen的主配置文件(xend-config.sxp),将网络和VIF脚本切换到NAT和vif-nat;然后为每个虚拟机指定一个自定义的内部IP。一个巧妙之处在于,Xen自带的network-nat脚本已经自动处理了IP转发和iptables规则,省去了手动设置的麻烦。 作者特别强调了初始环境要“干净”,因为Xen的脚本在复杂网络环境下可能配置失败。整个配置流程逻辑清晰,从主机到虚拟机逐层设置,对需要隔离网络或节省公网资源的管理员来说,是一份很直接的操作参考。

本机暂存
IT 安全/ 2014-11-06 23:58:58 / 累计浏览 1,982

修改 Mac 的 MAC 地址

这篇讲的是如何通过修改 MAC 地址来应对特定的网络管理策略。作者从学校环境下下载资源时,IP 乃至物理网卡 MAC 地址被封禁的常见困境出发,引出了解决这一问题的核心方法:使用一行命令临时更换 Mac 的 Wi-Fi 接口 MAC 地址。文中具体介绍了通过 `ifconfig` 与 `openssl` 命令随机生成并应用新地址的操作,同时点明了苹果在 iOS 8 上引入 MAC 地址随机化功能,用于在公共 Wi-Fi 环境下保护用户隐私的背景。 该方案的巧妙之处在于其极简性与临时性——一行命令即可生效,且无需复杂设置;由于未写入启动项,系统重启后便自动恢复真实地址,这既满足了临时绕过限制的需求,也保证了系统日常使用的纯净与稳定。对于需要在外使用公共网络的用户,作者也顺带提醒了搭配 VPN 的安全建议。

本机暂存
IT 后端/ 2014-11-06 23:57:54 / 累计浏览 5,795

libcurl中使用curl_easy_getinfo 产生段错误分析

这篇文章从一个实际的开发案例出发,分享了在 libcurl 中使用 `curl_easy_getinfo` 函数时遇到的隐蔽陷阱。作者在编写 HSF 代理程序时发现,将 `CURLINFO_RESPONSE_CODE` 的返回值写入 `int` 类型变量会导致程序段错误,而使用 `long` 类型则一切正常。 问题的根源在于 `curl_easy_getinfo` 的实现采用了可变参数机制。库内部会按照 `long*` 类型来接收并写入数据,而编译器并不会检查调用者传入的指针类型是否匹配。在 64 位系统中,`long` 类型通常为 8 字节,`int` 为 4 字节,这导致函数调用时向较小的栈空间写入了过多数据,从而破坏了栈帧,引发了段错误。作者通过一段模拟代码清晰地复现并验证了这一过程。 文章的价值不仅在于指出了这个具体的 API 使用陷阱,更提醒开发者在面对 C 风格可变参数函数时需格外谨慎。类型声明的一字之差,在特定平台上可能演变成难以调试的内存破坏问题,这要求我们对底层数据模型和函数契约保持清晰的认知。

本机暂存
IT 后端/ 2014-11-06 23:55:43 / 累计浏览 2,019

如何让 PHP json_encode 函数不转义中文?

这篇讲的是如何让 PHP 的 json_encode 函数在处理中文时不再输出 `\uXXXX` 形式的转义码。 文章开头就指出了一个常见的恼人场景:直接调用 json_encode,中文字符会被转义成看似“乱码”的 Unicode 序列。作者澄清,这并非 JSON 标准的要求,标准是允许直接保留 Unicode 字符的。根因在于 PHP 的 json_encode 在早期版本默认开启了转义。 文章核心给出两种解决方案。对于 PHP 5.4.0 及以上版本,可以简单地通过添加 `JSON_UNESCAPED_UNICODE` 选项来禁用此行为,这是最便捷的方式。针对无法升级的环境,作者则分享了一个自定义的 `Util::json_encode` 函数实现。这个函数递归地处理字符串、数组和对象,其核心思路是:当值是字符串时,手动处理必要的转义(如反斜杠、换行符),并直接将其包裹在引号中返回,从而跳过对中文字符的 Unicode 编码。文章最后也坦诚地提到,这个自定义实现在处理复杂的关联数组判断时可能未覆盖所有边界情况,留给读者根据实际情况调整。

本机暂存
IT 移动开发/ 2014-11-06 23:51:46 / 累计浏览 2,155

中国移动网络下连接的秘密

网络工程师们常常争论 TCP 和 HTTP 哪个更可靠,这篇技术心得则拨开了这些迷思。作者从底层协议的本质出发,指出 TCP 是保证顺序与完整性的数据流,而 HTTP 作为其上的应用层协议,其“可靠感”更多源于请求-应答的临时连接模式。在移动网络环境下,这种特性与网络抖动结合,会显著放大延迟。 文章更深入地剖析了中国移动网络的特殊性:CMWAP/CMNET 的历史区分、各省各异的 WAP 网关,以及其作为 HTTP 代理对连接方式的限制。最后,作者聚焦于体验不佳的根源——受制于商业分割和硬件技术的“最后一公里”,并直言在此限制下,许多 CDN 加速方案的实际效果有限。 作者并非给出解决方案,而是基于实践,揭示了从协议层到运营商策略,再到物理接入的层层现实。理解这些“秘密”,才能对移动网络下的连接问题有更清醒的认知。

本机暂存
IT 后端/ 2014-10-21 19:44:15 / 累计浏览 3,679

JAVA多线程面试题

这篇文章系统梳理了Java多线程领域最常被问及的25个核心问题,堪称一份精炼的面试准备与知识巩固指南。 内容覆盖了从基础概念到底层原理的完整链条。开篇便厘清了进程与线程的根本区别,指出线程作为“轻量级进程”如何共享资源以提升效率。随后深入剖析了线程的创建方式(实现Runnable接口与继承Thread类)、生命周期状态(从New到Dead的流转),以及用户线程与守护线程的关键差异。 文章不仅止于理论,更聚焦于实战与调优。它详细解释了线程间通信的底层机制——为什么wait()、notify()等方法定义在Object类中且必须在同步块内调用,并对比了同步方法与同步块的性能影响。对于并发编程中的痛点,如线程安全,文章列举了同步、volatile、原子类等多种保障手段。关于死锁的分析、线程池的创建、以及ThreadLocal的用途,也都给出了清晰的定义与实用的指导。最后,文章还涉及了线程转储(Thread Dump)的获取与分析,为解决复杂并发问题提供了工具。 整体而言,这篇文章没有泛泛而谈,而是将每一个“为什么”和“怎么做”都讲得扎实具体,非常适合Java开发者用来查漏补缺,快速构建起关于多线程面试与实践的知识框架。

本机暂存
IT DevOps/ 2014-10-21 19:35:54 / 累计浏览 5,176

网络基础:路由表、默认网关和掩码等

这篇讲的是作者从一个具体的网络故障出发,剖析了路由表、子网掩码和默认网关的核心作用。问题很简单:两台服务器IP在同一子网,但其中一台的子网掩码被误配为255.255.255.224,这导致B在ping A时,根据错误的掩码计算,认为A不在本地网络,从而将数据包发给了网关。文章清晰地拆解了这一过程,说明了只要B端网关配置无效,通信就会失败。 作者接着将问题延伸,讲解了路由决策的通用原则。比如,当主机配备多网卡时,若为每个网关都设置了默认路由,系统在回包时可能因无法决策而随机选择路径,造成网络时断时通的诡异现象。对此,文章给出的实用解决方案是:要么为特定外部网络添加精确路由,要么去掉非主要出口网卡的默认网关配置,避免路由冲突。这些细节对于理解日常网络配置中的陷阱非常实用。

本机暂存
IT 开发者/ 2014-10-21 19:32:45 / 累计浏览 4,276

谈谈面试技巧

这篇文章从一位技术面试官的视角出发,分享了如何从面试细节中洞察结果,并高效考察候选人的软技能。 作者首先指出,面试者可以通过几个关键节点自我判断:是否进入最后一轮、是否被谈及薪资期望,以及最终面试官的直接反馈。例如,若面试官回避确定性答复或不谈薪,通常希望不大;反之,若对方直接表达认可或询问最快到岗时间,则是积极信号。 文章的重点在于面试官的考察方法。在终面阶段,作者通常会问几个精心设计的问题来评估为人:例如让候选人评价自己并列举优缺点,考察其自省能力;询问他人会如何评价自己,洞察其社交认知;以及通过“最感激与最厌恶的人”这类问题,测试其感恩之心与胸怀。这些提问并非寻求标准答案,而是观察候选人的反应与思考。 作者强调,面试不仅是技术考核,更是情商与软技巧的博弈。他建议从“眼光、胆魄、胸怀和忍耐”等维度设计问题,通过捕捉候选人的眼神、肢体语言等细节,能更全面地判断其综合素质。这篇文章提醒我们,高情商与良好的自我认知,在求职中往往与专业能力同等重要。

本机暂存
IT 前端/ 2014-10-15 23:01:00 / 累计浏览 2,070

基于jQuery的简易手风琴切换插件

作者在项目需要手风琴效果时,对比了几个现有jQuery插件,觉得它们相对笨重,于是自己动手写了一个更轻量、脉络清晰的版本。这篇讲的就是这个自制插件的实现思路和具体用法。 插件的核心思路很直接:将所有切换元素绝对定位在容器内,通过计算容器宽度与单个元素宽度的差值,动态分配每个元素的初始位置。当鼠标触发事件时,根据当前激活元素的索引,重新计算并动画所有元素的 left 值,从而实现展开收起的手风琴效果。 实现上考虑得比较周全。它支持通过参数配置鼠标事件类型(如mouseover或click)、默认展开项、动画间隔以及缓动函数(需配合jQuery.easing)。作者在代码中添加了详细注释,清晰说明了每个参数的作用和整体逻辑。 调用方式遵循标准jQuery插件模式,引入后只需一行代码即可启用。作者还提供了在线样例演示,帮助直观理解效果。这个插件适合那些需要轻量级手风琴交互,并且希望对实现细节有完全掌控的项目。

本机暂存
IT 前端/ 2014-10-15 22:56:44 / 累计浏览 1,948

关于Cookie长度的思考

这篇讲的是如何在有限的存储空间(比如浏览器的Cookie)里“挤”下更多信息。 作者从一个常见的问题出发:如何让存储的数据变得更小?文章没有停留在理论上,而是直接列举了我们熟悉的“key_len + key + value_len + value”这种存储格式作为分析起点。接着,作者给出了一系列非常具体的“瘦身”技巧:如果字段长度固定,对应的长度标识就能省掉;如果给字段编个号,字段名本身也能缩短;甚至可以完全依赖顺序来定位,连字段名和长度都能一并去除。 更巧妙的是处理变长数据和空值的思路。比如,用一个单独的“元字段”来标记哪些值是空的,从而省掉原本用于表示空值的长度字节。文章还提出了一个很实用的“默认值”策略:把频繁出现的值设为默认,不实际存储,仅用极少的位数(如2比特)来标识当前用的是哪个默认值。 所有这些优化背后有一个统一的原理:信息并没有丢失,而是巧妙地“藏”进了代码逻辑和预设规则之中。这篇文章就像一位经验丰富的工程师在分享他的存储空间优化心得,把看似简单的数据结构玩出了很多节省空间的花样。

本机暂存
IT 安全/ 2014-10-15 22:54:26 / 累计浏览 2,000

FakeID签名漏洞分析及利用(Google Bug 13678484)

这篇讲的是作者如何提前深入分析了一个影响安卓多年的签名漏洞(Google Bug 13678484)。在BlueBox于Blackhat大会前夕披露该漏洞后,作者随即进行了复现与利用研究。 文章的核心在于剖析漏洞的根因:安卓系统在校验APK签名证书链时存在缺陷,未能严格验证所有证书的合法性。攻击者可利用这一点,构造包含伪造根证书的恶意签名。尽管APK本身的完整性校验不会被破坏,但系统中依赖证书来验证身份(如WebKit插件认证)的机制会被欺骗。 作者通过具体的攻击场景演示了危害:成功将自研APK伪装成Adobe Flash Player插件,注入到其他应用的WebView中。更进一步,文章指出单纯注入还不够,需遵循插件开发规范(如导出特定Native接口)才能在对方进程内触发代码执行,从而真正突破沙箱限制。 这篇文章的价值在于,它不仅揭示了一个长期存在的底层安全问题,还完整地展示了从原理分析到漏洞利用的技术路径,对理解安卓签名机制的安全边界很有启发。

本机暂存
IT 前端/ 2014-10-15 22:50:19 / 累计浏览 2,302

javascript运算符

这篇讲的是JavaScript里运算符的“脾气”。它不只是简单列举了+、-、==、===这些符号,而是深入拆解了它们背后的规则和容易踩坑的地方。 文章把运算符按算术、比较、逻辑、赋值等用途分门别类,然后着重讲了几个关键点:比如“+”号面对字符串时,就从“加法”变成了“拼接”;而“==”和“===”的区别,直接关系到比较时会不会自动做类型转换。这些细节在日常编码里稍不注意就会埋雷。 它还特别点出了运算符的结合性顺序——比如“++”放在变量前后的不同效果,这在实际循环或表达式中非常实用。同时,对于除法可能产生浮点数、模运算对非数字的处理等边缘情况,也都给出了明确的规则说明。 整体来说,这篇文章适合想理清JavaScript基础语法、避免低级错误的开发者。它把枯燥的语法点结合实际执行行为来讲,读起来能帮你建立起对这些运算符更清晰、更可靠的心理模型。

本机暂存