IT技术博客大学习 共学习 共进步
首页 / Becomin' Charles
IT 2019-06-28 13:25:29 / 累计浏览 1,780

Linux 运维:系统服务管理

这篇讲的是Linux服务器运维中那些令人头疼的“重复学习”时刻——系统服务管理的方式总是随着技术演进而变迁。作者从自己给老款MacBook Pro安装Ubuntu 19.04桌面版出发,先吐槽了新版apt命令依然不够顺手,并演示了如何用aptitude替换掉默认的vim-tiny、补装net-tools这些桌面版缺失的基础工具。 文章的重点其实落在CentOS的服务管理上。作者并排展示了两种新老方式的实操命令:一边是逐渐被淘汰的SysV风格,用`chkconfig`查看、关闭或删除服务;另一边是主流的systemd,通过`systemctl`来列出、禁用服务状态。他甚至演示了如何暴力删除阿里云相关服务的残留文件,再用`reset-failed`清理干净——这恰恰是运维中常遇到的“清理战场”场景。 如果你正被服务器上那些幽灵般的服务困扰,或者面对不同发行版时对管理命令感到混乱,这篇文章给出的对比和具体步骤,就像一份可以直接“照着做”的速查手册。它不空谈理论,而是把折腾的过程和关键命令直接摊开,对实际排障很有参考价值。

IT 2019-03-28 22:28:54 / 累计浏览 2,640

重要的事情说三遍:ARQ协议

这篇讲的是作者从一个实际的网络难题出发,引出了ARQ(自动重传请求)协议这一关键概念。他家里的阿里云服务在公司访问异常,最后通过在家庭服务器和云服务器间建立可靠的“隧道”解决了问题,而这条隧道的核心就是ARQ。 文章随后像剥洋葱一样,清晰地解释了ARQ的精髓:它本质是一种在不可靠网络上实现可靠传输的错误控制策略,核心在于“确认”与“超时”机制,就像重要的事情没听清就要再说一遍。作者不仅给出了定义,更生动地对比了三种主流实现策略:最基础但低效的“停止并等待”、TCP所采用的“后退N帧”,以及更智能高效的“选择性重发”,把它们各自的原理和优劣讲得明明白白。 理解ARQ,不仅有助于我们看懂日常使用的TCP/IP协议背后的机制,也为在复杂网络环境下设计可靠的服务提供了思路。

IT 2017-03-01 23:18:42 / 累计浏览 2,120

[PHP 最佳实践]如何处理用户的密码

这篇讲的是 PHP 开发中处理用户密码的安全演进路径。文章从近年来频发的“拖库”事件切入,点明密码作为最隐私的数据,绝不能抱有侥幸心理。它直接指出了许多初级开发者的误区——仅满足于使用 MD5 等简单散列算法,并生动解释了这些算法为何“不及格”:它们本质上是单向散列而非加密,且容易被黑客利用预计算的彩虹表或字典暴力破解。 文章的核心在于层层递进地揭示更安全的做法。它强调了加“盐”(随机字符串)的必要性,即为每个用户的密码在散列前拼接独特随机值,大幅增加字典攻击的难度。但即便如此,面对当今高性能计算机每秒数十亿次的计算能力,传统的 MD5/SHA 系列算法仍显脆弱。 因此,作者引出了专门为密码存储设计的 bcrypt 算法,其计算成本极高,暴力破解速度被限制在每秒几千次,安全性呈指数级提升。文章不仅讲清楚了原理,还提供了直接可用的 PHP 内置函数(如 `password_hash` 和 `password_verify`)示例,并进一步推荐了 Yii 2 框架中更完善的安全组件封装。最终目的是帮助开发者建立从原理到实践的正确密码处理观念,而不仅仅是停留在“知道不能存明文”的层面。

IT 2017-03-01 23:17:44 / 累计浏览 2,820

部署 HSTS 提升网站安全性

