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

最新文章

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

IT 移动开发/ 2016-03-14 23:42:51 / 累计浏览 1,884

iOS 开发 UI 搭建心得(一)—— 驾驭 StoryBoard

这篇是 iOS 开发 UI 构建方式系列文章的开篇,主要聚焦于如何有效使用 Storyboard。作者首先点明了 Storyboard 的核心价值:它不仅仅是一个描述页面布局的 XML 文件,其更深层的作用是让多个页面及其关系可视化,并通过 Segue 提供一种直观的跳转管理方式。 文章随后分享了一个经典的“踩坑”经历:新项目运行后页面全黑。其根因在于未正确设置 Storyboard 的初始窗体(Initial View Controller),导致 APP 启动后无法加载界面。作者通过截图和简单设置清晰地展示了解决方案。 为了避免单个 Storyboard 文件变得臃肿难维护,作者重点推荐了“多 Storyboard 最佳实践”。他以实际项目重构为例,讲解了如何按功能模块(如登录、考试)划分独立的 Storyboard 文件,并详细说明了在代码中如何通过 `UIStoryboard` 类实例化并调用另一个 Storyboard 中的窗体,无论是作为初始窗体还是通过 Storyboard ID 定位。 最后,文章点出 Storyboard 与 Auto Layout 天作之合的特性,并预告了下一篇将深入探讨另一种 UI 构建方式——xib,为读者对比不同方案的优劣和适用场景做好了铺垫。

本机暂存
IT 后端/ 2016-03-14 23:39:34 / 累计浏览 2,812

【Java并发编程实战】—– AQS(三):阻塞、唤醒:LockSupport

这篇讲的是LockSupport如何作为AQS框架的底层原语,实现线程的阻塞与唤醒。 作者从AQS的获取与释放锁流程切入,指出当线程获取锁失败进入CLH队列后,最终是通过`parkAndCheckInterrupt()`中的`LockSupport.park(this)`挂起的;而在释放锁后,则由`unparkSuccessor()`调用`LockSupport.unpark()`来唤醒队列中的下一个节点。 文章深入解析了LockSupport的核心机制:它基于一个与线程关联的“许可”工作。`park()`会尝试获取许可,若许可不可用则线程休眠;`unpark()`则赋予许可以唤醒目标线程。这种方法比传统的`Thread.suspend()`和`resume()`更安全,因为它不会导致死锁问题。文中也提到,许可不可重入,因此`park()`与`unpark()`通常需要成对使用,并且`unpark()`需要发生在`park()`之后,否则线程不会一直阻塞,还可以通过`parkNanos()`设置超时。 实现上,两者最终都委托给`Unsafe`类的本地方法完成,这展示了Java并发包构建在更底层原语之上的设计思想。

本机暂存
IT 后端/ 2016-03-14 23:37:10 / 累计浏览 2,882

【Java并发编程实战】—– AQS(二):获取锁、释放锁

这篇讲的是Java并发编程中AQS(抽象队列同步器)如何实现锁的获取与释放,是对AQS底层机制的核心剖析。 作者从锁获取的核心方法 `acquire` 出发,结合源码与流程图,清晰地展示了完整流程:线程首先通过 `tryAcquire` 尝试获取锁;若失败,则通过 `addWaiter` 将自身封装为节点加入CLH队列队尾;随后在 `acquireQueued` 方法中,节点会自旋检查是否为前驱节点且能获取锁,若是则出队,否则通过 `parkAndCheckInterrupt` 挂起等待。文章特别指出了 `tryAcquire` 由具体子类(如ReentrantLock)实现,体现了模板方法模式的设计。 在锁释放部分,流程相对简洁:释放锁时调用 `release` 方法,其核心是 `tryRelease` 修改状态后,通过 `unparkSuccessor` 唤醒队列中下一个有效节点,使等待的线程得以继续尝试获取锁。 通过对 `acquire` 与 `release` 两大核心路径的拆解,这篇文章帮助读者直观理解了AQS如何以CLH队列为骨架,管理锁状态与线程等待,从而掌握ReentrantLock、Semaphore等并发工具背后的统一运行逻辑。

