自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(79)
  • 收藏
  • 关注

原创 浅谈设计模式(3):享元模式

之前在书里读到过享元模式(FlyweightPattern),算是比较好懂的几种设计模式之一,但一直没有亲眼见到过。对象是否频繁到对内存产生足够大的影响。如果注释里能加一个相关issue的链接就更好了。说实话,光是这么看,很难判断这里的享元模式用得是否必要,因为不清楚创建长度为0的。对象说——感到很奇怪为什么要把长度为0单独算一种情况?的话,就白白占用了一份内存,所以这里共用同一个对象。后来发现,长度为0时,返回了一个共用的。(还有就是,感觉长度为0的。的源码时终于见到了享元模式。...

2022-07-17 21:44:17 1736 1

原创 为什么应该少用静态(static)方法:静态方法的三大问题

静态方法非常常见,比如很多工具类中都会有大量静态方法。之前我对这种现象习以为常,直到最近发生的几件事让我决定以后要尽量避免用静态方法。下面就来看看静态方法的两大问题。(这里以 Java 为例,但相信很多语言应该都一样。)相比常规方法,在 Java 中对静态方法进行 mock 要复杂一些。Mockito 直到 3.4.0 版本才支持 mock 静态方法。不过,这实在是三个问题里最轻的一个了。面向对象语言的精髓就是依赖抽象,而不是依赖实现。在 Java 中,可以通过接口或者抽象类来实现这一点。而静态方法则不具备

2022-07-13 13:27:24 3484

原创 Mockito 实现原理(4):@Mock 注解

上篇文章 研究了一下 JUnit 的基础原理,这篇来看看 Mockito 和 JUnit 交界的部分: 注解。 注解可以看做一个语法糖,用更少的代码实现相同的 mock 功能。例如:这样声明 更为清晰直观,胜过在测试里写 ,特别是在许多测试方法中都要用到这样一个 mock 对象的时候。那为什么说 注解是 Mockito 和 JUnit 交界的部分呢?注意最上面那行 ,如果把这行去掉, 注解就失效了。(当然,还有别的方式也可以实现同样功能,比如增加 JUnit 的 注解。)毕竟, 注解需要由 Mock

2022-06-14 11:59:19 7245

原创 JUnit 实现原理(1):测试是如何跑起来的

继上一个系列初步研究了单元测试神器 Mockito 的实现原理之后,这个系列关注一下单元测试框架本身:JUnit。相信大家对于在 IDE 中执行单元测试毫不陌生。除了单元测试,我也经常会用 JUnit 验证一些 Java 的语法机制,毕竟 Java 不是脚本语言,总得有个入口才能执行程序呀!总不能每次都新建一个 project 吧。如此说来,JUnit 真的是一个非常方便的工具。下面就来看看,当你点击 IntelliJ 中的“执行测试”的按钮时,JUnit 中到底发生了什么。(本文基于 JUnit 4.13

2022-06-11 20:37:21 2683 3

原创 浅谈 Java 注解(annotation)

之前我一直以为,Java 注解(annotation)和 Python 或者 JavaScript 里的装饰器(decorator)是类似的东西,毕竟看起来很像嘛,都是一个 符号;甚至功能也很像,就是给原本的对象“添加”一些效果。今天才发现,虽然 Python 和 JavaScript 里的装饰器确实是一回事,但 Java 注解和它们完全不同!先来看看 Python 和 JavaScript 里的装饰器吧。之所以叫“装饰器”,的确是因为实现了设计模式里的“装饰器模式”(decorator pattern)

2022-06-06 15:51:13 345

原创 Mockito 实现原理(3):如何对 final 类进行 mock

前面两篇提到,Mockito 默认基于创建派生类(subclass)来实现 mock(包括 spy)。那么问题来了,如果我的类标记为 final,明确禁止创建派生类,那不就没法 mock 了吗?为了解决这个问题,Mockito 2 中引入了 。和前面讨论过的默认的 相比,这个 同样基于 Byte Buddy 这个提供 Java 字节码操作功能的第三方库,但会尽量不通过创建派生类来实现 mock。对 final 类进行 mock,需要用 替换掉默认的 。替换方法是通过创建一个配置文件。按照这篇教程,应该

2022-06-05 21:48:24 5092

原创 Mockito 实现原理(2):spy 的原理

上一篇讲了 的基本原理,这一篇简单谈谈 。可以这么理解这两者之间的区别: 的一个典型用法就是,你想测试某个对象 的某个方法 A,但 A 会调用它的另一个方法 B,而你想把 B mock 掉。这时候就可以基于 创建一个 ,然后把它的 B 方法 mock 掉就可以了。(注:本系列基于 Mockito 4.6.1 源码)可以看到,在创建 对象时,Mockito 会指定 作为 :这里的 并非一个字符串,而是某个对象。总之就是,根据这个配置,在对 mock 对象进行方法调用时,默认会执行真正的方法,而不

2022-06-04 19:06:33 642

原创 使用 Optional 写出更简洁清晰的 Java 代码

Optional 是 Java 8 中引入的功能,很早就听说过,但一直没实际用过。直到这两天在某开源项目里看到 Optional,没看懂,查了一下用法,这才恍然大悟,原来这东西这么有用!简单来说,如果你的代码里有很多 这样的判断,那么 Optional 能帮你把它们都除掉!写出更简洁清晰的代码。(这个功能类似于 和 中的可选链(Optional Chaining))下面举个例子。假设需要根据客户端传来的 查找相应的 data,有两点要求:如果不用 Optional,一般情况下我们会这样写:使用 O

2022-06-04 12:30:43 249

原创 Mockito 实现原理(1):基本原理

最近开始读 Mockito 的源码,还挺有意思。先简单说说它的基本原理吧!(注:本系列基于 Mockito 4.6.1 源码)Mockito 最基本的用法就是 mock 一个对象,然后在调用其方法时返回指定结果。以一段最简单的代码为例:这个效果是如何实现的呢?事实上,Mockito 提供了不止一种方法来实现上面的 mock 效果。在 中定义了一个 接口:这个接口有好多个实现类。目前我执行时发现,默认用的是 这个实现,所以下面就讨论该实现的具体步骤。第一行调用 时, 首先会做的就是创建一个 moc

2022-06-03 20:30:26 1410

原创 浅谈设计模式(2):装饰模式

继上一篇讲了简单工厂模式之后,这一篇谈谈装饰模式(Decorator Pattern),也叫装饰器模式。这也是继简单工厂模式之后,我实际工作中用到的第二种模式。装饰模式极为常见,一个很典型的例子就是缓存。很多时候一个业务组件已经实现了其功能,但我们希望给它加上一层缓存。大多数情况下,缓存的逻辑和该业务组件的内部逻辑完全无关,所以当然应该分开来写。甚至,这个业务组件根本就不应该知道缓存的存在!为什么呢?因为业务组件是业务逻辑,缓存只是技术细节,不应该用技术细节去“沾染”业务逻辑。这种情况下,装饰模式是当之无愧

2022-06-02 20:51:52 170

原创 浅谈 Mockito:Java 单元测试神器

背景背景Mockito 解决的问题Mockito 的优点优点 1:简单易用优点 2:功能强大优点 3:语法优美小结背景记得刚开始学 Java 那会儿看过一个讲解 Mockito 的视频,当时不理解,感觉这东西不过如此,平时不太会需要用到,就把它忘到九霄云外了。两年过去了,翻过来看到了同一个视频,这才意识到这东西的重要性!简直就是开发效率提升神器好不好!两年间,是我的编程习惯发生了天翻地覆的变化。之前的我喜欢学新技术,喜欢把功能快速实现(当然,也是产品的压力在那里),不太在意代码的可维护性,单元测试更

2022-05-28 18:30:44 551

原创 浅谈设计模式(1):简单工厂模式

作为“浅谈设计模式”系列的第一篇,简单谈谈“简单工厂模式”(Simple Factory Pattern)。这是非常简单实用的一种创建型设计模式,也是我在实际项目里用到的第一种设计模式。为什么需要简单工厂模式?简单工厂模式是一种创建型设计模式,换句话说就是用来创建对象的。创建对象很简单,用 new 关键字就可以了。为什么需要简单工厂模式呢?如果需求永远不会变化,一遍写完就可以了,那么的确用 new 关键字来创建对象就足够了,没什么问题。但实际情况往往比较复杂。一个案例说一个根据实际项目改编的案

2022-05-21 13:31:23 269

原创 再读《架构整洁之道》

前一阵子读了 Robert C. Martin(Bob 大叔)的大作《架构整洁之道》,觉得挺有意思,但很多地方没细看。五一假期,拿起来重读。说说读这本书的几个收获吧:收获 1:SOLID 原则第一遍刚开始读,最大的感受是,这东西离我好远!这辈子就没听说过 SOLID 原则,但写了这么久代码,不也好好的吗?为什么要整这么多抽象、枯燥的原则把人绕晕?后来看了一些关于设计模式的书,这才逐渐发现,SOLID 原则的确是很有道理。不过不得不说,SOLID 五原则的重复性非常强。其实我觉得,它们归根

2022-05-04 11:12:27 272

原创 《大型网站技术架构》读后感

五一期间终于读完了李智慧的《大型网站技术架构》。虽然是一本 2013 年的老书,但很多思想非常有启发性,即便 10 年之后读来仍然醍醐灌顶。技术方面自然学到了很多东西,但更多的是收获了一些思想。挑个重点说吧:书中反复出现的一个观点是,大部分情况下,是业务推动技术,而不是反过来。技术最终是为业务服务,是业务需求的增加推动了技术进步,而不是为了技术而改进技术。我十分认同这个观点。书里还举了一个特别好的例子:淘宝技术架构的演进。之前读过《淘宝技术这十年》这本书,熟悉这段历史,但作者的几句点评,又让

2022-05-03 12:19:36 1359

原创 《重构》读后感

五一假期头两天,终于拜读了马丁福勒的大作《重构》。第一印象是,不像那些大部头,这书名气虽大,但通俗易懂,读起来很畅快。花了不到一天就把前面论述部分读完了,剩下后面的“重构名录”回头有时间慢慢翻阅。收获很多,下面分别说说最大的收获、共鸣和感悟:最大的收获:重构要小步慢来印象中至少有两次,我的重构尝试悲惨收场:规划了一个看起来很不错的重构方式,但做到一半发现功能坏了,debug 很难,迫于进度压力不得不丢弃所有改动,在原有架构上继续新增功能。相当于所有重构努力全部白费了。看完这本书终于明白了

2022-05-01 15:26:11 706

原创 JavaScript 神奇的 sort() 方法

最近做一道算法题,感觉写的算法没错啊,可结果就是不对。调试很久之后发现,竟然是 sort() 方法出了问题!示例如下:a = [1, 2, 3, 10]a.sort() // a = [1, 10, 2, 3]惊呆了!一时间以为我排序的是字符串而不是数字。可我用的明明是数字呀!然后又读了一般 MDN 上的相关文档:Array.prototype.sort(),发现人家还真就是这么定义的!默认会把数字先转换成字符串再排序!我晕!!这是谁设计的??如果想要正常按大小排序,需要这样:a = [

2022-04-02 07:48:59 798 1

原创 为什么会有不同的 IO 模型(BIO、NIO、AIO)?

背景经常在书里看到关于 IO 模型的讨论,虽然没实践过,还是对这方面很好奇。抽空写一下自己的理解。为什么会有不同的 IO 模型?学习过程中最令人费解的问题是,为什么有这么多不同的 IO 模型?为什么非得这么复杂?可以说,时延是最大的幕后元凶,主要是网络通信时延以及用户时延(比如用户思考和打字的时间)假如有 100 个人排着队和你聊天,你先和第一个人聊天,聊完了再和第二个人聊。有什么复杂的吗?没有,很简单。不需要什么复杂的策略,“先来先聊”即可。可一旦把时延加进来,问题就复杂了!在现实

2022-03-27 11:06:51 468

原创 SDUI(服务器驱动 UI)开发感受

背景最近在参与公司的一个 SDUI 项目,参见 :初识 SDUI(Server-Driven UI,服务端驱动 UI)_兜兜小猎犬的博客-CSDN博客)目录背景什么是 SDUI?为什么要用 SDUI?SDUI 的缺点和局限服务端的返回数据庞大,传输时间长开发和测试难度增加谁在用 SDUI?Spotify爱彼迎Lyft小结背景最近参与了公司的一个项目,要把公司的网站和 APP 整个重写一遍(我只参与其中 Web 的部分),并且新的系统是基于 SDUI(Server-Driven UI,服务端驱动 UI)的

2022-03-26 09:12:52 2294

原创 项目回顾:一个简单的充值码库存管理系统

这里写目录标题背景需求第一步:从商家获取充值码第二步:需要能在平台上售卖充值码第三步:后台管理系统实现防止重复售卖、重复发货防止超售邮件系统小结背景回顾一下去年 6 月左右做的一个库存管理系统。需求我们是做一个游戏充值平台,最早我们是分销,给别的充值平台引流,最终的支付和发货(即充值到账)都是在合作伙伴系统里完成的。这回第一次上线自己的售卖系统,先从最简单的充值码做起,因为不需要太多后台对接,无论我们还是游戏商家做起来都容易。第一步:从商家获取充值码当时是从商家拿了一个 Excel 表,表里存

2022-03-25 10:52:44 2299 1

原创 通过 useEffect 让过期请求自动失效

目录背景实现代码说明参考链接背景很多时候都会遇到这么一种场景:需要不断发送请求,并且新请求发出去的时候,旧请求就过期了。但如果旧请求反而后收到结果,就可能会覆盖更新的结果,造成数据错误。举例来说,假设要实现一个实时搜索框,用户在键入的过程中就可以看到结果,不需要按回车键。例如用户输入 “cat”,则会依次发送 3 个请求:“c”、“ca”、“cat”。这时候,即便 “ca” 的结果比 “cat” 后到,也一定不能覆盖 “cat” 的结果。实现代码示例代码如下:const [searchQue

2022-02-27 14:30:06 252

原创 React Native Expo 项目中添加动画音效

目录背景实现代码参考链接背景最近做一个学校作业,用 React Native 写一个游戏。游戏中涉及一个物体下落的动效,是用 React Native 的 Animated API 实现的。现在希望在物体落地的时候发出“嗒”的一个音效,没想到还挺麻烦。首先需要一个库来实现音频的播放。网上搜了一下,大部分人的解决方案都是用 react-native-sound 这个库。我照着试了一下,安装很麻烦不说,即便我只是像下面这样引入这个库:import Sound from 'react-native-so

2022-02-17 21:55:17 2585

原创 React Native 中使用 Animated 实现物体下落动效

目录背景实现代码需要注意的几点效果参考链接背景学校留了一个作业,要用 React Native 做个游戏。我做的游戏涉及物体下落的效果,今天来尝试一下使用 React Native 的 Animated API 来实现这个效果。实现代码比较简单,这次直接上代码吧:import { useRef, useEffect } from 'react';import { Animated, Dimensions } from 'react-native';const WINDOW_WIDTH =

2022-02-06 18:25:30 3101

原创 使用 Matter.js 在 React Native 中实现物体下落

目录背景Matter.js 简介使用 Matter.js 实现物体下落参考链接背景最近学校有个作业,用 React Native 做个游戏。我想在里面加一些物理效果,比如物体下落。如果自己写的话会比较麻烦,不如直接用现有工具。使用 React Native 的一大好处就是,可以直接用现成的 JavaScript 库,比如物理引擎 Matter.js。Matter.js 简介简单来说,Matter.js 分为两部分:物理引擎(Matter.Engine):你可以创建一些物体,指定物体的属性(例如

2022-02-04 21:38:42 1154

原创 如何正确搭配使用 useEffect 与 setInterval

目录背景失败的尝试哪里出错了?正确写法方法一方法二参考链接背景useEffect 看似很简单,其实不然。由于没有理解 useEffect 的工作原理,我被狠狠坑了一回。事情是这样的:我想实现一个很简单的“物体下落”效果:物体的垂直位置用 positionY 这个 state 来表示,从上往下计算, positionY 越大就离屏幕顶端越远;设置一个 setInterval,每隔一小段时间(30 ms)就增加 positionY,然后基于 positionY渲染物体,从而实现“物体下落”的效果;

2022-02-02 20:35:15 2430

原创 修改一行代码需要多久部署上线?

目录背景只修改一行 CSS 代码第一座大山:代码库分离第二座大山:Peer Review第三座大山:GitHub Actions小结背景之前在一本讲持续交付的书里看到过一个衡量持续交付能力的方法:假如只修改一行代码,这个改动需要多久才能部署上线?这个指标非常有意思。下面我就简单分析一下,在我目前参与开发的前端项目中,从修改一行代码到部署到测试环境(因为项目还没上线)需要多久。只修改一行 CSS 代码修改一行代码很容易,这里再假设一个最简单的情况:只需要修改一行 CSS 代码。但即使是这样,在通向

2022-02-02 01:16:18 429

原创 MobX store 基于另一个 store 做出 reaction

目录背景RootStore 模式Reaction参考链接背景最近遇到一个问题:我们每个域(Domain)都维护自己的一个 MobX store,通常情况下不需要和其他 store 产生联系。比如我们是搜索引擎组(相当于一个域),只需要维护自己的 store 就行了。但突然有个需求,需要我们这个 store 和用户账户组(另一个域)的 store 产生联系:当用户在同一个账户下切换使用者子账户时(比如一家几口人共用一个账户,但有各自的使用者子账户),我们就要加载相应子账户的搜索历史记录。简单来说就是:

2022-02-01 11:26:45 1117

原创 如何在 Spring Boot 启动之后触发代码逻辑

目录背景Spring Boot 启动之后执行代码逻辑参考链接背景这周遇到一件很棘手的事情。在启动某个 service 时,我需要初始化一个缓存。按照之前的逻辑,初始化只需要从本地存储中加载一个文件就行了,当时用 Spring 的 @PostConstruct 注解成功解决了这个问题:@Servicepublic class MyService { @Resource SomeDao someDao; // 数据库的 DAO @PostConstruct private void

2022-01-31 18:10:39 1944

原创 初识 GraphQL 和 Apollo Federation

目录背景为什么要用 GraphQL?为什么要用 Apollo Federation一个真实的案例小结:什么样的团队适合使用 GraphQL背景GraphQL 自诞生以来就被寄予厚望,被认为是一种有望替代 REST 的新一代服务端调用方式。而 Apollo Federation 这个工具是对 GraphQL 的一种增强,让 GraphQL 能够更好地应用在微服务架构下。下面就来简单分析一下,为什么要使用 GraphQL / Apollo Federation?为什么要用 GraphQL?那么,Gr

2022-01-31 15:56:21 1991

原创 获取 TypeScript enum 类型的键名称

目录背景解决方法参考链接背景在 TypeScript 中,通常基于数值来创建 enum 类型,例如:enum Direction { Up = 1, Down, Left, Right,}这样的话,Direction.Up、Direction.Down、Direction.Left、Direction.Right 的取值就分别为 1、2、3、4。但前两天我遇到了一个比较奇怪的问题:后端传来一个值,我需要检查一下它属于该 enum 类型中的哪个类别,然后据此执行后续逻辑。类似于这

2022-01-24 18:31:41 4462

原创 解决 React Native Expo 项目运行太慢的问题

目录背景解决背景最近在做一个学校的项目,用 Expo 开发一个 React Native 的项目。今天尝试加一个物体坠落的动效,发现慢的出奇!根本没法用啊。花了半天时间,尝试排查各种原因,无果。一开始以为是我写的代码的问题,后来把能解决的都解决了,甚至完全换上别人写好的、一定没问题的代码,居然还是一样慢!最后想到,是不是因为一直开着远程调试?这还是做上一个项目的时候开的,但因为所有项目都是从同一个手机上的 Expo 应用中打开的,所以 Expo 仍然保留了远程调试开启的状态。解决尝试关掉了 E

2022-01-24 00:39:58 3242 1

原创 浅谈开源软件许可证(1):MIT 与 Apache 许可证

目录背景开源软件许可证MIT 许可证Apache 许可证其他许可证MIT 许可证 vs Apache 许可证共同点:区别 1:商标使用权区别 2:许可证长度区别 3:小结参考链接背景作为程序员,每天的工作都在和开源软件打交道,但很少有机会了解开源项目背后的运作方式。最近脑子里冒出来一些问题,比如:为什么有这么多不同的开源软件许可证?如果我开源一个自己的小项目,应该选择哪种许可证?谁来监督许可证法律效力的执行?等等。打算抽空研究一下这些问题,不如从两个目前最流行的许可证开始吧:MIT 许可证和 Apa

2022-01-23 12:33:13 5698 4

原创 如何为开源项目取名字?

目录背景软件的商标小结背景前两天突然冒出来一个脑洞:开源项目是可以随便取名的吗?比如现在已经有了个卡夫卡(Apache Kafka),那我搞个项目叫贝多芬行不行?叫达芬奇行不行?谁来告诉我什么名字不能用?软件的商标带着这个问题,简单在网上研究了一下,发现情况和我想的还是挺不一样的。以前只知道 Java 是个商标,这回搜了一下才发现,原来平常用到的大多数软件,即便是开源的,也是有商标保护的,比如以下商标:Java(属于 Oracle 公司)JavaScript(同样属于 Oracle)My

2022-01-17 00:39:57 1714

原创 Lucene 索引原理系列(1):索引分段

目录背景搜索引擎的核心:倒排索引Lucene 的索引实现为什么 Lucene 要对索引分段?为什么段是不可变的 ?分段会带来什么问题?小结参考链接背景刚接触 Lucene 时,只求能用就行,至于背后复杂的设计和原理,我看得晕头转向,云里雾里。比如,作为搜索引擎核心的倒排索引概念,原理上其实不难理解,但怎么一到了具体的实现,就多出了这么多复杂的设计!倒排索引本质上不就是个哈希表吗,为什么在 Lucene 里要分段(Segment)?为什么每个段都是不变的,从而带来了段合并(segment merg

2022-01-16 13:10:56 789

原创 TypeScript 中 import type 与 import 的区别

目录背景`import type` vs `import`使用 `import type` 的好处参考链接背景这周遇到了一个比较奇怪的问题:如何在 TypeScript 中根据某个 enum 的取值来执行后续逻辑?按理来说应该很简单,这是 enum 的定义:export enum MyEnum { DEFAULT = 0, SOME_VALUE = 1, SOME_OTHER_VALUE = 2,}然后在另一个项目中,通过 import type 来引入:import type

2022-01-15 20:26:30 29418 30

原创 Java 并发编程基础实例:Runnable 与固定大小线程池

目录背景RunnableExecutors.newFixedThreadPool小结参考链接背景之前虽然在书里学过 Java 并发编程的基础,但一直没有在实践中用到过。直到上周,终于在项目看到了一个活生生的例子。这个例子也非常基础,需求大概是这样的:我们基于 Lucene 做站内搜索引擎,每天都需要重新构建一次索引,因为每天都会产生新内容(之所以彻底重新构建一遍,是因为内容量也没有那么大,与其在原有索引后面追加新索引,不如重新构建,因为这样查询起来更快);在构建索引时,需要请求 CMS 数据库,

2022-01-10 01:07:03 588

原创 React Native 初体验

目录背景从 React 到 React NativeExpo开发与调试样式小结背景之前做过 React 前端开发,这学期学校有一门移动开发的课教 React Native,我就选了。上了半学期,做了几个小的 React Native 项目,感觉还挺好,简单写写 React Native 的开发体验。从 React 到 React Native直到接触了 React Native,我才惊叹于 React 的强大。因为从 React 到 React Native,学习成本实在太低了!你还是在用 Rea

2022-01-08 23:57:35 338

原创 Java stream 中 peek() 的合理用法

目录背景最终操作(terminal operation)peek() vs forEach()peek() 的典型用法:协助调试参考链接背景这周遇到了一件很有意思的事情。在看项目代码时,发现了这么一段:return objects.stream() .peek(object -> addInfo(object, someParams)) .collect(Collectors.toList());因为之前没接触过 peek(),这段代码看得我云里雾里。后来在

2022-01-08 19:12:39 46141 11

原创 解决 bash 命令实际执行路径与 which 路径不匹配的问题

目录背景bash 的命令执行路径缓存检查缓存删除缓存背景简单写写这周遇到的一个有意思的小问题。之前用 AWS 的命令行工具 aws-cli,遇到点儿问题。看官方文档,说如果用的是 1.x 版本,那么最好先卸载,然后重装 2.x 版本的 aws-cli。我看了一下,我用的果然是1.x 版本,于是卸载掉,重装了一个 2.x 版本的 aws-cli。但奇怪的事情发生了,我在执行 aws 的时候,会提示该文件不存在:$ aws-bash: /old/path/to/aws: No such file

2022-01-08 12:07:44 757

原创 闲谈 Git:学习曲线

目录背景Git 学习曲线阶段 1:init, commit, push阶段 2:status, log, reset阶段 3:branch, PR, conflicts, stash阶段 4:cherry-pick, rebase...小结背景掌握 Git 不是一件容易的事情。虽然我现在 Git 用得已经比较顺手了,但回想起刚接触 Git 时(也就 4、5 年前),看到那么多纷繁复杂的功能和流程,那种望而生畏、不知何从下手的感觉仍然历历在目。回顾一下这几年,Git 的学习还是有一个清晰的脉络的,那就是

2022-01-03 15:05:34 252

原创 使用 Luke 浏览 Lucene 的索引

目录背景下载 Luke运行 Luke基本功能加载索引浏览 Documents基础搜索小结背景我目前所在的搜索团队用 Lucene 给公司的在线视频应用做站内搜索(对,你没看错,是直接用的 Lucene 而不是 Elasticsearch!之后等我熟悉架构了可以写写直接用 Lucene 的优缺点),索引是每天更新一次。最近在做国际化,新增了一个语种的 analyzer,并且索引里也会加一些字段。为了验证和测试这些改动,我需要在索引里加一些 mock 的 document,看看能不能搜到。写入 mock

2022-01-03 00:55:06 1746

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除