<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Abner_G的博客]]></title><description><![CDATA[万石谷，粒粒积累;千丈布，根根织成。]]></description><link>https://blog.youkuaiyun.com/Abner_G</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Abner_G]]></copyright><item><title><![CDATA[【AI】用大白话解释Transformer：编码与解码的奇幻之旅]]></title><link>https://blog.youkuaiyun.com/Abner_G/article/details/135928213</link><guid>https://blog.youkuaiyun.com/Abner_G/article/details/135928213</guid><author>Abner_G</author><pubDate>Tue, 30 Jan 2024 11:19:05 +0800</pubDate><description><![CDATA[一个现实的例子类比Transformer
讨论“人工智能在房地产公司的使用前景”
问题背景： 正在讨论“人工智能在房地产公司的使用前景”。
多头注意力（互联网公司）： 在整个讨论过程中，有6家互联网公司参与。每家公司充当一个“编码器”，并为整体讨论提供独特的视角。这就是多头注意力的体现，每个编码器（公司）关注讨论中的不同议题。]]></description><category></category></item><item><title><![CDATA[【踩坑日常】解决 ClickHouse 分布式表重建引发的元数据异常问题Existing table metadata in ZooKeeper differs in primary key.]]></title><link>https://blog.youkuaiyun.com/Abner_G/article/details/135919514</link><guid>https://blog.youkuaiyun.com/Abner_G/article/details/135919514</guid><author>Abner_G</author><pubDate>Mon, 29 Jan 2024 19:58:36 +0800</pubDate><description><![CDATA[在线上分布式 ClickHouse 数据表结构需要调整，这要求删除现有的分布式表，并重新创建（DDL 发生变化）。然而，删除表后重新创建时可能会出现异常。]]></description><category></category></item><item><title><![CDATA[优雅处理MyBatis与Apollo集成中的配置加载]]></title><link>https://blog.youkuaiyun.com/Abner_G/article/details/134839336</link><guid>https://blog.youkuaiyun.com/Abner_G/article/details/134839336</guid><author>Abner_G</author><pubDate>Wed, 06 Dec 2023 19:45:57 +0800</pubDate><description><![CDATA[通过本文的介绍，你可以了解在不使用传参的情况下，如何在MyBatis的mapper文件中读取Apollo中的配置信息。选择适合你项目的方式，确保能够正确读取到配置，提高系统的灵活性和可维护性。希望这篇博客能对你有所帮助。请注意，这只是一种可能的解决方案，具体实现可能因项目结构和框架不同而有所差异。确保在应用启动时提前加载Apollo配置，以确保其他组件在初始化时能够正确访问到配置信息。]]></description><category></category></item><item><title><![CDATA[【踩坑日常】解决Eureka启动报错：Network level connection to peer localhost；retrying after delay]]></title><link>https://blog.youkuaiyun.com/Abner_G/article/details/134785968</link><guid>https://blog.youkuaiyun.com/Abner_G/article/details/134785968</guid><author>Abner_G</author><pubDate>Mon, 04 Dec 2023 16:56:43 +0800</pubDate><description><![CDATA[在 Spring Framework 中，Profile 是一种用于定义一组 Bean 定义和配置的机制，这些 Bean 定义和配置仅在特定的运行时环境或应用程序配置下生效。通过使用 Profile，你可以根据应用程序运行的环境，如开发环境、测试环境、生产环境等，来灵活地管理不同的配置]]></description><category></category></item><item><title><![CDATA[【Linux】 服务器优化之定时任务：自动清理日志，重启服务]]></title><link>https://blog.youkuaiyun.com/Abner_G/article/details/134718263</link><guid>https://blog.youkuaiyun.com/Abner_G/article/details/134718263</guid><author>Abner_G</author><pubDate>Thu, 30 Nov 2023 18:30:49 +0800</pubDate><description><![CDATA[服务本地日志没有定时清理，造成机器重启机器重启之后，服务没有自动重启。]]></description><category></category></item><item><title><![CDATA[SpringBoot 项目上传文件异常【java.io.IOException: Stream closed】]]></title><link>https://blog.youkuaiyun.com/Abner_G/article/details/128471280</link><guid>https://blog.youkuaiyun.com/Abner_G/article/details/128471280</guid><author>Abner_G</author><pubDate>Wed, 28 Dec 2022 17:16:02 +0800</pubDate><description><![CDATA[项目场景：SpringBoot 项目上传文件接口异常。]]></description><category></category></item><item><title><![CDATA[【Mac 环境配置】--安装git及使用]]></title><link>https://blog.youkuaiyun.com/Abner_G/article/details/127706250</link><guid>https://blog.youkuaiyun.com/Abner_G/article/details/127706250</guid><author>Abner_G</author><pubDate>Sat, 05 Nov 2022 18:29:06 +0800</pubDate><description><![CDATA[上传至github：登录账号、点击头像、选择Settings、选择SSH and GPG keys，然后new一个ssh key。创建过程询问密钥位置，可以不用管直接enter就好。注意这里和用户邮箱一致。]]></description><category></category></item><item><title><![CDATA[【Mac 环境配置】-- 配置JAVA环境]]></title><link>https://blog.youkuaiyun.com/Abner_G/article/details/127704883</link><guid>https://blog.youkuaiyun.com/Abner_G/article/details/127704883</guid><author>Abner_G</author><pubDate>Sat, 05 Nov 2022 16:45:00 +0800</pubDate><description><![CDATA[MacOS 安装java 环境]]></description><category></category></item><item><title><![CDATA[【踩坑日常】-- clickhouse DB::Exception: Division by zero: while executing ‘FUNCTION divide]]></title><link>https://blog.youkuaiyun.com/Abner_G/article/details/127676480</link><guid>https://blog.youkuaiyun.com/Abner_G/article/details/127676480</guid><author>Abner_G</author><pubDate>Thu, 03 Nov 2022 19:40:58 +0800</pubDate><description><![CDATA[既然无论条件是什么，都会评估 if() 的 else 参数，那么在扫描的时候，加判断转化为数字，避免报错。原因可能还是跟Decimal底层的存储结构有关，底层应该做了限制，并且在除法运算中。进行判断，依旧还是报错。]]></description><category></category></item><item><title><![CDATA[【锁】synchronized(源码c++)]]></title><link>https://blog.youkuaiyun.com/Abner_G/article/details/125775876</link><guid>https://blog.youkuaiyun.com/Abner_G/article/details/125775876</guid><author>Abner_G</author><pubDate>Thu, 14 Jul 2022 01:42:03 +0800</pubDate><description><![CDATA[本来是在写面霸系列的，写着写着就写到了这一题：而关于 Synchronized 我去年还专门翻阅 JVM HotSpot 1.8 的源码来研究了一波，那时候我就发现有一个点，一个几乎网上所有文章包括《Java并发编程的艺术》也是这样说的一个点。锁升级想必网上有太多文章说过了，这里提到当轻量级锁 CAS 失败，则当前线程会尝试使用自旋来获取锁。其实起初我也是这样认为的，毕竟都是这样说的，而且也很有道理。因为重量级锁会阻塞线程，所以如果加锁的代码执行的非常快，那么稍微自旋一会儿其他线程就不需要锁了，就可以直接 ]]></description><category></category></item><item><title><![CDATA[【锁】synchronized 锁升级]]></title><link>https://blog.youkuaiyun.com/Abner_G/article/details/125731154</link><guid>https://blog.youkuaiyun.com/Abner_G/article/details/125731154</guid><author>Abner_G</author><pubDate>Thu, 14 Jul 2022 01:14:29 +0800</pubDate><description><![CDATA[在Java中，锁可能是我们最早接触的锁了，在 JDK1.5之前synchronized是一个重量级锁，相对于juc包中的Lock，比较笨重。
修饰实例方法，反编译之后查看加锁前后对比；在加锁之后，常量池中多了ACC_SYNCHRONIZED标示符；
修饰代码块，反编译之后查看加锁前后对比；加锁之后多了,三条指令；monitor对象：监视器锁，每个对象都存在着一个 monitor 与之关联。在Java虚拟机(HotSpot)中，monitor是由ObjectMonitor实现；
线程通过 CAS尝试获取锁，如]]></description><category></category></item><item><title><![CDATA[【TransmittableThreadLocal】源码分析理解]]></title><link>https://blog.youkuaiyun.com/Abner_G/article/details/125696424</link><guid>https://blog.youkuaiyun.com/Abner_G/article/details/125696424</guid><author>Abner_G</author><pubDate>Sat, 09 Jul 2022 18:35:04 +0800</pubDate><description><![CDATA[上一篇博客【InheritableThreadLocal】搭配线程池使用存在问题，实际开发中遇到，阿里开源类解决这个问题，本文目的是探究一下TTL的原理；
transmittable-thread-local
方法是 创建时调用，默认创建一个 WeakHashMap。方法是创建子线程Thread 调用 init 方法，会调用ThreadLocal.createInheritedMap(parent.inheritableThreadLocals),创建ThreadLocalMap调用childValue
官]]></description><category></category></item><item><title><![CDATA[【InheritableThreadLocal】搭配线程池使用存在问题]]></title><link>https://blog.youkuaiyun.com/Abner_G/article/details/125691060</link><guid>https://blog.youkuaiyun.com/Abner_G/article/details/125691060</guid><author>Abner_G</author><pubDate>Sat, 09 Jul 2022 15:05:44 +0800</pubDate><description><![CDATA[服务中多接口报空指针异常，以报错邮件中的接口参数调用接口时，接口调用正常；
推断（A接口报空指针，邮件使用的接口信息为B接口信息）能接收到报错邮件，肯定是有空指针异常；报错邮件是根据log4j抓取的异常触发。接口信息使用过滤器在接口请求时，将接口信息存放在MDC中。
报错的接口中都是使用的多线程处理，在几个接口处理异常时都打印具体异常标识，重新发版之后；多接口异常信息都指向同一个处理异常处理点；异步调用，异常处理方法
可以看到异常处理机制是使用从线程池中拿到的子线程进行异常处理。那就看一下为什么子线程中存放]]></description><category></category></item><item><title><![CDATA[【Mysql】online 数据批量处理]]></title><link>https://blog.youkuaiyun.com/Abner_G/article/details/125682620</link><guid>https://blog.youkuaiyun.com/Abner_G/article/details/125682620</guid><author>Abner_G</author><pubDate>Fri, 08 Jul 2022 17:44:18 +0800</pubDate><description><![CDATA[因迭代版本升级，Mysql数据存储发生改变，需要批量处理旧版本数据。
🎯创建更新数据SQL脚本


