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

最新文章

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

IT 后端/ 2014-04-07 22:35:21 / 累计浏览 9,504

抓取网页内容生成Kindle电子书

这篇讲的是如何把那些只能在线浏览的网页内容,变成可以在Kindle上随时随地阅读的电子书。作者从一个常见的痛点出发——Kindle虽好,但网上大量优质的在线文档、技术书籍却无法离线阅读。 文章的核心方案是借助开源的电子书管理工具Calibre。它提供的`ebook-convert`命令和`recipes`机制是关键:用户只需编写一个Python类脚本(即recipes),定义好抓取规则,就能自动将网页内容转换为mobi或epub格式。作者以《Git Pocket Guide》为例,详细演示了如何分析网页结构、编写`parse_index`方法来解析目录并组织章节内容,甚至自动处理图片。实现思路清晰,通过继承`BasicNewsRecipe`类并实现一个核心方法,就能完成定制化抓取,非常巧妙。 最终生成的电子书在Kindle上拥有完整的目录和图文排版,效果很好。作者还把自己的多个recipes整理在GitHub上供社区使用,让这套方法更具实用价值。

本机暂存
IT 移动开发/ 2014-04-07 22:30:04 / 累计浏览 2,411

免费应用的精益分析

这篇文章从移动应用(尤其是游戏)复杂的变现模式出发,深入探讨了如何通过精益分析来理解业务。不同于简单的付费下载,通过内购、广告等组合方式盈利的模式,需要一套更精细的指标体系来导航。 作者系统梳理了开发者应关注的核心指标,从源头的下载量、应用商店位置,到关键的用户获取成本、打开率、活跃用户占比,再到最终的付费用户比例、每用户平均收益(ARPU)和用户生命周期价值(CLV)。文章特别强调了应用商店推荐(专题)的巨大推力,并以具体数据说明了其对排名和收益的显著提升。 分析中举了一个虚拟游戏的例子:月下载12300次,ARPU为3.2美元,月流失率15%,由此可算出用户生命周期约6.67个月,单个用户终身价值约21美元。这清晰地展示了如何将基础数据串联起来,计算投放回报、预估收入,从而做出更明智的决策。 最终,文章指向了一个平衡的艺术:开发者不能只盯着短期收益而设计“抢钱”机制,必须让游戏体验、参与度与付费设计协同,才能在避免用户流失的同时,实现长期、健康的增长。

本机暂存
IT 开发者/ 2014-04-07 22:27:39 / 累计浏览 2,625

解密Google的流量来源字符串

这篇讲的是如何通过分析Google流量来源字符串中的“ved”参数,来破解被隐藏的搜索流量细节。面对Google安全搜索导致超过75%的关键词显示为“未提供”这一困境,作者从Google跳转URL的尾参入手,发现“ved”参数是一个关键突破口。 文章具体拆解了“ved”参数的编码规则:它由三段信息组成,分别标识了搜索结果所属的通用搜索垂直类别(如标准网页、Google新闻缩略图)、在该类别内的相对位置,以及在整体结果页中的绝对位置。例如,代码“QFJ”代表普通网页结果,而“QqQIw”则指向新闻聚合模块。通过这些编码,站长终于能区分流量究竟是来自常规网页搜索、图片结果还是新闻推荐。 基于此发现,作者提供了一套在Google Analytics中创建新配置文件与高级过滤器的详细方案,旨在自动提取这些参数,从而将模糊的“自然搜索流量”细分归因。文章为破解GA关键词“not provided”难题提供了一条极具操作性的技术路径,将原本黑箱的数据转化为可分析的流量来源图谱。

本机暂存
IT 安全/ 2014-04-07 22:24:29 / 累计浏览 2,420

抽奖类活动项目的一些技术Tips

