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

最新文章

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

IT 后端/ 2013-05-19 23:32:29 / 累计浏览 4,188

文件系统的树形结构改善构思

传统树形文件系统在管理一个文件属于多个分类时显得力不从心。要么得在多个目录下复制文件,造成空间浪费,要么就得忍受层级嵌套带来的繁琐点击。作者从这一痛点出发,提出了一个结合“标签”的改进思路。 核心方案是为文件系统增加一个自动生成的标签区。当文件被放入某个目录时,系统会为其打上该目录名的标签,同时也支持用户手动添加其他标签。这样,像《C/C++编程指南》这样的书籍就能同时关联“C语言”和“C++语言”两个标签,无需重复存储。 文章进一步探讨了两种访问逻辑:传统的树形目录用于文件管理,而标签则提供了另一种扁平化的快速索引路径。作者还设想了更人性化的交互——点击一个标签,文件管理器能直接打开包含该标签内容的相关目录,让访问路径更直观。 这篇构思主要在于抛砖引玉,探讨如何融合目录与标签的长处,来改善文件管理的体验。

本机暂存
IT 数据库/ 2013-05-19 23:31:44 / 累计浏览 3,123

深入理解Oracle中的Mutex

这篇讲的是Oracle数据库中两种底层串行机制——Mutex与Latch的深度对比分析。作者从内部机制出发,清晰阐述了Mutex为何以及如何在多个场景下成为更优的选择。 关键差异首先体现在效率上:Mutex获取仅需约30~35个CPU指令,而Latch需要150~200个;其内存结构也仅16字节,远小于Latch的112字节。更重要的是,Mutex的设计能大幅减少伪争用——不同于一个Latch保护多个热点对象,一个Mutex可以专门服务于单个数据结构(如每一个父游标或子游标),使得串行控制点更精准。 文章详细剖析了Mutex如何兼具传统Latch和Pin的双重职责。其内嵌的引用计数(ref count)机制,使其能像Pin一样防止对象被释放,同时自身又提供了必要的串行保护。在10.2版本后,这直接替代了游标执行时频繁创建/销毁library cache pin的昂贵操作,后续进程只需轻量级地增减引用计数即可。作者以KKS游标共享为例,列举了在父游标检查、统计信息访问等操作中,Mutex如何带来更低的解析成本和更好的并发性能。 最后,文章也提供了从AWR报告解读Mutex等待事件(如cursor:mutex S/X, cursor:pin S)的思路,并附上了统计信息表示例,为实际的性能诊断提供了具体指引。

本机暂存
IT 后端/ 2013-05-19 23:29:31 / 累计浏览 3,158

PhpIniDir的应用以及php.ini-dist和php.ini-recommended的区别

在PHP配置管理中,PhpIniDir指令决定了php.ini文件的查找路径,这对环境部署至关重要。PHP5更新了查找顺序,优先检查PHPIniDir设置(仅适用于Apache模块),然后依次是注册表键值、环境变量、PHP或服务器目录,最后才是Windows默认目录。文章建议在Apache2中直接通过httpd.conf配置PHPIniDir,例如设置PHPIniDir 'C:/php',同时提醒在NTFS系统上需确保服务器有读取权限,避免常见部署问题。 文章还对比了php.ini-dist和php.ini-recommended两个初始配置文件。php.ini-dist是PHP安装时的默认选项,适合开发环境,提供标准设置便于调试;而php.ini-recommended则增强了安全性配置,比如限制错误显示和潜在危险函数,专为生产环境设计。官方文档明确指出,php.ini-dist仅适用于开发,上线前应切换到php.ini-recommended,并参考PHP安全手册进行额外调整。 这种对比清晰指出了两者在场景适配上的差异,帮助开发者根据部署阶段选择合适配置,避免因误用开发设置而引入安全风险,强调了配置细节在PHP应用中的实际影响。

本机暂存
IT DevOps/ 2013-05-19 23:28:29 / 累计浏览 2,325

如何通过修改注册表来添加删除Windows的系统服务

