IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者
首页 / JavaRanger
IT 2016-11-06 22:34:25 / 累计浏览 3,700

8大实用又重要Mac使用技巧

这篇讲的是Mac日常使用中的效率提升指南,文章从区分苹果几种容易混淆的Store开始,为你理清App Store、iTunes Store和Apple Store的区别。不过核心干货集中在对快捷键系统的深度拆解上。 文章将零散的快捷键梳理成了清晰的几类:顶行功能键的巧用、空格键堪称“万能预览键”的神奇之处、以及一整套覆盖文件管理、窗口切换、截屏和系统控制的组合键。比如,文中特别介绍了Command+Shift+4接空格可以精准截取窗口,比QQ截图更原生高效;而Command+Option+Esc用于强制退出卡死的程序,也是Mac用户的必备技能。 除了介绍,文章也提到了如何自定义快捷键,并推荐了KeyCue这个辅助工具,让记忆变得更轻松。最后,作者强调了一个常被忽略的观点:熟练使用触控板的各种手势,其效率其实远超外接鼠标,建议所有用户都去系统偏好设置里完成官方教学。整体来看,这篇文章从基础认知到进阶操作都覆盖了,是一份很实用的Mac使用备忘录。

本机暂存
IT 2016-03-18 12:37:09 / 累计浏览 2,960

Mac实用技巧——在Finder中显示文件完整路径

这篇讲的是一个让Mac Finder显示文件完整路径的实用技巧。在默认设置下,Finder只会在标题栏显示当前文件夹的名字,而不会显示完整路径,这给需要频繁导航多层目录的用户带来了不便,尤其是在处理复杂项目文件时,常常需要反复点

本机暂存
IT 2016-03-07 23:30:48 / 累计浏览 2,420

java8新特性——Lambda表达式

作者从Lambda表达式的定义出发,剖析了这个Java 8中被称为“闭包”的新特性。文章核心在于展示Lambda如何通过表达式直接代替功能接口,并用简洁的`->`语法连接参数列表与函数体,从而大幅提升代码可读性。 文中通过生动的代码对比,直观呈现了Lambda的简化效果:无论是排序任务中用一行表达式替代冗长的匿名内部类,还是在集合转换场景下,结合Stream API使用Lambda进行链式操作,代码都变得极为精炼。文章不仅介绍了基础语法,还具体展示了`java.util.function`包与`java.util.stream`包如何与之配合,实现对集合数据的批量处理。 作者最终总结,Lambda表达式与Stream的结合,是自泛型和注解以来对Java生态影响最深远的变化之一,它让开发者能以更声明式、更简洁的方式编写代码,也为并行类库的编写奠定了基础。

本机暂存
IT 2016-02-11 14:59:45 / 累计浏览 2,320

垃圾收集器选择

这篇讲的是JVM垃圾收集器的核心选择问题。作者从JDK版本演进切入,指出在串行收集器只适用于小数据量的前提下,真正的选择主要发生在并行收集器与并发收集器之间。 文章清晰地梳理了两者的定位与典型配置。吞吐量优先的并行收集器(如UseParallelGC),通过最大化处理器利用率来服务后台批处理任务,并提供了调整GC线程数、暂停时间及自适应策略等关键参数。而响应时间优先的并发收集器(如UseConcMarkSweepGC),则致力于最小化应用停顿,更适合在线服务场景。文章也具体指出了像-XX:+UseConcMarkSweepGC可能会导致-XX:NewRatio失效,以及如何通过参数处理并发收集器产生的内存碎片问题。 它不仅给出了“是什么”和“为什么”,更提供了“怎么配”的实战代码示例。无论你是在做科学计算需要高吞吐,还是运营在线系统要求低延迟,都能从中找到明确的调优方向和参数依据。

本机暂存
IT 2015-12-26 20:29:08 / 累计浏览 3,700

JAVA虚拟机简介

这篇讲的是Java虚拟机(JVM)的基础全景。文章开门见山,帮读者厘清“JVM”这个词的多层含义:它既是一套定义行为的规范,又是如HotSpot这样的具体实现,同时也是程序运行时的一个独立实例。这种分层解读,有助于跳出“JVM就是一个黑盒”的模糊认知。 接着,文章厘清了开发者日常接触的“三件套”:JVM负责执行字节码,JRE包含了JVM和核心类库,而JDK则在JRE之上增添了开发工具。理清它们的包含关系,是理解Java技术体系的第一步。 文章后半部分聚焦JVM内部,通过图解展示了其基本结构,重点剖析了类加载子系统。它详细拆解了Bootstrap、Extension、App和Custom这四层类加载器的职责与分工,特别是指出了启动类加载器由C++实现、无法被Java程序直接引用的特殊性。 对于刚接触Java底层原理的开发者而言,这篇文章像一份清晰的地图,系统性地梳理了从宏观概念到核心模块的关键知识点,为后续深入探索内存模型、垃圾回收等打下了扎实的基础。