这篇讲的是通过部署 HSTS(HTTP 严格传输安全)协议来强制浏览器使用 HTTPS 加密连接,从而避免用户首次访问时因 HTTP 跳转而产生的安全风险。作者指出,尽管许多网站已提供 HTTPS 服务,但用户习惯于输入域名,浏览器默认发起 HTTP 请求。这个跳转的瞬间,攻击者可能实施中间人攻击。HSTS 通过服务器在响应头中下发指令,让浏览器记住该域名必须使用 HTTPS,后续访问会直接发起安全连接。 文章详细拆解了开启 HSTS 的三个关键参数:必填的 `max-age` 定义了指令的有效时长(如一年),设置过短会增加暴露风险,过长则可能影响网站故障时的降级处理;可选的 `includeSubdomains` 将策略扩展到所有子域名,但需确保所有子站均已支持 HTTPS;`preload` 则更进一步,将域名预置入浏览器核心列表,实现首次访问即安全,但这也意味着极高的变更代价。 作者提醒,HSTS 依赖客户端行为,配置需谨慎。好消息是,如今各大浏览器已广泛支持,且免费 SSL 证书获取便捷,实施 HSTS 的门槛已大大降低,是提升整体互联网安全环境的有效手段。

IT 2017-03-01 23:14:25 / 累计浏览 2,180

MAMP Pro 里面自带的 PHP 命令行执行特别慢的问题

这篇讲的是作者在 Mac 上使用 MAMP Pro 开发环境时遇到的一个颇为古怪的问题:升级系统后,命令行执行 PHP 命令会异常缓慢。作者尝试用 dtruss(Mac 下的系统调用追踪工具)进行调试,但未能定位到具体卡顿点。 经过查阅资料,发现问题根源在于某些 PHP 调用会触发不必要的 DNS 查询,导致执行延迟。最终的解决方案出人意料地简单:在 Mac 的 hosts 文件中,为自己的计算机名添加了本地解析条目。具体操作是,在 `127.0.0.1` 和 `::1`(IPv6)后添加形如 `YourComputer.local` 的主机名(主机名需在系统偏好设置的“共享”面板中查看)。设置完成后,PHP 命令行的执行速度恢复正常,可谓“药到病除”。 文章通过作者亲身实践的调试过程与最终验证的解决方案,为遇到类似 MAMP Pro 环境下命令行迟钝问题的开发者,提供了一个清晰且可直接操作的排查思路和修复方法。

IT 2015-11-08 22:07:36 / 累计浏览 3,220

git术语解释staging,index,cache

这篇讲的是Git里三个让人头疼的术语:staging、index和cache。作者从自己的困惑出发——为什么《Pro Git》里叫staging area,`git-reset`的文档里叫index,而`git-rm`的参数却是`-cached`?这三个词到底是不是一回事? 文章追溯了问题的根源,发现这其实是Linus Torvalds当年的“一念之差”。在开发Git初期,为了管理Linux内核的补丁,他设计了一个“目录缓存”来保存完整的目录树快照。这个缓存的内容结构,在源码里被存储在一个叫`index`的文件中。因此,在Git的底层实现(源码)里,操作这个缓冲区的变量都带着“cache”前缀;而“index”这个名字则因为它作为文件直观地出现在了`.git`目录里。 随着时间推移,普通用户更多通过文档而非源码接触Git,“index”成为了更通用的称呼。而“cache”一词则逐渐退居幕后,仅在讨论内部实现时使用,其过去分词“cached”则作为一个形容词保留下来,用于描述“已通过`git add`放入暂存区”的状态。通过引用git核心维护者Junio C Hamano的解释,文章理清了这三个术语的历史脉络和细微差别,帮你理解为什么同一个东西会有这么多名字。

IT 2015-11-02 23:00:11 / 累计浏览 3,460

SVN为什么比git更好

