首页 文章 精选 留言 我的

精选列表

搜索[代码生成],共10000篇文章
优秀的个人博客,低调大师

手把手教你用Prophet快速进行时间序列预测(附Prophet和R代码

简介 对于任何业务而言,基于时间进行分析都是至关重要的。库存量应该保持在多少?你希望商店的客流量是多少?多少人会乘坐飞机旅游?类似这样待解决的问题都是重要的时间序列问题。 这就是时间序列预测被看作数据科学家必备技能的原因。从预测天气到预测产品的销售情况,时间序列是数据科学体系的一部分,并且是成为一个数据科学家必须要补充的技能。 如果你是菜鸟,时间序列为你提供了一个很好的途径去实践项目。你可以非常轻易地应用时间序列,它会带领你进入更大的机器学习世界。 Prophet是Facebook发布的基于可分解(趋势+季节+节假日)模型的开源库。它让我们可以用简单直观的参数进行高精度的时间序列预测,并且支持自定义季节和节假日的影响。 本文中,我们将介绍Prophet如何产生快速可靠的预测,并通过Python进行演示。最终结果将会让你大吃一惊! 本文目录 1.

优秀的个人博客,低调大师

用Python假装自己有女朋友(附代码

520这一天,也是网络情人节。就在今天,python聊天机器人竟然对我表白了,并且还自动地和微信里面的所有人和群聊天。一时间,所有人以为我变成了聊天达人。具体什么情况,我们慢慢看看怎么实现的。 运行环境 运行平台:Mac Python版本:Python3.6 IDE:spyder wxpy介绍 wxpy 在 itchat 的基础上,通过大量接口优化提升了模块的易用性,并进行丰富的功能扩展。 wxpy一些常见的场景: 一些常见的场景 控制路由器、智能家居等具有开放接口的玩意儿 跑脚本时自动把日志发送到你的微信 加群主为好友,自动拉进群中 充当各种信息查询 转发消息 逗人玩 ... # 脑洞太大的就不提了... 总而言之,可用来实现各种微信个人号的自动化操作 安装wxpy 安装wxpy非常简单,如果你拥有pip,请直接按照Github中的方法安装: 从 PYPI 官方源下载

优秀的个人博客,低调大师

(附代码&视频)

比特币的剧烈震荡,引起全民关注,加快了区块链的普及速度。 区块链养猫养狗、区块链游戏、区块链游戏,区块链旅游……打着区块链名头的项目蜂拥上线。 如何将区块链和 AI 两种不同技术结合?如何在python中编写工作证明算法?一致性算法有哪些? 在这个视频中,我们重点讨论 AI+BlockChain 如何一起工作,如何在 python 中编写工作证明算法,然后在高层次上讨论一些其他的共识算法。 人工智能可以利用区块链的力量对数据进行审计,对其目标进行激励,甚至创造新型的精英组织。 下面用图文给大家简单介绍视频中所提到的四种算法: 币圈所用的 Consensus Algorithms(分布式一致性算法)主要有Proof of work (工作证明)算法和 Proof of Stake(权益证明)算法两种。 Proof of work(工作证明) 比特币

优秀的个人博客,低调大师

一句python代码让局域网中任何人都能访问你的文件

概述 说真的,上面个标题有点长,但是我真的不能在精简了,有时候在局域网中要传输一些文件,当然你可以使用scp命令或者ftp,但是这都太麻烦了,有没有一种简单到不行的办法,用完就可以扔,有 操作 其实就是使用python内置的一个模块http server 在python2中是下面这样的python -m SimpleHTTPServer 80 解释下上面的参数,-m表示让python使用一个模块,80当然是端口,SimpleHTTPServer就是模块的名字了 在python3中是下面这样子的python -m http.server 80 访问的效果看文章顶部图片就好了 欢迎关注Bboysoul的博客www.bboysoul.com Have Fun

优秀的个人博客,低调大师

iOS-《编写高质量代码》笔记-第八章 定制init...和dealloc

建议50:了解对象的alloc 和 init... alloc 分配过程不仅进行对象的内存分配,还初始化对象的两个小而非常重要的属性,即它的isa实例变量和保持数。 建议51:直接访问实例变量的init...方法 父类可能无法正确初始化对象,并返回nil,故要经常检查,确保self不为nil,然后再执行自己的初始化。 建议52:初始化方法必须以init字母开头 如果一个对象没有实现自己的初始化方法,Cocoa就会调用其最近的祖先对象的方法。 建议53:从init...方法得到的对象可能是不想要的 在创建对象时,通常应该在对象使用前检查初始化返回的对象是否为nil。 一旦对象被初始化了,就不应该再进行初始化了,否则,容易产生抛出。 建议54:实现init...方法的唯一性或者指定性并非“不可能” 调用super的初始化方法可以确保继承链上方的类定义的实例变量都率先得到初始化。 建议55:init... 方法有“轻重级别”之分 进行对象的初始化,要注意轻重之分。

优秀的个人博客,低调大师

Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析(3)

Service Manager被唤醒之后,就进入while循环开始处理事务了。这里wait_for_proc_work等于1,并且proc->todo不为空,所以从proc->todo列表中得到第一个工作项: w=list_first_entry(&proc->todo,structbinder_work,entry); 从上面的描述中,我们知道,这个工作项的类型为BINDER_WORK_TRANSACTION,于是通过下面语句得到事务项: t=container_of(w,structbinder_transaction,work); 接着就是把事务项t中的数据拷贝到本地局部变量struct binder_transaction_data tr中去了: if(t->buffer->target_node){ structbinder_node*target_node=t->buffer->target_node; tr.target.ptr=target_node->ptr; tr.cookie=target_node->cookie; ...... cmd=BR_TRANSACTION; }else{ ...... } tr.code=t->code; tr.flags=t->flags; tr.sender_euid=t->sender_euid; if(t->from){ structtask_struct*sender=t->from->proc->tsk; tr.sender_pid=task_tgid_nr_ns(sender,current->nsproxy->pid_ns); }else{ tr.sender_pid=0; } tr.data_size=t->buffer->data_size; tr.offsets_size=t->buffer->offsets_size; tr.data.ptr.buffer=(void*)t->buffer->data+proc->user_buffer_offset; tr.data.ptr.offsets=tr.data.ptr.buffer+ALIGN(t->buffer->data_size,sizeof(void*)); 这里有一个非常重要的地方,是Binder进程间通信机制的精髓所在: tr.data.ptr.buffer=(void*)t->buffer->data+proc->user_buffer_offset; tr.data.ptr.offsets=tr.data.ptr.buffer+ALIGN(t->buffer->data_size,sizeof(void*)); t->buffer->data所指向的地址是内核空间的,现在要把数据返回给Service Manager进程的用户空间,而Service Manager进程的用户空间是不能访问内核空间的数据的,所以这里要作一下处理。怎么处理呢?我们在学面向对象语言的时候,对象的拷贝有深拷贝和浅拷贝之分,深拷贝是把另外分配一块新内存,然后把原始对象的内容搬过去,浅拷贝是并没有为新对象分配一块新空间,而只是分配一个引用,而个引用指向原始对象。Binder机制用的是类似浅拷贝的方法,通过在用户空间分配一个虚拟地址,然后让这个用户空间虚拟地址与t->buffer->data这个内核空间虚拟地址指向同一个物理地址,这样就可以实现浅拷贝了。怎么样用户空间和内核空间的虚拟地址同时指向同一个物理地址呢?请参考前面一篇文章浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路,那里有详细描述。这里只要将t->buffer->data加上一个偏移值proc->user_buffer_offset就可以得到t->buffer->data对应的用户空间虚拟地址了。调整了tr.data.ptr.buffer的值之后,不要忘记也要一起调整tr.data.ptr.offsets的值。 接着就是把tr的内容拷贝到用户传进来的缓冲区去了,指针ptr指向这个用户缓冲区的地址: if(put_user(cmd,(uint32_t__user*)ptr)) return-EFAULT; ptr+=sizeof(uint32_t); if(copy_to_user(ptr,&tr,sizeof(tr))) return-EFAULT; ptr+=sizeof(tr); 这里可以看出,这里只是对作tr.data.ptr.bufferr和tr.data.ptr.offsets的内容作了浅拷贝。 最后,由于已经处理了这个事务,要把它从todo列表中删除: list_del(&t->work.entry); t->buffer->allow_user_free=1; if(cmd==BR_TRANSACTION&&!(t->flags&TF_ONE_WAY)){ t->to_parent=thread->transaction_stack; t->to_thread=thread; thread->transaction_stack=t; }else{ t->buffer->transaction=NULL; kfree(t); binder_stats.obj_deleted[BINDER_STAT_TRANSACTION]++; } 注意,这里的cmd == BR_TRANSACTION && !(t->flags & TF_ONE_WAY)为true,表明这个事务虽然在驱动程序中已经处理完了,但是它仍然要等待Service Manager完成之后,给驱动程序一个确认,也就是需要等待回复,于是把当前事务t放在thread->transaction_stack队列的头部: t->to_parent=thread->transaction_stack; t->to_thread=thread; thread->transaction_stack=t; 如果cmd == BR_TRANSACTION && !(t->flags & TF_ONE_WAY)为false,那就不需要等待回复了,直接把事务t删掉。 这个while最后通过一个break跳了出来,最后返回到binder_ioctl函数中: staticlongbinder_ioctl(structfile*filp,unsignedintcmd,unsignedlongarg) { intret; structbinder_proc*proc=filp->private_data; structbinder_thread*thread; unsignedintsize=_IOC_SIZE(cmd); void__user*ubuf=(void__user*)arg; ...... switch(cmd){ caseBINDER_WRITE_READ:{ structbinder_write_readbwr; if(size!=sizeof(structbinder_write_read)){ ret=-EINVAL; gotoerr; } if(copy_from_user(&bwr,ubuf,sizeof(bwr))){ ret=-EFAULT; gotoerr; } ...... if(bwr.read_size>0){ ret=binder_thread_read(proc,thread,(void__user*)bwr.read_buffer,bwr.read_size,&bwr.read_consumed,filp->f_flags&O_NONBLOCK); if(!list_empty(&proc->todo)) wake_up_interruptible(&proc->wait); if(ret<0){ if(copy_to_user(ubuf,&bwr,sizeof(bwr))) ret=-EFAULT; gotoerr; } } ...... if(copy_to_user(ubuf,&bwr,sizeof(bwr))){ ret=-EFAULT; gotoerr; } break; } ...... default: ret=-EINVAL; gotoerr; } ret=0; err: ...... returnret; } 从binder_thread_read返回来后,再看看proc->todo是否还有事务等待处理,如果是,就把睡眠在proc->wait队列的线程唤醒来处理。最后,把本地变量struct binder_write_read bwr的内容拷贝回到用户传进来的缓冲区中,就返回了。 这里就是返回到frameworks/base/cmds/servicemanager/binder.c文件中的binder_loop函数了: voidbinder_loop(structbinder_state*bs,binder_handlerfunc) { intres; structbinder_write_readbwr; unsignedreadbuf[32]; bwr.write_size=0; bwr.write_consumed=0; bwr.write_buffer=0; readbuf[0]=BC_ENTER_LOOPER; binder_write(bs,readbuf,sizeof(unsigned)); for(;;){ bwr.read_size=sizeof(readbuf); bwr.read_consumed=0; bwr.read_buffer=(unsigned)readbuf; res=ioctl(bs->fd,BINDER_WRITE_READ,&bwr); if(res<0){ LOGE("binder_loop:ioctlfailed(%s)\n",strerror(errno)); break; } res=binder_parse(bs,0,readbuf,bwr.read_consumed,func); if(res==0){ LOGE("binder_loop:unexpectedreply?!\n"); break; } if(res<0){ LOGE("binder_loop:ioerror%d%s\n",res,strerror(errno)); break; } } } 返回来的数据都放在readbuf中,接着调用binder_parse进行解析: intbinder_parse(structbinder_state*bs,structbinder_io*bio, uint32_t*ptr,uint32_tsize,binder_handlerfunc) { intr=1; uint32_t*end=ptr+(size/4); while(ptr<end){ uint32_tcmd=*ptr++; ...... caseBR_TRANSACTION:{ structbinder_txn*txn=(void*)ptr; if((end-ptr)*sizeof(uint32_t)<sizeof(structbinder_txn)){ LOGE("parse:txntoosmall!\n"); return-1; } binder_dump_txn(txn); if(func){ unsignedrdata[256/4]; structbinder_iomsg; structbinder_ioreply; intres; bio_init(&reply,rdata,sizeof(rdata),4); bio_init_from_txn(&msg,txn); res=func(bs,txn,&msg,&reply); binder_send_reply(bs,&reply,txn->data,res); } ptr+=sizeof(*txn)/sizeof(uint32_t); break; } ...... default: LOGE("parse:OOPS%d\n",cmd); return-1; } } returnr; } 首先把从Binder驱动程序读出来的数据转换为一个struct binder_txn结构体,保存在txn本地变量中,struct binder_txn定义在frameworks/base/cmds/servicemanager/binder.h文件中: structbinder_txn { void*target; void*cookie; uint32_tcode; uint32_tflags; uint32_tsender_pid; uint32_tsender_euid; uint32_tdata_size; uint32_toffs_size; void*data; void*offs; }; 函数中还用到了另外一个数据结构struct binder_io,也是定义在frameworks/base/cmds/servicemanager/binder.h文件中: structbinder_io { char*data;/*pointertoread/writefrom*/ uint32_t*offs;/*arrayofoffsets*/ uint32_tdata_avail;/*bytesavailableindatabuffer*/ uint32_toffs_avail;/*entriesavailableinoffsetsarray*/ char*data0;/*startofdatabuffer*/ uint32_t*offs0;/*startofoffsetsbuffer*/ uint32_tflags; uint32_tunused; }; 接着往下看,函数调bio_init来初始化reply变量: voidbio_init(structbinder_io*bio,void*data, uint32_tmaxdata,uint32_tmaxoffs) { uint32_tn=maxoffs*sizeof(uint32_t); if(n>maxdata){ bio->flags=BIO_F_OVERFLOW; bio->data_avail=0; bio->offs_avail=0; return; } bio->data=bio->data0=data+n; bio->offs=bio->offs0=data; bio->data_avail=maxdata-n; bio->offs_avail=maxoffs; bio->flags=0; } 接着又调用bio_init_from_txn来初始化msg变量: voidbio_init_from_txn(structbinder_io*bio,structbinder_txn*txn) { bio->data=bio->data0=txn->data; bio->offs=bio->offs0=txn->offs; bio->data_avail=txn->data_size; bio->offs_avail=txn->offs_size/4; bio->flags=BIO_F_SHARED; } 最后,真正进行处理的函数是从参数中传进来的函数指针func,这里就是定义在frameworks/base/cmds/servicemanager/service_manager.c文件中的svcmgr_handler函数: intsvcmgr_handler(structbinder_state*bs, structbinder_txn*txn, structbinder_io*msg, structbinder_io*reply) { structsvcinfo*si; uint16_t*s; unsignedlen; void*ptr; uint32_tstrict_policy; if(txn->target!=svcmgr_handle) return-1; //EquivalenttoParcel::enforceInterface(),readingtheRPC //headerwiththestrictmodepolicymaskandtheinterfacename. //Notethatweignorethestrict_policyanddon'tpropagateit //further(sincewedonooutboundRPCsanyway). strict_policy=bio_get_uint32(msg); s=bio_get_string16(msg,&len); if((len!=(sizeof(svcmgr_id)/2))|| memcmp(svcmgr_id,s,sizeof(svcmgr_id))){ fprintf(stderr,"invalidid%s\n",str8(s)); return-1; } switch(txn->code){ ...... caseSVC_MGR_ADD_SERVICE: s=bio_get_string16(msg,&len); ptr=bio_get_ref(msg); if(do_add_service(bs,s,len,ptr,txn->sender_euid)) return-1; break; ...... } bio_put_uint32(reply,0); return0; } 回忆一下,在BpServiceManager::addService时,传给Binder驱动程序的参数为: writeInt32(IPCThreadState::self()->getStrictModePolicy()|STRICT_MODE_PENALTY_GATHER); writeString16("android.os.IServiceManager"); writeString16("media.player"); writeStrongBinder(newMediaPlayerService()); 这里的语句: strict_policy=bio_get_uint32(msg); s=bio_get_string16(msg,&len); s=bio_get_string16(msg,&len); ptr=bio_get_ref(msg); 就是依次把它们读取出来了,这里,我们只要看一下bio_get_ref的实现。先看一个数据结构struct binder_obj的定义: structbinder_object { uint32_ttype; uint32_tflags; void*pointer; void*cookie; }; 这个结构体其实就是对应struct flat_binder_obj的。 接着看bio_get_ref实现: void*bio_get_ref(structbinder_io*bio) { structbinder_object*obj; obj=_bio_get_obj(bio); if(!obj) return0; if(obj->type==BINDER_TYPE_HANDLE) returnobj->pointer; return0; } bio_get_obj这个函数就不跟进去看了,它的作用就是从binder_io中取得第一个还没取获取过的binder_object。在这个场景下,就是我们最开始传过来代表MediaPlayerService的flat_binder_obj了,这个原始的flat_binder_obj的type为BINDER_TYPE_BINDER,binder为指向MediaPlayerService的弱引用的地址。在前面我们说过,在Binder驱动驱动程序里面,会把这个flat_binder_obj的type改为BINDER_TYPE_HANDLE,handle改为一个句柄值。这里的handle值就等于obj->pointer的值。 回到svcmgr_handler函数,调用do_add_service进一步处理: intdo_add_service(structbinder_state*bs, uint16_t*s,unsignedlen, void*ptr,unsigneduid) { structsvcinfo*si; //LOGI("add_service('%s',%p)uid=%d\n",str8(s),ptr,uid); if(!ptr||(len==0)||(len>127)) return-1; if(!svc_can_register(uid,s)){ LOGE("add_service('%s',%p)uid=%d-PERMISSIONDENIED\n", str8(s),ptr,uid); return-1; } si=find_svc(s,len); if(si){ if(si->ptr){ LOGE("add_service('%s',%p)uid=%d-ALREADYREGISTERED\n", str8(s),ptr,uid); return-1; } si->ptr=ptr; }else{ si=malloc(sizeof(*si)+(len+1)*sizeof(uint16_t)); if(!si){ LOGE("add_service('%s',%p)uid=%d-OUTOFMEMORY\n", str8(s),ptr,uid); return-1; } si->ptr=ptr; si->len=len; memcpy(si->name,s,(len+1)*sizeof(uint16_t)); si->name[len]='\0'; si->death.func=svcinfo_death; si->death.ptr=si; si->next=svclist; svclist=si; } binder_acquire(bs,ptr); binder_link_to_death(bs,ptr,&si->death); return0; } 本文转自 Luoshengyang 51CTO博客,原文链接:http://blog.51cto.com/shyluo/964541,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册