这篇文章分享了设计高并发抽奖活动系统时,如何通过关键技术点来抵御刷奖风险、保障活动稳定性的实战经验。 作者从互联网抽奖活动常面临专业刷奖团伙的真实背景出发,系统性地提出了五层防护建议。核心思路是保持系统简单可靠:接入层用缓存(如Redis)限制IP和用户抽奖频率,避免直接冲击数据库;代码层采用最简单的算法做初筛,将最终发奖逻辑下沉至数据库层;数据层则采用“每日奖池”模式,强调使用有符号整型并利用事务与行锁(如 FOR UPDATE)确保奖品数量扣减的准确与并发安全。 此外,文章还给出了非常务实的运营建议,比如选择白天发放奖品、细化每个时间点的投放量,以及保留充足的活动规则解释空间。整体来看,这套从接入、逻辑、数据到测试的完整实践,对保障线上抽奖类活动的健壮性与公平性具有很高的参考价值,能帮助开发者避免很多“坑”。

本机暂存
IT 移动开发/ 2014-04-07 22:21:19 / 累计浏览 3,474

关于Feed流信息的加载方式

作者从微信使用中的几个具体场景出发,讨论了信息流产品在加载新内容时的交互设计问题。比如在刷朋友圈、看长文或浏览群聊记录时,中断后返回,往往需要反复查找上次阅读位置,体验不够顺畅。 文章将问题提炼为:对于Feed流内容,新内容该如何加载?并以新浪微博和Twitter作为对比案例。Twitter的做法是,加载新内容后页面会停留在加载线,用明确标记告知用户上次的位置,继续下拉即可自然阅读新内容。而新浪微博则会在下拉时自动将旧内容顶下去,用户需要来回滚动才能衔接上阅读进度,交互路径相对割裂。 作者认为Twitter的交互更自然连贯,阅读成本更低。通过这一具体功能的对比,文章揭示了内容流产品中一个容易被忽略但直接影响用户体验的细节设计。

本机暂存
IT 算法/ 2014-04-07 22:19:00 / 累计浏览 2,175

趣题:用 k × 1 的矩形覆盖 n × n 的正方形棋盘

这篇讲的是一个有趣的棋盘覆盖问题:用 k×1 的小矩形去铺满 n×n 的大棋盘,如果无法完全盖住,那么总有一种方案能使得剩余的空格数 m(n, k) 达到最少。文章的核心结论是,这个最小的剩余格子数,无论 n 和 k 取何值,永远是一个完全平方数。 作者从问题的直观定义出发,首先处理了 n k/2,作者则展示了一种更精巧的“风车式”填充策略,可以使得最终只留下一个边长为 k-r 的小正方形空白,此时 m(n, k) = (k-r)²。由于 r 和 k-r 互为补数,在这两种情况下,m(n, k) 的表达式都自然形成了一个平方数。 整个证明过程中,作者引入了一个在棋盘格子上按对角线循环填数的技巧,直观地解释了为什么当空白区域边长不超过 k/2 时,该覆盖方案已达到最优。这个数学谜题最终指向了一个简洁而普适的结论,展现了离散几何中一种精妙的优化与对称性。

本机暂存
IT 移动开发/ 2014-04-07 22:18:26 / 累计浏览 2,093

巨头们的理想生意

这篇讲的是BAT在移动互联网时代的布局逻辑。作者敏锐地指出,移动互联网并非桌面的简单延伸,它动摇了巨头们过去“躺着赚钱”的高毛利模式——百度依赖的信息流广告、腾讯的游戏、阿里本质上的“卖水”模式,都面临迁移困境。文章将巨头们所有的投资收购行动,都归结于一个核心焦虑:如何在移动端找到下一个高毛利业务。 作者用了一个生动的比喻,“卖白粉的很难有卖白菜的手感”,来解释为何BAT始终做不好零售电商这类低毛利苦活。真正的转机被聚焦在支付领域。因为支付虽利薄,却直通金融这一公认的高毛利行业。于是,微信红包点燃了支付战火,双方在打车软件、地图导航等高频场景的激烈投资,本质上都是对支付入口和用户数据的争夺。 文章进一步指出,这种依赖资本运作的“结构化”竞争,一方面为创业者提供了退出或背靠大树的选择,减少了“巨头抄你怎么办”的恐惧;但另一方面,也使得颠覆性的代际更替变得困难,互联网格局趋于固化。作者最终留下一个值得玩味的循环:巨头们会持续投资试探,直到找到自己的“白粉”,届时便可能亲自下场,历史就此循环。