本机暂存
IT 2015-12-13 22:12:12 / 累计浏览 3,580

缓存算法–LRU

这篇讲的是两种经典的缓存淘汰算法:LRU和它的改进版LRU-K。文章开门见山,先解析了LRU(最近最少使用)的核心思想——它用一个巧妙的链表来实现,新数据插入头部,每次访问都把数据提到最前,满了就淘汰尾部那个“最久没碰”的。这种策略在热点数据集中时效率很高,实现也简单。 但文章也指出了LRU的软肋:一旦出现偶发的批量扫描,会挤掉很多热门数据,造成严重的“缓存污染”。为了解决这个问题,文章引入了LRU-K。这里的“K”代表一个访问次数阈值,比如我们常说的LRU-2。它不再因为一次访问就把数据加入缓存,而是让数据在历史队列中先“排队”,只有被访问了K次,证明它确实是热点,才获准进入缓存队列。 这样一来,LRU-K的命中率通常比LRU更高,能有效抵抗缓存污染。但天下没有免费的午餐,它的实现需要维护额外的访问历史队列并进行排序,算法复杂度、内存消耗和CPU开销都比LRU要高。文章最后也点明了选择的关键:LRU胜在简单高效,适合大多数常规场景;而当你面对严重的访问模式波动时,LRU-K(尤其是LRU-2)提供了一个更稳健的选择。

本机暂存
IT 2015-11-08 22:09:55 / 累计浏览 1,840

ubuntu设置开机后台自动运行

这篇讲的是在Ubuntu系统中设置脚本开机自动后台运行时遇到的典型路径问题。作者从创建一个简单的Shell脚本开始,通过编辑`/etc/rc.local`文件实现开机自启,但重启后却发现日志提示“sslocal:command not found”。 问题根源在于,虽然`sslocal`命令实际存在于`/usr/local/bin/`下,但`rc.local`执行环境的PATH变量并未包含该目录,导致系统无法定位到命令。作者的解决思路很直接:将需要调用的命令文件从`/usr/local/bin/`直接移动到系统标准路径`/bin`下,从而让任何执行环境都能找到它。 这个案例清晰展示了Linux后台任务管理中容易忽略的环境差异问题。对于需要自动化运行的脚本,确保依赖的命令位于系统标准路径,或在脚本中明确指定其绝对路径,是避免此类“命令未找到”错误的关键。

本机暂存
IT 2015-11-08 22:08:28 / 累计浏览 1,540

linux上二进制部署mysql详细步骤(测试环境常用)

这篇讲的是如何在Linux系统上用二进制包快速部署MySQL,特别适合测试环境。作者从实际经历出发,指出rpm安装常出问题、编译安装又太耗时,因此选择了二进制包方案。 文章以MySQL 5.5.42版本为例,详细拆解了从下载、解压、创建用户、初始化数据库到配置权限的全过程。作者特别强调了几个容易踩坑的地方:比如在Ubuntu上安装时,系统可能因缺少libaio1库而报错,导致初始化失败,解决办法是用apt安装该库后重新执行初始化。此外,文章也厘清了CentOS和Ubuntu在自启动目录、socket文件路径等方面的差异。 作者还分享了实用技巧,比如如何设置root密码、通过端口查看服务状态,以及当遇到socket连接错误时,可以尝试通过指定127.0.0.1地址来登录。这些细节让整个部署流程更具操作性,即使不熟悉环境,也能跟着步骤在几分钟内搭好MySQL服务器。

本机暂存
IT 2015-11-08 22:08:06 / 累计浏览 4,140

Java程序员们最常犯的3个集合错误

