编程导航随笔话题讨论

随笔

9 参与
分享

快来分享你的内容吧~

点击登录,快来和大家讨论吧~
表情
图片
话题
打卡
综合
交流
文章
问答

2025/7/1 【 改变 · 现在的自己 】

## 往昔 现在的我,明显比起大学里的自己不再是对计算机一无所知,已经非常明确它的基本结构和使用逻辑。 - 基本结构:硬件功能 - 操作系统 - 文件 - 使用逻辑:信息论,信息传递与使用 但达到了这一程度后,抱着“做项目”、“收集工具”这种想法继续去阅读资料、做题和学项目,却不再感到有明显的提升。直到偶然我再次阅读算法书,试着做以前做不了的算法题之后,我发觉我找到了答案: 1. 我一直以来都是抱着阅读资料提取其中有用的信息的想法来使用着这些资源,但在我能够从中提取重要概念并获得工具后,我就再也没有获得新东西,似乎资料被用尽了。 2. 直到我真正抛弃资料的时候,我才感觉到自己才开始熟悉工具了。直到我离开那些资料后,直到我写代码不再想着去参考资料的时候,工具才真正变得更加清晰、可触。 原来,直到我逼迫自己不依靠任何资料去编写代码,我才真正开始熟悉工具;直到我逼迫自己不依靠任何捷径去获取业务,我才真正开始熟悉业务。这才是开启新阶段的密码! ## 未来 数据,这个概念蕴含了我想要研究的一切,比如人如何从实际形成记录、一步步拓展结构、完善体系,构造出美妙又具有价值的思想工具,思想工具究竟时如何与实际交织融合。下一阶段,要从这个概念出发。 探索历程,还需要留下痕迹,以将这件事铭刻于心,不再重蹈覆辙。要形成层次结构明确且记录对象明确的记录,同时需要提醒自己简历每天的状态是否有所丰盈。

删除不了jar包-maven clean package失败

删除不了jar包 ======== 背景 在删除jar包的时候删除不掉 <img src="https://pic.code-nav.cn/post_picture/1813946725418893314/3NSyQx5pO6zZuVHp.webp" alt="" width="100%" /> 分析: jar包正在运行 解决 我并不知道jar包,在哪运行。 可以根据jar包名称 查找 1.查找所有的java运行的程序,并且显示详细信息 ```shell jps -lv ``` 2.根据jar名称查找运行的端口 在终端 ctrl + f 数据jar包名称 <img src="https://pic.code-nav.cn/post_picture/1813946725418893314/xVl8TX87UY5nW2GX.webp" alt="" width="100%" /> 3.杀死所运行的进程id ```shell taskkill /F /PID 16668 ``` 测试, 再次maven clean 成功,当然package 也成功 <img src="https://pic.code-nav.cn/post_picture/1813946725418893314/fp9mHlJw6jdiZMb1.webp" alt="" width="100%" />

谷歌浏览器驱动和浏览器版本不一致问题