这篇文章的作者个人偏爱Git,但他从团队实际出发,提出了一个反向思考:在什么情况下,SVN可能是比Git更“好”的选择? 作者以一家拥有约20名程序员、使用多种语言的创业公司为背景,坦率地分析了SVN的优势。它拥有广泛的群众基础,几乎所有人都能快速上手;跨平台支持优异,尤其以Windows下的TortoiseSVN著称;核心优点是简单易用,甚至能被误用作“云端文件夹”也未引发大问题;经过十五年打磨,其功能完善且流程稳定,非常适合传统的公司制研发团队管理。 相对地,作者指出Git的主要短板在于高昂的学习成本(尤其对新人和非核心技术人员),对Windows平台支持不佳,其分布式概念和存储原理构成了一定的抽象门槛,并且过高的自由度容易因误操作给团队带来混乱。 结论是,对于研发规模中等偏上、人员背景多样的创业公司而言,如果团队协作并不涉及高频次的跨地域开源协作,SVN在降低团队协作摩擦和上手成本方面,可能是一个更务实、更稳妥的选择。

IT 2015-11-02 22:55:06 / 累计浏览 3,160

不应该用public static function来改善系统的抽象层次

这篇讲的是PHP开发中一个常见的抽象误区。作者观察到,很多团队为了复用代码和分层,会抽出所谓的Service层,但实现上却大量使用public static function。作者直言这种做法很糟糕——因为public static function本质上就是全局函数,而滥用全局函数是编程中的反模式。 文章的核心观点是,虽然抽象Service层本身没错,但用静态方法来实现,往往导致“抽象能力停留在函数级别”。作者用了一个生动的比喻:这就像破窗户理论,一旦有人开了滥用全局函数的头,代码就会迅速腐化,最终整个系统充斥着相互调用的全局函数,变得难以维护。他强调,全局函数和全局变量是需要极力避免的,而不是被当作抽象的工具去增加。 作者最终呼吁,要实现真正的分层抽象,不应依赖public static function,而应采用更合理的架构设计,来约束依赖和作用域,从而避免系统在团队协作中走向失控。

IT 2014-12-01 23:46:59 / 累计浏览 4,260

& * # 这三个是什么符号?

这篇讲的是,很多国内程序员都习惯用中文叫那些常见符号——“and符”、“星号”、“井号”,但在国际技术交流中,它们却有另一个名字。作者从一次听国外公开课“彻底懵了”的经历出发,点出了这个细微却影响交流的认知差异。 文章核心就在于“翻译”这三个符号在技术语境下的真正发音和背景:& 其实是 ampersand,它的含义就是“and”;* 的名字是 asterisk,常见于表示脚注;而 # 的英文名是 hash,在英语中既可以表示数字序号(如地址#18),在美国还用作重量单位“磅”(如2# sugar,约两斤糖)。 这篇文章提醒我们,在阅读英文技术文档、观看国际公开课时,理解这些符号的“本名”非常关键。它不光是一个冷知识,更是帮助我们流畅获取一手技术信息的一个小钥匙。

IT 2014-11-27 12:59:32 / 累计浏览 3,700

服务器运维:怎样优雅地切割log

这篇讲的是如何优雅地处理服务器日志切割的问题。作者从运维人员常遇到的困境出发,先吐槽了手动移动日志文件的粗暴方式及其风险,接着介绍了写空日志的改良方法,最终引出真正的解决方案——专用的logrotate工具。 文章的核心在于,它不仅推荐了工具,更结合实际生产环境给出了配置思路。作者指出,简单的每日切割在高流量场景下会暴露新问题,比如压缩大量日志时可能瞬间占满CPU,影响服务响应。因此,他提出了一系列具体的优化建议:预估日志产生量、规划存储周期、谨慎评估是否压缩,并在必须压缩时,可以使用taskset和nice指令来分配CPU资源,避免影响业务进程。此外,针对单日志文件过大的情况,文章也提出了按大小或按小时切割的策略。 整篇文章用平实的语言,将日志管理从“能用”提升到了“好用且稳健”的层面,给出了从工具选择到参数调优的完整思考路径。