这篇文章总结了Java开发者在使用集合时三个高频出现的陷阱,并给出了清晰的解决方案。作者从最常见的编码实践出发,指出错误背后的原理。 首先,在将数组转换为列表时,直接使用`Arrays.asList(arr)`会返回一个大小固定的内部类`ArrayList`,而非我们通常使用的`java.util.ArrayList`。这导致后续的`add`操作会失败。正确的做法是用`new ArrayList<>(Arrays.asList(arr))`来创建一个可动态修改的列表副本。 其次,判断数组是否包含某个值时,很多人会先将其转换为`HashSet`。作者指出这多此一举,直接使用`Arrays.asList(arr).contains(targetValue)`或循环检查效率更高,代码也更简洁。 最后,文章重点分析了在循环中删除列表元素时最隐蔽的错误。无论是使用普通for循环下标删除还是增强for循环,都可能因为元素索引连续变化或迭代器状态不一致,导致元素遗漏或抛出`ConcurrentModificationException`。作者强调,必须使用迭代器的`remove()`方法,并确保在`next()`之后调用,才能安全地在遍历时删除元素。 理解这些集合操作背后的实现差异,能帮助开发者避免一些难以调试的程序错误,写出更健壮的代码。

本机暂存
IT 2015-11-08 22:00:18 / 累计浏览 4,560

基于漏桶(Leaky bucket)与令牌桶(Token bucket)算法的流量控制

这篇讲的是高并发系统限流中的两个经典算法——漏桶与令牌桶的核心差异和适用场景。文章以大促流量为背景,引出限流对系统稳定性的必要性。 漏桶算法被形象地比喻为一个底部有孔的桶,它强制数据以固定速率流出,哪怕输入流量是突发的,它也能起到削峰填谷、强行平滑流量的作用。 而令牌桶则不同,它以固定速率向桶中放置令牌,请求需要消耗令牌才能通过。文章特别指出,令牌桶允许桶内积累一定数量的令牌,因此能较好地应对突发流量,在平均限流的同时保留了灵活性。文中也提到了Guava的RateLimiter,其SmoothBursty实现正是令牌桶的优化,能积攒令牌应对短时高峰,而SmoothWarmingUp则实现了漏桶式的预热限流。 作者通过对比明确了二者的本质区别:漏桶强在“恒定速率”,令牌桶强在“允许突发”。选择哪种算法,关键取决于你的业务流量是需要严格平滑,还是需要在平均速率约束下应对可预测的突发。

本机暂存
IT 2015-11-08 21:56:21 / 累计浏览 4,260

一致性哈希算法(consistent hashing)

这篇讲的是分布式系统中一个经典问题的优雅解法:一致性哈希算法。作者从最简单的哈希取模(id % N)方式切入,指出其致命短板——一旦集群节点数(N)因扩容或宕机而变化,几乎所有数据的映射关系都会被打破,导致缓存雪崩,后端压力骤增。 为了解决这个“牵一发而动全身”的问题,一致性哈希将哈希空间组织成一个虚拟的环形。节点被映射到环上,数据也映射到环上,并沿顺时针方向找到的第一个节点作为处理者。这样,当增加或删除节点时,只有相邻节点间的数据映射会发生变化,实现了影响范围的局部化。 文章进一步指出,若物理节点较少,可能导致负载在环上分布不均。为此引入了“虚拟节点”概念——为每个物理节点生成多个虚拟分身,均匀分布在环中,从而使负载更加均衡,但会增加一次查找开销。 最后,文章还归纳了评判一致性哈希算法优劣的四个核心标准:平衡性、单调性、分散性和负载。这篇内容清晰地将一个解决分布式数据路由问题的核心算法,从痛点、原理到优化与评估,串联成了一条完整的逻辑链。

本机暂存
IT 2015-10-04 23:15:06 / 累计浏览 2,060

清官谈mysql中utf8和utf8mb4区别

这篇文章对比了MySQL中两种常见的字符编码:utf8与utf8mb4。作者从实际存储问题出发,解释了核心差异:MySQL的utf8编码最大仅支持3个字节的UTF-8字符,因此无法存储Emoji表情、部分生僻汉字等占用4个字节的Unicode字符,插入时可能导致异常。而utf8mb4作为其超集,专门用于兼容这类四字节字符。 文章进一步追溯了问题根源,指出这与MySQL早期设计时Unicode尚未扩展辅助平面有关,当时的utf8被限制为最多3个字节。作者建议,尽管utf8在多数情况下足够且更节省空间,但为了更好的兼容性和前瞻性,应始终优先使用utf8mb4字符集(需MySQL 5.5.3以上版本)。同时,他提到使用utf8mb4时,对于CHAR类型数据会额外消耗空间,官方推荐使用VARCHAR类型进行替代。

本机暂存
IT 2015-10-04 23:11:14 / 累计浏览 5,740