这篇讲的是如何通过修改注册表来管理Windows系统服务,特别是在默认工具不灵活时提供更底层的控制方法。在系统维护中,清理无用服务或添加自定义服务是常见需求,但直接操作注册表需要谨慎,文章详细拆解了关键步骤。 删除服务部分介绍了三种实用方法:使用sc命令行工具(如“sc delete KSD2Service”),直接编辑注册表删除HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services下的键值,以及处理特殊情况——例如服务由系统进程保护时,需先结束进程或进入安全模式再操作。这些方法覆盖了从简单命令到深度清理的不同场景。 添加服务部分则深入讲解如何通过注册表创建新服务项,并设置必要的键值:DisplayName(服务名称)、ImagePath(程序路径)、Start(启动类型,值2为自动,3为手动,4为禁止)等。文章以添加QQ程序为服务为例,展示了如何逐步配置并验证效果。 通过这些方法,用户可以灵活地控制服务启动状态和系统资源,解决服务冲突或优化性能。文章提供了具体技术细节和注意事项,避免常见误操作,适合需要精细管理Windows环境的系统管理员参考。

本机暂存
IT 前端/ 2013-05-19 23:27:36 / 累计浏览 11,125

使用python/casperjs编写终极爬虫-客户端App的抓取

这篇讲的是在JavaScript动态渲染盛行的今天,如何有效抓取那些传统爬虫无能为力的“客户端App”型网页。作者以自动化获取Google Adwords关键词搜索量为实际案例,详细对比了两种实现路径。 文章首先回顾了经典的Selenium WebDriver方案。它像一位稳重的老兵,功能全面,能操控真实浏览器。作者分享了在无图形界面的服务器上配置它的技巧,并演示了如何通过分析页面结构、模拟登录、处理动态等待(如`implicitly_wait`)来一步步完成任务,最后用XPath提取出结果。方案虽可靠,但步骤相对繁琐。 随后,作者转向更现代的JavaScript Headless方案,重点介绍了CasperJS(基于PhantomJS)。这条路子轻快灵活,执行速度可达Selenium的三倍,代码也更直观——可以直接在浏览器控制台逻辑下编写。作者用它演示了几乎相同的功能,但指出CasperJS在进程间通信(IPC)方面存在局限。 最终,文章提供了一个完整的CasperJS爬虫脚本示例,读者替换账号即可运行。对于需要应对复杂JavaScript渲染的爬虫场景,这篇文章提供了从传统到现代的清晰路线图和实用代码。

本机暂存
IT DevOps/ 2013-05-19 23:25:34 / 累计浏览 3,180

服务器间同步/镜像/备份配置备忘录

这篇文章讲的是作者在从VPS迁移到独立服务器后,面对没有现成备份的困境,如何一步步摸索并比较各种文件同步方案,以实现可靠、实时备份的实战经历。 作者首先解决备份服务器的选型,找到了高性价比的大容量VPS。核心的挑战在于文件同步:基础的rsync配合cron定时任务虽然方便,但面对海量小文件和对“实时性”的追求,显得力不从心。于是,作者依次尝试了基于inotify机制的inotify-tools和sersync。文章详细记录了每一步的配置和遇到的真实问题:inotify-tools的过滤规则在实践中不顺手,日志混乱;而国产的sersync虽然整合了failover机制,看似更顺手,却暴露了多线程下大文件同步不完整、资源占用高等新问题,且文档和日志功能缺失。 最终,作者回归到inotify-tools,通过编写自定义脚本来解决文件过滤问题,找到了更可控的解决方案。整篇文章像一份技术人的踩坑笔记,清晰地对比了rsync、inotify-tools、sersync在功能、易用性、稳定性和资源消耗方面的差异,其价值不在于给出一个标准答案,而是为读者提供了在选择实时同步方案时,需要考量哪些实际维度——是稳定性、资源效率,还是配置的简洁性。

本机暂存
IT 后端/ 2013-05-19 23:24:24 / 累计浏览 2,335

Erlang集群全联通问题及解决方案