谷歌浏览器驱动和浏览器版本不一致问题 ------------------ 背景:在使用的一个项目的时候,之前可以正常使用,但是最近突然不能用了,报错如下 ```shell Exception in thread "main" org.openqa.selenium.SessionNotCreatedException: session not created: This version of ChromeDriver only supports Chrome version 133 Current browser version is 135.0.7049.42 with binary path C:/Program Files/Google/Chrome/Application/chrome.exe ``` <img src="https://pic.code-nav.cn/post_picture/1813946725418893314/krx192b9r7WqUQEC.webp" alt="" width="100%" /> 原因是,项目中的浏览器驱动和浏览器版本不一致了。 解决办法首先就是,退回到之前版本的浏览器,发现官方并没有提供下载链接。 经过查阅资料,发现了一种官方源的下载方式 网址:[History for bucket/googlechrome.json - ScoopInstaller/Extras](https://github.com/ScoopInstaller/Extras/commits/master/bucket/googlechrome.json) 如图 <img src="https://pic.code-nav.cn/post_picture/1813946725418893314/Yqi7KyoJj8234lO6.webp" alt="" width="100%" /> 以我要下载的133.0.694.x为例 我是64位的操作系统,所以直接找到64bit的包,复制绿色框的url:即可下载。 <img src="https://pic.code-nav.cn/post_picture/1813946725418893314/t82CPF0swXd8xVRK.webp" alt="" width="100%" /> 关于自动更新这个问题:删除新版本之后,在下载老版本不会自动更新。

# 随笔 最近不是学校安排了实训吗,然后带队的主要让我们使用mybatis,selvert,mysql等实现的一个小系统,然后今天去答辩,问的问题全都是mysql和数据库的知识,然后发现基本上完全重合面试鸭的题目,因为这个实训是公司的来带的,所以答辩他就问的一些企业常问的面试题目,答辩完后,回头看面试鸭,发现真的[面试鸭](https://www.mianshiya.com/)还是太全面了!!!

类型

# 类型 探究技术的本质,追寻技术的乐趣!如题,今天我们来聊聊类型,这里的类型需要限定范围,特指编程语言中的类型。如果要给众多编程语言按照类型来分类的话,可以分为两类,一类是静态类型的语言,一类是动态类型的语言。静态类型的语言的典型代表Java,动态类型的语言的典型代表Python。无论是动态还是静态都逃不出类型,就如同小说中常说的一样,"跳出三界之外,仍在五行之中",显而易见,类型是编程语言最基本的语法元素,就如同句子的主语一般,不可缺少。基本有时候会省略主语,那也是在上下文的环境中隐含了主语。就如同编程语言中的类型推导一般,比如Go中 var name = "pandaer"。既然类型如此基础,那么类型究竟代表了什么呢?我认为我们看待类型有两个视角,一个对内,一个对外。 ## 对内:CPU的视角 CPU才不管你是什么类型,CPU只认机器码,也就是0101序列。根据机器码执行指令操作内存,如果你写过汇编代码,那么你一定有感触,读写内存的方式是使用内存地址,而且稍不注意就容易写错内存地址。这种没有边界检查式的读写内存,心智压力极大。也是因为这个原因,各个高级编程语言就利用类型来限定我们能够操作内存的范围。在高级编程语言中,变量就可以看成内存地址,因为内存地址是一串数字不方便记忆,所以利用变量来替代。而为变量赋予类型就是就是限定这个变量能操作的内存的范围。比如 var num int64要表达的意思就是num这个变量能操作的内存单元大小只有8个字节。通过类型来限制能够操作的内存范围,极大的减少了心智负担。这也是为什么C语言中的指针容易出错的原因所在,即失去了内存的范围限制。 ## 对外:建模的视角 建模,其实就在在构建我们的程序的时候,只抽取对我们程序而言相关的属性,比如对于书而言,如果我们构建的是一个在线图书馆程序,我们可能更加关注书的名字,出版社,书的分类。而如果我们开发的是一个书店项目,我们可能更加关心书的价格,书的销量这些属性。而类型就提供了建模的能力,比如对于书而言,我们可以使用String类型来表示书的名字,使用Int类型来表示书的页码。 ## 总结 类型对内限定了变量能够访问的内存范围,提高程序的安全性,对外提供了建模的手段。

分享内容有什么要求

分享内容有什么要求,刚看到这个功能,具体分享什么不知道

Redis 持久化问题 我们都知道Redis是基于内存的,而内存的特点就是掉电数据丢失,为了解决这个问题,Redis提供了两种持久化方案,一种类似快照形式,一种类似日志形式,两者各有优缺点,下面且听我娓娓道来。 Redis提供的持久化方案为RDB以及AOF,RDB全称Redis Database Backup File, 这个方案类似于快照,是某个时刻Redis的数据的备份。AOF全称Append Only File,这个方案类似于日志记录,记录从Redis启动开始,所执行的写操作的指令。两种方案各有千秋,我们先来说说RDB吧,RDB是Redis默认开启的,会在Redis主动退出的时候,自动执行一个RDB操作,生成一个xxx.rdb文件,除此之外你也可以在配置文件中配置多久执行一次RDB操作。由于RDB文件保存的是Redis的数据备份,因此在重新启动Redis做数据恢复时会很快,但是成也快照,败也快照,虽然在启动的时候快,但是在Redis运行的时候,如果主进程进行RDB操作,由于RDB操作涉及磁盘IO,耗时较多,就会导致主进程阻塞,无法执行其他命令,破坏了Redis的可用性。不过这种情况Redis已经考虑到了,提供了异步的RDB操作,而且默认也是异步的RDB操作。但是异步的RDB操作是基于多进程的,即便Linux使用的是Copy-On-Write模式,在最坏的情况下,内存中会有两分一模一样的数据,导致内存空间浪费,甚至有可能因为这个导致OOM的发生。为了解决这个问题,Redis给出了另外一种持久化方案AOF,在每次执行AOF操作的时候,不再是备份Redis中的数据了,而是记录执行成功的写操作指令,降低了在运行时的耗时操作,以及由于异步导致的内存占用问题。但是代价就是文件的大小会很大,而且存在冗余,比如之前执行了set num 123 过了一会又执行set num 999 ,在进行数据恢复的时候,我们只需要set num 999 但是却执行了这两条指令,因此在重新启动的时候,速度慢。这个问题Redis也考虑到了,通过一条指令可以整理xxx.aof文件,尽量的减少无用的指令。这个命令是 BGREWRITEAOF 稍微总结一下,RDB在启动的时候速度快,但是在运行时,可能会占用过大的内存,而AOF在启动的时候需要逐条执行指令,速度慢,但是在运行时,速度快,但是aof文件大小可能会很庞大。 现在我们可能就体会到了每种方案都不是完美的,有种鱼和熊掌不可兼得的感觉。但是有时候 一加一可能大于二,在Redis7的版本中(我忘了什么时候开始的了),一旦开启了AOF,其实就是AOF和RDB的结合模式了。具体的流程是这样的,起初会进行一次RDB操作,然后在运行时执行AOF操作,等到自动执行BGREWRITEAOF的时候,就会再进行一种RDB操作,并重新生成一个AOF文件。然后当Redis主动停机的时候也会执行一直RDB操作,同时生成一个新的AOF文件。这样就在一定程度上实现了鱼和熊掌我都要。到此,我们就阅完了Redis给持久化问题交出的答卷,不知道你从中学到了什么呢?下面我们来聊聊Redis如何解决性能问题的! #随笔# #Redis#

微服务可用性-超时控制

## 超时控制 @2024/07/12 好久不见,甚是想念,今天我们来聊聊保证微服务架构高可用性的另一个手段,超时控制。超时控制的作用可以及时释放资源,提高系统资源的利用率,而且还能保证客户端在预期的时间内可以获得响应。而超时控制在微服务领域存在两种形态,第一种就是我们熟悉的客户端-服务端的超时控制,可以称之为**端到端的超时控制**,比如服务A需要调用服务B,如果调用服务B的时间超过了预期的时间,那么服务A就不会再管服务B是否完成了,而是释放连接,返回给用户一个超时的响应。第二种也是微服务领域比较常用的一种,**链路超时控制**,这种类型的超时控制视角变大了,保证的是一个业务的超时控制,比如一个下载订单的业务,需要通过用户服务A获取用户信息,判断他是否有权限查看订单数据,然后通过订单服务B获取订单数据,格式化数据,最后通过文件服务C将订单数据打包成一个文件返回给用户,这个业务经历了三个服务 A→B→C,链路超时控制指的就是这个调用链路的调用时间不能超过预期的值,超过了就必须中断业务,返回超时响应。这就是目前主流的超时控制思路,但是超时控制的时间如何设置才是超时控制中最重要落地的一部分,因为如果时间设置的过长,就会导致系统资源耗尽(线程资源,连接资源等)服务崩溃,设置过短会导致服务一直在频繁重试得不到真正的业务执行。所以**合适**的超时时间是非常重要的。那么有没有什么方法论可以帮助我们在确定超时时间这件事上有迹可循呢?答案是有的,我们回到超时控制的目标上来,超时控制的目标有两个,一个是保证系统的可用性,即及时释放资源,另一个就是保证客户端在预期的时间内获取反馈。所以我们可以根据用户的体验来设置超时时间。这种事情我们可以循环产品的设计者--产品经理,如果这种方法行不通,我们可以根据被调用服务的响应时间来设置超时时间,基本上以被调用服务响应时间的99线,或者999线为超时时间,这里补充一个点,99线,就是99%请求的响应时间都这这个时间内。999线类似。但是如果你没有被调服务的99线,就只能模拟线上环境,进行压力测试。然而很多公司并没有模拟好的线上环境,所以这个办法也有可能行不通,所以你需要估算被调服务的代码中的耗时操作的时间,比如被调服务A 进行了2次数据库连接,1次Redis访问,那么估算耗时时间为:数据库响应时间 X 2 + Redis响应时间 X 1。稍微小结一下,确定超时时间有四种办法,优先级逐级降低,复杂程度逐步升高 1. 根据用户体验 2. 根据被调服务响应时间 3. 根据模拟线上环境的压力测试 4. 根据被调服务的代码估算 确定了超时时间,接下来我们来思考一个问题,那就是在服务端执行业务的过程中超时了,我们是中断业务的执行呢?还是继续执行业务呢?按照我们认知的来说确实应该中断业务,因为毕竟这个响应超时了,但是如果要实现这一目标,尤其是在端到端的超时控制中,你不得不在业务手动判断当前这个请求是否处理超时了,据此来判断业务是否继续执行。而在链路超时控制中,由于业务被分为了几个步骤,我们可以在这几步中,进行超时校验来中断业务。链路超时控制中,最重要的事情就是传递超时时间,是传递过期时间段,还是传递过期的具体时间呢?比如超时时间是1s,现在是9:30:58,那么传递的过程中是传递`timeout:1000`,还是`timeout: 9:30:59`呢?两者都有利弊,先来说说传递时间段,传递时间段的问题在于,网络传输时间的不确定性,比如服务A调用服务B,在调用服务B之前,已经消耗了300ms,那么交给服务B的超时时间就只能为700ms了,当服务B接受到服务A的请求时,拿到的超时时间也不过是协议头中设置的700ms,没有了传输时间,所以我们需要根据大量的测试,来估算出这段传输时间。当然你也可以结合时间戳,比如在协议头中记录了调用服务B时的时间戳,然后当服务B接收到的时候,根据自己的时间减去协议头中记录的时间就可以得出传输耗费的时间,但是这个策略多此一举,与其这样,不如直接使用超时时间戳,还是这个例子,服务A调用服务B,当服务A接收到用户的请求时,根据这个业务的超时时间,记录超时时间戳,比如当前时间为9:30:40,这个业务的超时时间为1s,那么超时时间戳为9:30:41,将这个时间戳传递给服务B,服务B在执行业务的时候判断当前时间是否超过了这个时间戳就可以了。但是使用时间戳是存在问题的,即时钟回拨问题,简单而言就是两个服务之间的时间不一致,就会发生一种情况,明明超时了,服务B觉得没有超时,明明没超时,服务B觉得超时了。这就是我所知道的超时控制的全部内容,下一期我们讲远程调用。

随便聊聊🤗

大家好,我是香香。 --- 又要说 “时间过得真快” 了,不知不觉已经马上 7 月份了,而我的大学生涯也即将谢幕。 本来想着写一篇年中总结的,但是敲到这儿了,顺便来回顾一下自己的大学时光。 ### 大学 > 人,总是会在即将告别某样东西的时候,才懂得珍惜。 其实自己从小学习成绩就不好,但是这个成绩不好呢,又不是说那种 “学了但学不会” ,就是可以理解为压根不听,考试盲考,又或者说和现在的小孩比起来少了那份认知 / 紧迫感。尽管前面的话可能给人的感觉有一点点 “自吹是天才但是不主动学习” 的感觉,但是事实就是如此。 不出意外。。高考结束之后我非常顺利的进入了职业技术学院;同样选专业的时候也是非常坚定的选择了《计算机》,是的,非常坚定,现在也是。为什么强调非常坚定呢?其实选专业的时候,根本没有考虑过什么好不好就业、未来发展怎么样、薪资范围等等这些因素。原因就是,很简单,就是觉得电脑很高级,想看看到底怎么事。 ### <div style="text-align:center"> <img src="https://pic.code-nav.cn/post_picture/1661055852716494850/09USXnNR-image.png" alt="Image" /> </div> ### 紧接着就进入了学校学习,但是这个 “高级的兴趣” 早就被刚刚进入新环境的我不知道丢去哪了。 - “大学太爽了吧,我手机可以随便玩,甚至上课也可以明目张胆的玩” - “没课的时候还能随便出门!” - “处对象!处对象! +_+ ” - .... 就这样 2 年的时间很快就过去了,心想完了呀,在我正愁毕业不知道该干嘛的时候,了解到了 “专升本”,这个每个地方的叫法可能不一样,但是意思是一样的。我当时想着:“这好呀,短时间之内不用考虑工作了”,也搞不清楚是为了 **提升自己** 还是说 **逃避就业**。 最终也是考到了一个普通学校,至少有学上了。 进入本科之后呢,不知道是因为长大了,还是说意识到可能没几年学可上了(emmm),也算是变得更加成熟了点。就会开始想自己以后要去干什么,往什么方向发展等等,这个时候已经是大三了,相比 92 或者自律的同学来说,这属于是相当晚了,本来就没有绝对的优势是吧。但是吧,很喜欢的一句话,“种一棵树最好的时间是十年前,其次是现在。”出自非洲经济学家丹比萨·莫约的《援助的死亡》一书。其实别说是大三了,即便是现在、甚至明年,只要想 就不晚。 其实在快毕业的时候才发现会舍不得,但是呢,又说不上来具体是在留恋些什么东西(呼应一下前面的引用)。 --- ### 工作 我真是更加相信了那句话:选择有时候比努力更加重要。 <img src="https://pic.code-nav.cn/post_picture/1661055852716494850/jxL6orbj-9623749286be9acfcd1cac68eb59522.jpg" alt="9623749286be9acfcd1cac68eb59522.jpg" width="100%" /> 今年从过完年之后就开始投入找工作,也算是赶上春招的黄金期了吧。Offer 拿了不多不少,虽然说都不咋地,但是最起码感觉那个时间点,拿 Offer 还是相对容易一点,可能也有运气的成分在。 但是我却选择了一个现在看来并不是很好的 Offer,这里跟小伙伴们提一句,不要!被别人的花言巧语给蒙骗了!!!反正注点意哈。 我可没有被 “蒙骗” 啊 T——T,没有的事! 每天的工作内容,说白了,代码就是 CRUD,对吧。基本上上点台面的技术呢,不是不给你学习的机会呀,是真的没有啊。整天的状态呢,就和 Yes 哥直播的时候说的:“上班和上 F 一样”。一天到晚!甚至都讲不了几句话!!(怒砸键盘) > Will choose new opportunities 太多就不说了,时间不够了,我要撤退了,反正就是大家擦亮双眼,然后相信自己吧,尽量不要有太多的负能量,慢慢来,**希望能帮助到一些人吧**。 大家都好运 我也好运 ^_^ 吃饭吃饭

下载 APP