IT 2013-10-29 23:01:45 / 累计浏览 24,320

Bash的模式和配置文件加载

这篇讲的是Bash启动时如何加载配置文件的“冷知识”,作者坦言自己早年也一知半解,于是从`man`手册出发,把这个绕人的机制捋清楚了。核心在于理解运行中的Bash有两种“模式”:交互式(是否直接与终端对话)和登录式(是否作为用户登录会话的起点)。两者独立组合,决定了启动时加载哪些文件。 文章清晰列出了加载路径:登录Shell会依次尝试`/etc/profile`、`~/.bash_profile`等;而交互式非登录Shell则主要加载`~/.bashrc`。这些规则直接解释了日常中的两个典型困惑:为什么在`crontab`里配置的环境变量常常不生效?因为非交互、非登录的Shell压根不会加载这些配置文件。同样,为什么在Mac终端里修改`~/.bashrc`没反应?因为它的终端默认启动的是登录Shell(`$0`以`-`开头),本应配置`~/.bash_profile`,而不像某些Linux发行版那样在`~/.profile`里隐式地加载了`~/.bashrc`。 搞清楚这个加载逻辑,就能精准定位Shell脚本的环境问题,无论是定时任务还是跨平台开发。作者用亲身踩坑的例子把这份“手册知识”讲得生动实用,帮读者建立起正确的心智模型。

IT 2013-07-28 15:51:11 / 累计浏览 5,880

Bash如何取得当前正在执行的脚本的绝对路径?

这篇讲的是Shell脚本中一个看似简单却容易掉坑里的问题:如何可靠地获取当前执行脚本的绝对路径。 作者从实际开发中经常需要使用脚本自身路径的场景出发,重点澄清了两种广为流传但并不正确的“常见误区”。一个是直接使用 `pwd` 命令,它只能获取当前的工作目录,与脚本所在位置无关;另一个是过度依赖特殊变量 `$0`,它的值会随 bash 的调用方式而变化,不一定就是脚本的绝对路径。 文章的核心价值在于对比和辨析。它详细解释了为什么这些方法会失效,并给出了一个经过验证的正确解决方案:`basepath=$(cd \`dirname $0\`; pwd)`。这个方案通过组合 `dirname` 和 `cd` 再加上 `pwd`,巧妙地规避了 `$0` 可能不完整的问题,确保无论从哪个目录调用脚本,都能稳定地返回脚本自身所在的绝对路径。对于编写需要灵活部署、不依赖用户预配置的工具脚本来说,这个技巧非常实用。

IT 2013-07-26 13:25:46 / 累计浏览 4,260

服务器监控软件Zabbix初窥

这篇讲的是作者从工作中对服务器监控系统的兴趣出发,初次探索了开源监控软件Zabbix的体验。Zabbix始创于2001年,使用C语言和PHP开发,以GPL v2开源发布,经过十多年积累已形成成熟的解决方案。 作者详细描述了安装过程:从SourceForge下载源码包,按照官方Wiki配置后直接make install,整个过程出乎意料地简单顺畅,比以往编译其他软件轻松得多。前端安装也不复杂,类似WordPress的配置。文章接着解析了Zabbix的核心概念:通过host group分组管理主机,定义item监控属性(如CPU、内存、网络流量),设置trigger触发规则(例如CPU超过90%报警),并基于events触发通知,支持邮件、短信、微信等多种方式,逻辑严密且功能全面。 在对比层面,作者将Zabbix与所在公司的内部

IT 2013-05-01 22:51:09 / 累计浏览 4,520

Ubuntu中apt-get列出的软件包前面的字母标识含义

