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

最新文章

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

IT DevOps/ 2013-10-08 12:26:34 / 累计浏览 3,019

系统自动化配置和管理工具 SaltStack

作者从团队实际运维经验出发,对比了Puppet、Fabric与SaltStack这几款工具。他指出,Puppet擅长系统初始化和配置管理,而Fabric更适合执行批量临时任务,二者功能有别。但如果选择SaltStack,则可以统一覆盖两者功能,从而减轻工具链的复杂度和人力、时间成本。 文章重点介绍了SaltStack的核心优势:它采用ZeroMQ消息队列,通信速度远超Puppet/Chef;整个工具由Python编写,对Python技术栈的团队更友好,更接近其“能力圈”。它通过Salt Master(主控)和Salt Minion(受控)的架构进行集中管理与下发。 随后,文章详细演示了从安装到使用的关键步骤,包括在Ubuntu/CentOS上部署主控与客户端、建立信任关系,并通过命令行示例展示了如何快速执行远程命令。更重要的是,它展示了如何通过定义状态文件(.sls)来实现类似Puppet的配置管理功能,例如自动安装软件包(vim、Glances)并管理配置文件,真正实现了“一键式”的状态强制执行。 这种将配置管理与任务执行融合的“一专多能”工具选型思路,对需要简化技术栈的团队应该很有启发。

本机暂存
IT 后端/ 2013-10-08 12:24:52 / 累计浏览 2,527

PHP抽象静态方法

这篇文章分享了一个在PHP版本升级中遇到的典型兼容性问题。作者将程序从PHP 5.3升级到5.4后,遇到了“Static function Dataaccess::get() should not be abstract”的严格错误提示。 经过排查,根本原因在于从PHP 5.2版本开始,官方已经不允许在抽象类中使用`abstract static`同时修饰一个方法了,这种写法会导致E_STRICT级别的错误。文章指出,虽然不能在抽象类中这样定义,但我们依然可以使用接口来达成强制子类实现特定静态方法的目的。 作者随后给出了具体的解决方案:将原本定义在抽象类中的静态抽象方法,移至一个单独的接口(如`Iget`)中定义,然后让抽象类去实现该接口。通过这种方式,继承该抽象类的子类就依然必须实现接口中声明的静态方法,从而在语法规范的升级下,保证了原有的设计意图得以延续。

本机暂存
IT DevOps/ 2013-10-08 12:16:34 / 累计浏览 2,105

如何的退出无响应的 SSH 连接

这篇讲的是SSH连接卡死时的优雅退出方法。作者从日常工作中遇到的实际烦恼出发——离开电脑后,未退出的SSH会话常常悬在那里,既无法操作也无法中断,以往只能粗暴地关闭终端或手动寻找进程并终止。尤其对于没有图形界面的环境,这种重复性操作令人十分头疼。 文章的核心在于一个简单却鲜为人知的技巧:在无响应的SSH会话中,输入波浪符加句点(`~.`)即可立即断开连接。作者通过查阅`man ssh`手册确认了这一“转义字符”的功能,它被列为支持的断开连接命令。这个发现解决了长期困扰他的问题,提供了一种无需依赖窗口关闭或额外终端来杀进程的、直接且“优雅”的解决方案。 这个方法虽然基础,但对于经常使用SSH的开发者和运维人员来说非常实用,能有效节省时间并提升终端操作体验。

本机暂存
IT 安全/ 2013-10-08 12:15:24 / 累计浏览 2,886

防火墙的目标地址转换和源地址转换