本机暂存
IT 后端/ 2016-03-14 23:34:34 / 累计浏览 3,211

【Java并发编程实战】—– AQS(一):简介

这篇讲的是Java并发编程中作为JUC同步器基石的AbstractQueuedSynchronizer(AQS)框架的核心原理。作者从ReentrantLock、CountDownLatch等同步器获取锁的不同方法出发,引出对统一框架的需求,从而介绍了AQS的诞生背景。 文章着重解析了AQS实现的三大核心机制。首先,它用一个volatile的int型state变量来表示同步状态,通过CAS操作进行原子更新,这构成了锁获取与释放的状态基础。其次,AQS内部维护了一个变种的CLH双向队列,用于管理等待线程。这个设计的巧妙之处在于,它摒弃了原始CLH的自旋,转而让节点在队列中通过状态位安全地阻塞与唤醒,并能高效处理超时和取消操作。最后,AQS通过队列中Node的SHARED和EXCLUSIVE标记,统一支持了共享锁与互斥锁两种模式。 在阻塞唤醒机制上,AQS没有沿用Java内置锁的wait/notify,而是采用了更底层的LockSupport.park()与unpark()本地方法。整篇文章清晰地勾勒出AQS的骨架,为后续深入分析各类同步器的具体实现打下了扎实的基础。

本机暂存
IT 算法/ 2016-03-14 23:29:53 / 累计浏览 2,840

Scheme 初步

这篇讲的是作者出于函数式编程启蒙、接触经典教材《计算机程序的构造和解释》以及扩展 Emacs 等现实考虑,开启 Scheme 语言学习之旅的初体验。 文章没有高深理论,而是以轻松引导的方式,带读者跨过环境配置这道常见的“入门第一坎”。从在线 REPL 到本地安装,作者分享了让程序“跑起来”的最短路径。核心语法部分从最基础的 `( + 1 1 )` 聊起,清晰拆解了括号、前缀表示法和函数调用这些 Lisp 家族的标志性特征,帮助读者建立最初的语感。 作者坦言中文资料稀缺,因此参考了日文教程并对比了不同译本质量,文章本身也是学习过程的整理备忘。整体而言,这篇记录亲切、务实,为那些对函数式编程好奇又不知从何入手的开发者,提供了一个低门槛的起点和一份真诚的学习地图。

本机暂存
IT 设计/ 2016-03-14 23:26:57 / 累计浏览 1,185

产品设计师的前世今生

这是一篇关于设计行业演变的观点文。作者从上世纪五六十年代杂志行业的变革出发,梳理了设计头衔的变迁史——从“艺术指导”到“交互设计师”,再到如今流行的“产品设计师”。 文章的核心观点是,头衔的更迭更多是受市场风向和技术工具的影响,而非设计本质的改变。例如,当Flash技术兴起时,“交互设计师”头衔应运而生;而随着软件产品成为主流,市场便转向了“产品设计师”。作者指出,从Alexey Brodovitch在杂志社的版面设计,到如今在敏捷冲刺中绘制线框图,优秀设计师的核心特质——以用户为中心、有目的、可迭代、善于协作——一脉相承。 文章揭示了一个现象:设计师发明或选择特定头衔,往往是因为这符合当前市场的经济利益和专业细分需求。然而,市场真正需要的从来不是一个时髦的头衔,而是一群关心用户、乐于创造、持续改进的优秀设计师。无论媒介如何从纸张变为软件,为用户打造卓越体验的追求始终未变。

本机暂存
IT 安全/ 2016-03-14 23:25:35 / 累计浏览 3,288

Redis未授权配合SSH免密码登录漏洞及修复