在 Ubuntu 服务器上管理软件包时,`apt-get` 或 `aptitude` 命令输出的每一行开头,常常带着让人有点困惑的字母代码。这篇文章的核心,就是把这些看似随意的标识一一解码,让你能“读懂”系统在告诉你什么。 它把标识拆解成两个位置来说明。第一个字母代表软件包当前的状态:比如 `i` 表示已安装,`c` 表示包已删除但残留了配置文件,而 `v` 则指明这是一个虚拟软件包。第二个字母则预告了即将对它执行的动作,例如 `i` 代表即将安装,`d` 代表即将删除。 搞清楚这些简码,相当于掌握了和 Ubuntu 包管理器直接对话的密钥。下次再运行相关命令时,你就能立刻从输出信息中把握住每个软件包的准确状况和系统预定操作,让日常的维护与排障工作变得更高效、更清晰。

IT 2013-03-03 22:40:27 / 累计浏览 4,960

什么是NAT

这篇讲的是NAT——网络地址转换,一个为解决IPv4地址不够用而生的核心网络技术。作者从一个“理想很丰满,现实很骨感”的个人学习故事切入,用了一个“小马哥管公司”的生动类比,把地址稀缺和分级管理的逻辑讲得挺明白。 文章直接点出了NAT要解决的关键矛盾:公网地址有限,但内网设备(比如家里、公司里的电脑)需要上网通信。解决方案是划出几个特定的私有IP地址段(如192.168.x.x),允许内网重复使用,然后由NAT设备(通常集成在路由器里)来“翻译”地址。当内网设备要访问公网时,路由器会把它数据包的源地址,悄悄换成自己拥有的那个唯一的公网IP地址。 更深入一层,文章还解释了NAT如何利用TCP/UDP的端口号,来区分同一内网下不同设备发出的数据流。它通过维护一张“内网IP+端口”到“公网IP+虚拟端口”的映射表,确保返回的数据能准确送回原来的那台设备。这种对协议现有字段的巧妙复用,让NAT在不改变底层IP协议的情况下,打通了内外网的通信桥梁。 总的来说,作者用接地气的语言和比喻,把NAT这个略显枯燥的概念拆解清楚了,核心就是它如何通过地址和端口的转换,在地址不足的现实下,让海量内网设备得以顺利接入互联网。

IT 2012-12-09 20:09:50 / 累计浏览 29,060

WordPress插件开发 -- 在插件使用数据库存储数据

这篇讲的是WordPress插件开发中一个非常实际的问题:当插件需要存储的数据比较复杂时,比如网店的商品订单或音乐播放器的歌单,简单的键值对(Option API)就捉襟见肘了,这时就得直接操作数据库。 文章清晰地区分了两种场景:简单的配置项适合用 `get_option` 和 `update_option` 这类API;而面对复杂的结构化数据,就必须考虑建表。作者没有止步于此,而是引出了解决方案的核心——WordPress内置但未被官方文档化的 `dbDelta` 函数。这个函数设计的巧妙之处在于,它会自动对比你提供的建表SQL和现有表结构,生成并执行 `ALTER TABLE` 语句,从而实现数据库架构的平滑升级,极大降低了维护成本。 为了让说明更具体,文章以一个用于教学的“博客索引生成器”插件为例,详细展示了如何使用这个API为正排和倒排索引创建所需的数据表。整个讲解从背景需求、方案对比到具体实现思路和实例,为需要处理复杂数据的WordPress插件开发者提供了一个清晰、可操作的技术路径。

IT 2012-12-08 23:04:24 / 累计浏览 2,860

Ext JS 4 布局和容器:Layouts、Containers