作者从一起防火墙故障出发,探讨了目标地址转换与源地址转换的配置逻辑。故障表现为外网用户能成功发送请求到内网网站,却始终收不到响应。排查发现,根源在于内网服务器配置了两块同网段网卡且均设置了网关,导致返回数据包的源地址与请求进入时的目标地址不一致,防火墙因此无法将响应数据正确关联到原有会话。 要解决这一问题,需要理解防火墙的数据包处理流程。在常规的“外网访问内网”场景中,通常只需配置目标地址转换。但在上述网卡配置错误的特殊情况下,必须同时配置源地址转换,强制让内网服务器的返回流量经过防火墙,从而维持会话的对应关系。同样,当“内网通过域名访问另一内网服务器”时,源地址转换也是必需的,它避免了内网主机间直接通信导致防火墙无法跟踪连接状态的问题。 文章通过实例拆解了两种地址转换在不同场景下的必要性,核心在于确保返回数据包的路由路径能被防火墙正确识别和管理。作者最后指出,虽然具体防火墙机制各异,但基本原理相通:在规划地址转换时,必须考虑数据包返回的路径,否则可能导致通信失败或应用获取不到真实客户端IP。

本机暂存
IT 前端/ 2013-10-08 12:14:44 / 累计浏览 4,945

2014网易前端开发笔试题笔记

这篇讲的是作者2014年参加网易前端开发校招笔试的真实经历与考题回顾。文章从收到临时通知的匆忙赶场开始,生动还原了考场外的见闻:来自不同高校的考生、不少“霸笔”同学,以及外包给智联招聘的笔试组织形式。 核心部分聚焦于笔试本身。作者详细分享了两大板块的题目:第一部分是所有技术岗必考的计算机基础,涵盖文件组织、图遍历、无向图、可计算性、哈夫曼编码、死锁、数据库索引等经典问题,并附上了自己的解析。第二部分是前端开发专业题,题型包括不定项选择、填空、简答和编程题,重点考察JavaScript,例如要求手写闭包示例、阐述apply/call区别,并参照原型图实现交互页面。 除了考题,作者还观察到招聘可能存在学校偏好,并指出广州考生流动性较低的现象。整篇文章既是一次笔试的详细记录,也为后来者提供了宝贵的复习参考和实战视角。

本机暂存
IT 设计/ 2013-09-26 22:34:33 / 累计浏览 4,456

谁说设计师不会写代码?—Photoshop脚本语言简介

这篇文章探讨的是设计师工作流程中一种常被忽视的自动化利器:Photoshop脚本语言。作者从设计师普遍使用“动作”进行自动化出发,指出了动作像固定录像、缺乏灵活性的根本局限,进而引出脚本语言这一更具交互性的替代方案。 文章的核心在于澄清一个误区:脚本并非只有程序员才能驾驭。它明确指出,只要具备基础的JavaScript知识,设计师就能利用脚本实现更复杂、更智能的自动化,例如根据参数动态调整图像处理过程。文中以调整图像大小为例,清晰对比了动作步骤与对应脚本代码的写法,让技术门槛显得更为直观。 此外,文章还提供了扎实的入门指引,包括推荐使用Adobe ExtendedScript Toolkit作为编写工具、解释Photoshop对象模型(DOM)的基本结构,并指出脚本可像动作一样保存和绑定快捷键。整篇文章旨在为设计师打开一扇新窗,将原本重复枯燥的机械操作,转化为可通过代码灵活控制的创意流程。

本机暂存
IT 后端/ 2013-09-26 22:33:06 / 累计浏览 3,432

图片服务架构学习之ZIMG

这篇讲的是一个名为ZIMG的开源图片服务架构,作者从中小型网站面临的大流量、高并发和海量存储这三重压力出发,详细拆解了这套用C语言编写、追求极致性能的系统是如何设计的。 它的核心思路在于将图片服务完全独立,并把处理逻辑(基于libevhtp)、图片操作(基于ImageMagick)与存储(memcached+硬盘)整合在一个轻量级进程里,以减少组件间的开销。文章深入到了代码实现层面,揭示了几个巧妙之处:用图片的MD5哈希值作为全局唯一标识,避免了复杂的数据库查询;采用两级子目录(根据MD5前六位哈希)来组织存储,单机理论容量可达200TB;并且内置了智能的多级缓存策略,能快速响应热点图片的裁剪、变换等请求。同时,系统通过自动压缩图片(宣称可减少约67%体积)、尽可能在内存中完成操作来削减I/O,体现了其“用CPU换I/O”的优化哲学。 文章最后也指出,这种单机部署、高内聚的方案,在成本与性能之间做了务实权衡,特别适合需要快速搭建一个高效、自主可控图片服务的场景。