这篇讲的是Erlang集群一个看似“贴心”但可能致命的设计:默认全联通。 作者从Erlang集群节点加入时的“引荐”机制讲起,新节点会被介绍给所有现有节点,从而建立一个完全连接的网状拓扑。问题在于,这种全联通连接数(N*(N-1)/2)会随节点数增加而爆炸式增长,不仅消耗大量系统资源,更因定期的心跳检测引发网络风暴,严重制约集群规模。 解决这个问题的方案出人意料地简单:在节点启动参数中加入“-hidden”标志,使其成为“隐藏节点”。如此一来,节点间的连接不会被主动发布,从而有效避免了不必要的全联通。 不过,作者特别提醒了一个关键细节:隐藏节点的行为是“或”逻辑——只要通信双方中有一方是隐藏节点,global模块就不会进行自动引荐。这个特性在实际部署和故障排查时必须留意。文章最后指出,社区已开始正视并规避这一设计带来的问题,对从事大规模分布式Erlang开发的工程师来说,这个经验颇具价值。

本机暂存
IT 后端/ 2013-05-19 23:22:37 / 累计浏览 2,883

Erlang集群RPC通道拥塞问题及解决方案

当Erlang集群采用默认的全联通架构时,节点间通过RPC通道的密集调用可能引发严重的通道拥塞。文章从社区主流的分层服务架构出发,指出大量节点间消息流易导致dist端口忙,进而阻塞发送进程——由于RPC模块基于单进程gen_server,这种阻塞会直接拖累系统响应时间。 作者指出,这类问题可通过`erlang:system_monitor`的`busy_dist_port`事件及时感知,例如Riak系统便利用此机制告警。解决关键在于调整`dist_buf_busy_limit`参数:默认1MB的分布缓冲区上限可能不足,通过启动参数`+zdbbl`将其调大(如Riak案例中增至8MB),即可显著缓解阻塞、提升吞吐。文章结合监控实践与参数调优案例,提供了从问题定位到彻底解决的完整路径。

本机暂存
IT 后端/ 2013-05-17 13:49:09 / 累计浏览 6,071

gen_tcp发送缓冲区以及水位线问题分析

这篇讲的是一个线上 Erlang 服务器遇到的具体困惑:为什么按预期,客户端发送第 4 字节就该阻塞,实际上却到了第 7 字节才阻塞?作者从这个问题出发,深入剖析了 gen_tcp 的发送缓冲区与水位线(high_watermark/low_watermark)机制。 文章指出,理解的关键在于 ERTS 内部 port 的消息队列模型。发送数据(send)实质是向 port 发消息,当队列数据达到高水位线时,port 进入“忙碌”状态,调用者进程会被挂起,直到数据降至低水位线。文章结合参数设置详细推演了缓冲区与水位线的实际交互过程,并澄清了一个常见误解:高水位线更多是一个“软”限制,用于流程控制,而非精确的阻塞点;最终发送端的阻塞,很大程度上取决于接收端的 recv 行为。 作者通过源码与机制分析,将配置选项、内部数据流与观察到的行为串联起来,为理解 Erlang 网络编程中的流量控制提供了清晰的视角。

本机暂存
IT 算法/ 2013-05-17 13:47:17 / 累计浏览 5,937

经典证明:任意三角形都能被分成n≥4个等腰三角形

这篇讲的是一个经典的几何分割问题:如何把任意一个三角形分成任意多个(n≥4)等腰三角形。问题源自1976年的数学期刊,而1977年由Gali Salvatore给出了一套非常巧妙的通用证明。 作者从最基础的分割方法入手:先作高线把原三角形分成两个直角三角形,再对每个直角三角形作斜边中线,即可得到4个等腰三角形。基于这个“单元”,通过递归地对其中一个等腰三角形进行同样操作,就能以每次+3的增量,解决所有形如 n=4, 7, 10, 13… 的情况。 证明的关键在于处理 n=5 和 n=6 这两个“基例”。n=6 的方案相对直接,而 n=5 则需要一个巧妙的“预留一个等腰三角形,再把剩余部分分成四份”的策略。值得一提的是,这种方法无法直接用于等边三角形,文章为此专门展示了等边三角形分割成5个等腰三角形的独立方案,体现了思考的完备性。 整个证明思路层层递进,从通用构造到处理特殊情况,将一个看似复杂的问题分解为几个清晰可操作的步骤,展现了数学构造中的严谨与美感。

