一、LiveData
LiveData是17年GoogleIO大会上提出来的一个新技术。相对于通信总线类型的框架EventBus和RxBus来说,它更简单,更简洁、更解耦。
它具有以下优点: UI和实时数据保持一致 因为LiveData采用的是观察者模式,这样一来就可以再数据发生改变时获得通知,更新UI
避免内存泄漏 观察者被绑定到组件的生命周期上,当被绑定的组件销毁(Destory)时,观察者会立刻自动清理自身的数据。
不会再产生由于Activity处于stop状态而引起的崩溃 当Activity处于后台状态时,是不会收到LiveData的任何事件的
不需要再解决生命周期带来的问题 LiveData可以感知被绑定的组件的生命周期,只有在活跃状态才会通知数据变化
实时数据刷新 当组件处于活跃状态或者从不活跃状态到活跃状态时总是能收到最新的数据
解决Confinguration Change问题 在屏幕发生旋转或者被回收再次启动,立刻就能收到最新的数据
二、简要分析运用方式:
当 LiveData 所持有的数据改变时,它会通知相应的界面代码进行更新。 同时,LiveData 持有界面代码 Lifecycle (生命周期组件)的引用,这意味着它会在界面代码(LifecycleOwner)的生命周期处于 started 或 resumed 时作出相应更新,而在 LifecycleOwner 被销毁时停止更新。 另外ViewModel的优点也很明显,为Activity 、Fragment存储数据,直到完全销毁。尤其是屏幕旋转的场景,常用的方法都是通过onSaveInstanceState()保存数据,再在onCreate()中恢复。
既然LiveData 在线程中传递事件这么优秀,那么我们应用到项目总的话,就可以集成到一块。这样就诞生了LiveDataBus。
三、LiveDataBus优点:
LiveDataBus的实现及其简单 相对EventBus复杂的实现,LiveDataBus只需要一个类就可以实现
LiveDataBus可以减小APK包的大小 LiveDataBus只依赖Android官方组件LiveData,本身实现只一个类。EventBus 57Kb、RxJava 2.2M
LiveDataBus 依赖方支持更好 LiveDataBus只依赖Android官方组件LiveData,相比RxBus依赖的RxJava和RxAndroid,依赖方支持更好
LiveDataBus具有生命周期感知 LiveDataBus具有生命周期感知,在Android系统中使用调用者不需要调用反注册,相比EventBus和RxBus使用更为方便,并且没有内存泄漏风险。
四、代码展示:
以上我们已经知道了,LiveData订阅消息和发送消息的方式。 那么应用到项目中时,使用Map将这些LiveData保存记录下来,这样各个页面的调用存取都可以写到同一个Map中,就形成总线机制。
订阅消息 1、observe 生命周期感知,不需要手动取消订阅
LiveDataBus.get().with("key_name", String.class)
.observe(this, new Observer() {
@Override
public void onChanged(@Nullable String s) {
}
});
2、observeForever 需要手动取消订阅
LiveDataBus.get().with("key_name", String.class).observeForever(observer);
LiveDataBus.get().with("key_name", String.class).removeObserver(observer);
发送消息 1、setValue 在主线程发送消息
LiveDataBus.get().with("key_name").setValue(value);
2、postValue 在后台线程发送消息,订阅者会在主线程收到消息
LiveDataBus.get().with("key_name").postValue(value);
Sticky模式 支持在注册订阅者的时候设置Sticky模式,这样订阅者可以接收到订阅之前发送的消息
observeSticky 生命周期感知,不需要手动取消订阅,Sticky模式
LiveDataBus.get()
.with("sticky_key", String.class)
.observeSticky(this, new Observer() {
@Override
public void onChanged(@Nullable String s) {
}
});
observeStickyForever 需要手动取消订阅,Sticky模式
LiveDataBus.get().with("sticky_key", String.class).observeStickyForever(observer);
LiveDataBus.get().with("sticky_key", String.class).removeObserver(observer);
public final class LiveDataBus {
private final Map> bus;
private LiveDataBus() {
bus = new HashMap<>();
}
private static class SingletonHolder {
private static final LiveDataBus DEFAULT_BUS = new LiveDataBus();
}
public static LiveDataBus get() {
return SingletonHolder.DEFAULT_BUS;
}
public synchronized BusMutableLiveData with(String key, Class type) {
if (!bus.containsKey(key)) {
bus.put(key, new BusMutableLiveData<>());
}
return (BusMutableLiveData) bus.get(key);
}
public BusMutableLiveData with(String key) {
return with(key, Object.class);
}
private static class ObserverWrapper implements Observer {
private Observer observer;
public ObserverWrapper(Observer observer) {
this.observer = observer;
}
@Override
public void onChanged(@Nullable T t) {
if (observer != null) {
if (isCallOnObserve()) {
return;
}
observer.onChanged(t);
}
}
private boolean isCallOnObserve() {
StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
if (stackTrace != null && stackTrace.length > 0) {
for (StackTraceElement element : stackTrace) {
if ("android.arch.lifecycle.LiveData".equals(element.getClassName()) &&
"observeForever".equals(element.getMethodName())) {
return true;
}
}
}
return false;
}
}
public static class BusMutableLiveData extends MutableLiveData {
private class PostValueTask implements Runnable {
private Object newValue;
public PostValueTask(@NonNull Object newValue) {
this.newValue = newValue;
}
@Override
public void run() {
setValue((T) newValue);
}
}
private Map observerMap = new HashMap<>();
private Handler mainHandler = new Handler(Looper.getMainLooper());
@Override
public void postValue(T value) {
mainHandler.post(new PostValueTask(value));
}
@Override
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer observer) {
super.observe(owner, observer);
try {
hook(observer);
} catch (Exception e) {
e.printStackTrace();
}
}
public void observeSticky(@NonNull LifecycleOwner owner, @NonNull Observer observer) {
super.observe(owner, observer);
}
@Override
public void observeForever(@NonNull Observer observer) {
if (!observerMap.containsKey(observer)) {
observerMap.put(observer, new ObserverWrapper(observer));
}
super.observeForever(observerMap.get(observer));
}
public void observeStickyForever(@NonNull Observer observer) {
super.observeForever(observer);
}
@Override
public void removeObserver(@NonNull Observer observer) {
Observer realObserver = null;
if (observerMap.containsKey(observer)) {
realObserver = observerMap.remove(observer);
} else {
realObserver = observer;
}
super.removeObserver(realObserver);
}
private void hook(@NonNull Observer observer) throws Exception {
//get wrapper's version
Class classLiveData = LiveData.class;
Field fieldObservers = classLiveData.getDeclaredField("mObservers");
fieldObservers.setAccessible(true);
Object objectObservers = fieldObservers.get(this);
Class classObservers = objectObservers.getClass();
Method methodGet = classObservers.getDeclaredMethod("get", Object.class);
methodGet.setAccessible(true);
Object objectWrapperEntry = methodGet.invoke(objectObservers, observer);
Object objectWrapper = null;
if (objectWrapperEntry instanceof Map.Entry) {
objectWrapper = ((Map.Entry) objectWrapperEntry).getValue();
}
if (objectWrapper == null) {
throw new NullPointerException("Wrapper can not be bull!");
}
Class classObserverWrapper = objectWrapper.getClass().getSuperclass();
Field fieldLastVersion = classObserverWrapper.getDeclaredField("mLastVersion");
fieldLastVersion.setAccessible(true);
//get livedata's version
Field fieldVersion = classLiveData.getDeclaredField("mVersion");
fieldVersion.setAccessible(true);
Object objectVersion = fieldVersion.get(this);
//set wrapper's version
fieldLastVersion.set(objectWrapper, objectVersion);
}
}
}
注: 在BusMutableLiveData类中,hook函数利用反射机制重新给wrapper的version赋值了。跟踪源码可知:这么操作的意义是为了在Activity未创建时,不接收发布消息者发布过来的消息。(例:网络请求后使用LiveData向AActivity发送消息,但是AActivity还未创建,这样一旦AActivity创建后onResume函数调用,View会跟着数据变化。但如果我不想AActivity创建后View有所改变呢,就使用调用hook函数的observe去订阅就可以了)
你可能感兴趣的:(LiveDataBus 感知组件生命周期的事件通信框架)
接口测试-API测试中常用的协议(下)
2025年一定要上岸
集成测试
一、RPCRPC(RemoteProcedureCall)即远程过程调用协议,它允许程序调用位于其他计算机上的程序中的过程或函数,就像调用本地程序中的过程一样。下面从其概念、工作原理、特点、应用场景等方面详细介绍:概念起源与核心思想起源:RPC的概念最早出现在20世纪70年代,是为了解决分布式系统中不同计算机之间的通信和协作问题而提出的。随着计算机网络的发展和分布式系统的广泛应用,RPC逐渐成为一
使用Node.js连接MySQL数据库
技术探宝
数据库 node.js mysql 编程
在Node.js中,可以使用各种库和模块来连接和操作MySQL数据库。本文将介绍一种常用的方法,以及相应的源代码示例。步骤1:安装MySQL模块首先,需要在Node.js项目中安装MySQL模块。可以使用npm包管理器来安装mysql模块,执行以下命令:npminstallmysql步骤2:导入MySQL模块在代码中导入mysql模块,以便使用模块中提供的功能。可以使用以下语句实现导入:const
C语言结构体内存对齐:如何让结构体更加高效?
雨中微步
c语言 开发语言 编程
C语言结构体内存对齐:如何让结构体更加高效?在C语言中,结构体是一种非常重要的数据类型。但是,由于结构体内存分配方式的不同,会导致内存浪费或程序出错。为了避免这种情况发生,我们需要理解结构体内存对齐。内存对齐是为了提高程序性能和数据读取速度而设计的。一般来说,内存对齐是将数据存储在内存中时,按照预定的字节对齐方式来存放,以减少访问内存的次数,提高程序的执行效率。下面,我们来看一个例子:struct
Node.js Buffer 教程
神秘代码行者
Node.js javascript node.js
Node.jsBuffer教程Buffer是Node.js中的一个重要概念,它用于处理二进制数据流。Buffer类在全局作用域中可用,不需要通过require引入。本文将全面介绍Buffer的概念、使用方法和最佳实践。1.Buffer基础概念Buffer是一个类似于数组的对象,但它专门用于存储字节数据。Buffer的大小在创建时确定,且无法调整。每个元素的取值范围是0-255(即一个字节)。1.1
Node.js 连接 mysql 数据库
7 号
Node.js 数据库 node.js mysql
安装mysql2模块npminstallmysql2使用mysql2连接池的方式,示例1importmysqlfrom'mysql2';//创建连接池constpool=mysql.createPool({host:'127.0.0.1',port:3306,user:'root',password:'123456',database:'test'});//获取连接并执行sql语句,execute
DeepSeek vs ChatGPT:AI 领域的华山论剑,谁主沉浮?
晨陌y
chatgpt 人工智能
一、引言在当今科技飞速发展的时代,人工智能(AI)已然成为推动各领域变革的核心力量。而在人工智能的众多分支中,自然语言处理(NLP)因其与人类日常交流和信息处理的紧密联系,成为了最受瞩目的领域之一。在这片充满创新与突破的领域里,DeepSeek和ChatGPT犹如两颗璀璨的明星,吸引着全球开发者、研究人员以及广大普通用户的目光。它们代表着当前AI语言模型的顶尖水准,一场关于“谁主沉浮”的激烈较量正
【开源】基于SSM框架“大学生艺术节”管理系统(计算机毕业设计)+万字毕业论文+远程部署+ppt+代码讲解 ssm284
计算机毕业设计_gzs
开源 课程设计 spring 毕设 mybatis java 毕业设计
系统合集跳转源码获取链接点击主页更能获取海量源码博主联系方式拉到下方点击名片获取!!!博主联系方式拉到下方点击名片获取!!!10年计算机开发经验,主营业务:源码获取、项目二开、语音辅导、远程调试、毕业设计、课程设计、毕业论文、BUG修改一、系统环境运行环境:最好是javajdk1.8,我们在这个平台上运行的。其他版本理论上也可以。IDE环境:Eclipse,Myeclipse,IDEA或者Spri
基于深度学习的股票短期趋势预测模型设计与实现【附代码】
算法与数据
深度学习 人工智能
,我们首先对股票的基本交易数据进行了清洗和预处理,包括去除异常值、填补缺失值等。同时,我们还挖掘了多个可能影响股票价格走势的因子,如成交量、市盈率、市净率等,并将这些因子作为特征加入到数据集中。通过特征工程,我们进一步扩展了数据集,提高了模型的输入质量。在模型构建方面,我们采用了LSTM网络来处理时间序列数据。LSTM网络具有记忆功能,能够捕捉数据中的长期依赖关系,这对于股票价格走势的预测至关重要
Domain Name System
竹某
互联网应用 网络 网络协议 服务器
目录一.BasicFunction&BriefHistory二.从数据库层面理解DNS2.1DomainNamespace&ResourceRecord2.2DNSserver2.3DNSresolver三.从协议层面理解DNS3.1DNSserver正确解析domainname返回IP地址的方法3.1.1递归方法解析域名3.1.2迭代方法解析域名3.2DNSserver提高域名解析效率的缓存机制
系统思考—系统结构
陈思杰系统思考Jason
微信公众平台 微信开放平台 新浪微博 百度 微信
转型路上,别再孤军奋战,找到对的人,一起突破!这几年,身边不少朋友在转型的路上摸索——有的换了赛道,有的升级了打法,也有的在原领域深耕。但不管是哪种方式,一个人死磕,真的是太难了。有时候,不是你不够努力,而是方向不对;有时候,不是你没资源,而是信息差太大;有时候,不是你没想法,而是少了并肩同行的伙伴。我们在组织内设计了不同的系统结构,已经赋能伙伴实现了超10倍的成长回报。而这回报,不仅仅是收入的增
利用python实现小提琴图的代码
python游乐园
可视化 python 开发语言
importseabornassnsimportmatplotlib.pyplotasplt#加载seaborn内置的鸢尾花数据集iris=sns.load_dataset("iris")#设置绘图风格,可选,这里使用默认风格#sns.set_style("whitegrid")#绘制小提琴图,以'species'为分类依据,绘制'sepal_length'特征的小提琴图#可以根据实际需求更改x和
Spring Bean 生命周期
金州小铁匠
spring python java
SpringBean生命周期一、Bean的创建方式与底层实现Spring中Bean的创建方式及其底层源码实现是理解生命周期的关键。以下是常见的Bean注册方式及其源码层面的核心逻辑:1.XML配置方式源码分析:解析阶段:XmlBeanDefinitionReader解析XML文件,生成BeanDefinition并注册到BeanFactory的beanDefinitionMap。注册逻辑:Defa
泷羽sec-网络基础之超文本协议与内外网划分 学习笔记
Darker'K
网络 学习 笔记
声明!学习视频来自B站up主**泷羽sec**有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关,切勿触碰法律底线,否则后果自负!!!!有兴趣的小伙伴可以点击下面连接进入b站主页[B站泷羽sec](泷羽sec的个人空间-泷羽sec个人主页-哔哩哔哩视频)本章课程链接:黑客网络基础之超文本协议
关于FPGA的代码书写错误引起的时序问题
mmmmmlovely
FPGA_debug总结 fpga开发
一、现象FPGA从RAM中读取DAC数据后,出现偶尔从RAM读错数据的情形,有时候修改一些代码后又不出现该错误的二、分析根据这个现象应该是时序引起的,需要做实验定位问题是写数据有误还是读数据有误,最后通过实验分析是写数据有误。三、手撕代码发现写数据到ram中,有两个信息跨时钟且都是写信号,会出现类似“竞争与冒险”的错误,因为有个是先写另外一个是后写,但是这两个信号同时置为“1”,且跨时钟域,又时写
计算机网络应用层之文件传输协议——FTP(这一篇就够了)
jesesl
计算机网络 ftp 网络协议
目录文件传输协议:FTPFTP传输文件的过程FTP传输文模式FTP配置文件传输协议:FTPHTTP和FTP都是文件传输协议,但FTP使用两个并行的TCP连接来传输文件,一个是控制连接(controlconnection),一个是数据连接(dataconnection)。控制连接用于在两个主机之间传输控制信息,如用户标识、口令、改变远程目录的命令。数据连接用于实际传输一个文件。也称FTP的控制信息是
【数据序列化协议】Protocol Buffers
茉菇
网络
一、为什么需要序列化?数据跨平台/语言交互:不同编程语言(如Java、Python、Go)的数据结构不兼容,序列化提供统一的数据表示。例如:Java的HashMap和Python的dict需转换为通用格式(如JSON、Protobuf)才能通信。网络传输优化:原始内存中的对象包含指针、元数据等冗余信息,无法直接传输。序列化后数据体积更小,减少带宽占用,提升传输效率。持久化存储:将对象转换为字节流或
pythonmatplotlib绘图小提琴_Matplotlib提琴图
weixin_39797393
小提琴图类似于箱形图,除了它们还显示不同值的数据的概率密度。这些图包括数据中位数的标记和表示四分位数范围的框,如标准框图中所示。在该箱图上叠加的是核密度估计。与箱形图一样,小提琴图用于表示跨不同“类别”的可变分布(或样本分布)的比较。小提琴图形比普通图形更具信息性。事实上,虽然箱形图仅显示平均值/中位数和四分位数范围等汇总统计量,但小提琴图显示了数据的完整分布。importmatplotlib.p
【漏洞复现】泛微OA E-Cology WorkflowServiceXml Sql注入
0x0000001
漏洞复现 sql 数据库 web web漏洞 漏洞 网络安全 web安全
免责声明:本文内容旨在提供有关特定漏洞或安全漏洞的信息,以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步,并非出于任何恶意目的。阅读者应该明白,在利用本文提到的漏洞信息或进行相关测试时,可能会违反某些法律法规或服务协议。同时,未经授权地访问系统、网络或应用程序可能导致法律责任或其他严重后果。作者不对读者基于本文内容而产生的任何行为或后果承担责任。读者在使用本文所
pythonmatplotlib绘图小提琴_python 箱线图和小提琴图
奥利奥东
箱形图(Box-plot)又称为盒须图、盒式图或箱线图是一种用作显示一组数据分散情况资料的统计图,因形状如箱子而得名。它能显示出一组数据的最大值、最小值、中位数、及上下四分位数。箱形图绘制须使用常用的统计量,能提供有关数据位置和分散情况的关键信息,尤其在比较不同的母体数据时更可表现其差异。箱形图的绘制主要包含六个数据节点,需要先将数据从大到小进行排列,然后分别计算出它的上边缘,上四分位数,中位数,
GPU与FPGA加速:硬件赋能AI应用
AI天才研究院
DeepSeek R1 & 大数据AI人工智能大模型 AI大模型企业级应用开发实战 计算科学 神经计算 深度学习 神经网络 大数据 人工智能 大型语言模型 AI AGI LLM Java Python 架构设计 Agent RPA
GPU与FPGA加速:硬件赋能AI应用1.背景介绍1.1人工智能的兴起人工智能(AI)在过去几年中经历了爆炸式增长,成为推动科技创新的核心动力。从语音识别和计算机视觉,到自然语言处理和推荐系统,AI已广泛应用于各个领域。然而,训练和部署AI模型需要大量计算资源,这对传统的CPU架构提出了巨大挑战。1.2硬件加速的必要性为满足AI算法对计算能力的巨大需求,硬件加速技术应运而生。专用硬件如GPU(图形
腾讯 tRPC-Go 教学——(5)filter、context 和日志组件
go腾讯rpchttp
本文咱们来介绍一下在tRPC中的filter机制、context用法,以及在相关机制上可以实现的tracinglog能力。说实话,这一部份是我个人最不喜欢的tRPC的实现模式,不过这不妨碍咱们使用它——只要把它封装成让人更为舒服的模式也未尝不可。系列文章腾讯tRPC-Go教学——(1)搭建服务腾讯tRPC-Go教学——(2)trpcHTTP能力腾讯tRPC-Go教学——(3)微服务间调用腾讯tRP
JavaScript 任务队列详解:Event Loop、宏任务与微任务
咖啡虫
前端中的一些概念及理解 javascript vim 开发语言
JavaScript任务队列详解:EventLoop、宏任务与微任务在JavaScript的世界里,异步编程是一个至关重要的概念。JavaScript采用单线程运行方式,但能够处理异步任务,这一切都要归功于事件循环(EventLoop)机制。本文将深入剖析JavaScript的任务队列(TaskQueue),包括宏任务(Macrotask)和微任务(Microtask),并结合示例解析代码的执行顺
智能优化算法应用:基于哈里斯鹰算法与双伽马校正的图像自适应增强算法
智能算法研学社(Jack旭)
智能优化算法应用 图像增强 算法 计算机视觉 人工智能
智能优化算法应用:基于哈里斯鹰算法与双伽马校正的图像自适应增强算法-附代码文章目录智能优化算法应用:基于哈里斯鹰算法与双伽马校正的图像自适应增强算法-附代码1.全局双伽马校正2.哈里斯鹰算法3.适应度函数设计4.实验与算法结果5.参考文献6.Matlab代码摘要:本文主要介绍基于哈里斯鹰算法与双伽马校正的图像自适应增强算法。1.全局双伽马校正设图像的灰度值范围被归一化到[0,1]范围之内,基于全局
分库分表全解析:从原理到实战,破解亿级数据存储难题
没什么技术
java 分库分表
一、为什么需要分库分表?随着业务规模的增长,单库单表逐渐暴露出性能瓶颈:数据量过大:单表存储超过1亿条数据时,查询效率显著下降。并发压力高:单一数据库的QPS(每秒查询数)难以支撑高并发场景。维护困难:备份、恢复等运维操作耗时增加,影响业务连续性。典型问题场景:电商订单表日增百万数据,单表无法支撑。用户行为日志表年增数十TB,存储成本飙升。实时风控系统要求毫秒级响应,传统架构难以满足。二、分库分表
多波段tif拆分程序
百里千流
数据处理程序 python
importrasteriodefsplit_multi_band_tif(input_path,output_folder):"""将多波段的GeoTIFF文件拆分成多个单波段的GeoTIFF文件。:paraminput_path:输入的多波段GeoTIFF文件的路径:paramoutput_folder:输出单波段GeoTIFF文件的文件夹路径"""try:#打开多波段的GeoTIFF文件wi
DeepSeek学习教程 从入门到精通pdf下载:快速上手 DeepSeek
不会编程的程序猿ᅟ
学习
下载链接:DeepSeek从入门到精通(清华大学).pdf链接:https://pan.baidu.com/s/1Ym0-_x9CrFHFld9UiOdA5A提取码:2ebc一、DeepSeek简介DeepSeek是一款由中国团队开发的高性能大语言模型,具备强大的推理能力和对中文的深刻理解。它广泛应用于智能办公、教育辅助、编程开发、商业分析等领域,支持自然语言交互,用户无需复杂提示词即可获得高质量
编程题-连接两字母单词得到的最长回文串(中等)
Kevin Kou
数据结构 算法 哈希表 c++ 贪心算法
题目:给你一个字符串数组words。words中每个元素都是一个包含两个小写英文字母的单词。请你从words中选择一些元素并按任意顺序连接它们,并得到一个尽可能长的回文串。每个元素至多只能使用一次。请你返回你能得到的最长回文串的长度。如果没办法得到任何一个回文串,请你返回0。回文串指的是从前往后和从后往前读一样的字符串。解法一(贪心+哈希表):根据回文串的定义,回文串可以由奇数或者偶数个words
LLaMA-Factory|微调大语言模型初探索(3),qlora微调deepseek记录
闻道且行之
自然语言处理 语言模型 人工智能 qlora微调 llama deepseek
前言 上篇文章记录了使用lora微调llama-1b,微调成功,但是微调llama-8b显存爆炸,这次尝试使用qlora来尝试微调参数体量更大的大语言模型,看看64G显存的极限在哪里。1.WhyQLora?QLoRA在模型加载阶段通过4-bit量化大幅减少了模型权重的显存占用。QLoRA通过反量化到BF16进行训练,在保持计算精度的同时,进一步节省显存和提高效率。QLoRA在加载、训练、以及权重
DeepSeek 与网络安全:AI 在网络安全领域的应用与挑战
一ge科研小菜菜
人工智能 运维 网络
个人主页:一ge科研小菜鸡-CSDN博客期待您的关注1.引言在当今数字化时代,网络安全已成为国家、企业和个人面临的重要挑战。从传统的病毒、木马攻击,到高级持续性威胁(APT)、零日漏洞和供应链攻击,网络威胁的形式日益复杂。与此同时,人工智能(AI)技术的快速发展正在为网络安全提供全新的解决方案,而DeepSeek作为AI领域的新兴力量,也正在探索如何利用深度学习和大规模语言模型(LLM)加强网络安
python绘图之回归拟合图
pianmian1
python 回归 开发语言
回归拟合图在数据分析中具有重要作用,它不仅可以帮助我们理解变量之间的关系,还可以评估模型的拟合效果、进行预测和推断、发现异常值,以及用于模型比较和结果展示。importpandasaspdimportseabornassnsimportmatplotlib.pyplotasplt#创建一个示例数据集#假设我们有一些鱼的重量和高度数据data={'Weight':[100,150,200,250,3
JAVA中的Enum
周凡杨
java enum 枚举
Enum是计算机编程语言中的一种数据类型---枚举类型。 在实际问题中,有些变量的取值被限定在一个有限的范围内。 例如,一个星期内只有七天 我们通常这样实现上面的定义:
public String monday;
public String tuesday;
public String wensday;
public String thursday
赶集网mysql开发36条军规
Bill_chen
mysql 业务架构设计 mysql调优 mysql性能优化
(一)核心军规 (1)不在数据库做运算 cpu计算务必移至业务层; (2)控制单表数据量 int型不超过1000w,含char则不超过500w; 合理分表; 限制单库表数量在300以内; (3)控制列数量 字段少而精,字段数建议在20以内
Shell test命令
daizj
shell 字符串 test 数字 文件比较
Shell test命令
Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。 数值测试 参数 说明 -eq 等于则为真 -ne 不等于则为真 -gt 大于则为真 -ge 大于等于则为真 -lt 小于则为真 -le 小于等于则为真
实例演示:
num1=100
num2=100if test $[num1]
XFire框架实现WebService(二)
周凡杨
java webservice
有了XFire框架实现WebService(一),就可以继续开发WebService的简单应用。
Webservice的服务端(WEB工程):
两个java bean类:
Course.java
package cn.com.bean;
public class Course {
private
重绘之画图板
朱辉辉33
画图板
上次博客讲的五子棋重绘比较简单,因为只要在重写系统重绘方法paint()时加入棋盘和棋子的绘制。这次我想说说画图板的重绘。
画图板重绘难在需要重绘的类型很多,比如说里面有矩形,园,直线之类的,所以我们要想办法将里面的图形加入一个队列中,这样在重绘时就
Java的IO流
西蜀石兰
java
刚学Java的IO流时,被各种inputStream流弄的很迷糊,看老罗视频时说想象成插在文件上的一根管道,当初听时觉得自己很明白,可到自己用时,有不知道怎么代码了。。。
每当遇到这种问题时,我习惯性的从头开始理逻辑,会问自己一些很简单的问题,把这些简单的问题想明白了,再看代码时才不会迷糊。
IO流作用是什么?
答:实现对文件的读写,这里的文件是广义的;
Java如何实现程序到文件
No matching PlatformTransactionManager bean found for qualifier 'add' - neither
林鹤霄
java.lang.IllegalStateException: No matching PlatformTransactionManager bean found for qualifier 'add' - neither qualifier match nor bean name match!
网上找了好多的资料没能解决,后来发现:项目中使用的是xml配置的方式配置事务,但是
Row size too large (> 8126). Changing some columns to TEXT or BLOB
aigo
column
原文:http://stackoverflow.com/questions/15585602/change-limit-for-mysql-row-size-too-large
异常信息:
Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAM
JS 格式化时间
alxw4616
JavaScript
/**
* 格式化时间 2013/6/13 by 半仙 alxw4616@msn.com
* 需要 pad 函数
* 接收可用的时间值.
* 返回替换时间占位符后的字符串
*
* 时间占位符:年 Y 月 M 日 D 小时 h 分 m 秒 s 重复次数表示占位数
* 如 YYYY 4占4位 YY 占2位<p></p>
* MM DD hh mm
队列中数据的移除问题
百合不是茶
队列移除
队列的移除一般都是使用的remov();都可以移除的,但是在昨天做线程移除的时候出现了点问题,没有将遍历出来的全部移除, 代码如下;
//
package com.Thread0715.com;
import java.util.ArrayList;
public class Threa
Runnable接口使用实例
bijian1013
java thread Runnable java多线程
Runnable接口
a. 该接口只有一个方法:public void run();
b. 实现该接口的类必须覆盖该run方法
c. 实现了Runnable接口的类并不具有任何天
oracle里的extend详解
bijian1013
oracle 数据库 extend
扩展已知的数组空间,例:
DECLARE
TYPE CourseList IS TABLE OF VARCHAR2(10);
courses CourseList;
BEGIN
-- 初始化数组元素,大小为3
courses := CourseList('Biol 4412 ', 'Psyc 3112 ', 'Anth 3001 ');
--
【httpclient】httpclient发送表单POST请求
bit1129
httpclient
浏览器Form Post请求
浏览器可以通过提交表单的方式向服务器发起POST请求,这种形式的POST请求不同于一般的POST请求
1. 一般的POST请求,将请求数据放置于请求体中,服务器端以二进制流的方式读取数据,HttpServletRequest.getInputStream()。这种方式的请求可以处理任意数据形式的POST请求,比如请求数据是字符串或者是二进制数据
2. Form
【Hive十三】Hive读写Avro格式的数据
bit1129
hive
1. 原始数据
hive> select * from word;
OK
1 MSN
10 QQ
100 Gtalk
1000 Skype
2. 创建avro格式的数据表
hive> CREATE TABLE avro_table(age INT, name STRING)STORE
nginx+lua+redis自动识别封解禁频繁访问IP
ronin47
在站点遇到攻击且无明显攻击特征,造成站点访问慢,nginx不断返回502等错误时,可利用nginx+lua+redis实现在指定的时间段 内,若单IP的请求量达到指定的数量后对该IP进行封禁,nginx返回403禁止访问。利用redis的expire命令设置封禁IP的过期时间达到在 指定的封禁时间后实行自动解封的目的。
一、安装环境:
CentOS x64 release 6.4(Fin
java-二叉树的遍历-先序、中序、后序(递归和非递归)、层次遍历
bylijinnan
java
import java.util.LinkedList;
import java.util.List;
import java.util.Stack;
public class BinTreeTraverse {
//private int[] array={ 1, 2, 3, 4, 5, 6, 7, 8, 9 };
private int[] array={ 10,6,
Spring源码学习-XML 配置方式的IoC容器启动过程分析
bylijinnan
java spring IOC
以FileSystemXmlApplicationContext为例,把Spring IoC容器的初始化流程走一遍:
ApplicationContext context = new FileSystemXmlApplicationContext
("C:/Users/ZARA/workspace/HelloSpring/src/Beans.xml&q
[科研与项目]民营企业请慎重参与军事科技工程
comsci
企业
军事科研工程和项目 并非要用最先进,最时髦的技术,而是要做到“万无一失”
而民营科技企业在搞科技创新工程的时候,往往考虑的是技术的先进性,而对先进技术带来的风险考虑得不够,在今天提倡军民融合发展的大环境下,这种“万无一失”和“时髦性”的矛盾会日益凸显。。。。。。所以请大家在参与任何重大的军事和政府项目之前,对
spring 定时器-两种方式
cuityang
spring quartz 定时器
方式一:
间隔一定时间 运行
<bean id="updateSessionIdTask" class="com.yang.iprms.common.UpdateSessionTask" autowire="byName" />
<bean id="updateSessionIdSchedule
简述一下关于BroadView站点的相关设计
damoqiongqiu
view
终于弄上线了,累趴,戳这里http://www.broadview.com.cn
简述一下相关的技术点
前端:jQuery+BootStrap3.2+HandleBars,全站Ajax(貌似对SEO的影响很大啊!怎么破?),用Grunt对全部JS做了压缩处理,对部分JS和CSS做了合并(模块间存在很多依赖,全部合并比较繁琐,待完善)。
后端:U
运维 PHP问题汇总
dcj3sjt126com
windows2003
1、Dede(织梦)发表文章时,内容自动添加关键字显示空白页
解决方法:
后台>系统>系统基本参数>核心设置>关键字替换(是/否),这里选择“是”。
后台>系统>系统基本参数>其他选项>自动提取关键字,这里选择“是”。
2、解决PHP168超级管理员上传图片提示你的空间不足
网站是用PHP168做的,反映使用管理员在后台无法
mac 下 安装php扩展 - mcrypt
dcj3sjt126com
PHP
MCrypt是一个功能强大的加密算法扩展库,它包括有22种算法,phpMyAdmin依赖这个PHP扩展,具体如下:
下载并解压libmcrypt-2.5.8.tar.gz。
在终端执行如下命令: tar zxvf libmcrypt-2.5.8.tar.gz cd libmcrypt-2.5.8/ ./configure --disable-posix-threads --
MongoDB更新文档 [四]
eksliang
mongodb Mongodb更新文档
MongoDB更新文档
转载请出自出处:http://eksliang.iteye.com/blog/2174104
MongoDB对文档的CURD,前面的博客简单介绍了,但是对文档更新篇幅比较大,所以这里单独拿出来。
语法结构如下:
db.collection.update( criteria, objNew, upsert, multi)
参数含义 参数
Linux下的解压,移除,复制,查看tomcat命令
y806839048
tomcat
重复myeclipse生成webservice有问题删除以前的,干净
1、先切换到:cd usr/local/tomcat5/logs
2、tail -f catalina.out
3、这样运行时就可以实时查看运行日志了
Ctrl+c 是退出tail命令。
有问题不明的先注掉
cp /opt/tomcat-6.0.44/webapps/g
Spring之使用事务缘由(3-XML实现)
ihuning
spring
用事务通知声明式地管理事务
事务管理是一种横切关注点。为了在 Spring 2.x 中启用声明式事务管理,可以通过 tx Schema 中定义的 <tx:advice> 元素声明事务通知,为此必须事先将这个 Schema 定义添加到 <beans> 根元素中去。声明了事务通知后,就需要将它与切入点关联起来。由于事务通知是在 <aop:
GCD使用经验与技巧浅谈
啸笑天
GC
前言
GCD(Grand Central Dispatch)可以说是Mac、iOS开发中的一大“利器”,本文就总结一些有关使用GCD的经验与技巧。
dispatch_once_t必须是全局或static变量
这一条算是“老生常谈”了,但我认为还是有必要强调一次,毕竟非全局或非static的dispatch_once_t变量在使用时会导致非常不好排查的bug,正确的如下: 1
linux(Ubuntu)下常用命令备忘录1
macroli
linux 工作 ubuntu
在使用下面的命令是可以通过--help来获取更多的信息1,查询当前目录文件列表:ls
ls命令默认状态下将按首字母升序列出你当前文件夹下面的所有内容,但这样直接运行所得到的信息也是比较少的,通常它可以结合以下这些参数运行以查询更多的信息:
ls / 显示/.下的所有文件和目录
ls -l 给出文件或者文件夹的详细信息
ls -a 显示所有文件,包括隐藏文
nodejs同步操作mysql
qiaolevip
学习永无止境 每天进步一点点 mysql nodejs
// db-util.js
var mysql = require('mysql');
var pool = mysql.createPool({
connectionLimit : 10,
host: 'localhost',
user: 'root',
password: '',
database: 'test',
port: 3306
});
一起学Hive系列文章
superlxw1234
hive Hive入门
[一起学Hive]系列文章 目录贴,入门Hive,持续更新中。
[一起学Hive]之一—Hive概述,Hive是什么
[一起学Hive]之二—Hive函数大全-完整版
[一起学Hive]之三—Hive中的数据库(Database)和表(Table)
[一起学Hive]之四-Hive的安装配置
[一起学Hive]之五-Hive的视图和分区
[一起学Hive
Spring开发利器:Spring Tool Suite 3.7.0 发布
wiselyman
spring
Spring Tool Suite(简称STS)是基于Eclipse,专门针对Spring开发者提供大量的便捷功能的优秀开发工具。
在3.7.0版本主要做了如下的更新:
将eclipse版本更新至Eclipse Mars 4.5 GA
Spring Boot(JavaEE开发的颠覆者集大成者,推荐大家学习)的配置语言YAML编辑器的支持(包含自动提示,