本机暂存
IT 开发者/ 2013-09-26 22:31:43 / 累计浏览 4,486

每个程序员都应该了解的知识有哪些?

这篇内容整理自Stack Overflow一个关于“网站上线前开发者需要考虑哪些关键技术细节”的高赞问答。作者以资深开发者的视角指出,许多像Jeff Atwood这样的技术专家也可能忽略基础要点,并系统梳理了从界面体验到安全防护的核心清单。 在界面与用户体验方面,文章强调了跨浏览器兼容测试的必要性,至少需覆盖Gecko、Webkit、IE和Opera等主流引擎。同时,需关注移动端与无障碍访问(如WAI和Section508标准)等非常规使用场景。作者还提醒注意用户交互的细节,比如避免显示明文邮箱、为用户添加的链接设置rel="nofollow"属性,以及实现POST后的重定向以防重复提交。 安全部分则重点引用了《OWASP开发指南》,详细列出了应对SQL注入、XSS、XSRF等常见攻击的方法。文中特别指出,必须对用户密码进行加盐哈希处理(推荐使用bcrypt或scrypt),并切勿自创认证系统。此外,使用SSL/HTTPS加密敏感页面、及时更新系统补丁等,都是必须坚守的底线。 这些知识点虽基础,却易被实际项目中的赶工心态所忽略。文章的价值在于提供了一份清晰的自查清单,帮助程序员在追求新功能的同时,巩固这些关乎产品可用性与安全性的根本防线。

本机暂存
IT 后端/ 2013-09-25 23:02:05 / 累计浏览 2,559

Go 语言简介(下)— 特性

这篇讲的是Go语言的核心并发特性。作者从通勤时间的利用切入,用一系列简洁的代码示例,带你快速上手Go中并发编程的四大金刚:goroutine、原子操作、Channel以及它们的安全性问题。 文章首先展示了如何用`go`关键字轻松启动goroutine,就像给函数调用加了“并发”开关。但真正的并发需要配置`runtime.GOMAXPROCS`。作者特意用一个经典的“卖票程序”作为例子,直观地演示了当多个goroutine同时修改全局变量时,若无保护,票数竟会变成负数。随后,他引出了解决并发数据竞争的两种核心武器:使用`sync.Mutex`互斥锁进行显式加锁,以及对于简单计数器使用`sync/atomic`包进行无锁的原子操作,后者通过一个期望结果为200的累加实验说明了其效率与正确性。 最后,文章聚焦于Go的通信哲学核心——Channel。通过示例代码,清晰地讲解了Channel如何充当goroutine间安全的通信管道,包括如何设置缓冲区大小,以及利用其默认的阻塞特性来协调收发双方的节奏,避免了直接共享内存带来的复杂锁问题。整篇文章用最简短的上下班时间,帮你建立起对Go并发模型从基础到实践的关键认知。

本机暂存
IT 后端/ 2013-09-25 23:00:25 / 累计浏览 2,857

Go 语言简介(上)— 语法

这篇讲的是Go语言入门语法,作者在一个宅家的周末里,决定以“通勤时间也能轻松读完”为目标,用大量代码和注释搭建了一份极简指南。如果你有C、Python或Unix基础,大约半小时就能对Go建立初步印象。 文章从经典的“Hello World”切入,迅速展示了Go运行与构建的两种方式。随后,核心语法点如静态类型变量声明(其 `:=` 简洁赋值借鉴了Pascal,却更现代)、常量、数组及其类似Python的切片操作被逐一铺陈。作者特别强调了Go控制流的“干净”:`if`/`switch`/`for` 语句均无需圆括号,且`switch`省略了`break`。这些设计让代码看起来更清爽。 更深入一些,文章介绍了Go的内置`map`类型——相比传统语言的哈希表,它的创建、读写和遍历语法都显得异常直观。此外,也提及了Go保留了指针功能。最后,一个有趣的细节是:Go实际上使用分号终结语句,但其词法分析器能根据简单规则自动插入,因此源代码中几乎无需手动输入。这些对比C、Python等语言的语法差异点,正是文章希望帮你快速抓住的Go语言“性格”。对于想快速了解Go独特风格的读者,这是一本带你快速上手的迷你语法手册。

