![]()


![]()
![]()
![]()
![]()
![]()


CountDownLatch是一个同步工具类,它通过一个计数器来实现的,初始值为线程的数量。每当一个线程完成了自己的任务,计数器的值就相应得减1。当计数器到达0时,表示所有的线程都已执行完毕,然后在等待的线程就可以恢复执行任务。
CountDownLatch(int count):count为计数器的初始值(一般需要多少个线程执行,count就设为几)。
countDown(): 每调用一次计数器值-1,直到count被减为0,代表所有线程全部执行完毕。
getCount():获取当前计数器的值。
await(): 等待计数器变为0,即等待所有异步线程执行完毕。
boolean await(long timeout, TimeUnit unit): 此方法与await()区别:
实现在无多条件查询的接口下完成多条件查询,即批处理调用接口查询,为了保证获取的性能问题,此处需要使用此技术。
前提是该接口支持该数量级的qps。
List<String> ids = new ArrayList<>(Arrays.asList("陈", "王", "李"));
List<String> nameList = Collections.synchronizedList(new ArrayList<>());
CountDownLatch countDownLatch = new CountDownLatch(ids.size());
for (String s : ids) {
ThreadPoolUtil.execute(() -> {
// 此处方法为调用外部接口,根据姓氏条件模糊查询用户列表,获取包含此姓氏的所有名字列表(假设没有多条件查询下)
List<String> exhibitionDetailsSplit = SignUtil.advancedQueryMultipleConditions(s);
nameList.addAll(exhibitionDetailsSplit);
countDownLatch.countDown();
});
}
try {
countDownLatch.await();
} catch (InterruptedException e) {
log.error("exception: {}", e.getMessage());
}ThreadPoolUtil工具类
@Slf4j
public class ThreadPoolUtil {
private static ExecutorService executor = Executors.newCachedThreadPool();
public static void execute(Runnable task) {
try {
executor.execute(task);
} catch (Exception e) {
log.error("线程池异常:{}", e.getMessage());
}
}
public static void shutdown() {
executor.shutdown();
}
}西安交通大学开源了人工智能SadTaker模型,通过从音频中学习生成3D运动系数,使用全新的3D面部渲染器来生成头部运动,可以实现图片+音频就能生成高质量的视频。内含多个踩坑的解决办法,值得玩一玩。
可以根据一张图片、一段音频,合成面部说这段语音的视频。图片需要真人或者接近真人。目前项目已经支持stable diffusion webui,可以SD出图后,结合一段音频合成面部说话的视频(抖音常见的数字人)
![]()
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple遇到个线上问题,调用三方接口报错:“请求需要使用token认证;请检查请求Header中是否填了正确的Authorization”。
该问题很明显是token填写格式问题,由于是商店应用本地调试需要更改很多配置,所以线上调试会更快。
线上服务器执行
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar之后会列出服务器正在运行的jar程序
[INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER.
* [1]: 22023 xxx.jar
[2]: 18084 xxx2.jar
[3]: 21167 org.apache.catalina.startup.Bootstrap假如报错的为程序1,输入1后回车![]()
此时为终端输入模式,输入如下命令定位该问题,之后将会解释下命令内容和给出命令文档:
watch com.rawchen.tools.PooledHttpUtils getData -x 2 -b -s -n 5此时终端为监听模式,只要再次触发com.rawchen.tools.PooledHttpUtils包下的getData方法,将会准备输出该方法中的入参,出参,抛出异常,类中字段值。至多5条。
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 82 ms, listenerId: 4
▌最后得到的数据:
method=com.rawchen.tools.PooledHttpUtils.getData location=AtExit
ts=2024-03-22 11:21:05; [cost=6.452475626433412E10ms] result=@ArrayList[
@Object[][
@String[621d8594dc],
@HttpConfig[headers=[Authorization: Beareru-eeharKx8hpbaLPojKdKJcak3FcK8F5l9W014Kw20j], cookies=null],
null,
],
@ApiController[
log=@Logger[Logger[com.rawchen.alipan.controller.ApiController]],
parentFileId=@String[root],
apiUrl=@String[https://api.baidu.com],
apiUrlV3=@String[https://api.baidu.com/v3],
oauthTokenUrl=@String[https://baidu.com/token],
openApiUrl=@String[https://baidu.com],
refererURL=@String[https://baidu.com],
passwordFileName=@String[pwd],
appId=@String[5dde4e1bdf9e4966b387ba58f4b],
],
@ArrayList[
@PanFile[PanFile{fileId='621d85af96156951062f4cb4ad0b06fb5', type='folder', name='测试文件夹1', parentFileId='621d8594dc9e9ad3b63e47d9b599edbb04', createdAt='2022-03-01T02:32:15.410Z', fileExtension='null', size=0, url='null', previewUrl='null', encrypted=false}],
@PanFile[PanFile{fileId='621d85b6c6f56dac771645f2b413b39ae', type='folder', name='测试文件夹2', parentFileId='621d8594dc9e9ad3b63e47d9b599edbb04', createdAt='2022-03-01T02:32:22.717Z', fileExtension='null', size=0, url='null', previewUrl='null', encrypted=false}],
],
]由此便可知问题了,可以看出请求头出现Authorization为Bearer后加token,拼接时出现少空格情况。因为我们统一在common层做的处理,此时才知道是引入的common为旧版依赖,所以代码有缺陷导致的。
其实这只是Arthas最基础的线上方法观测功能,还有很多例如方法监测、线上调试、JVM运行状态、线程堆栈、反编译、解决冲突等。可以查看Arthas官方文档。
![]()
![]()
![]()
https://github.com/alibaba/arthas/issues?q=label%3Auser-case
attach连接JVM、实现应用代码隔离类隔离、支持OGNL
https://blog.csdn.net/lym152898/article/details/131345547
AI生成摘要:2023年匆匆忙忙过去,2024年已经过去一个月。作者回顾了自己在过去一年半中所经历的压力、情绪、热爱和自由,以数码照片的方式记录下这些经历。尽管日常工作重复,但作者探索了户外活动、阅读、摄影、运动等新的兴趣爱好。在思考过去和未来之际,作者意识到生活中的细节和热爱是写作的灵感来源。展望2024年,作者希望生活丰富多彩有条有理,并制定了周更博客、徒步旅行、学习新技术和影视后期制作的计划。
匆匆忙忙的2023之后才发现2024已经过去1个月了。博客尘封了多久我也记太清楚。才回过头去看已是大半年了,提起笔,不对敲着键盘,才发现再也找不到在大学时候研究学习各种好玩的技术,参加各种好玩的比赛,并记录下这些好玩的事情,结识了一个又一个朋友...踟躇很久才决定了,总结一下202207-202312吧,也算是毕业工作后一年半首次总结。
在这一年半中有过压力,有过EMO,有过每个人都经历过的怅惘,也有过把山海拍遍的热爱和自由。但不管怎样,很多难以忘记的这些星星点点,我都将它以数码照片方式存印。正是这些关于挚友、阅读、运动、旅行、关于失而复得喜悦,关于冥思苦想的明悟,纵横交织。看了本书,名字是《云边有个小卖部》,有句是:货架上满载着岁月和夕阳。我们都是被行程选择的赶路人,面对湖光山色,还是值得贪恋几许的吧。也许我们终点一致,也肯定一致,但是我们何时到达,会遇到什么谁也不知道。
我感觉写总结应该还挺有意义的,它不像是工作总结一样毫无感情。我再想为什么想写这个话题呢,我从业的是互联网软件开发,对于经常爱逛科技博文的应该或多或少知道阮一峰博客。得空就会看看有什么新科技,偶然间看到一个仓库:这个仓库收集国内网友的2023年个人总结 ,从其他博主文章中也能收获很多,互联网上每个人都是一个小点点,我们想逃离中心化的大平台,博客的意义,就是这其中的一座座灯塔吧,照亮每一个逃离的旅行者。
但如果要说 2023 年有哪些变化,我第一反应是开始喜欢户外,其它的是日复一日的工作,然后摸鱼,甚至于这篇文章都是我在春节放假前最后一个工作日摸鱼时写的,感觉摸鱼对于写作效率的提升是有很大帮助的。
以及:
还是会在某个深夜开始 emo,然后睡不着觉,胡思乱想。
还是会在漫无目的的刷完手机后开始假装自责
还是会在每天习惯背着笔记本电脑回家让它躺着
但真就这样么?我尝试在回忆的原野上捕捉一只只断线的风筝,偶尔还是能看到一些被风吹断线后,飘散在地上的零散纸片
开始用Kindle阅读器看点喜欢的书籍了。
喜欢上了摄影航拍,在海边公园悠闲的听歌跑步
每周一次的羽毛球,让身体畅快淋漓
每周一山一海,逃离城市里的生活
茫然惊醒,原来 24 年已经过去了一个月,我好像一直在虚度光阴,回过头来,晚霞依旧笼罩在这座城市,我也逐渐意识到,只有真正热爱生活,去挖掘,体会生活中的那些细节,写出来的文字自然而然就会有真情实感。我也时常会去想,如果我现在60岁,如果我23岁那年毕业后出来做了旅行博主...如果我23岁那年毕业后出来开了咖啡店...如果我23岁那年毕业后出来...
但是没有如果,我只能尽量追寻我的方向,现实与理想永远是一个鸿沟。
2024我的愿望是:让生活多姿多彩有条有理
2024我的计划是:周更、开始重装徒步、学习互联网新技术、学习影视后期与航拍技巧
20230714
音质非常Nice,低音很有感觉,颜值高续航给力。![]()
20230629
比较新的显卡,2023年5月18日发布。性能挺强,属于中端显卡,比3060TI显卡提升10%左右。支持DLSS3。
3100多入的。![]()
20230512
大光圈下也很锐,几乎无紫边和畸变。适用于我的半画幅相机。等效85mm了,适用拍摄半身人像。![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
20230421
操作手感不错。![]()
20230419
磁吸式充电,拆卸式表带设计很方便。屏幕比前一代大了很多。![]()
![]()
给红米K40 AirPods2换新电池
感觉设备满血复活。
深圳漂亮的海边很多,这里也应该被人记住。溪谷、山野、丛林、草甸、沙滩、礁石、大海满足你对山和海的所有憧憬。
一条鲜为人知的登山看海路线,一条风景超级无敌美丽的山海径,延绵的七娘山山脉超五星的无敌海景。漫步高山草甸行摄山海间眺望最美风景。沿着山脊阶梯往下有5个观景台,每个观景台景色各不相同。
上次去的时候留有遗憾,山上都是雾。再次去就能感受景色真的太美啦。
徒步的下半场是杨梅坑,《美人鱼》拍摄地位于杨梅坑鹿嘴山庄,电影取景的“人鱼洞”是必打卡的地方,陡峭的悬崖加上激流的海浪。真的有几分巴厘岛佩尼达的感觉。在这里,登高俯瞰参差的海岸,超级无敌干净的海水岸边被海浪冲刷的岩石。
杨梅坑-鹿嘴山庄-鹿雁径-鹿嘴山庄-杨梅坑
徒步路程约8公里,爬升600米上山,难度★★,风景:★★★★★。需要准备徒步鞋、速干衣裤、双肩包、防晒用品、防晒帽、防晒衣、雨伞/雨衣、零食等。
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()