本机暂存
IT 开发者/ 2013-05-17 13:45:53 / 累计浏览 2,314

结网随想

读完图灵的《结网》,这篇技术视角的随想从产品经理与技术的关系、团队管理等维度分享了几个深刻观察。 作者首先点明,懂技术虽非产品经理的必要条件,但对技术缺乏理解往往会限制产品视野,拥有更深技术理解的产品经理更具竞争优势。书中关于创新者与模仿者的案例也引发思考:从AltaVista到Google、Napster到iTunes,模仿者屡屡成功,根源常在于创新团队缺乏兼具技术远见与管理能力的核心人才。 在团队协作上,作者借用漫画理论指出,领导者在传达愿景时,给予一个抽象而宏大的目标,比事无巨细的指示更能激发团队潜力,这为有想法的成员提供了翱翔空间。此外,文章强调了危机管理中“坦诚透明”的文化至关重要——敢于直面问题并公开进展,是团队与领导者值得信赖的标志。 这些观点不仅源于书本,更结合了作者对技术人才生态的思考。对于产品与技术从业者而言,这些从实战经验中提炼的见解,或许能提供超越操作层面的启发。

本机暂存
IT 前端/ 2013-05-16 23:42:19 / 累计浏览 5,203

Javascript的那些事儿

这篇文章从JavaScript的发展历程切入,探讨了它在构建数据库监控可视化方案中的实际应用。作者以Oracle Enterprise Manager中经典的“等待事件图”为实例,展示了如何利用JavaScript和ExtJS类库来复刻这一功能。 具体方案上,文章推荐使用ExtJS的图表组件来处理绘图工作,开发者只需专注于数据获取与格式转换。核心逻辑是创建一个JsonStore来存储等待事件数据,并通过定时(如每5秒)从数据库查询最新记录、移除最旧记录的方式,实现图表的动态前移更新。 文章还对比了JavaScript与Java在实现这一逻辑时的差异,突出了JavaScript作为动态语言在属性定义与操作上的灵活性——例如可以直接使用包含空格的属性名(如“ON CPU”),并通过字典式语法(item['time'])方便地遍历属性,这使得代码比Java实现更为简洁。 最终,通过前端JavaScript的动态数据操作与ExtJS图表库的结合,实现了一个可交互的、实时更新的等待事件监控面板。作者认为,JavaScript或许被低估了,在Web技术主导的时代,它确实是一个强大且实用的工具。

本机暂存
IT DevOps/ 2013-05-16 23:26:37 / 累计浏览 3,870

快速查看服务器硬件配置信息

这个脚本的目标很明确:为运维和开发人员提供一个一键式工具,快速获取Linux服务器的硬件与系统概况。它从几个关键维度着手,条理清晰。 首先,它智能识别操作系统发行版,无论是通过`lsb_release`还是直接读取`/etc/issue`,确保兼容性。接着,脚本深入`/proc/cpuinfo`和`/proc/meminfo`,提取CPU型号、物理颗数、核心数、逻辑处理器数,以及内存总量、交换空间、缓存等详细数据。对于磁盘信息,它整合了`fdisk`和`df`命令的结果,给出物理磁盘概况与各分区使用情况。 脚本的一个巧妙之处在于对64位系统的判断逻辑——通过检查CPU是否支持`lm`(长模式)标志,而非直接依赖系统位数。整个实现大量运用了管道和`awk`/`sed`进行文本处理,逻辑连贯,输出格式用等号线分隔,清晰易读。 对于需要快速摸底新服务器配置,或进行批量巡检的团队来说,这个脚本提供了一个非常直接、可立即落地的方案。它省去了手动拼接多个命令的麻烦,将分散的信息点整合成一份完整的“体检报告”。

本机暂存
IT 后端/ 2013-05-15 23:16:03 / 累计浏览 3,838

编码规范集锦