本机暂存
IT 后端/ 2014-03-20 23:08:58 / 累计浏览 6,798

微信二维码登录的原理

这篇文章讲的是微信PC端二维码登录背后的实现机制。它从用户视角出发,解析了扫描二维码时实际发生的交互过程。 文章首先指出,微信PC端登录时会生成一个唯一UID并绘制为二维码。当用户用手机微信扫描后,这个UID会与手机端的身份令牌(token)绑定并上传服务器。接着,网页端会通过JavaScript发起持续的轮询请求,查询该UID的登录状态。 其中,文章展示了具体的轮询代码逻辑:网页每500毫秒请求一次服务器。根据返回的状态码决定下一步——例如,返回201表示已成功获取授权,而408则表示超时需要重试。这种基于轮询的异步验证机制,巧妙解决了跨设备状态同步的问题。 作者最后还提到,这种二维码授权模式在其他场景也有应用,比如手机控制智能电视盒。整篇文章通过代码和流程解析,将看似简单的扫码登录背后的“生成-绑定-轮询-验证”链路清晰地呈现出来,帮助读者理解其安全性和可靠性的技术基础。

本机暂存
IT DevOps/ 2014-03-20 23:06:07 / 累计浏览 4,304

web业务尽快升级到centos 6.4的理由

这篇讲的是,面对中国网络环境复杂、丢包率高的现实挑战,Web业务尤其是CDN系统如何通过升级操作系统来获得更优的网络性能。作者从CentOS 6.4的内核变化出发,重点剖析了几个关键的TCP协议层补丁。 其中,RFC2988bis补丁将SYN包丢失后的重试时间从默认的3秒大幅缩短至1秒,显著降低了首次连接的延迟。而调整初始拥塞窗口(initcwnd)和接收窗口(initrwnd)大小,则减少了Web短连接场景下必要的TCP交互轮次,提升了数据传输效率,文章也给出了具体的配置命令。此外,Proportional rate reduction补丁优化了丢包后的恢复策略,使得拥塞窗口的减少更为平滑,降低了平均传输延迟。 这些补丁主要源自Google的实践,能够直接提升业务在弱网环境下的响应速度和稳定性。对于运维和后端开发人员而言,这是一次了解底层网络优化如何落地到具体操作系统版本的实用参考。

本机暂存
IT DevOps/ 2014-03-20 23:05:36 / 累计浏览 4,296

linux单机根据ip查看流量

这篇讲的是在双线机房环境下,如何精确统计Linux单机上不同IP(如电信、网通)的独立流量。作者从实际运维痛点出发:一台机器绑定多个IP时,系统默认的流量监控工具无法区分各IP的收发数据量。通过调研无果后,他选择用SystemTap编写了一个内核级脚本,直接挂钩TCP的收发函数来按IP累加数据包大小。脚本运行后能清晰列出每个IP的接收与发送千比特数。作者也坦诚说明,该方案目前仅支持TCP流量统计,若服务器涉及UDP服务则数据不准,且SystemTap需要安装调试信息包。整体方案简洁实用,为类似场景提供了一个可直接复用的轻量级诊断思路。

本机暂存
IT 后端/ 2014-03-20 23:04:14 / 累计浏览 7,929

python实现一个P2P文件发布

