OpenAI 人工智能绘图工具 DALLE 好用吗?

用朴素的语言,还原你天马星空的想象。

喜悦

早上,终于收到了 OpenAI 的通知 —— 漫长的排队后,我可以用 DALLE 了。

这款人工智能绘图工具让我种草了多长时间?其实都快忘了,哈哈。查了一下,我是 4 月 7 日申请的,到被批准差不多 100 天吧 ?

激动的心,颤抖的手,我赶紧按照信件提示,点链接进去。欢迎我的,是这样一个霸王条款:

DALLE 生成的图片,严禁商用,更别提上 NFT 交易了;而且 OpenAI 对于我创作出来的图片拥有所有权。用户只对「自己上传到系统的图片」有所有权。但是,为了改进模型,人家可能还要用你上传的图片作为训练数据……

搁以前我的脾气,早就扭头走人了。但是这回不行,DALLE 的吸引力太大,而且前面沉没成本较高。忍一忍吧。

尝试

我进入 DALLE 后,发现页面非常清爽,只有一个文本框。

我在其中输入了这样一段描述文字:

a kung fu panda is fighting with a T-rex in the woods

应用自动开始工作,通过训练好的大模型来进行图像生成。等候过程中,会有一些提示和样例。

例如这个:

进度条往后走,还有这样的提示:

这些不断变化的提示,既缓解了用户焦躁等待的心情,同时还帮你改进后续的内容输入方式。这种一举两得的方式,值得其他应用借鉴。

几十秒钟之后,进度条终于挪动到头儿了,于是我看到了生成的结果,一共 6 张图片。我一一点进去。

其中这张很不错:

这张嘛,也还行:

最搞笑的,是这张:

喂,你拿恐龙当玩具吗?

这是 6 张图片的全景。你更喜欢其中哪一张呢?

我正玩儿得不亦乐乎,大儿子进来了。他刚放假,最近在和弟弟养小鸡。于是他出的题目自然是:

Two little boys, teasing two fluffy chicks

DALLE 做出来的结果,他不是很满意。

因为这俩小孩儿,看上去明显是外国人嘛。于是我帮着修改了一下描述:

Two little Asian boys, teasing two fluffy chicks

嗯,这回看起来好多了。

对比

其实,这已经不是我第一次为你介绍人工智能自动绘图工具了。

还记得吗?去年那篇《如何把你的想法一键变成图画?[1] 这款工具的绘图能力。

下面咱们来对比一下 Text to Image Art Generator[2] 和 DALLE 对同样的文字绘制图像结果的差别。

这是第一句:

a small boy on the shark in deep ocean

Text to Image Art Generator[3] 当初绘制的图形是这样。

我把同样的内容,输入到了 DALLE ,咱们再来看看。

果然是「没有对比就没有伤害」啊,哈哈。当时的文章里,还有一句话,是:

a t-rex playing in olympics 100 meters running game

Text to Image Art Generator[4] 做的图是这样的:

咱们看看同样的话,在 DALLE 里面是啥样?

我现在只能用「不可同日而语」来形容二者之间的差距了。

顺便,我也想对比一下前些日子非常火的 Disco Diffusion 和 DALLE 的区别。

刚开始用 Disco Diffusion 的时候,我做了不少测试。其中写过这样一段:

a beautiful landscape painting of A wizard in black robes, and a Tyrannosaurus rex in a fierce battle in the primeval forest. a 9-year-old boy and a 5-year-old boy are watching them in the corner.

这是当时 Disco Diffusion 在 Google Colab 里经过几十分钟生成的结果:

而这,是 DALLE 几十秒内画出来的:

好吧,再来对比另外一组:

A comic with a robot wearing a cowboy hat in the center is painting a landscape on a drawing board. The right side of the painting has a creek running through it, with mountains and sunset in the distance in the background by Pablo Munoz Gomez Trending on artstation

这是 Disco Diffusion 的结果,够抽象的。我要不说,你能看出是机器人画家在作画吗?

而这,是 DALLE 的绘图:

其中,我最喜欢的是这张。

你喜欢哪张?

图片生成图片

除了文字生成图片以外,注意文本框下面还有一行小字儿 —— 你可以上传图片,然后由 DALLE 进行调整生成新的图片。

我尝试了几张图片。发现并不是所有图片都可以。例如说图片里面包含人脸,就不行。