Java程序员必知的8大排序算法

这篇讲的是Java程序员几乎绕不开的排序算法集合。排序是编程基础,但很多人可能只记得零散的冒泡和快排,对其他几种知其然不知其所以然。这篇文章就系统性地梳理了直接插入、希尔、简单选择、堆排序等经典算法。 它不像教科书那样堆砌公式,而是像一张清晰的导航图,先用一张图展示8种排序之间的演进与关系,帮助读者建立整体认知。对于每一种算法,都拆解成三部分:先讲清楚核心思想和解决问题的逻辑,比如堆排序如何借助“堆”这种数据结构进行树形选择;然后给出一个直观的排序实例图,让抽象过程可视化;最后附上可直接运行的Java代码,将思想落地。 尤其值得一提的是,文章在讲解复杂算法(如堆排序)时,通过分解“建堆”和“交换”两个关键步骤的可视化过程,让算法的巧妙之处一目了然。这种从原理、图示到实现的递进式讲解,能帮助开发者不仅学会怎么用,更理解算法背后的设计考量,从而在面对不同数据规模或特征时,能更从容地做出选择。

本机暂存
IT 2015-10-04 22:52:44 / 累计浏览 2,420

MySQL索引原理与慢查询优化

这篇讲的是如何从原理层面理解MySQL索引,并将其应用于实际的慢查询优化。作者从“查询效率”这个基本需求出发,首先用字典类比引出索引概念,然后深入讲解了数据库为平衡磁盘IO成本所选择的数据结构——B+树。文章详细剖析了B+树的节点结构、查找过程以及高度可控的优势,解释了为什么索引字段要尽量小,以及复合索引的“最左匹配”原则是如何从B+树结构推导出来的。 在原理部分之后,文章给出了几条非常实用的建索引原则,比如索引列不能参与计算、尽量扩展而非新建索引等。最后,它提供了一套慢查询优化的基本步骤,并强调了`explain`命令中`rows`指标的核心作用。整篇文章将底层的数据结构原理与上层的SQL优化实践紧密串联,帮助读者不仅知道“怎么做”,更理解“为什么”。

本机暂存
IT 2015-02-26 14:03:22 / 累计浏览 5,300

在vim保存时获得sudo权限

这篇讲的是在vim编辑器中,如何不退出进程就能获得sudo权限来保存只读文件。 在维护线上服务的过程中,工程师经常需要编辑那些只有读权限的文件——比如系统配置或日志文件,它们通常属于其他用户。每次保存时,vim都会提示“read-only”,迫使你先退出编辑,再用sudo vim重新打开文件进行保存。这种反复切换的操作不仅繁琐,还容易打断思路,尤其在紧急修复时更显低效。 文章作者从这一常见痛点出发,分享了一个巧妙的解决方案:使用vim命令 `:w !sudo tee %`。这个命令允许在vim内部直接调用sudo权限,将当前缓冲区的内容保存到文件,无需中断编辑进程。具体来说,`:w !{cmd}` 执行外部命令`{cmd}`,并将缓冲区内容通过stdin传入;tee工具负责将stdin保存到文件;而`%`是vim中的一个只读寄存器,始终存储着当前编辑文件的路径。因此,整个操作相当于从vim外部修改了文件,巧妙地绕过了权限限制。 这个技巧能极大提升运维效率,避免反复退出和重启vim的麻烦。它展示了vim命令行的强大灵活性,以及如何利用外部工具增强编辑器的功能——对于经常处理系统文件的技术人员来说,这无疑是一个实用且高效的工作流优化。

本机暂存
IT 2014-12-30 12:29:21 / 累计浏览 12,640

HashMap解决hash冲突的方法

这篇讲的是 HashMap 如何巧妙处理哈希冲突。作者直接从 put 方法的源码切入,展示了当不同 key 通过哈希算法映射到同一个数组索引(即“桶”)时,HashMap 采用的“链表法”解决方案。 核心思路很清晰:当发生冲突时,新的键值对并不会替换旧的,而是像插入单链表一样,通过 `addEntry` 方法被添加到该桶的链表头部。文章特别指出,这个新插入的 Entry 对象会指向原先位于该桶的 Entry,从而形成一条单向链表。这就解释了为什么在冲突严重时,get 操作会从直接定位退化为需要遍历链表,最坏情况下复杂度会达到 O(n)。 文章还点出了一个关键的设计权衡——负载因子。默认的 0.75 是空间与查询效率之间的折中:过大会节省内存但查询变慢,过小则查询更快但更耗内存。 总的来说,这篇分析没有停留在概念层面,而是通过源码把链表如何形成、负载因子如何影响性能这些细节讲透了,适合想弄懂 Java 集合框架底层原理的开发者阅读。