本机暂存
IT 后端/ 2013-09-25 22:55:33 / 累计浏览 7,476

Storm:最火的流式处理框架

这篇讲的是Storm这个实时流处理框架为何能走红,以及它到底能解决什么问题。作者从Hadoop批处理延迟大的痛点切入,引出了Storm诞生的背景——专为低延迟的实时计算而生。文章拆解了Storm的核心卖点:它是一个分布式、高容错的系统,通过Topology(由Spout和Bolt构成)来处理数据流,并依赖Zookeeper进行状态管理,部署和横向扩展都相对简单。 摘要还梳理了Storm的实际应用情况,比如被淘宝、百度、Twitter等大公司用于实时用户画像分析或网站性能监控,以及它如何在迭代中加入Trident等新特性来解决重复计数等实际问题。最后,文章将Storm与Spark Streaming、HStreaming等竞争对手做了简单对比,并指出Storm虽然不是一个“开箱即用”的完整方案,但一旦解决好消息队列和状态管理等前置问题,其简单可扩展的架构优势就会显现出来。

本机暂存
IT 算法/ 2013-09-23 23:30:17 / 累计浏览 1,614

电子商务互联网营销:ROI的罪与罚(下)

这篇讲的是电商流量评估中一个常见困境:那些ROI表现很差的门户流量,真的就一无是处吗?作者从一个萦绕多年的“模糊性”问题出发,回顾了流量评估方法的演进。传统只看ROI或CPA的单一维度评估,常常让我们陷入两难——比如“新浪”频道的ROI很差,但你又无法彻底砍掉它。 文章的核心洞察在于,流量的价值应放在整个营销漏斗中去衡量。作者提出,除了ROI,还必须引入“Engagement(参与度)”这个维度,比如页面浏览量、停留时间、跳出率等。通过一个将ROI与Engagement结合的气泡图,可以清晰看到:有些流量虽然直接转化差(ROI低),但Engagement很高(如天涯社区、新浪汽车频道),这说明它们可能在营销流程的早期阶段(如品牌认知)发挥了重要价值。新老访客比例的数据也印证了这一点。 然而,单纯知道它“有价值”还不够。文章进一步探讨了流量渠道间的相互作用,试图揭示“助攻流量”与“得分流量”之间的关系,并引入了归因模型(Attribution Modeling)来深挖这些相互影响。这实际上是在推动我们从孤立地评判单个渠道,转向理解整个渠道生态系统是如何协同工作的。对电商营销者而言,这意味着需要一套更复杂、更多维的评估体系,来真正看清每个流量的真实贡献。

本机暂存
IT 算法/ 2013-09-23 23:26:11 / 累计浏览 1,567

电子商务互联网营销:ROI的罪与罚(上)

这篇讲的是电商营销中ROI(投资回报率)这个KPI背后的复杂性与常见误区。作者从自身在行业演讲中遇到的从业者困惑出发,指出一个核心矛盾:老板或市场普遍追求高ROI,但这可能反而限制了业务增长,因为越追求精准流量,规模就越难放大。 文章通过微观经济学中的成本-收入曲线模型,清晰拆解了ROI的“安全线”如何动态变化。它指出,ROI的底线并非固定数值,而是取决于生意的成本结构——例如,当产品与运营成本占比高达90%时,即便ROI达到2.3:1也仍需外部输血才能存活。而如果有外部投资支持,企业可以承受更低的ROI来换取规模。 最终,作者提出了超越单纯ROI考核的三种增长途径:降低流量成本(难度最大)、提高转化率(直接影响ROI)和提升客单价(相对容易但需权衡)。文章引导读者回归商业本质,思考不同发展阶段下,到底应该看重销售额、毛利还是ROI,而非盲目追逐数字本身。