这篇讲的是一个实用的运维效率提升方案。作者面对服务器规模增长后文件分发变慢的痛点,没有继续优化传统的单点推送,而是转向了分布式思路,基于Python的libtorrent库实现了一个轻量的P2P文件发布工具。 核心思路是利用BT协议让已接收文件的机器同时作为源进行分享,从而将下载压力分散到整个网络。文章附上了完整的工具代码,展示了如何创建种子、设置监听与限速、管理做种时间等关键环节。作者进行了真实环境的测试:将一个240MB的内核文件分发给10个机房、70多台服务器,在源端限速2MB/s的情况下,全部传输完成仅需约140秒。这个效率对比传统的单点分发有了质的飞跃。 通过这个案例,可以看到即使是经典的P2P技术,在特定场景下依然能巧妙地解决现代运维中的规模化部署难题。工具已开源,对于需要频繁进行大规模文件同步的团队来说,具有很高的实用参考价值。

本机暂存
IT DevOps/ 2014-03-20 23:03:09 / 累计浏览 4,180

SSH日常用法小例

这篇讲的是如何将SSH从“会用”提升到“用得顺手”。作者从最基础的命令行登录出发,逐步展示了如何通过配置文件别名、公钥认证和代理转发等一系列技巧,一步步把繁琐的登录过程简化到极致——最终实现“一次配置,处处免密”。 文章特别对比了传统密码登录与公钥认证在便利性上的巨大差异。对于文件传输,作者不仅介绍了最常用的scp命令,并解释了-r和-C参数的作用,还推荐了sftp这个基于SSH的交互式工具,为不同场景提供了解决方案。其中,ssh -A代理转发用于跳板机的思路也很有启发性。 作者用实际例子告诉我们,掌握这些小技巧,能让你在连接和管理多台服务器时,省去大量重复输入密码的时间,大幅提升日常工作效率。对于需要频繁远程操作的开发者和运维人员来说,这是一份非常实用的快速参考。

本机暂存
IT 后端/ 2014-03-20 23:02:05 / 累计浏览 2,918

底层通讯协议问题排查案例

这篇讲的是作者在处理用户技术支持时,亲历的一系列底层网络通讯协议“踩坑”与排查实录。这些案例看似离奇,根因却往往藏在协议栈的深处或网络环境的微妙配置中。 文章详细拆解了五个典型案例:包括NAT环境下TCP时间戳机制导致的连接失败、ISP篡改MTU引发的UDP丢包、中间网络设备异常引起的MSS分片问题、TCP动态窗口无法增长导致的速率极低,以及网卡速率协商错误造成的单向慢传输。每个案例都从具体现象出发,通过抓包分析等手段定位到根本原因,并给出了如调整内核参数(tcp_timestamps、tcp_window_scaling)、修改MSS值、检查网卡状态等明确的解决方法。 这不仅是一份实用的故障排查手册,更像是一份网络协议在复杂生产环境中行为特性的观察笔记。作者将枯燥的协议规范(如RFC1323、MTU)与鲜活的一线问题结合,展示了如何从表象层层深挖至协议与环境的交互点。对于需要处理类似网络疑难杂症的开发者或运维人员,文中从现象推导到根因的排查思路,以及那些意想不到的解决方案,都提供了直接的参考和启发。

本机暂存
IT DevOps/ 2014-03-20 23:00:07 / 累计浏览 2,466

大量小包的CPU密集型系统调优案例一则

这是一篇典型的方案/架构类文章,作者从一个处理大量小数据包的生产系统调优实践出发,详细分享了将单网卡流量从100M提升至230M(预估可达480M)且CPU负载保持均衡的完整优化路径。 核心方案围绕着“硬件选型与内核调优”展开。作者首先强调了必须使用支持MSI-X和多队列的网卡,这是性能提升的硬件基础。在软件层面,他将操作系统从RHEL 5升级至RHEL 6.1,以利用其内核对Google RPS/RFS补丁的支持,从而将软中断负载均衡到多个CPU核心。此外,文章还详细说明了如何手动关闭irqbalance服务,并通过设置smp_affinity将网卡队列中断精确绑定到指定CPU,以实现更精细的负载控制。对于发送方向,作者也提到了利用内核2.6.38引入的XPS特性进行优化。 整个调优过程有很强的数据支撑,作者展示了调优后单网卡承载15万/秒数据包、系统负载为0且各CPU核心均保有余量的生产环境截图,并解释了因网卡队列数与CPU数不匹配时,为何不能简单将中断广播到所有CPU,而需要采用物理/固定模式进行一对一绑定。文章为类似网游、CDN等“小包量大”的场景提供了一套可落地的系统性能挖掘手册。