将上一步生成的SQL脚本，执行
🎯比对数据
对比备份表和正式表数据量]]></description><category></category></item><item><title><![CDATA[【Kettle】 Kettle连接Clickhouse自定义插件2.0（升级驱动）]]></title><link>https://blog.youkuaiyun.com/Abner_G/article/details/125529258</link><guid>https://blog.youkuaiyun.com/Abner_G/article/details/125529258</guid><author>Abner_G</author><pubDate>Wed, 29 Jun 2022 21:48:27 +0800</pubDate><description><![CDATA[使用Kettle 整合不同Mysql数据库数据，批量插入Clickhouse,会不定时出现错误 。Clickhouse社区给出的答案是驱动问题。社区回答
Kettle 官方自定义创建插件文档喜欢吃燕麦粥的KeyL 大佬博客这里使用的还是kettle 8.1的包，9.1也可以使用，这里使用Clickhouse官方最新驱动

按照官方文档重写对应方法

getURL方法

驱动修改getDriverClass


打包
将所有依赖jar，打包成jar包。存放到新建clickhouse-plugins文件夹下。需]]></description><category></category></item><item><title><![CDATA[【锁】CAS（Compare And Swap）]]></title><link>https://blog.youkuaiyun.com/Abner_G/article/details/125500435</link><guid>https://blog.youkuaiyun.com/Abner_G/article/details/125500435</guid><author>Abner_G</author><pubDate>Tue, 28 Jun 2022 23:29:53 +0800</pubDate><description><![CDATA[【锁】悲观锁与乐观锁实现，中乐观锁，使用的是CAS算法。CAS（Compare And Set  或 Compare And Swap），即比较并修改的意思。CAS技术可以保证操作的原子性，atomic包下的原子类都是基于CAS和volatile实现原子操作的。
【Atomic】—JDK 原子计数器AtomicInteger（源码）对java 使用CAS源码进行了分析，从Java1.5开始JDK的atomic包里提供了一个类AtomicStampedReference来解决ABA问题。这个类的compare]]></description><category></category></item><item><title><![CDATA[【锁】悲观锁与乐观锁实现]]></title><link>https://blog.youkuaiyun.com/Abner_G/article/details/125494027</link><guid>https://blog.youkuaiyun.com/Abner_G/article/details/125494027</guid><author>Abner_G</author><pubDate>Tue, 28 Jun 2022 01:44:59 +0800</pubDate><description><![CDATA[锁：在程序中一种保证数据安全的手段和机制。在并发处理共享资源时，可以对共享变量使用关键字。多用户修改表中同一数据时，可以给该行数据上锁保证数据安全。乐观锁和悲观锁，可以理解为因为一种态度，一种思想定义的一类锁。
如图使用的方式，保守的保证了数据的安全。两个线程同时去修改id 为1的同一行数据为例，实现悲观锁。