本机暂存
IT DevOps/ 2013-09-23 23:16:43 / 累计浏览 3,539

深入理解 GRE tunnel

这篇讲的是 GRE 隧道,作者从一个常见误区出发:很多人以为 GRE 和 SIT、IPIP 一样是端到端的隧道,其实根本不是。核心差异在于,GRE 隧道不是建立在通信的主机上,而是建立在中间的路由器上,这对端点主机完全透明。 文章通过对比 SIT 隧道(包在出入口主机封装解封)和 GRE 隧道(由路由器负责封装解封)的原理图,清晰揭示了这一关键设计。这种设计让 GRE 解决了 IPIP 无法处理的多播等问题。随后,作者深入 Linux 内核,剖析了 GRE 隧道的实现:发送时路由将包导向隧道设备,内核添加外部 IP 头;接收时内核先识别 GRE 协议,交给 `ipgre_rcv()` 函数剥去外层头,再像普通 IP 包一样处理。 理解 GRE 是中间节点而非端点的特性,是掌握其工作原理和应用场景的关键。这篇文章从原理到内核实现,把这一点讲透了。

本机暂存
IT DevOps/ 2013-09-23 23:11:31 / 累计浏览 5,146

让进程在后台可靠运行的几种方法

这篇讲的是如何在 SSH 断开或终端关闭后,让进程继续可靠运行的经典方法。文章从一个常见痛点出发:在远程执行耗时任务时,网络波动或误关终端会导致任务中断。作者围绕如何规避 HUP(挂断)信号,对比了多种解决方案。 核心方法包括:最常用的 `nohup`,让进程忽略 HUP 信号;使用 `setsid` 或 `(cmd &)` subshell 技巧,让进程在新会话中运行,从而脱离原终端。文章特别指出了一个关键差异:`nohup` 启动的进程父进程仍是原终端,而 `setsid` 启动的进程父进程会变为 init(PID=1),从根源上隔绝了信号影响。 对于已经提交的任务,文章也介绍了补救措施:通过 `Ctrl-Z` 挂起、`bg` 后台运行,最后用 `disown` 命令将其移出作业表,使其不再受 HUP 信号影响。这些方法各有简单的操作示例,非常适合临时任务或未预先规划的场景。 总的来说,文章系统梳理了从预防到补救的完整工具链,帮助你在不同情境下灵活选择,确保关键进程不会意外中断。

本机暂存
IT DevOps/ 2013-09-23 23:10:39 / 累计浏览 2,498

DRBD远程实时双机热备系统配置完全手册

这篇文章详细记录了作者重新搭建并配置DRBD远程实时双机热备系统的全过程。出发点很简单:几年前配过的环境已无法使用,于是决定完整走一遍流程,并将每一步骤记录分享。 内容以两台虚拟机为基础环境,从安装Linux系统、配置网络,到添加虚拟硬盘并分区作为镜像源,再到DRBD软件的安装与关键的配置文件(drbd.conf)编写,形成了一个清晰的操作链条。作者不仅给出了具体命令和系统输出,还穿插了如提前创建虚拟机快照等实用经验提示。 整个过程不空谈原理,而是通过一个实际可复现的案例,展示了如何构建一个数据实时同步的节点对。对于想了解或动手实践DRBD部署的读者,这篇手册提供了一个从零开始、步骤完整的配置蓝图,能够帮助读者快速建立对DRBD基础部署流程的认知。

本机暂存
IT 后端/ 2013-09-23 23:09:27 / 累计浏览 5,618

Netty和Jetty的Java NIO 网络框架模型分析