这篇文章探讨的是编码规范——一套团队共同遵守的编码约定。作者认为,规范不仅仅是风格统一,更是构建健壮软件的基石。它能帮助新成员快速融入、减少低级错误,甚至防止滥用语言特性带来的隐患。 文章没有停留在理论层面,而是直接列举了几个业界著名的规范作为参考。比如,谷歌的风格指导因其同时剖析了建议的优点和局限而备受作者推崇;Linux内核那标志性的8空格缩进规则则令人印象深刻;而GNU规范则更全面地涵盖了编程中的一致性与错误预防。 作者通过这些具体例子说明,选择何种规范取决于项目和团队,但遵循一个成熟的规范本身,能大幅提升协作效率与代码可维护性。它让编码从个人习惯上升为可工具化、可文档化的工程实践。

本机暂存
IT 后端/ 2013-05-15 23:15:17 / 累计浏览 4,853

为什么编码规范里要求每行代码不超过80个字符的限制是合理的

这篇探讨了Python编码规范PEP8中备受争议的“每行不超过80字符”限制。作者从实际编码体验出发,为这个看似过时的规定做了辩护。他认为,尽管我们早已摆脱VT100终端的小屏幕,但坚持这个限制能让代码更紧凑、可读性更强。 文章指出,Python语句本身通常只占35到60个字符,过长的行会破坏视觉平衡。通过合理的换行与空格,开发者能更直观地控制嵌套深度——这正是Python代码清晰度的关键。作者对比了两个函数示例:一个行宽无限制,需要横向滚动;另一个遵守80字符规范,结构一目了然。这种“约束”反而促进了代码的整洁。 另一个现实好处是屏幕空间的高效利用。当你在并排对比多个文件或函数时,80字符的宽度能确保所有内容都清晰地呈现在眼前,无需反复调整编辑器或担心自动换行干扰。即便在使用Django等框架时(其方法链调用很长),作者也坚持这一原则,以保证核心逻辑的可读性。 最终,作者强调,这条规范的本质是督促程序员将代码可读性置于首位。它不仅是历史遗留,更是一种有助于写出清晰、紧凑且易于团队协作的代码的实践哲学。

本机暂存
IT 移动开发/ 2013-05-15 23:08:42 / 累计浏览 1,976

Cocoa处理JSON转换, 兼谈计算机语言的哲学

作者从在Cocoa框架中使用NSJSONSerialization处理JSON转换时感到异常繁琐这一具体痛点出发,展开了一场关于编程语言设计哲学的讨论。他对比了Objective-C与PHP、JavaScript在核心操作上的体验差异:在PHP中,一个`json_encode()`与`json_decode()`就能直截了当完成任务;而在Cocoa中,开发者却不得不先处理NSData与字符编码的转换,并受限于顶层对象必须是数组或字典的约束。 这种对比引出了作者对“理想语言数据模型”的深层思考。他认为,字节数组(字符串)应统一且透明,数据本身是静态的,而解读方法才是赋予其意义的关键;映射表(字典)应保持“空间序”,即插入顺序即为可见顺序,这比无序的哈希表或强制的字典序对开发者更友好。他推崇像PHP和JavaScript那样,让最常用的操作(如数组操作)拥有最简洁的语法,避免为了所谓的“一致性”而让日常代码变得冗长。 文章并非单纯吐槽,而是在比较中提炼出语言设计的一些朴素原则:核心数据结构应与JSON等通用格式能自然映射,API应致力于降低常用场景的心智负担。最后,作者呼吁Cocoa开发者社区共同封装更易用的工具,并给出了一份融合类C语法、JavaScript数据模型及PHP/JS简洁API的“语言设计建议清单”。

本机暂存
IT 后端/ 2013-05-15 23:00:23 / 累计浏览 10,850

推荐一些socket工具,TCP、UDP调试、抓包工具

作者从Fiddler和Charles这些HTTP调试神器聊起,引出了对socket及TCP/UDP调试工具的需求。文章没有停留在理论,而是直接推荐了几款作者亲测的实战工具,并点明了它们各自的长处。 Wireshark依然是底层抓包分析的王者,但文章特意提醒了它可能按端口号自动解码协议带来的小烦恼。而国产工具sokit则更像一把“瑞士军刀”,作者重点介绍了它基于QT的跨平台特性、方便的二进制包组装能力,以及模拟分包/粘包和轻量级抓包的实用功能,甚至分享了自己曾因一个空格导致发送数据异常的真实小故事,这恰恰凸显了详细日志的重要性。 除此之外,文章还对比了体积小巧的TCP/IP Builder,以及能直观监控系统所有连接、帮助排查异常进程的Windows工具TCPView。整体来看,这篇推荐就像一份从实战出发的工具清单,帮助开发者根据具体场景——是深度抓包分析、快速调试协议,还是监控连接状态——选择最顺手的兵器。