本机暂存
IT 后端/ 2014-03-20 22:58:48 / 累计浏览 2,067

分地区访问解决方案

这篇讲的是如何通过部署Nginx反向代理,来实现高效、精确的网站分地区内容访问。文章开篇直击痛点:传统的动态页面或DNS劫持方案,要么资源消耗大,要么因用户使用第三方DNS而误判率高。作者提出,在Web服务器前加一层Nginx负载均衡器是更优选择。 具体方案利用了Nginx的GeoIP模块。配置的核心是定义一个`geo`映射表,将不同的客户端IP段(如192.168.70.64/26)映射到特定变量值(如“cnc”)。接着,通过`upstream`为每个变量值定义一组后端服务器。当请求到达时,Nginx会根据来源IP自动选择对应的变量,并将请求代理到相应的后端服务器组,实现了透明的流量分流。 文章强调了该方案的最大优点:判断精确,且对后端应用完全无侵入。同时,也客观指出了代价——需要额外的代理服务器,且单台Nginx的并发处理能力存在上限(文中实测可达4.5万/秒)。因此,作者在文末建议,在生产环境部署前,务必使用LoadRunner等工具进行全面的压力与功能测试,确保方案稳定可靠。

本机暂存
IT 设计/ 2014-03-20 22:56:50 / 累计浏览 2,739

Python修饰器的函数式编程

这篇文章从Python装饰器的英文名“Decorator”切入,厘清了它与面向对象设计模式中的装饰器模式以及Java/C#注解的本质区别。作者指出,OO的装饰器模式往往陷入复杂的类层次,而Python的装饰器则是一种优雅的函数式编程技巧,它直接利用了语言层面的高阶函数和闭包,无需引入额外的复杂概念。 文章从一个经典的“Hello World”示例出发,展示了装饰器如何通过闭包和函数回调实现功能增强。接着,它深入解析了`@decorator`语法糖的实质:`func = decorator(func)`,这是一个函数作为参数传入另一个函数并被其返回值替换的过程。理解了这一点,无论是多层装饰器嵌套还是带参数的装饰器(需要返回一个真正的装饰器函数),都变得清晰自然。文中那个用装饰器为字符串添加HTML标签的例子,很好地体现了这种技巧的简洁与灵活。 最后,文章还提到了用类来实现装饰器的方式,通过`__init__`和`__call__`方法来完成同样的功能。整篇文章将Python装饰器从语法糖还原为函数编程的基本范式,帮助读者理解其“描述意图而非实现过程”的优雅本质。

本机暂存
IT 后端/ 2014-03-19 23:21:27 / 累计浏览 3,051

在tomcat应用中获得原始IP

这篇讲的是如何在使用 Apache/Nginx 作为反向代理的 Tomcat 应用中,重新获取被代理层“吃掉”的客户端原始信息。作者从实际场景出发,指出 Apache 代理后,Tomcat 得不到客户端的真实 IP、主机名和是 HTTP 还是 HTTPS 协议,这会给生成绝对重定向 URL 和页面资源链接带来麻烦。 文章的核心方案分两步:先在 Apache 端配置,通过 `ProxyPreserveHost` 转发原始 Host 头,并添加 `X-Forwarded-Proto` 等自定义头部来传递协议等信息。然后,在 Tomcat 端配置 `RemoteIpValve`,让它能智能地“读懂”并应用这些从代理转发过来的头部,从而在 `HttpServletRequest` 中还原出真实的客户端信息。 文章还贴心地附上了测试用的 Servlet 代码和对比结果。测试表明,配置完成后,无论前端是 HTTP 还是 HTTPS 访问,Tomcat 都能正确获取到原始 IP 和协议类型。这套组合配置为解决代理环境下的应用逻辑判断提供了清晰有效的路径。