这篇深度对比了 Netty 与 Jetty 这两个流行 Java 网络框架的底层 NIO 模型。作者从两者处理新连接请求的入口设计切入,揭示了它们截然不同的实现思路。 Netty 采用了专门的 Acceptor Reactor(由 Boss 线程负责),它只专注于监听和接收新的连接。一旦连接建立,便会根据连接序号对事件分离器(默认数量为 CPU 核心数的两倍)取模,将其分配给对应的 NioWorker 线程进行后续的读写监听。这种模型将“接收”与“处理”显式分离,但要求耗时操作必须异步提交,否则会阻塞整个事件循环。 相比之下,Jetty 的设计更接近经典的半同步/半异步模式。它在一个线程中通过同步的 `accept()` 方法阻塞等待新连接,就绪后生成变更事件注册到多路分离器,同样采用轮询策略分配负载。其代码结构往往被认为更直观。 作者最后提出了一个值得深思的问题:Netty 这种为“接收”单独设立线程池的方式,是否更利于处理短连接场景;而 Jetty 同步等待的传统模式,是否对长连接(如 HTTP)更友好?这背后的性能差异,还需要更精细的并发测试来验证。

本机暂存
IT 算法/ 2013-09-23 23:08:03 / 累计浏览 2,514

大整数乘法

这篇讲的是大整数乘法的经典实现思路与代码实践。作者用一个整形链表来存储大整数的每一位,核心计算部分通过两层循环遍历乘数与被乘数,将每对数字的乘积累加到结果链表的对应位置上,并通过一个递归辅助函数处理进位。 实现的亮点在于对基本数据结构的运用:自定义的BigInt结构体包含了数值、指针和符号位,通过重载运算符(如乘法、输入输出流)让操作更直观。不过作者也坦诚地指出了代码的几处“非典型”设计:乘法运算返回指针而非对象,递归计算存在栈溢出风险,以及指针管理上不够严谨。这些反思本身也是很有价值的经验点。 从代码片段可以看到具体的实现细节,比如如何构建数字链表、处理进位和负号。整体上,这是一次从零开始构建大整数运算的扎实尝试,既展示了基本算法,也揭示了手动管理内存时需要面对的复杂性。

本机暂存
IT 后端/ 2013-09-23 23:06:25 / 累计浏览 4,479

Jetty线程“互锁”导致数据传输性能降低问题分析

这篇讲的是在Jetty 7.2.1这个特定版本中,一个会导致数据传输性能降低的“互锁”问题。作者从Jetty经典的NIO异步反映器模型入手,分析了主线程(selector)与子线程(工作线程)之间的一种微妙配合失误。 问题的核心在于,当子线程遭遇网络拥塞、缓冲区写满时,它会进入阻塞状态并向主线程注册一个内部事件,等待拥塞解除的通知。然而,主线程的select循环在等待selector的网络事件时,可能并未及时轮询和处理这些内部事件,导致子线程无法被唤醒,形成“互锁”,拖累了整体性能。 文章通过拆解具体的代码逻辑,清晰地展示了这种线程间交互的瓶颈点。最终,作者指出了相应的解决或规避思路,比如合理设置超时参数,以帮助开发者在类似场景下优化配置,避免性能陷阱。

本机暂存
IT 前端/ 2013-09-23 13:56:16 / 累计浏览 2,687

通过WebRTC获取摄像头影像

这篇技术文章讲的是如何利用 WebRTC API 在网页中调用摄像头并实现一键截图。作者从基础的 video 标签搭建开始,引出了核心的 `navigator.getUserMedia` 接口,并特别指出了它在当时浏览器环境下的兼容性现实:Chrome 和 Firefox 需要加前缀,移动端支持不佳。 文章的核心实现思路清晰:通过 `getUserMedia` 请求摄像头权限,成功后拿到视频流,再通过 `window.URL.createObjectURL` 将流媒体转换为 URL 填入 video 标签播放。截图功能则依赖 canvas 的 `drawImage` 方法,把视频当前帧“画”上去。作者贴心地给出了处理浏览器差异的兼容代码,并分享了一个实战中遇到的“坑”:在 Firefox 中无法通过常规事件可靠获取视频尺寸,最终采用 `setTimeout` 轮询的变通方案来绑定截图按钮。 除了核心步骤,文章末尾还补充了几个有价值的细节,比如同一浏览器不同标签页可以共享摄像头,但不同浏览器不行;以及推荐将截图上传至服务器再提供下载,而非在本地强制保存。整体上,这是一份对前端开发者来说相当直接、步骤明确的实践指南。

本机暂存