本机暂存
IT 安全/ 2013-05-15 22:58:42 / 累计浏览 3,387

IIS写权限利用续以及写权限漏洞来由解释

这篇文章聚焦于一个具体的技术疑问:在 IIS 的 .NET 环境下,为什么利用 WebDAV 写权限时,经典的 MOVE 命令会失败并返回 207 状态码。 作者从自己三年半前留下的实践困惑出发,不仅解答了这个谜题,还深入剖析了所谓“IIS写权限漏洞”的根源。他指出,这并非复杂的高深漏洞,而是源于两个典型的管理错误配置:启用了通常不需要的 WebDAV 服务器扩展,以及在网站权限中开启了“写入”权限。这本质上是“人祸”。 对于大家熟知的利用流程——先 PUT 一个 txt 文件,再 MOVE 成 asp 脚本——作者给出了在 .NET 环境下成功的关键技巧。他利用了 IIS6.0 的文件解析漏洞,在目标文件名中加入分号,例如将 `oldjun.txt` MOVE 到 `shell.asp;1.jpg`,从而绕过了环境限制,成功获取 webshell。 文章最后推荐了 DAV Explorer 工具,并总结道,只要管理员避免上述错误配置,就能从根源上杜绝此类问题。

本机暂存
IT 后端/ 2013-05-15 22:56:33 / 累计浏览 3,430

gen_tcp如何限制封包大小

这篇讲的是如何在Erlang的TCP服务器(基于gen_tcp)中,从底层实现上来限制单个数据包的大小,以防范潜在的安全风险和资源耗尽问题。 文章从两种包接收模式入手。对于同步接收({active, false}),作者指出,当使用gen_tcp:recv时,实际上内核会为接收分配一个缓冲区。通过源码可以看到,这个缓冲区大小存在一个硬编码的上限:TCP_MAX_PACKET_SIZE(64MB),一旦请求超过此限制,就会直接返回ENOMEM错误。这可以看作是系统级的防线。 而对于更常见的异步消息投递({active, true}),控制则发生在协议解析层面。通过inet:setopts设置的packet_size选项,会在数据解析时被检查。文章通过追踪tcp_remain等函数的源码揭示了这一机制:当解析器发现包头声明的长度超过了设定的psize值,这个数据包就会被判定为无效。 核心巧妙之处在于,这两种机制一个在缓冲区分配时卡住,一个在协议解析时拦截,共同构成了对包大小的纵深防御。文章通过解读底层C驱动代码,让读者清晰地看到这些看似简单的应用层选项是如何被严格实现的,对于需要定制或深入理解Erlang网络编程的开发者来说,提供了扎实的内部视角。

本机暂存
IT 开发者/ 2013-05-15 22:55:42 / 累计浏览 3,965

在敏捷

这篇文章分享了让Scrum实践更“舒服”的核心心得。作者从沟通、预估、团队和目标四个关键维度展开,强调Scrum并非固定模式,而是需要通过持续磨合来找到最适合团队的节奏。 文中指出,顺畅的沟通(尤其是面对面沟通)是这一切的基础,有时甚至需要非正式场合来建立信任。在预估方面,文章用图示说明了初期难以精准的现实,建议将任务拆解细化,为测试预留时间,通过迭代逐步提升预估准确性。 团队协作部分着重于建立“我们是一个整体”的文化——共享需求、共担责任(包括修复Bug)、互相支持,确保个人休假不会阻碍进度。最终,所有努力都指向一个共同的目标:明确每个冲刺的任务,做出并完成承诺,共同庆祝成功或复盘失败。 文章结尾推荐了《Scrum敏捷软件开发》一书,供读者在需要时深入研究。整体来看,它为团队落地Scrum提供了务实且充满人情味的视角。

本机暂存