如果事务等待获取排他锁的时间超过LockTimeout ，则将抛出LockTimeoutException ，而不会将该事务标记为已回滚；死锁处理：悲观锁会增加死锁的可能性，其中两个（或更多）事务各]]></description><category></category></item><item><title><![CDATA[【数组】---Leetcode数组大白话]]></title><link>https://blog.youkuaiyun.com/Abner_G/article/details/124890394</link><guid>https://blog.youkuaiyun.com/Abner_G/article/details/124890394</guid><author>Abner_G</author><pubDate>Sat, 21 May 2022 00:03:09 +0800</pubDate><description><![CDATA[提示：本文题目跟随 代码随想录，刷题顺序。

【数组】---Leetcode题目总结🏆 前言⭐️ 数组基础🎯二分查找🍍题目🍋何时考虑🥝Leetcode 题解🎯双指针移除元素🍍题目🍋何时考虑🥝Leetcode 题解🎯有序数组的平方🍍题目🥝Leetcode 题解🎯长度最小的子数组

🏆 前言
本文题目跟随 代码随想录，刷题顺序。对题目进行自我总结；说的不对的地方，欢迎指正。

⭐️ 数组基础

存放在连续内存空间
不能单个元素删除，只能覆盖
二维数组是多条连续的内存空间

