IT技术博客大学习 共学习 共进步
首页 / 三江小渡
IT 2016-03-23 15:17:17 / 累计浏览 2,160

PHP empty和isset源码分析

作者从一个具体的PHP问题出发:`empty('00')` 到底返回 `true` 还是 `false`?他原本猜测 `empty()` 会将字符串 `'00'` 转换成数字进行判断,但觉得又不对。为了验证,他决定直接从源码一探究竟。 文章跟随作者的思路,首先发现 `empty()` 和 `isset()` 在操作码层面都调用了同一个函数 `ISSET_ISEMPTY_VAR`。顺藤摸瓜,最终定位到实际执行判断的核心函数是 `i_zend_is_true()`。 通过阅读这段精炼的源码,作者得出了明确的结论:`empty()` 在判断时并没有进行类型转换。对于字符串,它的判断逻辑非常直接——先检查字符串长度是否为0(即空字符串),若不是,则进一步检查是否长度为1且唯一字符为 `'0'`。只有这两种情况才会返回“空”(`true`),否则都返回非空(`false`)。 因此,对于 `'00'` 这样长度为2的字符串,它不满足上述任一条件,所以 `empty('00')` 的结果就是 `false`。而 `isset()` 则更简单,在变量未赋值时就直接返回了,根本不会走到这个判断逻辑。这个源码级的分析,清晰地解答了最初的那个疑问。

IT 2016-03-21 22:57:30 / 累计浏览 1,580

shell实现ssh自动登录

作者因为在Mac下没找到顺手的SSH客户端,干脆自己用expect写了一套自动登录方案。这篇分享的核心是一个名为`ssh_auto_login`的expect脚本,它能自动处理SSH连接中的密码验证,甚至支持通过通道机(跳板机)进行动态密码认证和内网服务器跳转,省去了手动输入的繁琐。 配合一个更上层的shell启动器脚本,作者实现了通过简单命令(如`./launcher 49`)快速连接不同服务器(如联通、电信线路或特定IP)的功能。整个方案无需复杂配置,特别适合需要频繁通过跳板机访问内网服务器的运维或开发场景。虽然脚本中的服务器IP和通道机逻辑是为特定环境编写的,但其处理SSH交互、动态密码匹配的核心思路清晰,稍作修改就能适配其他服务器。作者用这个实用小工具,演示了Shell脚本在自动化运维中解决具体痛点的灵活价值。

IT 2016-03-21 12:11:45 / 累计浏览 2,440

协同过滤 Collaborative Filtering

这篇从推荐系统的“长尾现象”切入,解释了协同过滤算法为何诞生以及它的核心价值:在有限展示空间里,帮用户发现自己可能感兴趣的小众内容,从而释放长尾的商业潜力。 作者首先点出协同过滤最基础的假设——“人有感兴趣的领域”,并由此推论出两条关键逻辑:同时被一个人喜欢的两个事物可能类型不同,而同时被很多人喜欢的两个事物则可能类型相同。基于此,文章逐步拆解了算法的数学模型:如何用余弦相似度量化物品关联度,如何通过加权降低热门物品的干扰,最终计算出用户对未接触内容的偏好预测值。 文章没有停留在理论,还坦诚讨论了算法的优缺点:它实现简单、适用性广、效果稳定,但也面临冷启动、数据稀疏等实际挑战,并指出需要针对具体业务进行二次过滤与优化。 整篇文章就像一位工程师在分享实践经验,从背景假设到公式推导,再到利弊分析,把一个经典算法讲得既清晰又接地气。对于想了解推荐系统入门逻辑的读者,这是一篇扎实的起点。

IT 2016-03-21 12:10:57 / 累计浏览 2,220

跳跃表

这篇讲的是从Redis底层实现引出的跳跃表数据结构。作者从结构图入手,说明它本质是多层链表的组合,底层S0存储有序数据,上层作为索引加速查找。查找时从顶层向下逐层扫描,插入时则通过随机概率P决定新节点能“跳”到多高,从而在期望O(logn)时间内完成操作。 文章展示了一组实验数据,对比了不同P值(如1/2、1/e)对平均操作时间、列高和跳跃次数的影响,直观体现了参数选择的权衡。最后,作者引用了Redis作者antirez的观点,点出跳跃表相比平衡树的核心优势:内存占用可控、对范围查询(ZRANGE)友好、实现与调试更简单。文末也补充说明,这种简单高效的特性使其同样适合算法竞赛场景。