布局系统是Ext JS最核心的能力之一,负责决定页面上每一个组件的尺寸和位置。这篇文档就是带你走进这个强大系统的入门指南。 作者从Ext JS界面由组件构成这一基本事实出发,重点解释了“容器”这个特殊组件。容器的职责很纯粹——就是容纳其他组件,从而形成典型的嵌套结构。文章以最常用的容器类组件`Panel`为例,展示了如何通过`items`配置将子面板(比如两个指定高度和宽度的`Child Panel`)嵌套其中。 通过这个清晰的例子,文档揭示了Ext JS应用界面的构建逻辑:一层套一层的容器与组件,最终由布局系统统一管理。对于想搞明白Ext JS界面到底怎么搭起来的开发者来说,这篇文章抓住了“容器”和“布局”这两个枢纽,是建立系统认知的第一步。

IT 2012-12-07 23:50:05 / 累计浏览 5,600

WordPress插件开发--获知文章状态变化

这篇讲的是WordPress开发者在维护插件时,如何像侦探一样追踪一个钩子的真实面目。作者从一个具体需求出发:想精确掌控`publish_post`这个action的触发时机,却在源码中直接搜索不到对应的`do_action`调用。 问题出在钩子名是动态拼接的。作者采用“农村包围城市”的策略,先定位到周边已知的`save_post`、`wp_insert_post`等钩子,通过编写临时插件记录日志,将排查范围锁定在约80行的代码块内。最终锁定了关键函数`wp_transition_post_status`,并发现其内部实现了更灵活的钩子机制。 文章揭示了三种强大的钩子组合:通用的`transition_post_status`(监测任意状态流转)、具体的`状态_to_状态`(如`draft_to_publish`,针对特定路径),以及状态与文章类型组合(如`private_post`)。这彻底改变了“publish_post仅在发布时触发”的表面理解,提供了对文章状态全生命周期精准监控的方法。

IT 2012-12-07 23:48:57 / 累计浏览 5,100

使用array_reduce降维

这篇讲的是PHP中一个被许多人“遗忘”的利器——array_reduce函数。作者从PHP数组功能的强大与开发者习惯于使用foreach这一“一招鲜”现象出发,聚焦于array_reduce如何实现数组的“降维”。 文章核心对比了实现同一目标的两种路径。作者以一个实际场景——从不同数据库获取记录后,需要将ID字段拼接成IN查询语句——为例。传统的foreach循环写法虽然直观,但被作者认为并非最“PHP”的思考方式。相比之下,使用array_reduce则能以更函数式、更声明式的风格完成:将遍历、提取、拼接的逻辑,浓缩进一个归约函数中。 关键差异在于思维模式。array_reduce的核心是提供一个“累加器”函数,让数组元素在其中进行状态累积,最终“归约”为一个单一值(不仅限于字符串)。这要求开发者对问题有更强的抽象能力,将循环逻辑内聚。文章通过代码对比清晰地展示了这种思路的转换,并指出array_reduce不仅适用于拼接字符串,在数值求和、对象转换等任何“遍历-计算-累积”的模式中都能大显身手,是提升代码简洁度和表达力的重要工具。

IT 2012-12-07 23:46:50 / 累计浏览 2,160

监视文件系统变化——inotify

这篇讲的是如何为PHP常驻进程实现“代码热更新”的一个解决方案。当PHP以常驻内存模式运行时(比如执行后台任务或伺服服务),它失去了传统web模式下每次请求自动加载最新代码的能力。文章指出,在这种场景下,可以利用Linux内核提供的inotify机制来监听文件系统的变化。 文章详细解释了inotify的工作原理:它通过一个类似队列的系统,使用少量几个API函数(如初始化、添加监控、读取事件)来捕获指定目录或文件的创建、修改、删除、移动等各类事件。作者也提到了一些实用细节,比如inotify本身不支持目录递归监控,需要手动添加子目录,以及在虚拟机共享文件夹中可能存在的限制。 为了更直观地展示应用,文章最后提供了一个名为DirWatcher的PHP类示例代码。这个类封装了监控逻辑,允许开发者注册监控目标和对应的回调函数,从而在文件系统发生特定变化时自动触发执行动作。对于需要实现动态加载配置、自动部署或插件热替换的服务器端PHP应用来说,这是一个实用且底层的技术思路。