熟悉RecyclerView
的同学应该都知道,Adapter
作为RecyclerView
四大组成部分(Adapter
,LayoutManager
,ItemAnimator
,ItemDecoration
)之一,其重要性自然是不言而喻。今天,我们来分析一下Adapter
的源码。我打算将Adapter
的源码分析分为两个部分,一是,从普通的角度上来看Adapter
,从源码的角度上来分析我们日常使用的一些操作;二是,分析DiffUtil
,可能会涉及到Adapter
的部分源码。所以Adapter
源码分析分为两篇,本文是第一篇。
1. 概述
在分析Adapter
源码之前,我们先来回顾一下,我们经常使用的几个方法。
方法名
作用
onCreateViewHolder
创建一个ViewHolder对象,主要作用是将数据保存在ViewHolder,以供后面bind操作使用
onBindViewHolder
数据绑定方法
getItemCount
当前Adapter拥有数据的数量,该方法必须被重写,否则RecyclerView
展示不了任何数据
getItemViewType
该方法带一个Position,主要是返回当前位置的ViewType。这个方法通常用于一个RecyclerView
需要加载不同的布局。
getItemId
该方法表示的意思是返回当前位置Item的id,此方法只在setHasStableIds
设置为true才会生效
setHasStableIds
设置当前RecyclerView
的ItemView
是否拥有固定id,跟getItemId
方法一起使用。如果设置为true,会提高RecyclerView
的缓存效率。
上表中所列的方法应该就是我们使用Adapter
经常使用的方法,接下来,我将正式分析Adapter
的相关代码。我打算从如下角度来分析:
重新从RecyclerView
缓存角度来分析onCreateViewHolder
和onBindViewHolder
。
onBindViewHolder
的一个重载方法--主要是用于局部刷新。
结合Adapter
,分析ViewHolder
的position。
1. onCreateViewHolder和onBindViewHolder
onCreateViewHolder
方法和onBindViewHolder
方法算是我们使用次数最多的方法,很多自定义Adapter
的框架也都是从这两个方法入手的。我们来看看这两个方法到底有什么作用。
(1).onCreateViewHolder
首先,我们来看一下onCreateViewHolder
方法,从它的调用时机入手。 在本文之前,我分析过RecyclerView
的缓存机制,当时我将RecyclerView
的缓存分为4级缓存,其中分别是:
一级缓存:scrap
数组
二级缓存:CachedView
三级缓存:ViewCacheExtension
四级缓存:RecyclerViewPool
LayoutManager
会获取ViewHolder
时,如果4级缓存都没有命中,就会调用Adapter
的onCreateViewHolder
方法来创建一个新的ViewHolder
。我们来看看相关的代码:
if (holder == null) {
long start = getNanoTime();
if (deadlineNs != FOREVER_NS
&& !mRecyclerPool.willCreateInTime(type, start, deadlineNs)) {
// abort - we have a deadline we can't meet
return null;
}
holder = mAdapter.createViewHolder(RecyclerView.this, type);
if (ALLOW_THREAD_GAP_WORK) {
// only bother finding nested RV if prefetching
RecyclerView innerView = findNestedRecyclerView(holder.itemView);
if (innerView != null) {
holder.mNestedRecyclerView = new WeakReference<>(innerView);
}
}
long end = getNanoTime();
mRecyclerPool.factorInCreateTime(type, end - start);
if (DEBUG) {
Log.d(TAG, "tryGetViewHolderForPositionByDeadline created new ViewHolder");
}
}
上面的代码是RecyclerView
的tryGetViewHolderForPositionByDeadline
方法代码片段。之前,我们在分析缓存机制时,就已经仔细分析这个方法,这里我就不再赘述,有兴趣的同学可以我之前的文章:RecyclerView 源码分析(三) - RecyclerView的缓存机制。 我们回到上面的代码片段中来,从上面的代码上,我们看到这里是调用的是Adapter
的createViewHolder
方法来创建ViewHolder
。我们来看看Adapter
的createViewHolder
方法:
public final VH createViewHolder(@NonNull ViewGroup parent, int viewType) {
try {
TraceCompat.beginSection(TRACE_CREATE_VIEW_TAG);
final VH holder = onCreateViewHolder(parent, viewType);
if (holder.itemView.getParent() != null) {
throw new IllegalStateException("ViewHolder views must not be attached when"
+ " created. Ensure that you are not passing 'true' to the attachToRoot"
+ " parameter of LayoutInflater.inflate(..., boolean attachToRoot)");
}
holder.mItemViewType = viewType;
return holder;
} finally {
TraceCompat.endSection();
}
}
其实createViewHolder
方法里面也没有做什么的操作,差不多就是调用onCreateViewHolder
方法。简而言之,onCreateViewHolder
有点带兜底的韵味,缓存都没有命中,只能乖乖的创建ViewHolder
。 我们来看看第二方法,也就是onBindViewHolder
方法。
(2). onBindViewHolder
我们都知道,onBindViewHolder
方法的作用是进行数据绑定,所以执行这个方法的条件相对于onCreateViewHolder
有点苛刻。为什么呢?我们这么想一下吧,假设我们change了其中一个ItemView的数据,然后通过notifyItemChanged
来通知数据源已经改变。在这种情况下,正常来说,都是只刷新对应位置的ItemView就行了,没必要刷新其他数据没有改变的ItemView(这里的刷新就是指执行onBindViewHolder
方法)。现在,我们来看看对应的执行代码:
boolean bound = false;
if (mState.isPreLayout() && holder.isBound()) {
// do not update unless we absolutely have to.
holder.mPreLayoutPosition = position;
} else if (!holder.isBound() || holder.needsUpdate() || holder.isInvalid()) {
if (DEBUG && holder.isRemoved()) {
throw new IllegalStateException("Removed holder should be bound and it should"
+ " come here only in pre-layout. Holder: " + holder
+ exceptionLabel());
}
final int offsetPosition = mAdapterHelper.findPositionOffset(position);
bound = tryBindViewHolderByDeadline(holder, offsetPosition, position, deadlineNs);
}
从上面的代码,我们可以看出来,最后调用了tryBindViewHolderByDeadline
方法。而调用tryBindViewHolderByDeadline
方法条件比较苛刻,不过不管怎么苛刻,只要记住一点,如果对应位置的数据被更新了,该位置会执行一次onBindViewHolder
方法。我们继续看一下tryBindViewHolderByDeadline
方法的代码:
private boolean tryBindViewHolderByDeadline(ViewHolder holder, int offsetPosition,
int position, long deadlineNs) {
// ······
mAdapter.bindViewHolder(holder, offsetPosition);
// ······
}
执行过程跟onCreateViewHolder
方法差不多,都是在依靠Adapter
内部一个对应的final方法来回调。这样所做的好处,可以在onBindViewHolder
方法执行前后做一些其他的操作,比如初始化操作和清理操作,这种模式有点类似于Java中静态代理模式中的继承代理。然后,我们来看看Adapter
的bindViewHolder
方法:
public final void bindViewHolder(@NonNull VH holder, int position) {
holder.mPosition = position;
if (hasStableIds()) {
holder.mItemId = getItemId(position);
}
holder.setFlags(ViewHolder.FLAG_BOUND,
ViewHolder.FLAG_BOUND | ViewHolder.FLAG_UPDATE | ViewHolder.FLAG_INVALID
| ViewHolder.FLAG_ADAPTER_POSITION_UNKNOWN);
TraceCompat.beginSection(TRACE_BIND_VIEW_TAG);
onBindViewHolder(holder, position, holder.getUnmodifiedPayloads());
holder.clearPayload();
final ViewGroup.LayoutParams layoutParams = holder.itemView.getLayoutParams();
if (layoutParams instanceof RecyclerView.LayoutParams) {
((LayoutParams) layoutParams).mInsetsDirty = true;
}
TraceCompat.endSection();
}
从这里,我们可以简单发现,在执行onBindViewHolder
方法前后,各自做了一些不同的操作。比如,在执行onBindViewHolder
方法之前,更新了ViewHolder
的mPosition
属性和给ViewHolder
设置了一些flag;在执行onBindViewHolder
方法之后,清理了ViewHolder
的payload
,并且还是给ItemView
的LayoutParams
的mInsetsDirty
属性设置为true。 这里额外的提出两个点:
payload
主要是用于局部刷新的,待会我会详细解释怎么进行局部刷新。
关于LayoutParams
的mInsetsDirty
属性,这个属性尤为重要的,主要用于ItemView的绘制,后续我在分析ItemDecoration
时会详细的解释这个属性。
3. 局部刷新的基本使用和实现原理
(1). 局部刷新的基本使用
在分析局部刷新之前,我们先来讨论一下怎么进行布局刷新,也就是说怎么通过RecyclerView
实现ItemView
的局部刷新。 假设下面的一个Demo:
点击一下下面灰色的Button
,position
为0的ItemView
会改变显示的文字。如果我们不做局部刷新,出现什么问题呢?我们先来试试:
mDataList.get(0).setString("change data");
mAdapter.notifyItemChanged(0);
正常的实现应该就是上面的代码,非常的简单,也是我们经常书写的代码。这样书写有什么问题吗?有很大的问题!就是整个ItemView会闪烁一下,效果如下:
网上给了一堆的原因分析,我个人觉得,原因非常的简单,就是第一个ItemView执行的change动画。所以介于这两个原因,我们可以找到两种解决方案:
设置RecyclerView
的change动画时间为0,也就是调用ItemAnimator
的setChangeDuration
方法。
直接将RecyclerView
的ItemAnimator
设置为null。
对于第二种方案,我不置可否。这样来想,我们直接将动画设置为null,那么RecyclerView
就没有任何动画,是不是感觉有点得不偿失? 第一种方案比起第二种方案稍微要好一些,我们将change动画时间设置为0,只影响了change动画(相当于取消了change动画),不会影响其他其他操作的动画。不过,还是感觉美中不足,相当于后面所有的change操作都没有了动画,如果我想有些change操作有动画呢? 此时就需要局部刷新出手了。我们先来看看怎么实现局部刷新: 首先,调用带两个参数的notifyItemChanged
方法,如下:
mAdapter.notifyItemChanged(0, "");
第二参数是一个payload,Object类型,所以我们可以传递任意对象,这里就传递一个空字符串。 然后我们得重写Adapter
的onBindViewHolder
方法(这里重写的是带三个参数的onBindViewHolder
方法,带两个参数的onBindViewHolder
该怎么写就怎么写)。
@Override
public void onBindViewHolder(@NonNull RecyclerViewHolder holder, int position, @NonNull List payloads) {
if (payloads.contains("")) {
holder.mTextView.setText(mDataList.get(position).getString());
} else {
super.onBindViewHolder(holder, position, payloads);
}
}
这里我们判断了一下payloads
里面是否含有之前我们传递的空字符串,如果含有的话,直接更新显示文字即可,如果不含有则走默认逻辑。现在来我们看看效果:
是不是感觉perfect?
(2). 局部刷新的实现原理
局部刷新的使用是非常的简单的,就是重写了Adapter
带三个参数的onBindViewHolder
方法,然后调用的也是带两个参数的notifyItemChanged
方法。 但是,我们不禁好奇,为什么这样做ItemView就不会闪烁呢?我在这里就可以告诉大家答案,是因为没有执行change动画。为了保持求知若饥,虚心若愚的良好传统,大家肯定会进一步的问,为什么在这种情况下不会执行动画呢?其实为了回答这个问题,我早就已经为大家打好铺垫,在理解局部刷新的原理之前,大家最好已经理解了RecyclerView
的动画机制,有兴趣的同学可以看看我之前的文章:RecyclerView 源码分析(四) - RecyclerView的动画机制。 前面频繁的源码追踪我们这里就不进行了,可以参考我的文章:RecyclerView 源码分析(四) - RecyclerView的动画机制,这里直接从根源入手。我们都知道,当我们调用Adapter
的notifyItemChanged
方法,会执行到AdapterHelper$Callback
的markViewHoldersUpdated
方法。 而我们这里不看markViewHoldersUpdated
方法,而是看哪里调用了这个方法。 根据我们辛苦的追踪代码,我们发现主要是有两个地方在调用markViewHoldersUpdated
方法:1. postponeAndUpdateViewHolders
方法;2. consumeUpdatesInOnePass
方法。 这其中,consumeUpdatesInOnePass
方法是我们的老朋友,该方法主要是在dispatchLayoutStep2
方法,其作用也是不言而喻,主要是给消费之前添加的operation
。而postponeAndUpdateViewHolders
方法我们就感觉非常的陌生,这个方法是在哪里被调用呢? 根据我们的追踪,发现它的调用源头是AdapterHelper
的preProcess
方法。而preProcess
方法又是在哪里被调用的呢?是在processAdapterUpdatesAndSetAnimationFlags
方法:
private void processAdapterUpdatesAndSetAnimationFlags() {
// ······
if (predictiveItemAnimationsEnabled()) {
mAdapterHelper.preProcess();
} else {
mAdapterHelper.consumeUpdatesInOnePass();
}
// ······
}
而processAdapterUpdatesAndSetAnimationFlags
方法只在dispatchLayoutStep1
方法调用(这里不考虑非自动测量的情况)。这里,我们就彻底明了。dispatchLayoutStep1
方法阶段被预布局阶段,也就是说,change操作在预布局阶段就已经回调markViewHoldersUpdated
方法。 而markViewHoldersUpdated
方法的作用是啥呢?其实在RecyclerView 源码分析(四) - RecyclerView的动画机制,我就已经解释过了,主要作用有两个:
给每个ViewHolder
打了对应的flag
更新每个ViewHolder
的position。
关于这两个作用的分析,flag我们可以直接跳过,position在后面我会详细的分析。 从而,我们知道,在预布局阶段,每个ViewHolder
的position和flag就已经确定了,这个有什么作用呢?还记得我们之前分析RecyclerView
的动画机制说过,在预布局阶段如果条件允许的话,会进行一次布局,也就是会调用LayoutManager
的onLayouyChildren
方法。 而onLayouyChildren
方法会做啥呢?我主要介绍两点(这里以LinearLayoutManager
为例):
1.调用LayoutManager
的detachAndScrapAttachedViews
方法,回收所有的ViewHolder,将他们放入四级缓存中。
调用fill方法进行布局。在fill方法调用流程会调用RecyclerView
的tryGetViewHolderForPositionByDeadline
方法从缓存中获取ViewHolder
。
这里我们先来看回收部分,我们知道detachAndScrapAttachedViews
方法最终会调用到Recycler
的scrapView
方法里面去。我们来看看scrapView
方法(请大家睁大眼睛,这是寻找答案的第一条线索):
void scrapView(View view) {
final ViewHolder holder = getChildViewHolderInt(view);
if (holder.hasAnyOfTheFlags(ViewHolder.FLAG_REMOVED | ViewHolder.FLAG_INVALID)
|| !holder.isUpdated() || canReuseUpdatedViewHolder(holder)) {
if (holder.isInvalid() && !holder.isRemoved() && !mAdapter.hasStableIds()) {
throw new IllegalArgumentException("Called scrap view with an invalid view."
+ " Invalid views cannot be reused from scrap, they should rebound from"
+ " recycler pool." + exceptionLabel());
}
holder.setScrapContainer(this, false);
mAttachedScrap.add(holder);
} else {
if (mChangedScrap == null) {
mChangedScrap = new ArrayList();
}
holder.setScrapContainer(this, true);
mChangedScrap.add(holder);
}
}
从这里我们知道,scrapView
方法的作用就是ViewHolder
分别放到mAttachedScrap
和mChanedScrap
数组。这里我们重点关注canReuseUpdatedViewHolder(holder)
这个判断条件,我们来追踪这个方案的代码,最终我们找到了DefaultItemAnimator
的canReuseUpdatedViewHolder
方法:
@Override
public boolean canReuseUpdatedViewHolder(@NonNull ViewHolder viewHolder,
@NonNull List payloads) {
return !payloads.isEmpty() || super.canReuseUpdatedViewHolder(viewHolder, payloads);
}
看到没?这里判断了一下payloads
是否为空。这个有什么作用呢?我们回到scrapView
方法来,如果payloads
不为空的话,当前的ViewHolder
会被回收到mAttachedScrap
。这里,我们一定要记得,当ViewHolder
的payloads
不为空,那么在回收时,ViewHolder
会被回收到mAttachedScrap
。这个有什么作用呢?这就需要我们去寻找第二条线索。 第二条线索就藏在tryGetViewHolderForPositionByDeadline
方法里面。我们来瞅瞅:
ViewHolder getScrapOrHiddenOrCachedHolderForPosition(int position, boolean dryRun) {
final int scrapCount = mAttachedScrap.size();
// Try first for an exact, non-invalid match from scrap.
for (int i = 0; i < scrapCount; i++) {
final ViewHolder holder = mAttachedScrap.get(i);
if (!holder.wasReturnedFromScrap() && holder.getLayoutPosition() == position
&& !holder.isInvalid() && (mState.mInPreLayout || !holder.isRemoved())) {
holder.addFlags(ViewHolder.FLAG_RETURNED_FROM_SCRAP);
return holder;
}
}
// ······
}
结合上面的分析,当在预布局阶段,也就是dispatchLayoutStep1
阶段进行布局,通过带两个参数的notifyItemChanged
方法进行通知,肯定会在上面的代码返回一个ViewHolder
。也就是说,在这种情况下,变化前后该ItemView
的ViewHolder
肯定是同一个ViewHolder
。 如上就是第二条线索,那第二条线索有什么作用呢?就得看第三条线索了。那第三条线索在哪里呢?就在dispatchLayoutStep3
方法里面。 我们都知道,dispatchLayoutStep3
阶段被称为后布局,主要进行动画的执行,我们来看看我们的change操作会执行哪些代码:
private void dispatchLayoutStep3() {
// ······
if (mState.mRunSimpleAnimations) {
for (int i = mChildHelper.getChildCount() - 1; i >= 0; i--) {
// ······
animateChange(oldChangeViewHolder, holder, preInfo, postInfo,
oldDisappearing, newDisappearing);
// ······
}
// ······
}
change操作肯定会执行到如上的代码,我们在分析动画机制时就已经分析过了。我们来看看animateChange
方法:
private void animateChange(@NonNull ViewHolder oldHolder, @NonNull ViewHolder newHolder,
@NonNull ItemHolderInfo preInfo, @NonNull ItemHolderInfo postInfo,
boolean oldHolderDisappearing, boolean newHolderDisappearing) {
// ······
if (oldHolder != newHolder) {
// ······
addAnimatingView(oldHolder);
// ······
}
// ······
}
看到没,这就是最终的答案,只有两个ViewHolder
不是同一个对象才会添加一个AnimatingView
。 由于局部刷新的前后,ItemView
的是同一个ViewHolder
对象,才会导致局部刷新不会执行change动画,才会解决ItemView
的闪烁。 有可能有人又有疑问了,为什么会全局刷新不是同一个ViewHolder
呢?我们通过scrapView
方法可以知道,如果全局刷新,那么change的ViewHolder
会被回收到mChangedScrap
数组里面去,而在tryGetViewHolderForPositionByDeadline
方法里面,我们可以知道,只有预布局阶段才会从mChangedScrap
数组里面获取ViewHolder
对象:
if (mState.isPreLayout()) {
holder = getChangedScrapViewForPosition(position);
fromScrapOrHiddenOrCache = holder != null;
}
所以预布局阶段和正式布局阶段同一个ItemView
肯定是不同的ViewHolder
,从而会执行change动画。 由于这个问题的答案寻找起来比较麻烦,这里我就针对这个问题做一个简单的总结:
布局刷新之所以能解决ItemView
的闪烁问题,是因为在局部刷新的情况下,不会执行change动画。而不执行的chang动画的原因是因为在刷新前后都是同一个ViewHolder
,并且都是从mAttachedScrap
数组里面获得,所以在动画执行阶段,不会执行局部刷新导致的change动画,进而解决闪烁问题;而全局刷新由于刷新前后不是同一个ViewHolder
,所以会执行change动画。
4. ViewHolder的position
在ViewHolder的内部有几个让人难以理解的问题,一个是flag,众多的flag让人非常的懵逼,这个我在缓存机制那一篇文章,我已经做了详细的总结,有兴趣的同学可以看看我的文章:RecyclerView 源码分析(三) - RecyclerView的缓存机制;另一个是position,本文来重点分析一下。 这里主要分析两个方法,分别是getAdapterPosition
和getLayoutPosition
,对应着ViewHolder
内部两个成员变量mPosition
和mPreLayoutPosition
两个属性。 大家在使用这两个方法时,应该都对这两个方法有一定的疑问,这里我简单的解释一下这两个方法的区别(其实我们从这两个方法的注释就能看出区别)。 我们先来看看这两个方法的代码,首先来看一下getAdapterPosition
方法:
public final int getAdapterPosition() {
if (mOwnerRecyclerView == null) {
return NO_POSITION;
}
return mOwnerRecyclerView.getAdapterPositionFor(this);
}
别看getAdapterPosition
方法比较麻烦,还调用了RecyclerView
的getAdapterPositionFor
方法进行位置的计算。但是它表达的意思是非常简单的,就是获取当前ViewHolder所绑定ItemView的真实位置。这里的真实位置说的比较笼统,这样来解释吧,当我们remove掉为position为0的item,正常来说,后面ViewHolder
的position应该都减1。但是RecyclerView
处理Adapter
的更新采用的延迟处理策略,所以在正式处理之前获取ViewHolder
的位置可能会出现误差,介于这个原因,getAdapterPosition
方法就出现了。 getAdapterPosition
方法是怎样保证每次计算都是正确的呢?包括在正式处理之前呢?我们知道,在RecyclerView
中,延迟处理的实现是在notify阶段往一个叫mPendingUpdates
数组里面添加Operation
,分别在dispatchLayoutStep1
阶段或者dispatchLayoutStep2
阶段进行处理。通过追踪getAdapterPositionFor
方法,我们知道getAdapterPosition
方法在计算位置时,考虑到mPendingUpdates
数组的存在,所以在notify阶段和dispatchLayoutStep1
阶段之间(这里假设dispatchLayoutStep1
就会处理),getAdapterPosition
方法返回正确的位置。 而getLayoutPosition
方法呢?getLayoutPosition
方法就不能保证在notify阶段和dispatchLayoutStep1
阶段之间获取的位置是正确的。为什么这么说呢?我们来看看getLayoutPosition
方法的代码:
public final int getLayoutPosition() {
return mPreLayoutPosition == NO_POSITION ? mPosition : mPreLayoutPosition;
}
getLayoutPosition
方法返回的是mPosition
或者mPreLayoutPosition
,但是在dispatchLayoutStep1
阶段之前,还未更新每个ViewHolder
的position,所以获得不一定的是正确(只有在处理mPendingUpdates
的操作时,position才会被更新,对应着的代码就是执行AdapterHelper$Callback
接口的方法)。 但是getLayoutPosition
方法为什么还有存在的必要呢?我们发现getLayoutPosition
方法不会每次都计算,也就是说,getLayoutPosition
方法的效率比getAdapterPosition
方法高。当我们在Adapter这种调用方法来获取ViewHolder
的位置时,可以优先考虑getLayoutPosition
方法,因为Adapter
的方法回调阶段不在mPendingUpdates
处理之前,所以此时getLayoutPosition
方法跟getAdapterPosition
方法没有任何区别了。 但是需要注意,如果我们在其他地方获取ViewHolder
的position
,要特别注意这种情况,因为其他地方不能保证与RecyclerView
状态同步,这种情况为了保证结果的正确性,我们应该优先考虑getAdapterPosition
方法。
5. 总结
本文到这里差不多就结束了,在这里我们做一个简单的总结
之所以局部刷新能解决ItemView
闪烁的问题,是因为局部刷新进行change操作时没有执行change动画。而没有执行change动画的原因是因为在预布局阶段和后布局阶段,ItemView
的ViewHolder
是同一个对象。
getAdapterPosition
方法在任何时候获取的都是ViewHolder
真实的位置,而getLayoutPosition
方法只在mPendingUpdates
数组处理之后才能获取真实的位置。这是两个方法区别。
下一篇文章是分析DiffUtil
的实现,来看看DiffUtil
来怎么实现差量计算的。
你可能感兴趣的:(RecyclerView 源码分析(五) - Adapter的源码分析)
修改ssh默认端口号
weixin_33830216
运维
修改的是/etc/ssh/sshd_config文件[root@linux~]#vi/etc/ssh/sshd_config#$OpenBSD:sshd_config,v1.692004/05/2323:59:53dtuckerExp$#Thisisthesshdserversystem-wideconfigurationfile.See#sshd_config(5)formoreinformat
深入探索Django:常用实用方法指南
ivwdcwso
开发 django sqlite 数据库 python 开发
Django是一个高级的PythonWeb框架,旨在快速开发和简洁、实用的设计。它内置了许多功能,使得开发者能够高效地构建Web应用。在这篇博文中,我们将深入探讨一些Django中常用的实用方法,这些方法可以帮助你更好地控制Django应用的行为,使其更加灵活和安全。©ivwdcwso(ID:u012172506)1.get_object_or_404get_object_or_404是一个非常实
AI驱动运维管理革命:从理论到实战的全面指南
ivwdcwso
运维 人工智能 运维 AI
引言:运维的十字路口与AI的曙光数字化时代,企业IT架构呈指数级膨胀:微服务、容器化、混合云让系统复杂度激增;7×24小时业务连续性要求将MTTR(平均修复时间)压缩至分钟级;运维团队在告警风暴中疲于奔命,人力成本却居高不下。Gartner报告指出,2025年全球70%的企业将依赖AIOps(智能运维)实现系统自治。这场变革并非替代人类,而是将运维工程师从“救火队员”升级为“系统指挥官”。本文将深
AI 驱动的自动化测试:从代码到报告的全面解读
测试者家园
人工智能 软件测试 质量效能 测试策略 自动化测试 测试报告 测试用例
在软件开发的生命周期中,测试一直是确保软件质量的关键环节。然而,随着开发规模的日益庞大,传统的手动测试和简单的自动化脚本已经无法满足高效、快速和高质量的需求。随着人工智能(AI)的兴起,尤其是在深度学习、自然语言处理(NLP)和智能决策算法方面的突破,AI驱动的自动化测试正逐渐成为现代软件开发中的核心组成部分。从自动生成测试用例、智能缺陷预测、到自动化报告生成,AI技术的应用为软件测试带来了革命性
视觉分析之边缘检测算法
Erekys
计算机视觉 人工智能 音视频
9.1Roberts算子Roberts算子又称为交叉微分算法,是基于交叉差分的梯度算法,通过局部差分计算检测边缘线条。常用来处理具有陡峭的低噪声图像,当图像边缘接近于正45度或负45度时,该算法处理效果更理想。其缺点是对边缘的定位不太准确,提取的边缘线条较粗。importcv2ascvimportnumpyasnpimportmatplotlib.pyplotasplt#读取图像img=cv.im
YOLOv8与BiFormer注意力机制的融合:提升多场景目标检测性能的研究
向哆哆
YOLO 目标检测 目标跟踪 yolov8
文章目录保姆级YOLOv8改进:适用于多种检测场景的BiFormer注意力机制(Bi-levelRoutingAttention)1.YOLOv8的改进背景2.BiFormer注意力机制的核心原理2.1Bi-levelAttention结构2.2路由策略与加权融合3.YOLOv8与BiFormer的结合3.1YOLOv8架构概述3.2BiFormer与YOLOv8的融合策略4.实现代码示例5.结果
Java设计模式--工厂方法模式
yaCoding
Java设计模式 java 工厂方法模式 开发语言
工厂方法模式1.工厂方法模式的概述1.1工厂模式是简单工厂模式的延伸,符合开闭原则的基础上,还可以在增加新的具体产品对象时不需要对已有系统做任何修改。1.2工厂方法模式:定义一个用于创建对象的接口,但是让子类决定将哪个类实例化,工厂方法模式让一个类的实例化延伸到其子类。(也就是说在工厂方法模式中,不再提供一个统一的工厂类来创建所有的产品对象,而是对于不同的产品提供不同的工厂。例如:宝马工厂生产宝马
循环水泵:工业冷却系统的核心枢纽
CodeJourney.
人工智能 数据库 算法 架构
在现代工业生产中,循环水泵作为冷却系统的核心设备,发挥着不可替代的关键作用。无论是火力发电、石油化工,还是钢铁冶炼等行业,都离不开循环水泵高效稳定地运行,以保障生产流程的连续性和设备的安全性。本文将全面深入地探讨循环水泵的结构组成、工作原理、运行特点、维护要点以及未来发展趋势,力求为读者呈现一幅关于循环水泵的完整知识图景。一、循环水泵的重要作用循环水泵在工业系统中的主要任务是为凝汽式汽轮机提供大量
设计模式教程:解释器模式(Interpreter Pattern)
扣丁梦想家
设计模式教程 设计模式 解释器模式
1.什么是解释器模式?解释器模式(InterpreterPattern)是一种行为型设计模式,通常用于处理语言(例如数学表达式、SQL查询等)中的语法和解释。该模式定义了一个文法,并通过解释器类来解释文法中的表达式。通过将语言的语法规则表示为类,能够轻松地解释和执行表达式。解释器模式将每种语法规则表示为一个类,并提供一个解释方法,该方法根据语法规则对输入进行解析。通常,这种模式用于编写编程语言解析
如何修改系统默认的ssh端口?
花开香散入帘风
国产Linux操作系统 ssh 服务器 网络
如何修改系统默认的ssh端口?修改系统默认的ssh端口为1222,参考步骤如下:1、修改sshd配置文件sudovim/etc/ssh/sshd_config将该文件里面的“#port22”参数改为“port1222”后保存退出2、端口修改完成后在重启ssh服务sudosystectlrestartssh【注意】:1、系统默认的ssh端口为22。如果要修改,则直接编辑22端口并将前面的“#”注释符
Linux修改ssh默认端口22为其他端口2024
lytcreate.
Linux 问题记录 linux ssh 服务器
一、修改配置文件修改ssh服务的配置文件:/etc/ssh/sshd_config将Port22放开注释,并将22修改为2024,并保存二、重启sshd服务systemctlrestartsshd三、重启服务失败如果重启服务失败,可以执行以下命令:semanageport-a-tssh_port_t-ptcp2024semanageport-a-tssh_port_t-ptcp2024命令在SEL
修改ssh端口讲解
朝思慕柒
SSH Linux命令 ssh 服务器 linux
修改SSH端口讲解前言修改ssh端口主要是为了提高服务器的安全性,默认情况下的端口是“22”端口因此以防万一攻击者和自动化脚本攻击默认端口暴力破解、密码猜测等等恶意行为。一、编辑ssh配置文件编辑ssh配置文件,默认是在/etc/ssh/sshd_config,使用以下命令:vim/etc/ssh/sshd_config怕编辑错误可以使用以下命令备份cp/etc/ssh/sshd_config/e
Django连接mysql数据库
NiHaoChiLeMa
数据库 django python
前篇已配置好了Django的运行环境,接下来连接数据库,Django数据库默认保存在SQLite3上,但是不熟悉SQLite的操作,想更换为mysql数据库.一、新建数据库在mysql新建一个数据库,库名为:testsql二、配置Django项目环境1、配置settings.py在settings.py找到DATABASES,修改里面的参数为:DATABASES={'default':{'ENGI
Excel数据透视表行标签和列标签设置详解
mmoo_python
excel windows
Excel数据透视表行标签和列标签设置详解在Excel中,数据透视表作为一种高效的数据分析工具,被广泛用于数据处理和报告生成。它允许用户以灵活的方式对大量数据进行汇总、分类和分析,而行标签和列标签则是数据透视表中至关重要的组成部分,它们决定了数据的展示方式和阅读便利性。本文将详细介绍如何在Excel中设置数据透视表的行标签和列标签,帮助用户轻松掌握这一实用技能。一、数据透视表基础在深入探讨行标签和
【大数据技术】搭建完全分布式高可用大数据集群(MySQL+Hive)
Want595
Python大数据采集与分析 大数据 分布式 mysql
搭建完全分布式高可用大数据集群(MySQL+Hive)apache-hive-3.1.3-bin.tar.gzmysql-connector-java-8.0.30注:请在阅读本篇文章前,将以上资源下载下来。写在前面本文主要介绍搭建完全分布式高可用集群Hive的详细步骤。注意:统一约定将软件安装包存放于虚拟机的/software目录下,软件安装至/opt目录下。安装MySQL请按照以下步骤将MyS
MD5加密算法和BCrypt密码加密算法
敲代码的小王!
java 安全 算法
目录一、BCrypt算法与MD5算法介绍1、MD5算法1.MD5算法介绍2.MD5算法工作原理3.MD5算法的优劣2、BCrypt算法1.BCrypt算法介绍2.BCrypt算法原理3.BCrypt算法优劣3、两种算法的对比和总结1.MD5与bcrypt对比2.总结二、两种算法的使用1、MD5算法的使用说明:2、BCrypt算法的使用1.引入依赖2.BCrypt算法使用前言:随着网络安全威胁的日益
第 19 天:时间管理(Timers),让事件按时间执行!
Bluesonli
ue5 unreal engine 游戏 c++ 前端
目标✅理解UE5中定时器(Timer)的原理与用途✅使用FTimerHandle实现事件延时、倒计时系统✅比较Tick()与Timer的使用场景✅构建一个简单的倒计时示例1️⃣为什么需要时间管理?在游戏开发中,很多行为不需要每帧都更新,而是按照一定时间间隔执行,例如:延迟执行事件(如开火冷却、动画播放完成后触发后续逻辑)倒计时效果(如倒计时计时器)优化性能:与Tick()相比,定时器能减少不必要的
如何更改Linux的ssh端口
lxw1844912514
1.修改/etc/ssh/sshd_config里的Port字段Port22改为Port1000(你自定义的端口)2.重启sshd服务#servicesshdrestart
Git公钥设置 以及 Gitee拉取代码
jim_jill
工具 sql 数据库 vue.js
Git配置Git安装完之后,需做最后一步配置。打开gitbash,分别执行以下两句命令gitconfig--globaluser.name“用户名”gitconfig--globaluser.email“邮箱”justlikethis:SSH配置1、打开gitbash2、执行生成公钥和私钥的命令:ssh-keygen-trsa并按回车3下(不要设置密码,直接三个回车跳过输入,除非真的自己需要才设置
MATLAB图像处理
陈辰学长
图像处理 matlab 计算机视觉
MATLAB图像处理MATLAB,作为美国MathWorks公司出品的商业数学软件,以其强大的矩阵运算能力和丰富的函数库,在图像处理领域得到了广泛的应用。MATLAB不仅提供了基础的图像处理功能,还通过图像处理工具箱(ImageProcessingToolbox)等高级工具,为用户提供了从图像读取、显示、转换到高级分析和处理的一系列功能。以下将详细介绍MATLAB在图像处理方面的应用。一、MATL
Mac Unity编辑器中Process调用Python脚本。
ShawnWeasley
python java linux 人工智能 unity
这玩意是真的难,环境:macOS10.15.4Unity2019.4Python3.8首先我们要知道一个API:System.Diagnostics.Process可以打开其他程序。我期望能在Unity中直接调用一个写好的python脚本。需求很简单,却足足研究了三四个小时。一开始的思路是,用Unity打开终端,再自动输入一条命令比如python3.8xxx就可以了。用百度,发现win上的问题好像
[思考.AI]AI的能力边界?通用与专用模型平衡?人机协作模式?
俊哥V
AI 由AI辅助创作 人工智能 AI
刚才列的三个问题AI的能力边界?适合做什么、不适合做什么?通用与专用模型平衡?结合特定应用场景的选择人机协作模式?人与AI的角色协调与配合...索性先丢给了AI,摘录其回复:以下是对三个核心问题的结构化分析,结合当前AI发展现状与搜索结果中的关键信息:一、AI能力边界的界定与适用场景适合领域:模式识别与数据处理医疗影像分析(如肿瘤检测)、金融风控(反欺诈模型)等场景中,AI凭借高精度数据处理能力显
模型压缩-模型蒸馏、模型剪枝、模型量化
NLP的小Y
剪枝 机器学习 nlp 语言模型
一、模型蒸馏1.1蒸馏简介知识蒸馏是指通过教师模型指导学生模型训练,通过蒸馏的方式让学生模型学习到教师模型的知识,最终使学生模型达到或媲美教师模型的准确度。在模型压缩中,教师模型是一个预训练好的复杂的模型,而学生模型是一个规模较小的模型。如分类任务中,由训练好的教师模型在相同的数据下,通过将教师模型对样本的预测值作为学生模型的预测目标,指导学生模型学习,这个预测值一般指教师网络输出的类概率。教师模
零基础3分钟上手量化交易,用均线+成交量跑赢市场
Max易发量化
Ehpod易发量化 大数据 人工智能 区块链 比特币 web3
首先抛出一个问题:为什么新手更需要量化交易?揭开散户逆袭的唯一捷径当你在市场中“裸奔”时,机构早已全副武装二级市场是世界最残酷的竞技场,无论是熟知的大A、美股还是加密。当然如果你选对了市场,也会达到事半功倍的效果,如果你选错了鱼塘,拿着刀叉、簸箕、渔网去捕鱼,但鱼儿已经被大户打捞得消失殆尽,怎么打捞都是徒而无功...机构用AI每秒分析10万条数据,而你还在刷社交媒体看小道消息对冲基金靠算法24小时
动态规划求解 fibonacci 数列
暗隐之光
数据结构与算法 动态规划 算法
动态规划:动态规划的基本思想是:将原问题拆分为若干子问题,自底向上的求解。是自底向上的求解,即是先计算子问题的解,再得出原问题的解。思路:创建一个数组,大小为n+1,用于存储斐波那契数列的值。数组的第i个元素对应斐波那契数列的第i项。初始化数组的前两个元素,即F(0)=0,F(1)=1。从i=2开始,迭代计算出第i项的值,即F(i)=F(i-1)+F(i-2)。这个值可以直接由数组中的前两个元素得
标准制修订信息管理系统:推动企业标准化管理的数字化转型
Neozsvc
运维 零售
在数字化转型的浪潮中,标准化管理作为企业高质量发展的基石,正面临着前所未有的机遇与挑战。我们基于多年行业实践经验,推出标准制修订信息管理系统,助力企业实现标准化工作的全生命周期管理与全价值链共享,推动标准化管理从“传统分散”向“智能协同”转型。行业痛点:标准化管理的挑战标准体系不完善:缺乏动态化管理能力,难以适应快速变化的业务需求。管理分散,信息孤岛:标准化工作分散在不同部门,无法实现实时共享与协
MATLAB 图像处理:阈值分割检测裂纹和划痕
PixelDyno
图像处理 matlab 计算机视觉 Matlab
MATLAB图像处理:阈值分割检测裂纹和划痕阈值分割是一种常见的图像处理技术,可以将图像分成不同的区域。在裂纹和划痕检测中,阈值分割可以帮助我们将图像中的裂纹和划痕区域分离出来。本文将介绍如何使用MATLAB进行阈值分割裂纹和划痕检测。读入图像首先,我们需要读入一张待处理的图像。可以使用MATLAB的imread函数将图像读入到MATLAB中:img=imread('image.jpg');灰度化
静态链接与动态链接、静态库与动态库、硬链接与软链接
Potato_10
操作系统 编程语言 操作系统
一、C++从代码到可执行程序经历了什么?(1)预编译:主要处理源代码文件中的以“#”开头的预编译指令。(预编译后形成.i文件)处理规则见下: 删除所有的#define,展开所有的宏定义。 处理所有的条件预编译指令,如“#if”、“#endif”、“#ifdef”、“#elif”和“#else”。 处理“#include”预编译指令,将文件内容替换到它的位置,这个过程是递归进行的,文件中包含其
【GESP】C++二级真题 luogu-b3924, [GESP202312 二级] 小杨的H字矩阵
CoderCodingNo
GESP c++ 矩阵 java
GESP二级真题,多层循环、分支语句练习,难度★✮☆☆☆。题目题解详见:https://www.coderli.com/gesp-2-luogu-b3924/【GESP】C++二级真题luogu-b3924,[GESP202312二级]小杨的H字矩阵|OneCoderGESP二级真题,多层循环、分支语句练习,难度★✮☆☆☆。https://www.coderli.com/gesp-2-luogu-
Linux-RPM、YUM/DNF和软硬链接
CHQ_2157
linux
RPM管理工具RPM是红帽子包管理(RedhatPackageManager)的缩写。由RedHat公司提出的一种软件包管理标准。是Linux各发行版本中最广泛的软件包格式之一(还有debian的发行版deb安装包)RPM功能通过rpm命令使用不同参数来实现rpm:软件包_压缩存贮,拥有一个头文件,其中包含有关于本软件包的相关信息,便于对软件包信息进行查询RPM软件包的典型命名格式:软件名-版本号
java的(PO,VO,TO,BO,DAO,POJO)
Cb123456
VO TO BO POJO DAO
转:
http://www.cnblogs.com/yxnchinahlj/archive/2012/02/24/2366110.html
-------------------------------------------------------------------
O/R Mapping 是 Object Relational Mapping(对象关系映
spring ioc原理(看完后大家可以自己写一个spring)
aijuans
spring
最近,买了本Spring入门书:spring In Action 。大致浏览了下感觉还不错。就是入门了点。Manning的书还是不错的,我虽然不像哪些只看Manning书的人那样专注于Manning,但怀着崇敬 的心情和激情通览了一遍。又一次接受了IOC 、DI、AOP等Spring核心概念。 先就IOC和DI谈一点我的看法。IO
MyEclipse 2014中Customize Persperctive设置无效的解决方法
Kai_Ge
MyEclipse2014
高高兴兴下载个MyEclipse2014,发现工具条上多了个手机开发的按钮,心生不爽就想弄掉他!
结果发现Customize Persperctive失效!!
有说更新下就好了,可是国内Myeclipse访问不了,何谈更新...
so~这里提供了更新后的一下jar包,给大家使用!
1、将9个jar复制到myeclipse安装目录\plugins中
2、删除和这9个jar同包名但是版本号较
SpringMvc上传
120153216
springMVC
@RequestMapping(value = WebUrlConstant.UPLOADFILE)
@ResponseBody
public Map<String, Object> uploadFile(HttpServletRequest request,HttpServletResponse httpresponse) {
try {
//
Javascript----HTML DOM 事件
何必如此
JavaScript html Web
HTML DOM 事件允许Javascript在HTML文档元素中注册不同事件处理程序。
事件通常与函数结合使用,函数不会在事件发生前被执行!
注:DOM: 指明使用的 DOM 属性级别。
1.鼠标事件
属性
动态绑定和删除onclick事件
357029540
JavaScript jquery
因为对JQUERY和JS的动态绑定事件的不熟悉,今天花了好久的时间才把动态绑定和删除onclick事件搞定!现在分享下我的过程。
在我的查询页面,我将我的onclick事件绑定到了tr标签上同时传入当前行(this值)参数,这样可以在点击行上的任意地方时可以选中checkbox,但是在我的某一列上也有一个onclick事件是用于下载附件的,当
HttpClient|HttpClient请求详解
7454103
apache 应用服务器 网络协议 网络应用 Security
HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。本文首先介绍 HTTPClient,然后根据作者实际工作经验给出了一些常见问题的解决方法。HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需
递归 逐层统计树形结构数据
darkranger
数据结构
将集合递归获取树形结构:
/**
*
* 递归获取数据
* @param alist:所有分类
* @param subjname:对应统计的项目名称
* @param pk:对应项目主键
* @param reportList: 最后统计的结果集
* @param count:项目级别
*/
public void getReportVO(Arr
访问WEB-INF下使用frameset标签页面出错的原因
aijuans
struts2
<frameset rows="61,*,24" cols="*" framespacing="0" frameborder="no" border="0">
MAVEN常用命令
avords
Maven库:
http://repo2.maven.org/maven2/
Maven依赖查询:
http://mvnrepository.com/
Maven常用命令: 1. 创建Maven的普通java项目: mvn archetype:create -DgroupId=packageName
PHP如果自带一个小型的web服务器就好了
houxinyou
apache 应用服务器 Web PHP 脚本
最近单位用PHP做网站,感觉PHP挺好的,不过有一些地方不太习惯,比如,环境搭建。PHP本身就是一个网站后台脚本,但用PHP做程序时还要下载apache,配置起来也不太很方便,虽然有好多配置好的apache+php+mysq的环境,但用起来总是心里不太舒服,因为我要的只是一个开发环境,如果是真实的运行环境,下个apahe也无所谓,但只是一个开发环境,总有一种杀鸡用牛刀的感觉。如果php自己的程序中
NoSQL数据库之Redis数据库管理(list类型)
bijian1013
redis 数据库 NoSQL
3.list类型及操作
List是一个链表结构,主要功能是push、pop、获取一个范围的所有值等等,操作key理解为链表的名字。Redis的list类型其实就是一个每个子元素都是string类型的双向链表。我们可以通过push、pop操作从链表的头部或者尾部添加删除元素,这样list既可以作为栈,又可以作为队列。
&nbs
谁在用Hadoop?
bingyingao
hadoop 数据挖掘 公司 应用场景
Hadoop技术的应用已经十分广泛了,而我是最近才开始对它有所了解,它在大数据领域的出色表现也让我产生了兴趣。浏览了他的官网,其中有一个页面专门介绍目前世界上有哪些公司在用Hadoop,这些公司涵盖各行各业,不乏一些大公司如alibaba,ebay,amazon,google,facebook,adobe等,主要用于日志分析、数据挖掘、机器学习、构建索引、业务报表等场景,这更加激发了学习它的热情。
【Spark七十六】Spark计算结果存到MySQL
bit1129
mysql
package spark.examples.db
import java.sql.{PreparedStatement, Connection, DriverManager}
import com.mysql.jdbc.Driver
import org.apache.spark.{SparkContext, SparkConf}
object SparkMySQLInteg
Scala: JVM上的函数编程
bookjovi
scala erlang haskell
说Scala是JVM上的函数编程一点也不为过,Scala把面向对象和函数型编程这两种主流编程范式结合了起来,对于熟悉各种编程范式的人而言Scala并没有带来太多革新的编程思想,scala主要的有点在于Java庞大的package优势,这样也就弥补了JVM平台上函数型编程的缺失,MS家.net上已经有了F#,JVM怎么能不跟上呢?
对本人而言
jar打成exe
bro_feng
java jar exe
今天要把jar包打成exe,jsmooth和exe4j都用了。
遇见几个问题。记录一下。
两个软件都很好使,网上都有图片教程,都挺不错。
首先肯定是要用自己的jre的,不然不能通用,其次别忘了把需要的lib放到classPath中。
困扰我很久的一个问题是,我自己打包成功后,在一个同事的没有装jdk的电脑上运行,就是不行,报错jvm.dll为无效的windows映像,如截图
最后发现
读《研磨设计模式》-代码笔记-策略模式-Strategy
bylijinnan
java 设计模式
声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/
/*
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化
简单理解:
1、将不同的策略提炼出一个共同接口。这是容易的,因为不同的策略,只是算法不同,需要传递的参数
cmd命令值cvfM命令
chenyu19891124
cmd
cmd命令还真是强大啊。今天发现jar -cvfM aa.rar @aaalist 就这行命令可以根据aaalist取出相应的文件
例如:
在d:\workspace\prpall\test.java 有这样一个文件,现在想要将这个文件打成一个包。运行如下命令即可比如在d:\wor
OpenJWeb(1.8) Java Web应用快速开发平台
comsci
java 框架 Web 项目管理 企业应用
OpenJWeb(1.8) Java Web应用快速开发平台的作者是我们技术联盟的成员,他最近推出了新版本的快速应用开发平台 OpenJWeb(1.8),我帮他做做宣传
OpenJWeb快速开发平台以快速开发为核心,整合先进的java 开源框架,本着自主开发+应用集成相结合的原则,旨在为政府、企事业单位、软件公司等平台用户提供一个架构透
Python 报错:IndentationError: unexpected indent
daizj
python tab 空格 缩进
IndentationError: unexpected indent 是缩进的问题,也有可能是tab和空格混用啦
Python开发者有意让违反了缩进规则的程序不能通过编译,以此来强制程序员养成良好的编程习惯。并且在Python语言里,缩进而非花括号或者某种关键字,被用于表示语句块的开始和退出。增加缩进表示语句块的开
HttpClient 超时设置
dongwei_6688
httpclient
HttpClient中的超时设置包含两个部分:
1. 建立连接超时,是指在httpclient客户端和服务器端建立连接过程中允许的最大等待时间
2. 读取数据超时,是指在建立连接后,等待读取服务器端的响应数据时允许的最大等待时间
在HttpClient 4.x中如下设置:
HttpClient httpclient = new DefaultHttpC
小鱼与波浪
dcj3sjt126com
一条小鱼游出水面看蓝天,偶然间遇到了波浪。 小鱼便与波浪在海面上游戏,随着波浪上下起伏、汹涌前进。 小鱼在波浪里兴奋得大叫:“你每天都过着这么刺激的生活吗?简直太棒了。” 波浪说:“岂只每天过这样的生活,几乎每一刻都这么刺激!还有更刺激的,要有潮汐变化,或者狂风暴雨,那才是兴奋得心脏都会跳出来。” 小鱼说:“真希望我也能变成一个波浪,每天随着风雨、潮汐流动,不知道有多么好!” 很快,小鱼
Error Code: 1175 You are using safe update mode and you tried to update a table
dcj3sjt126com
mysql
快速高效用:SET SQL_SAFE_UPDATES = 0;下面的就不要看了!
今日用MySQL Workbench进行数据库的管理更新时,执行一个更新的语句碰到以下错误提示:
Error Code: 1175
You are using safe update mode and you tried to update a table without a WHERE that
枚举类型详细介绍及方法定义
gaomysion
enum javaee
转发
http://developer.51cto.com/art/201107/275031.htm
枚举其实就是一种类型,跟int, char 这种差不多,就是定义变量时限制输入的,你只能够赋enum里面规定的值。建议大家可以看看,这两篇文章,《java枚举类型入门》和《C++的中的结构体和枚举》,供大家参考。
枚举类型是JDK5.0的新特征。Sun引进了一个全新的关键字enum
Merge Sorted Array
hcx2013
array
Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array.
Note:You may assume that nums1 has enough space (size that is
Expression Language 3.0新特性
jinnianshilongnian
el 3.0
Expression Language 3.0表达式语言规范最终版从2013-4-29发布到现在已经非常久的时间了;目前如Tomcat 8、Jetty 9、GlasshFish 4已经支持EL 3.0。新特性包括:如字符串拼接操作符、赋值、分号操作符、对象方法调用、Lambda表达式、静态字段/方法调用、构造器调用、Java8集合操作。目前Glassfish 4/Jetty实现最好,对大多数新特性
超越算法来看待个性化推荐
liyonghui160com
超越算法来看待个性化推荐
一提到个性化推荐,大家一般会想到协同过滤、文本相似等推荐算法,或是更高阶的模型推荐算法,百度的张栋说过,推荐40%取决于UI、30%取决于数据、20%取决于背景知识,虽然本人不是很认同这种比例,但推荐系统中,推荐算法起的作用起的作用是非常有限的。
就像任何
写给Javascript初学者的小小建议
pda158
JavaScript
一般初学JavaScript的时候最头痛的就是浏览器兼容问题。在Firefox下面好好的代码放到IE就不能显示了,又或者是在IE能正常显示的代码在firefox又报错了。 如果你正初学JavaScript并有着一样的处境的话建议你:初学JavaScript的时候无视DOM和BOM的兼容性,将更多的时间花在 了解语言本身(ECMAScript)。只在特定浏览器编写代码(Chrome/Fi
Java 枚举
ShihLei
java enum 枚举
注:文章内容大量借鉴使用网上的资料,可惜没有记录参考地址,只能再传对作者说声抱歉并表示感谢!
一 基础 1)语法
枚举类型只能有私有构造器(这样做可以保证客户代码没有办法新建一个enum的实例)
枚举实例必须最先定义
2)特性
&nb
Java SE 6 HotSpot虚拟机的垃圾回收机制
uuhorse
java HotSpot GC 垃圾回收 VM
官方资料,关于Java SE 6 HotSpot虚拟机的garbage Collection,非常全,英文。
http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html
Java SE 6 HotSpot[tm] Virtual Machine Garbage Collection Tuning
&