这篇讲的是Redis未授权访问漏洞如何被利用来配合SSH免密码登录,以及相应的修复方法。作者从Redis的基本概念出发,介绍了redis-cli客户端、Redis Desktop Manager图形界面工具,以及常用的Key操作(如set、get、del)和服务器命令(如info、config get/set)。文章重点讲解了当Redis配置不当、默认无需密码认证时,攻击者如何通过Redis写入SSH公钥,从而实现免密码登录主机。具体步骤包括在Kali主机上使用redis-cli连接目标Redis,利用config set dir和config set dbfilename命令将SSH公钥写入/root/.ssh/authorized_keys文件。同时,文章还讨论了写入公钥后依然无法登录的常见情况,例如目录权限问题或SELinux设置,并给出了解决方法。 针对修复方案,文章强调了设置Redis密码认证的重要性,建议修改redis.conf文件中的requirepass参数。此外,还提到了修改绑定地址(bind参数)以限制访问,配置防火墙规则(如iptables)只允许特定IP连接,以及定期备份数据等措施。这些方案有助于系统管理员加固Redis服务,防止未授权访问和潜在的安全风险。通过实例演示漏洞利用过程,文章提供了可操作的修复建议,帮助读者在实际环境中实施安全防护。

本机暂存
IT 前端/ 2016-03-14 23:23:02 / 累计浏览 3,792

HTML5视频的那些事儿