本机暂存
IT 2014-11-30 23:28:07 / 累计浏览 3,020

实用命令行工具详解(五)—crontab

这篇讲的是Linux系统里“定时任务”的核心工具——crontab。文章从crontab的基础概念和命令格式讲起,比如常见的-l(查看)、-e(编辑)、-r(删除)等操作。 但真正的干货在后半部分的应用实例。作者没有停留在理论,而是直接给出了大量贴近实战的crontab写法,从“每晚21:30重启Apache”到“每周一到周五下午5点发邮件”,覆盖了日常运维和开发中高频出现的定时需求。特别是对时间字段(分、时、日、月、周)的各种灵活组合进行了拆解,例如“0 23-7/2,8 * * *”这种稍显复杂的表达式,都附有清晰的说明。 通过这些具体例子,文章把抽象的cron表达式变得具体可见,非常适合需要快速查阅或学习如何编写定时任务的读者。

本机暂存
IT 2014-11-30 23:27:39 / 累计浏览 2,300

实用命令行工具详解(四)—netcat

这篇讲的是Linux下的网络调试利器netcat(简称nc),它被称作“网络工具中的瑞士军刀”,能通过TCP和UDP在网络中读写数据。文章具体拆解了它的三个实用场景:建立监听端口进行基础通信、利用管道实现文件快速传输,以及通过-w参数设置连接超时以控制会话时长。每个场景都提供了清晰的客户端与服务器端命令示例,比如用`cat local | nc localhost 9999`来推送文件内容,或用`nc -w 10`来自动中断空闲连接。这些例子展示了如何将netcat与重定向、管道结合,在脚本或临时调试中灵活使用。

本机暂存
IT 2014-11-30 23:27:11 / 累计浏览 2,560

实用命令行工具详解(三)—ngrep

这篇文章介绍的是一个实用的网络抓包工具——ngrep。当httpclient请求出现线上问题却难以直接调试时,ngrep提供了一种轻量、高效的抓包分析方案。 与经典的tcpdump相比,ngrep更像是网络版的grep。它聚焦于“搜索”特定数据包内容这一核心功能,依赖libpcap库,能识别TCP、UDP等主流协议。对于开发者而言,它的最大优势在于简单直接:可以用类正则表达式直接匹配数据包中的文本内容。 文章通过一个捕获HTTP POST请求的实例,展示了ngrep的典型用法。例如,使用`sudo ngrep -q -W byline "(POST).*"`命令,就能快速过滤出所有POST请求,并清晰显示其完整的Header和Body内容,这对分析接口调用问题非常直观。文中还详细解读了各个参数,如`-q`静默模式、`-W byline`格式化显示、`-d`指定网卡等,帮助读者按需组合,精准定位问题流量。 总的来说,ngrep将强大的grep理念带入了网络诊断领域。对于需要在线上环境快速排查HTTP请求异常、进行轻量级协议分析的场景,它是一个上手快、效率高的得力工具。

本机暂存
IT 2014-11-30 23:26:11 / 累计浏览 2,040

实用命令行工具详解(二)—siege

这篇讲的是Linux下的负载测试工具siege如何模拟真实用户行为。文章开篇就点明了它与Apache ab的关键区别:siege能从URL列表随机请求,更适合仿真多用户并发负载,而ab则在追求极致性能基准时更精确。 文章详细展示了siege的多种实战用法。比如,你可以用 `siege -c 500 -r 50 -f url.txt` 模拟500个用户重复请求50次;也可以用 `-t10M` 参数让压测持续10分钟。它甚至能从服务器的access.log中提取URL,用来复现历史访问场景,这对于重现问题非常实用。 对于测试结果,文章逐一解读了输出指标,像“Transaction rate”即我们常说的QPS,“Response time”反映网络连接速度。最后部分还梳理了关键参数,如 `-c` 控制并发量、`-d` 设置请求间隔、`-l` 保存日志等,帮助读者根据自身环境灵活配置。 整体上,这篇文章没有停留在理论介绍,而是通过具体命令和输出示例,手把手地带读者用起来。对于需要快速评估Web应用压力承受能力的开发者来说,这是一份清晰的速查手册。

本机暂存