人脸不行,咱们就试试牛脸好了。我上传了一张水牛的照片。然后 DALLE 生成了另外 5 张图。

我觉得其中第 3 张最为有趣。

因为它包含了原始图形中根本没有涉及的角度。可以看得出来,这种图片生成可不只是旋转、镜像这种低级简单操作。

挑战

我给你不厌其烦展示这种机器作画的能力,并不是显摆「看我电脑画得多棒」,或跟你鼓吹「艺术家要失业了」之类的危言耸听。

艺术家不会失业。他们会和 AI 联合,把工作做得更高效,进一步挑战人类创造力的边界。

但是,DALLE的绘画能力,展现了一些潜在的挑战,我们可能需要注意。

首先,那些从事非艺术的绘画创作的人(例如低等级的插画师),可能会遭受到职业危机。

原先如果你需要一个特定的图画,又没有现成的,也许就需要找人来绘制。绘制的效果不一定要多么艺术,但是得美观能用,符合要求。所以只要你会画画,又对报酬没有过高的要求,总有一些生存的空间。

但是,现在只要有了想法,我用文字写出来,就可以由人工智能画出。我对这些图画,也没有啥太高的要求,够用就行。例如今天早上,为了给知识星球的新文章弄个题图,我直接让 DALLE 绘制了这样一副场景:

a highly intelligent robot finding things among different databases, digital art

然后嘛,下面这些题图就能用了。

我前面提到过,DALLE生成的图片,版权依然是个问题。如果你把机器生成的图片用作商用,DALLE 并不适合。不过好在技术的进步,会带来更快的迭代速度,和更好的绘画质量。而且根据以往的经验,随着热度提升,先进技术还会迅速扩散。我们可以期待,后续会有更多类似 DALLE 的人工智能绘画服务,便宜、好用,而且没有那么多的霸王条款。

而另外一件事情,可能带来的挑战更为剧烈一些。

我思考这个问题,是因为前些日子我们学院主办了一次《数据分析与信息服务发展国际会议》。

其中一位主讲嘉宾 Daniel E Acuna 提出了科研伦理中的典型问题——图片抄袭。你在新闻报道中可能已经听说过,不少很多论文的抄袭、剽窃都是用图片对比来发现的。

(图片来源:Mazaheri et al., 2021)

你可能会感到奇怪,为什么这些作者非得要原封不动像素级拷贝别人论文的图片呢?这是因为,科研中的证据照片(例如显微镜观察到的)或分析结果绘图要想「无中生有」,其实挺困难的。诸多因素牵扯,使得你「生造」图像的话,很容易会被专业人士识别出来。

因此更多人的铤而走险,选择的方向是把已经出现在图片里面的元素,稍加改动或者干脆拷贝粘贴。他们的侥幸心理作祟,期盼别人发现不了这张图和原图之间的联系。