🎯二分查找
Leetcode
🍍题目.]]></description><category></category></item><item><title><![CDATA[【树】--重建二叉树]]></title><link>https://blog.youkuaiyun.com/Abner_G/article/details/124771327</link><guid>https://blog.youkuaiyun.com/Abner_G/article/details/124771327</guid><author>Abner_G</author><pubDate>Sat, 14 May 2022 18:41:39 +0800</pubDate><description><![CDATA[题目：

根据二叉树的前序遍历和中序遍历的结果，重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

分析

前序遍历顺序：根节点-&gt;左子节点-&gt;右子节点
中序遍历顺序：左子节点-&gt;根节点-&gt;右子节点

前序中的第一个元素能把中序分成两部分,然后对左右两部分做同样操作，必然使用递归方法,递归出口，在最后只有一个元素，递归结束

思路


源码
package org.example.tree;

import org.example.model.TreeNode;]]></description><category></category></item><item><title><![CDATA[【链表】--从尾到头打印链表]]></title><link>https://blog.youkuaiyun.com/Abner_G/article/details/124769098</link><guid>https://blog.youkuaiyun.com/Abner_G/article/details/124769098</guid><author>Abner_G</author><pubDate>Sat, 14 May 2022 15:42:06 +0800</pubDate><description><![CDATA[题目：

从尾到头打印链表。

分析

方法A：反向，肯定会想到使用栈来处理
方法B：也可以使用双指针将链表逆序
方法C：递归遍历


思路


源码
package org.example.linkList;

import org.example.model.ListNode;

import java.util.ArrayList;
import java.util.Stack;

/**
 * 从尾到头打印链表
 * @author: guochao.bj@fang.com
 * @createDa]]></description><category></category></item></channel></rss>