这篇文章讲的是HTML5视频背后那堆让人头疼的概念和选择。作者从视频技术早于Web存在的历史讲起,梳理了我们常见的rmvb、mp4、flv等格式背后复杂的“三层结构”:容器、视频编解码器和音频编解码器,并用清晰的表格总结了mp4、ogg等主流组合的对应关系。 厘清这些后,文章转向HTML5的解决方案。它回顾了从黑盒的`embed`标签到功能强大但代码复杂的Flash插件的时代,引出了简洁的`

本机暂存
IT DevOps/ 2016-03-14 23:21:32 / 累计浏览 2,372

建立私有的 yum 源站

在企业内部运维中,管理统一的软件包源是个常见需求。这篇讲的是如何从零搭建一个私有 yum 源站,非常适合需要集中管控软件分发的团队。作者从最基础的三要素讲起:准备好要发布的 rpm 包、使用 `createrepo` 工具建立索引,最后通过 webserver(或本地/FTP)提供服务。 文章直接给出了可操作的步骤。从安装 `createrepo` 工具开始,到创建分层目录、复制 rpm 包,再到执行 `createrepo` 命令生成索引,每一步都有明确的命令示例。特别提醒了关键细节:每次新增 rpm 包后,都需要重新执行索引生成命令,否则客户端可能无法感知更新。 整个过程聚焦于 yum 源的核心构建逻辑,将 webserver 的具体配置留给读者自行扩展。对于想要快速搭建内部源、减少对外部网络依赖的运维人员,这套方法提供了一个轻量且清晰的起点。

本机暂存
IT 后端/ 2016-03-12 22:55:19 / 累计浏览 4,164

可靠 UDP 传输

这篇关于可靠 UDP 传输的文章,作者从对 TCP over UDP 的审慎态度出发,深入探讨了其可能的应用场景与实现路径。 作者首先指出,强行在 UDP 上复制一个完整可靠的传输协议往往得不偿失。其优势通常只在特定条件下显现,例如游戏状态同步等对包序不敏感、或采用一问一答请求模式的场景——这类小数据量交互正是 TCP 建立/拆除连接开销的短板所在。 核心方案上,作者认为一个可行的“可靠 UDP”模块,应专注于解决“如何利用不可靠传输实现可靠协议”这一逻辑问题,而非直接绑定 UDP 收发。他提出的 API 设计,将可靠化逻辑封装为独立层,业务层仅需调用发送与接收接口,而由底层的 `rudp_update` 函数处理数据包组序、重传请求与心跳维持。 作者分享了一个轻量级的 C 语言实现(约 500 行),采用了请求重发机制、16bit 包序号、以及可配置的发送延迟与超时策略。他强调,其实用性在于简化逻辑,并通过超时而非复杂确认来清理过期数据,为特定低延迟需求提供了一个灵活且易于修改的参考起点。

本机暂存
IT 数据库/ 2016-03-12 22:50:37 / 累计浏览 2,269

MySQL添加自增列失败

这篇文章记录了一位用户升级Discuz论坛时遇到的真实“坑”:试图给一张日志表添加自增主键列,却意外收到了“ERROR 1467”的报错,提示无法读取存储引擎的自增值。 面对这个不常见的错误,作者的第一反应是怀疑数据表损坏。但通过对比更底层的磁盘错误代码,他很快排除了这个方向,并将焦点转向了数据类型本身。关键的根因被锁定:原表中已存储的数据量,已经超出了用户指定的`mediumint`类型所能表示的数值上限,导致自增机制无法为其分配新的有效ID。 解决方法非常直接——将自增列的数据类型从`mediumint`更改为范围更大的`int`或`bigint`。这个案例生动地说明,在进行表结构变更,尤其是涉及主键和自增列时,仔细评估现有数据量与所选字段类型的容量匹配度是多么重要,一个疏忽就可能让一条简单的DDL语句失败。

本机暂存
IT 数据库/ 2016-03-12 22:49:10 / 累计浏览 4,433

从淘汰Oracle数据库的事情说起

作者从公司淘汰Oracle数据库的内部实践说起,类比国内“去IOE”浪潮,点明核心动因是高昂的维护成本与扩展性瓶颈。但他指出,这绝非简单地将Oracle换为MySQL或上云,而是一场有计划的架构演进——部分业务数据已迁移至DynamoDB等NoSQL,甚至落盘至S3,计算层则由Hadoop或Spark接管。 由此引出一个关键问题:NoSQL的兴起是否意味着SQL将过时?作者的回答是“恰恰相反”。他通过两个实例佐证:一是团队将复杂的Scala逻辑重写为Spark SQL,让更熟悉SQL的数据分析师能直接参与;二是基础设施团队通过Hive等工具,在底层从数据库切换至MapReduce后,依然对上层提供稳定的SQL接口。SQL作为一种数据抽象和思维范式,其生命力反而在增强。 文章还反思了关系型数据库自身“被成功到滥用”的问题,例如在不适宜的高并发场景硬用Oracle。最后,作者将话题从技术延伸到人与技能,指出诸如DBA等纯粹依赖维护的岗位将面临挑战,而真正的核心技术价值在于解决那些不易被工具或新平台简单替代的根本问题。整篇文章从一次具体的架构迁移,引发了对技术演进逻辑和工程师核心能力的深层思考。

本机暂存
IT 安全/ 2016-03-10 23:55:03 / 累计浏览 2,540

解决 SQL 注入的另类方法

这篇讲的是如何从根本上破解 SQL 注入,而不只是修补漏洞。作者从一个经典场景出发:攻击者通过精心构造的输入,篡改了原本合法的 SQL 查询语义。文章指出,这种问题的根源在于我们过度依赖与 SQL 语法等价的、但更容易被误用的“字符串拼接”表示法。 核心思路是跳出“过滤或转义”的传统框架,转而利用 SQL 本身是公理化语言的特性。文章提出了三种另类的防御策略:第一,将 SQL 模板转换为语法严格、结构不同的等价表示,比如前缀表示法或欧拉表示法,让攻击者的注入在新语法下直接失效;第二,为 SQL 关键字替换一套自定义的、任意的 token 集合,构建一个“私有语言”,使注入的 `or`、`=` 等字符成为无效代码;第三,验证 SQL 语句的结构不变量,例如填充前后 token 的数量必须恒定,任何偏离都意味着注入发生。 作者通过具体的代码示例,生动地展示了攻击注入在这些策略下是如何因语法错误或结构破坏而“折戟”的。这种从语言理论和形式化角度解决问题的方案,为防御注入攻击提供了一条极具启发性的新路径。

本机暂存
IT 安全/ 2016-03-10 23:52:49 / 累计浏览 2,633

SlemBunk木马浅析

这篇讲的是对SlemBunk这款Android木马的深度剖析。作者从拿到样本开始,一步步拆解其设计精妙之处。木马的核心目标很明确:伪装成常用应用,骗取用户的信用卡敏感信息。 它实现持久化和隐蔽性的手段堪称一套组合拳。首先,它通过获取设备管理员权限、控制锁屏状态、隐藏自身图标,并设置开机自启及SD卡监听,确保自己牢牢驻留在用户手机中。更狡猾的是,它会实时监控当前运行的应用,只在用户使用特定目标应用时才弹出欺骗界面,极大增加了欺骗的成功率。 在信息窃取层面,SlemBunk不仅读取短信记录、电话号码和设备ID,还能通过高优先级的广播接收器,监听甚至拦截所有短信。木马通过短信下发“CC”指令,实现远控。整个流程从激活、隐藏到窃密、回传,环环相扣。这种设计既高效又隐蔽,也为后续的变种演化提供了一个技术蓝本。

本机暂存
IT AI/ 2016-03-10 23:52:05 / 累计浏览 1,450

彪悍的职业不惧阿尔法狗

这篇文章从阿尔法狗与李世石的对弈讲起,引出了一个更值得深思的现实问题:在机器学习浪潮下,哪些人的职业未来会受到冲击?作者先以戏谑的方式提出了一个关于AI文明发展的宏大猜想,随后将话题拉回地面——Google为机器学习专家开出超200万美元年薪,正是因为资本正在押注这项技术的盈利潜力。 核心观点很明确:机器学习将首先替代那些重复性强、无需创造性思考的岗位。例如,机械搬运网络段子的小编辑,其工作可能很快被推荐算法取代。相反,那些需要灵感与创造性的职业,比如段子手、艺术家、导演,以及最重要的软件工程师,则拥有更长的“安全期”。作者甚至断言,当机器能完全替代程序员时,那可能已是AI文明终结地球之时。 因此,文章最终将“程序员”定义为地球上最后一个消失的职业,并建议有志者不妨从Python开始,踏入这个面向未来的领域。

本机暂存
IT DevOps/ 2016-03-10 00:08:53 / 累计浏览 2,073

多 SSH Key 管理技巧与 Git 多账户登录问题

这篇技术文章从开发者日常需要频繁登录多台远程服务器的场景出发,介绍了一种高效的管理方式。作者指出,虽然直接使用 `ssh` 命令配合端口号、别名等方式能工作,但当服务器数量增多时,命令会变得冗长且难以维护。 文章的核心解决方案是熟练运用 `~/.ssh/config` 配置文件。通过为不同主机(如工作服务器、个人代理、学校数据库)设置简洁的 `Host` 别名,并预先配置好对应的 `HostName`、`User`、`Port` 甚至 `IdentityFile`(指定不同的SSH密钥)和 `LocalForward`(端口转发)规则,可以将复杂的登录逻辑固化下来。此后,只需输入一个简单的别名即可建立连接。 作者通过多个配置实例,清晰地展示了如何将一条可能包含多重参数的复杂命令,转化为结构清晰、易于管理的配置项。这种方式不仅极大提升了日常登录的效率,也使得对不同环境、不同密钥的切换与管理变得一目了然。对于需要同时处理多个项目和远程环境的开发者而言,掌握这项技巧能有效减少心智负担。

本机暂存
IT 数据库/ 2016-03-10 00:03:48 / 累计浏览 2,051

MySQL processlist中哪些状态要引起关注

这篇文章针对MySQL DBA日常监控中的实际问题,详细列举了processlist中需要特别关注的12种状态及其背后的含义与优化方向。作者并未停留在表面解释,而是结合实际场景给出了具体建议。 例如,当看到“copy to tmp table”状态时,通常意味着正在进行ALTER TABLE操作,建议将其安排在业务低谷期或使用pt-osc等工具;而“Sending data”状态虽然看起来像是网络发送,实则是从存储引擎读取数据发送给客户端,此时应考虑通过索引或LIMIT减少数据扫描量。对于“Waiting for global read lock”等锁相关状态,文章明确指出这通常由全局读锁引起,应避免在生产环境长时间持有,并提供了执行备份等操作的替代思路。 整体来看,文章将枯燥的官方文档状态翻译成了可落地的DBA行动指南,覆盖了从临时表操作、排序到各类锁等待的典型场景,最后附上了MySQL官方文档链接供深入查阅。

本机暂存
IT 数据库/ 2016-03-10 00:02:24 / 累计浏览 1,869

关于RDS只读实例延迟分析

这篇讲的是RDS只读实例延迟的深度排查与实战解决。作者开篇即点明,延迟是只读架构(基于原生Binlog复制)与生俱来的挑战,会导致数据不一致甚至触发Binlog堆积,最终可能引发只读实例被锁、业务读操作失败。 文章系统梳理了导致延迟的五大典型场景,并给出了具体判据。例如,只读节点IOPS耗尽可能源于规格过小(对比主库配置);主库TPS过高但只读节点是单线程同步时,延迟难以避免;耗时长的DDL操作(如ALTER TABLE)会原样在只读节点执行,造成秒级甚至分钟级的同步卡顿;而大事务(如INSERT…SELECT)则会产生海量Binlog,使只读节点的SQL线程长时间处于“追赶”状态。 文章最后归纳了一套实用的“四看”排查法:一看只读节点IOPS是否触顶,二看其Binlog增长是否异常(定位大事务),三对比主库的ComDML指标(判断写入压力),四检查是否存在“Waiting for table metadata lock”等连接阻塞。这套方法能帮助用户快速定位问题根源,无论是优化配置、调整业务还是拆分事务,都能让读写分离架构运行得更顺畅。

本机暂存
IT DevOps/ 2016-03-10 00:00:24 / 累计浏览 3,630

初入运维的小伙伴,别再问需不需要学Python了

这篇讲的是运维人员该不该学Python的老话题。作者从百度知道上一个常见的提问切入,观点很明确:掌握一门开发语言,尤其是Python,已经是高级运维工程师的必备技能。 文章认为,不会开发,就难以深入理解业务流程、优化性能,也无法在复杂场景(如数千台服务器)中实现真正的自动化运维,只能依赖通用工具或拼凑开源软件。而Python恰好能胜任,它既是强大的脚本语言,满足绝大部分自动化需求,又能用于开发后端的C/S架构和Web界面,让运维人员有能力构建自己的运维平台,从而体现核心价值。 作者也对比了其他语言。比如,PHP更专注于Web;Java显得臃肿;C++在运维场景中多数时候“是为了来装B的”;而Go语言虽新,但预计不会成为运维开发的主流。同时,针对“Python效率低”的说法,作者指出程序效率更取决于开发者本身,并以Tornado框架在Python下实现高并发作为例证,强调语言本身的影响只占一部分。 文章的核心结论是:别再纠结“需不需要学”,Python因其简洁、全面和生态优势,就是运维转向开发、提升竞争力的首选工具。

本机暂存
IT DevOps/ 2016-03-09 23:59:15 / 累计浏览 1,764

如何通过 Yum 安装 Pure-ftpd

这篇教程从配置Yum源讲起,演示了在CentOS系统上快速部署Pure-ftpd FTP服务器的完整流程。核心方案是通过阿里云的EPEL源来获取软件包,从而解决官方源可能缺失的问题。 教程的关键操作包括修改pure-ftpd.conf配置文件,例如启用日志、设置虚拟用户数据库路径、关闭匿名登录,以及配置被动模式下的端口范围(48000-50000)。作者还详细说明了如何创建系统用户与虚拟用户,并设置相应的目录权限。 为了确保服务可被外部访问,文中补充了防火墙规则的配置,放行了控制端口21和被动模式端口。最后,通过chkconfig和init.d脚本实现服务的持久化与启动。整套流程完整且实用,适合需要快速搭建FTP服务的运维人员直接参照。

本机暂存