(图片来源 t.ly/D6PH[5]

我在想,DALLE 这样强悍的工具出现,对于学术论文插图的剽窃甚至造假活动,会意味着什么?

在很多领域,例如生物、医学,都有大量的图片和它们对应的文字描述。难免有人出于种种目的,把这些内容进行采集,并且微调 DALLE 这样的图像生成模型。在并不遥远的将来,他完全可以瞒天过海,仅用自己的语言描述,就把想要的结果直接变成制式、风格全都无懈可击的「新」照片或图形。或者直接上传原始图片,用语言进行调整修改,结果会让原论文作者自己都认不出来。这些操作,将给研究结果真实性和原创性审核带来严峻的挑战

有什么好办法来应对吗?我没有进行深入研究,无法回答。目前我能想到的,也就是用技术对抗技术。只有同样见多识广的模型,才能打败这种违背学术道德的「无中生有」。咱们拭目以待吧。

小结

本文我为你介绍了自己试用 OpenAI 的 DALLE 这款人工智能绘图应用的结果,以及一些涌入头脑的思考。面对新的科技浪潮,拥抱比排斥往往更为明智。尽管面对潜在的挑战,我们可能需要做好准备,以免使自己的生活,乃至于科学界的公序良俗遭受到冲击。

你有没有尝试这些近期高速发展的人工智能绘图应用?你觉得效果如何?有什么想要赞叹或吐槽的?欢迎留言,我们一起交流讨论。

祝(人工智能)绘图愉快!

延伸阅读

  • 【视频】临时笔记(Fleeting Notes)的记录与加工
  • 【星球精选】Obsidian 中的 excalibrain 插件:免费的 theBrain ?
  • 如何更高效用 Roam?免费分享 Roam Untangled 作者 Jamie Miles 的几个小技巧
  • 如何安装 Python 运行环境 Anaconda?(视频教程)
  • 如何用 Python 和决策树预测广告点击行为?(云环境视频教程)

参考资料

[1]

如何把你的想法一键变成图画?: https://mp.weixin.qq.com/s/E_rN2ZhuP2AOrSn5HCuoTA

[2]

Text to Image Art Generator: https://creator.nightcafe.studio/text-to-image-art

[3]

Text to Image Art Generator: https://creator.nightcafe.studio/text-to-image-art

[4]

Text to Image Art Generator: https://creator.nightcafe.studio/text-to-image-art

[5]

t.ly/D6PH: t.ly/D6PH

本文转载于网络 如有侵权请联系删除

相关文章

  • 教你更科学地花钱:因果推断在增长业务ROI量化评估上的应用

    点击蓝字关注我们作者:李金霞Polarisli知乎专栏:《数据分析方法与实践》创作者:「守望北极星的猫」---了解作者其他作品,请点击【文末原文链接】---丨导语丨 做增长业务,常用的策略手段有渠道拉新、拉活、节假日活动等,这几个业务都是需要花钱的,每年分配的预算有限,如何权衡在各项业务上的投入成本,如何花钱效率最高,将好钢用在刀刃上是需要运营管理者去思考和决策的,如何决策更科学,那就不得不提到因果推断这种科学的量化方法,每笔投入的ROI量化评判标准统一,自然就可比较。有一套关于花钱的经典面试题:新年伊始,业务部门要做新一年的规划,部门需要在渠道拉新、拉活、节假日活动3个地方花钱,你如何判断花钱是否值得,分配是否合理?这里面隐含的一个问题是:上述3个地方你的评估标准是否统一,比如用户价值统一用LTV衡量,后续统一计算ROI即可,最忌讳的是不同业务有不同的标准,比如拉新看次留、拉活看回流量、A活动看签到量、B活动看积分消耗量等,不统一则不可纵向比较。 渠道拉新相对容易,因为本身拉来的是一个新用户,自身计算LTV即可,但是拉活、活动因为要计算增益,就需要找对比组。比如拉活,要对比拉活和未拉

  • 项目延期了,怎么办?

    在软件开发的项目里,延期好像成了常态。我跟很多同行聊,都会有这种情况。那项目为什么会这么容易延期?因为软件不像房子这类实物,能通过特定的步骤达成。一个软件到底由多少代码写出来的,你在做之前是不知道的。而且代码多并不能代表做得就好。所以软件的复杂度更难评估。所以工程师在评估工作量时就不准确。尤其是那些他以前没有做过的功能。那如果项目延期了,我们怎么办?复盘——找问题——拆解问题——制定解决方案——迭代——复盘好像大部分事情都可以通过这种方式解决。我们把问题按类型分为:可控和不可控。可控的问题:1、资源分配不合理;2、没有及时同步信息;3、偏离计划后没有做好应对措施。不可控的:1、需求变更(需求管理没做好);2、临时人员变动;3、线上出现bug或有临时紧急任务。对于不可控的问题,我们能做的不多,只能尽量向上面争取资源,预留一部分时间来处理。比如对内上线时间与对外上线时间可以不一致。这种预留一般都不会很准,但需要。而可控的问题,是需要我们在下一次项目中解决的。具体怎么做呢?一、建立流程规范。通过线上项目管理工具(teambition、worktile、飞书之类的),把所有人的任务都进行线上管

  • Docker/Rancher2部署sftp

    Docker部署sftpdockerrun-d-p30022:22-v/data/sftp/data:/home-v/data/sftp/config/users.conf:/etc/sftp/users.confatmoz/sftp:latest复制根路径data需要755权限(监狱模式),用户路径需要777权限需要手动设置权限,并且重启后需要重新设置权限如果是挂载目录,则更改宿主机目录权限users.conf模板下载Rancher2部署sftp注意权限问题命令进入容器#1.添加账号 vim/etc/sftp/users.conf #2.重启容器,使账号生效 #3.给新用户目录赋值权限777 mkdir-m=777/home/新用户名/子目录名复制

  • take方法实现代码

    take方法实现代码publicEtake()throwsInterruptedException{ Ex; intc=-1; finalAtomicIntegercount=this.count; finalReentrantLocktakeLock=this.takeLock; //通过takeLock获取锁,并且支持线程中断 takeLock.lockInterruptibly(); try{ //当队列为空时,则让当前线程处于等待 while(count.get()==0){ notEmpty.await(); } //完成元素的出队列 x=dequeue(); /* 队列元素个数完成原子化操作-1,可以看到count元素会在插入元素的线程和获取元素的线程进行并发修改操作。 */ c=count.getAndDecrement(); /* 当一个元素出队列之后,队列的大小依旧大于1时当前线程会唤醒其他执行元素出队列的线程,让它们也可以执行元素的获取 */ if(c>1) notEmpty.signal(); }finally{ //完成锁的释放 takeLock.unlo

  • 设计模式(十一):代理模式

    设计模式(十一):代理模式强烈推介IDEA2020.2破解激活,IntelliJIDEA注册码,2020.2IDEA激活码模式动机​在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用。代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不能看到的内容和服务或者添加客户需要的额外服务。​通过引入一个新的对象(如小图片和远程代理对象)来实现对真实对象的操作或者将新的对象作为真实对象的一个替身,这种实现机制即为代理模式,通过引入代理对象来间接访问一个对象,这就是代理模式的模式动机。模式定义​代理模式(ProxyPattern):给某一个对象提供一个代理,并由代理对象控制对原对象的引用。代理模式的英文叫做Proxy或Surrogate,它是一种对象结构型模式。模式结构代理模式包含如下角色:Subject:抽象主题角色Proxy:代理主题角色RealSubject:真实主题角色代码示例这里我们使用一个玩游戏的例子来进行分析,对于玩游戏的人来说,玩累了,需要一些代理的人帮助自己杀Boss,这里我们有3个类:游戏接口pa

  • 没内鬼,来点干货!volatile和synchronized

    点击上方蓝字关注是Kerwin啊~题外话这篇笔记是我《没内鬼》系列第二篇,其实我计划是把设计模式和多线程并发分为两个系列,统一叫《一起学系列》来系统的介绍相关的知识,但是想到这篇笔记去年就写成了,一直不发心也痒痒,所以整理一番就发出来,希望大家指正~另外推荐我上一篇爆文:没内鬼,来点干货!SQL优化和诊断一起学习,一起进步!volatile关键字volatile关键字是在一般面试中经常问到的一个点,大家对它的回答莫过于两点:保证内存可见性防止指令重排那为了更有底气,那咱们就来深入看看吧JMM内存模型咱们在聊volatile关键字的时候,首先需要了解JMM内存模型,它本身是一种抽象的概念并不真实存在,草图如下:JMM内存模型规定了线程的工作机理:即所有的共享变量都存储在主内存,如果线程需要使用,则拿到主内存的副本,然后操作一番,再放到主内存里面去 这个可以引发一个思考,**这是不是就是多线程并发情况下线程不安全的根源?**假如所有线程都操作主内存的数据,是不是就不会有线程不安全的问题,随即引发下面的问题为什么需要JMM内存模型关于这个问题,我感觉过于硬核,我只能简单的想象假如没有JMM,

  • Mybatis的批处理

    本文主要测试Mybatis在mysql数据库下的批量插入、批量删除、批量更新。先梳理下流程:1、构建项目连好数据库配置好mybatis2、编写好批处理的mapper.xml3、根据mapper.xml把接口方法写好4、创建好service接口及实现类5、测试写的方法构建springBoot项目后连上数据库并配置Mybatis:数据库创建好数据库表:项目的结构如下所示: insert:编写好mapper.xml这里是批量插入: insert:Mapper的接口编写如下: insert:service层的接口如下所示: insert:service接口的实现类如下: insert:配置好测试类准备测试:insert:查看运行打印出来的mybatis日志: insert:运行后的数据库信息: 批量插入的已经测试完毕,下面进行批量删除!delete:写好批量删除的mapper.xml: delete:跑编写好的测试类:delete:查询运行时mybatis打印的日志:delete:查看运行后数据库的信息:批量删除的已经测试完毕,下面进行批量更新!update:编写批量更新的mapper.xml

  • 递归就是这么简单

    【这是狗哥的第51篇文章】 来自我的好朋友,EvilSay投稿的文章。我稍微润色了一下,以下是原文: 1、什么是递归?维基百科给出了如下定义:程序调用自身的编程技巧称为递归.递归作为一种算法在程序设计语言中广泛应用。上面的说法略显官方。简而言之,递归就是自己调用自己,但是这个调用它是有一定条件的,比如:子问题须与原始问题为同样的事,且更为简单。调用自身的次数不能太多,否则会造成程序堆栈溢出。必须设置递归边界,也就是递归的结束条件,否则递归会无限循环直到程序堆栈溢出。 2、递归与循环的区别递归优点:代码简洁、清晰(需要你理解算法,否则会更晕) 缺点:调用次数控制不好,容易造成堆栈溢出,此外,它的每次传递参数都是相当于在压栈,每次返回结果都相当于出栈,这个过程是非常影响执行效率的。循环优点:逻辑简单,速度快 缺点:不能解决所有的问题,有些问题必须用递归实现。比如,著名的汉若塔问题,如果有谁可以用其他方式写出来我服。3、递归的使用场景关于使用场景,我总结了一句话:调用次数较少且用循环实现极为恶心的时候,可以尝试使用递归。4、关于递归的几个示例①计算int数组的总和publicclassM

  • Golang Leetcode 179. Largest Number.go

    版权声明:原创勿转 https://blog.csdn.net/anakinsun/article/details/89011693 思路实现内置的排序接口来进行排序codetypeintSlice[]int funcnewIntSlice(a[]int)intSlice{ b:=intSlice{} for_,v:=rangea{ b=append(b,v) } returnb } func(sintSlice)Len()int{ returnlen(s) } func(sintSlice)Less(i,jint)bool{ stri:=strconv.Itoa(s[i]) strj:=strconv.Itoa(s[j]) s1,_:=strconv.Atoi(stri+strj) s2,_:=strconv.Atoi(strj+stri) returns1>s2 } func(sintSlice)Swap(i,jint){ s[i],s[j]=s[j],s[i] } funclargestNumber(nums[]int)str

  • WIFI底座

    自己贴片的51+WIFI的开发板终于到了。。还是贴片的好看美中不足的是需要改一个电阻的阻值。。还有就是由于自己的8266和51单片机一块断电上电,所以如果用的USB线的质量不好就会出现下载不了程序(8266瞬间启动需要一定的电流,导致整体电压拉低),无奈怕亲们的USB线质量不过关,然后说自己的板子不好。。。所以自己会配一条好的USB线看自己做的新的板子为了方便自己批量的烧录程序,自己做了这块小板子。 做这块板子是自己想了三天,,,,第一天的时候自己想的是用这然后问题来了,,,本来8266按到底就会卡住(不在8266下面放元器件),但是卡的太紧,自己想做成方便拆卸的。。然后想着在下面放元器件(串口模块,稳压芯片,一开始还想把晶振放在下面,但是小体积贴片的没有12M的,11.0592的不工作),既能保证不会卡紧,又能缩小板子的体积。。。然后问题来了,,如何卡住中途想过各种方案,但是都不满意(所用的方案一定不能浪费板子空间),第三天凌晨1点的时候,突然搜索到了这个虽然有带卡的端子了,又有一个问题,,卡太高。。。。卡不住然后就找卡低的,但是没有这么低的,弯针的低一些,但是还是不够低然后一直想到

  • 金融科技&大数据产品推荐:诸葛io互联网金融行业解决方案

    数据分析如同让企业长了一双“慧眼”,而仅是洞悉用户是远远不够的,更重要的是实现改善和增长。诸葛io深入广告监测、获取分析、智能触达三大场景,从流量源头到用户获取分析,再到有针对性的精准触达实现核心转化,一站式的帮助企业客户从数据洞察中获益。作者|诸葛io官网|www.datayuan.cn微信公众号ID|datayuancn本产品为数据猿推出的“金融科技价值—数据驱动金融商业裂变”大型主题策划活动第一部分的文章/案例/产品征集部分;感谢诸葛io的产品投递1、产品名称诸葛io互联网金融行业解决方案2、所属分类金融科技·智能获客3、产品介绍广告监测获取分析智能触达数据分析如同让企业长了一双“慧眼”,而仅是洞悉用户是远远不够的,更重要的是实现改善和增长。诸葛io深入广告监测、获取分析、智能触达三大场景,从流量源头到用户获取分析,再到有针对性的精准触达实现核心转化,一站式的帮助企业客户从数据洞察中获益。4、应用场景拉新:衡量优化渠道与活动投放运营:智能触达提升流量转化5、产品功能拉新如何衡量优化渠道与活动投放?对于一个在线上通过APP或网站向C端用户销售各类理财产品,帮助用户投资的一项业务,用

  • 【开源的魅力】盘点30个2017年最炙手可热的GitHub 机器学习开源项目

    【导读】近日,Mybridge发布了一篇博文,总结了在过去一年中机器学习、深度学习领域全球流行的开源项目。作者从8800个GitHub的开源项目中筛选出30个2017年最炙手可热项目,这些项目都是在2017年1~12月发布的,其中不乏像FastText、deeplearn.js等已广为人知的精品,或许还有很多你并未关注但是同样优秀的项目。下面就让我们一睹它们风采吧。30AmazingMachineLearningProjectsforthePastYear(v.2018)我们总结了过去一年中8800个开源的机器学习项目,并从中选出Top30个最受欢迎的项目这个名单非常具有含金量,它包含了过去一年(发布于2017年1~12月期间)最好的开源机器学习库、数据集和应用程序。mybridgeAI评价质量考虑普及,参与和近因。给你一个关于质量的想法,MybridgeAI通过考虑项目的知名度、参与度和是否最新来评估这些开源项目的质量,这些项目在Github中平均有3558个stars。开源项目对搞科研的人来说非常重要,因为你不仅可以阅读源码了解作者的思想,还可以基于源码构建自己的项目。在此之前,我

  • 腾讯云物联网通信查询产品资源详情物联网通信API20180614

    1.接口描述接口请求域名:iotcloud.tencentcloudapi.com。 本接口(DescribeProductResource)用于查询产品资源详情。 默认接口请求频率限制:20次/秒。 APIExplorer提供了在线调用、签名验证、SDK代码生成和快速检索接口等能力。您可查看每次调用的请求内容和返回结果以及自动生成SDK调用示例。 2.输入参数以下请求参数列表仅列出了接口请求参数和部分公共参数,完整公共参数列表见公共请求参数。本文档展示的是V1签名的参数说明,腾讯云建议您使用安全系数更高的V3签名算法,使用签名方法v3时,公共参数需要统一放到HTTPHeader请求头部中,详情。 参数名称 必选 类型 描述 Action 是 String 公共参数,本接口取值:DescribeProductResource。 Version 是 String 公共参数,本接口取值:2018-06-14。 Region 否 String 公共参数,本接口不需要传递此参数。 ProductID 否 String 需要查看资源列表的产品ID

  • 接入Twitter和Facebook分享踩坑记录

    准备工作 1、首先需要在HTML的head添加下述meta标签内容,在分享时,Twitter和Facebook会爬取该网站页面的meta内容,然后生成分享卡片。 2、按照下述配置完成后,需要把内容发布上线,否则Twitter和Facebook无法爬取到网页配置的meta信息。 3、完成上面的两个步骤后,使用官方的测试工具测试分享效果,如果配置正确就可以预览到分享的效果: Twitter测试工具:https://cards-dev.twitter.com/validator facebook测试工具:https://developers.facebook.com/tools/debug/ 4、Twitter和Facebook爬取内容填写的url位置有些区别,其中Facebook无法设置自定义内容。 切记:配置完成后,请务必使用上述的测试工具进行测试,否则可能会出现即使配置正确了,在开发测试分享功能的时候,效果也可能没生效。 Facebook分享 meta标签内容: <metaproperty="og:title"content="RemoveImageBackgroun

  • Java 进阶

    classPoint{ doublex; doubley; Point(){ x=0; y=0; } booleansamePlace(Pointp){ return(x==p.x)&&(y==p.y); } }复制   vtable是一个指向staticfield,method的指针 vtable被所有属于Point类的Object共享   有继承时 classPtSubClassextendsPoint{ intaNewField; booleansamePlace(Pointp2){ returnfalse; } voidsayHi(){ System.out.println("hello"); } }复制   覆盖原来的samePlace,在后面加入aNewField,sayHi。  

  • ef core种子数据,特别是外键数据

    https://www.cnblogs.com/cgzl/p/9868501.html 如果您觉得本文对你有用,不妨帮忙点个赞,或者在评论里给我一句赞美,小小成就都是今后继续为大家编写优质文章的动力,百小僧拜谢! 欢迎您持续关注我的博客:) 作者:百小僧 版权所有,欢迎保留原文链接进行转载:)

  • Redis总结

    redis线程模型 redis又叫做单线程模型,它采用IO多路复用机制同时监听多个socket,根据socket上的事件来选择对应的事件处理器进行处理。 多个socket IO多路复用程序 文件事件分派器 事件处理器(连接应答处理器、命令请求处理器、命令回复处理器) 多个socket可能会并发产生不同的操作,每个操作对应不同的文件事件,但是IO多路复用程序会监听多个socket,会将socket产生的事件放入队列中排队,事件分派器每次从队列中取出一个事件,把该事件交给对应的事件处理器进行处理 redis应用场景 热点数据缓存(最重要的),过期删除策略+内存淘汰机制 分布式session,传统cookie+session,引出redis+JWT 分布式锁,SETNX引出淘宝秒杀实例 消息队列(一般不用) 计数器,令牌桶 过期删除策略 主要有两个策略:定期删除和惰性删除 定期删除:redis默认是每隔100ms就随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除。注意这里是随机抽取的。为什么要随机呢?你想一想假如redis存了几十万个key,每隔100ms就遍历所有

  • Java8新特性 1——利用流和Lambda表达式操作集合

    Java8中可以用简洁的代码来操作集合,比如List,Map,他们的实现ArrayList。以此来实现Java8的充分利用CPU的目标。 流和Lambda表达式都是Java8中的新特性。流可以实现对集合的遍历,过滤,聚合,求和以及求平均值等操作。文章力求好懂的基础上写得简洁,达到看完就能用的效果。 1:利用流和Lambda来遍历集合 publicclassMain{ publicstaticvoidmain(String[]args){ //TODOAuto-generatedmethodstub List<People>peoples=newArrayList<People>(); peoples.add(newPeople("爱因斯坦",100)); peoples.add(newPeople("牛顿",80)); //stream()方法得到一个流 peoples.stream() .forEach(p->{System.out.println(p.getName());}); } } classPeople{

  • Eclipse 报java.lang.UnsupportedClassVersionError: (&quot;yourclass&quot;) bad major version at offset=6

    报这个错误是指你的jar包或者class的被编译的jdk版本比当前runtime的jdk版本高。 解决问题 1)如果是jar包,重新用jdk1.6编译你的jar包 2)如果是java文件或者项目,设置你当前runtime的编译版本为1.6,右键项目-》属性-》javacomplier。然后重新编译文件。 3)还有一种方法就是把你当前环境设成jdk1.5的,和你要加载的jar文件是一个版本。是把你当前环境设成jdk1.6的,和你要加载的jar文件是一个版本。 注:查看你当前支持的jdk,Window>Preferences>Java>InstalledJREs    wasjre6.1,它最高支持jdk1.5

  • 进程上下文和中断上下文

    一、中断下半部-工作队列 1、中断               先看一下宋宝华先生的《Linux设备驱动开发详解》里面对中断的描述吧。这本书个人感觉写的比较好,从开始学驱动到现在,还能从中得到不少知识。               设备的中断会打断内核中进程的正常调度和运行,系统对更高吞吐率的追求势必要求中断服务程序尽可能地短小精悍。但是,这个良好的愿望往往与现实并不吻合。在大多数真实的系统中,当中断到来时,要完成的工作往往并不会是短小的,它可能要进行较大量的耗时处理。如下图描述了Linux内核的中断处理机制。为了在中断执行时间尽可能短和中断处理需完成大量工作之间找到一个平衡点,Linux将中断处理程序分解为两个半部:顶半部(top half)和底半部(bottomhalf)。顶半部完成尽可能少的比较

  • java字符串与字符串数组的转换

    处理csv文件时,经常需要将字符串转为字符串数组,也需要将字符串数组转换为字符串。 晚上研究了字符串相关函数,用split函数和join函数可以实现。 如下: publicclassTestlist{ publicstaticvoidmain(String[]args){ //TODOAuto-generatedmethodstub Strings="1,2,3"; //字符串转为字符串数组使用split函数 String[]s_array=s.split(","); for(Stringstring:s_array){ System.out.println(string); } s_array[0]="234"; Stringdelimetal=","; //字符串数组转为字符串用String.join函数 System.out.println(String.join(delimetal,s_array)); } }复制  

相关推荐

推荐阅读