本机暂存
IT DevOps/ 2014-03-19 23:04:03 / 累计浏览 3,886

linux下cp,mv进行动态库覆盖问题分析

这篇讲的是一个生产环境中典型的“隐形地雷”:明明只是想更新一个动态库文件(.so),为什么用 cp 命令覆盖后,正在运行的程序就莫名崩溃了?作者从一次周会讨论的问题出发,抽丝剥茧地分析了这个现象的深层原因。 文章先厘清了 Linux 文件系统的两个关键概念:inode 存储文件元数据,dentry 建立文件名到 inode 的映射。核心分析由此展开:cp 和 mv 操作对正在被进程使用的文件影响截然不同。cp 命令本质是“打开目标文件并截断,然后写入新数据”,这个截断操作会通知内核释放该文件在内存中的所有页面映射。当程序再次执行到该库的代码时,会触发缺页中断,但因为原文件数据块已失效,内核无法正确填充内存,于是导致总线错误(bus error)或段错误(segment fault)。相比之下,mv 命令仅仅是重命名操作,只改变了目录项(dentry)的指向,并未影响文件本身(inode)及其内存映射,因此是安全的。 文章通过 strace 跟踪和进程内存映射的视角,清晰展示了故障现场。结论很明确:对于已被进程动态链接的库文件,在线更新的正确姿势是 mv(将新文件重命名为原名),而不是 cp。

本机暂存
IT 安全/ 2014-03-19 23:03:04 / 累计浏览 13,139

自建DNS以防止GFW干扰

这篇讲的是如何通过自建本地DNS服务器,来规避GFW对DNS查询的干扰,从而恢复部分网站的访问。文章首先解释了问题根源:GFW会拦截并污染常见的UDP协议DNS请求,导致解析结果错误。而一个有效的对策是利用TCP协议的DNS查询,因为它目前不易被干扰。 作者推荐的具体方案是,使用开源软件Unbound在本地搭建一个DNS服务器。该服务器监听本地,接收程序发出的UDP请求,并将其转换为TCP查询转发给上游公共DNS(如8.8.8.8),从而绕过污染。文章给出了在Windows系统上的详细配置步骤,包括安装、修改配置文件、重启服务,并最终将系统DNS指向本地127.0.0.1,操作性很强。 对于更进一步的安全需求,文章末尾还提到了一个升级思路:可以结合SSL加密,在境外服务器上部署Unbound作为上游,实现查询流量的端到端加密,提供了更彻底的解决方案。

本机暂存
IT 后端/ 2014-03-19 23:01:03 / 累计浏览 2,958

IO不再神秘

这篇讲的是IO编程的核心模型。作者从高可用服务器设计和Node.js的流行切入,旨在厘清经常被混淆的IO概念。 文章系统梳理了四种IO模型:同步阻塞、同步非阻塞、基于就绪事件的异步非阻塞,以及基于完成事件的异步非阻塞。作者详细解释了每种模型的工作原理、上下文切换开销,以及在不同连接场景下的性能表现,比如同步阻塞模型在长连接高并发下易导致线程资源耗尽。 除了模型对比,文章还深入到操作系统层面,对比了Linux的epoll、BSD的kqueue、Windows的IOCP等不同实现机制,并着重讲解了Reactor模式这一主流NIO设计范式的核心组件与流程。最后,文章提及了Java NIO/NIO2对这些模型的抽象与支持。 整体而言,文章将理论模型、操作系统实现与设计模式串联起来,清晰地描绘了IO从阻塞到非阻塞、从同步到异步的演进逻辑,有助于理解高性能网络编程的底层基石。

本机暂存