首页 文章 精选 留言 我的

精选列表

搜索[原生统一],共10006篇文章
优秀的个人博客,低调大师

Dactor —— 轻量级同步异步统一编程框架

DActor Introduction DActor框架可同时支持同步和异步代码,简化在线异步代码的开发,用同步代码的思维来开发异步代码,兼顾异步代码的高并发、无阻塞和同步代码的易读性,可维护性。 基于协程思想设计 最大程度的降低阻塞,提高单个线程的处理能力,并可有效的降低线程数。 Overview 目前开发过程中的几个常见模型 同步编程 所有步骤都在一个主线程中完成,调用一个方法,等待其响应返回。一个请求占用一个线程,在有数据库操作、TCP和Http通讯时因为有阻塞情况,会导致占用线程占用而无法及时释放 ,因此在同步交易中引入了线程池概念,提高系统的吞吐量 异步编程 所有步骤都可在不同线程中完成,调用一个方法,不等待响应既返回,典型交易如NodeJs。 目前市面上的异步框架都比较复杂,市面的通用解决方案是CallBack和Promise/Deferred模式模式。 设计思路 为了保留异步的高性能,简化异步的开发模式,同时使得程序更容易被程序员理解,在性能和代码可阅读性中间取得平衡,设计了此框架。 处理步骤:将请求封装为消息,丢入消息队列,寻找合适步骤处理消息,上述过程不断循环,直到所有可用步骤都执行完毕。 因为是对消息队列进行处理,对于同步交易,处理完毕即可丢入消息队列。对于异步交易,等待回调完毕再丢入消息队列。 两种情况对于框架来说是无差别的。同时因为通过异步交易避免了阻塞情况的发生,所以可在不大幅度提高线程数的情况下,提高吞吐量, 同时也可在一定程度避免流量突增的情况发生。 消息队列采用Disruptor的的高性能队列RingBuffer。 以Actor协程并发模型为基础设计框架。 Features 1、集成Netty 2、集成HttpClient 3、集成HttpServlet 4、支持多层父子结构 5、支持责任链模式 6、J2EE支持json,csv,pdf,xml,html格式输出 7、J2EE支持数据流输出,动态文件下载、动态图片输出、跳转和可根据配置动态输出 环境要求 JDK 1.8 Spring FrameWork 4.3.22.RELEASE + Servlet 3.0+(因为需要使用Servlet的异步功能) 注意事项 请求的完整逻辑是分散在不同的线程中执行的,所以尽量避免使用ThreadLocal Getting Started example是J2EE程序,下载后,可直接运行,其中集成了若干例子默认使用.do提交相关交易,但如果是.json将会返回json数据 启动后,在浏览器中输入http://localhost:8080/example/randomTxt2.json输出的是json格式的字符串randomTxt2:只有一级父子关系randomTxt1:有二级父子关系 chaintest1:只使用责任链chaintest2:同时使用责任链和一级父子关系exceptionTest:子交易抛出错误,框架对错误的处理httptest演示的是通过httpclient异步方式访问百度网站访问URL:http://localhost:8080/example/httptest.do启动后,可在控制台看到内部调用结果 Maven dependency <dependency> <groupId>cn.ymotel</groupId> <artifactId>dactor</artifactId> <version>1.0.6</version> </dependency> Gradle dependency compilegroup:'cn.ymotel',name:'dactor',version:'1.0.6' 代码简单讲解 执行过程为chain->grandfather->parent->Selft。 依次调用执行责任链中逻辑,grandfather中的逻辑,parent的逻辑和自身逻辑。 chain,grandfather,parent都可为空,不设置 在grandfather和parent中的Steps中至少有一个为placeholderActor交易,以调用子逻辑 整个过程中,需要先设置全局占位符<actor:global id="actorglobal"><actor:param name="beginBeanId" value="beginActor"/><actor:param name="endBeanId" value="endActor"/></actor:global>交易中如果未填写beginBeanId或者endBeanId时,系统默认使用全局中配置的beginBeanId或者endBeanId <actorid="randomTxt"parent="actorhttpcore"beginBeanId="randomTxtActor"> <steps> <stepfromBeanId="randomTxtActor"toBeanId="placeholderActor"conditon=""/> <stepfromBeanId="placeholderActor"toBeanId="endActor"conditon=""/> </steps> </actor> condtion可为空,空字符串,或者是ognl表达式placeholderActor的作用是在暂存当前环境,并调用子交易,待子交易执行完毕后,再恢复当前环境继续执行如果在Step中未找到toBeanIdActor,会直接调用endBeanId方法,认为自身交易已执行结束。交易的请求和流转信息都保存在Message中如果指定handleException=false或者使用默认设置,直接返回父中执行,如果父中也未捕获,则继续返回上一级执行,一般来说至少有要有一个actor中指定handleException=true 启动框架接收和执行请求

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

开源SQL-on-Hadoop系统一

引言 查询分析是大数据要解决的核心问题之一,而SQL作为查询分析中使用最简单、最广泛的的语言之一,必然而然的催生了许多支持在Hadoop上使用SQL的系统,这就是所谓的SQL-on-Hadoop系统,其中大众熟知的Hive就是最早的SQL-on-Hadoop系统。 经过若干年的发展,SQL-on-Hadoop系统已经百花齐放,按照架构划分这些系统大致可以分为以下几类: MapReduce架构系统:如Hive,这类系统是在MapReduce计算框架上封装了一个SQL语义层,在运行过程中把SQL转换为MapReduce程序来执行 MPP架构系统:如Impala、Presto、Drill等,这类系统采用MPP(Massively Parallel Processing)架构,而非MapReduce 预计算系统:如Druid、Kylin等,这类系统

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

OpenStack CEPH Liberty 统一存储 bug解决

1, 问题: glance 镜像 raw 格式,启动云主机报错 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 2015 - 12 - 13 11 : 53 : 27.597 11654 INFOnova.virt.libvirt.driver[req - db7b8ac1 - 8218 - 4ab0 - b769 - 9c4d4379843b e198d9f41e784308858a52b174fc822aa7fc63796b934498ba9b6d1a918cb2c7 - - - ][instance: 18efe519 - e86b - 43e9 - 842a - f974a751e29a]Creatingimage 2015 - 12 - 13 11 : 53 : 27.932 11654 ERRORnova.compute.manager[req - db7b8ac1 - 8218 - 4ab0 - b769 - 9c4d4379843b e198d9f41e784308858a52b174fc822aa7fc63796b934498ba9b6d1a918cb2c7 - - - ][instance: 18efe519 - e86b - 43e9 - 842a - f974a751e29a]Instancefailedtospawn 2015 - 12 - 13 11 : 53 : 27.932 11654 ERRORnova.compute.manager[instance: 18efe519 - e86b - 43e9 - 842a - f974a751e29a]Traceback(mostrecentcalllast): 2015 - 12 - 13 11 : 53 : 27.932 11654 ERRORnova.compute.manager[instance: 18efe519 - e86b - 43e9 - 842a - f974a751e29a] File "/usr/lib/python2.7/site-packages/nova/compute/manager.py" ,line 2155 , in _build_resources 2015 - 12 - 13 11 : 53 : 27.932 11654 ERRORnova.compute.manager[instance: 18efe519 - e86b - 43e9 - 842a - f974a751e29a] yield resources 2015 - 12 - 13 11 : 53 : 27.932 11654 ERRORnova.compute.manager[instance: 18efe519 - e86b - 43e9 - 842a - f974a751e29a] File "/usr/lib/python2.7/site-packages/nova/compute/manager.py" ,line 2009 , in _build_and_run_instance 2015 - 12 - 13 11 : 53 : 27.932 11654 ERRORnova.compute.manager[instance: 18efe519 - e86b - 43e9 - 842a - f974a751e29a]block_device_info = block_device_info) 2015 - 12 - 13 11 : 53 : 27.932 11654 ERRORnova.compute.manager[instance: 18efe519 - e86b - 43e9 - 842a - f974a751e29a] File "/usr/lib/python2.7/site-packages/nova/virt/libvirt/driver.py" ,line 2437 , in spawn 2015 - 12 - 13 11 : 53 : 27.932 11654 ERRORnova.compute.manager[instance: 18efe519 - e86b - 43e9 - 842a - f974a751e29a]admin_pass = admin_password) 2015 - 12 - 13 11 : 53 : 27.932 11654 ERRORnova.compute.manager[instance: 18efe519 - e86b - 43e9 - 842a - f974a751e29a] File "/usr/lib/python2.7/site-packages/nova/virt/libvirt/driver.py" ,line 2861 , in _create_image 2015 - 12 - 13 11 : 53 : 27.932 11654 ERRORnova.compute.manager[instance: 18efe519 - e86b - 43e9 - 842a - f974a751e29a]instance,size,fallback_from_host) 2015 - 12 - 13 11 : 53 : 27.932 11654 ERRORnova.compute.manager[instance: 18efe519 - e86b - 43e9 - 842a - f974a751e29a] File "/usr/lib/python2.7/site-packages/nova/virt/libvirt/driver.py" ,line 6282 , in _try_fetch_image_cache 2015 - 12 - 13 11 : 53 : 27.932 11654 ERRORnova.compute.manager[instance: 18efe519 - e86b - 43e9 - 842a - f974a751e29a]size = size) 2015 - 12 - 13 11 : 53 : 27.932 11654 ERRORnova.compute.manager[instance: 18efe519 - e86b - 43e9 - 842a - f974a751e29a] File "/usr/lib/python2.7/site-packages/nova/virt/libvirt/imagebackend.py" ,line 240 , in cache 2015 - 12 - 13 11 : 53 : 27.932 11654 ERRORnova.compute.manager[instance: 18efe519 - e86b - 43e9 - 842a - f974a751e29a] * args, * * kwargs) 2015 - 12 - 13 11 : 53 : 27.932 11654 ERRORnova.compute.manager[instance: 18efe519 - e86b - 43e9 - 842a - f974a751e29a] File "/usr/lib/python2.7/site-packages/nova/virt/libvirt/imagebackend.py" ,line 777 , in create_image 2015 - 12 - 13 11 : 53 : 27.932 11654 ERRORnova.compute.manager[instance: 18efe519 - e86b - 43e9 - 842a - f974a751e29a]prepare_template(target = base,max_size = size, * args, * * kwargs) 2015 - 12 - 13 11 : 53 : 27.932 11654 ERRORnova.compute.manager[instance: 18efe519 - e86b - 43e9 - 842a - f974a751e29a] File "/usr/lib/python2.7/site-packages/oslo_concurrency/lockutils.py" ,line 254 , in inner 2015 - 12 - 13 11 : 53 : 27.932 11654 ERRORnova.compute.manager[instance: 18efe519 - e86b - 43e9 - 842a - f974a751e29a] return f( * args, * * kwargs) 2015 - 12 - 13 11 : 53 : 27.932 11654 ERRORnova.compute.manager[instance: 18efe519 - e86b - 43e9 - 842a - f974a751e29a] File "/usr/lib/python2.7/site-packages/nova/virt/libvirt/imagebackend.py" ,line 230 , in fetch_func_sync 2015 - 12 - 13 11 : 53 : 27.932 11654 ERRORnova.compute.manager[instance: 18efe519 - e86b - 43e9 - 842a - f974a751e29a]fetch_func(target = target, * args, * * kwargs) 2015 - 12 - 13 11 : 53 : 27.932 11654 ERRORnova.compute.manager[instance: 18efe519 - e86b - 43e9 - 842a - f974a751e29a] File "/usr/lib/python2.7/site-packages/nova/virt/libvirt/driver.py" ,line 2853 , in clone_fallback_to_fetch 2015 - 12 - 13 11 : 53 : 27.932 11654 ERRORnova.compute.manager[instance: 18efe519 - e86b - 43e9 - 842a - f974a751e29a]backend.clone(context,disk_images[ 'image_id' ]) 2015 - 12 - 13 11 : 53 : 27.932 11654 ERRORnova.compute.manager[instance: 18efe519 - e86b - 43e9 - 842a - f974a751e29a] File "/usr/lib/python2.7/site-packages/nova/virt/libvirt/imagebackend.py" ,line 808 , in clone 2015 - 12 - 13 11 : 53 : 27.932 11654 ERRORnova.compute.manager[instance: 18efe519 - e86b - 43e9 - 842a - f974a751e29a] if self .driver.is_cloneable(location,image_meta): 2015 - 12 - 13 11 : 53 : 27.932 11654 ERRORnova.compute.manager[instance: 18efe519 - e86b - 43e9 - 842a - f974a751e29a] File "/usr/lib/python2.7/site-packages/nova/virt/libvirt/storage/rbd_utils.py" ,line 193 , in is_cloneable 2015 - 12 - 13 11 : 53 : 27.932 11654 ERRORnova.compute.manager[instance: 18efe519 - e86b - 43e9 - 842a - f974a751e29a] if image_meta.disk_format! = 'raw' : 2015 - 12 - 13 11 : 53 : 27.932 11654 ERRORnova.compute.manager[instance: 18efe519 - e86b - 43e9 - 842a - f974a751e29a]AttributeError: 'dict' object hasnoattribute 'disk_format' 2,问题分析 1,查找问题定位:/usr/lib/python2.7/site-packages/nova/virt/libvirt/storage/rbd_utils.py 1 2 3 4 5 6 7 import ipdb;ipdb.set_trace() if image_meta.disk_format! = 'raw' : reason = ( "rbdimageclonerequiresimageformattobe" "'raw'butimage{0}is'{1}'" ). format ( url,image_meta.disk_format) LOG.debug(reason) return False 2, ipdb 启动服务追踪 1 [root@AthComputeLiberty10325~] #ipdb/usr/bin/nova-compute--config-file=/etc/nova/nova.conf 3,发现蛛丝马迹 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 AttributeError: "'dict'objecthasnoattribute'disk_format'" >/usr/lib/python2.7/site-packages/nova/virt/libvirt/storage/rbd_utils.py(194)is_cloneable() 193 -->194 if image_meta.disk_format!= 'raw' : 195reason=( "rbdimageclonerequiresimageformattobe" ipdb>args self=<nova.virt.libvirt.storage.rbd_utils.RBDDriverobjectat0x5f41850> image_location={ 'url' :u 'rbd://03e180bd-7504-4883-8d0f-5506c63d4a4f/images/05cfd97d-f0d8-43b4-9796-180f650e79ce/snap' , 'metadata' :{}} image_meta={ 'status' :u 'active' , 'deleted_at' :None, 'name' :u 'Ceph-linux6.6.v2.0' , 'deleted' :None, 'container_format' :u 'ovf' , 'created_at' :datetime.datetime(2015,12,12,8,47,40,tzinfo=<iso8601.iso8601.Utcobjectat0x604ae90>), 'disk_format' :u 'raw' , 'updated_at' :datetime.datetime(2015,12,12,9,35,22,tzinfo=<iso8601.iso8601.Utcobjectat0x604ae90>), 'locations' :[{ 'url' :u 'rbd://03e180bd-7504-4883-8d0f-5506c63d4a4f/images/05cfd97d-f0d8-43b4-9796-180f650e79ce/snap' , 'metadata' :{}}], 'owner' :u 'a7fc63796b934498ba9b6d1a918cb2c7' , 'id' :u '05cfd97d-f0d8-43b4-9796-180f650e79ce' , 'min_ram' :0, 'checksum' :u '0909ad3eebe539efc2054196abffdb41' , 'min_disk' :0, 'is_public' :None, 'direct_url' :u 'rbd://03e180bd-7504-4883-8d0f-5506c63d4a4f/images/05cfd97d-f0d8-43b4-9796-180f650e79ce/snap' , 'properties' :{}, 'size' :128849018880} ipdb>image_meta.disk_format ***AttributeError: 'dict' object has no attribute 'disk_format' ipdb>image_meta.disk_format() ***AttributeError: 'dict' object has no attribute 'disk_format' ipdb>image_meta.disk_format. values () ***AttributeError: 'dict' object has no attribute 'disk_format' ipdb>dir(image_meta.disk_format) ***AttributeError: 'dict' object has no attribute 'disk_format' ipdb>args self=<nova.virt.libvirt.storage.rbd_utils.RBDDriverobjectat0x5f41850> image_location={ 'url' :u 'rbd://03e180bd-7504-4883-8d0f-5506c63d4a4f/images/05cfd97d-f0d8-43b4-9796-180f650e79ce/snap' , 'metadata' :{}} image_meta={ 'status' :u 'active' , 'deleted_at' :None, 'name' :u 'Ceph-linux6.6.v2.0' , 'deleted' :None, 'container_format' :u 'ovf' , 'created_at' :datetime.datetime(2015,12,12,8,47,40,tzinfo=<iso8601.iso8601.Utcobjectat0x604ae90>), 'disk_format' :u 'raw' , 'updated_at' :datetime.datetime(2015,12,12,9,35,22,tzinfo=<iso8601.iso8601.Utcobjectat0x604ae90>), 'locations' :[{ 'url' :u 'rbd://03e180bd-7504-4883-8d0f-5506c63d4a4f/images/05cfd97d-f0d8-43b4-9796-180f650e79ce/snap' , 'metadata' :{}}], 'owner' :u 'a7fc63796b934498ba9b6d1a918cb2c7' , 'id' :u '05cfd97d-f0d8-43b4-9796-180f650e79ce' , 'min_ram' :0, 'checksum' :u '0909ad3eebe539efc2054196abffdb41' , 'min_disk' :0, 'is_public' :None, 'direct_url' :u 'rbd://03e180bd-7504-4883-8d0f-5506c63d4a4f/images/05cfd97d-f0d8-43b4-9796-180f650e79ce/snap' , 'properties' :{}, 'size' :128849018880} ipdb>image_meta { 'status' :u 'active' , 'deleted_at' :None, 'name' :u 'Ceph-linux6.6.v2.0' , 'deleted' :None, 'container_format' :u 'ovf' , 'created_at' :datetime.datetime(2015,12,12,8,47,40,tzinfo=<iso8601.iso8601.Utcobjectat0x604ae90>), 'disk_format' :u 'raw' , 'updated_at' :datetime.datetime(2015,12,12,9,35,22,tzinfo=<iso8601.iso8601.Utcobjectat0x604ae90>), 'locations' :[{ 'url' :u 'rbd://03e180bd-7504-4883-8d0f-5506c63d4a4f/images/05cfd97d-f0d8-43b4-9796-180f650e79ce/snap' , 'metadata' :{}}], 'owner' :u 'a7fc63796b934498ba9b6d1a918cb2c7' , 'id' :u '05cfd97d-f0d8-43b4-9796-180f650e79ce' , 'min_ram' :0, 'checksum' :u '0909ad3eebe539efc2054196abffdb41' , 'min_disk' :0, 'is_public' :None, 'direct_url' :u 'rbd://03e180bd-7504-4883-8d0f-5506c63d4a4f/images/05cfd97d-f0d8-43b4-9796-180f650e79ce/snap' , 'properties' :{}, 'size' :128849018880} ipdb>type(image_meta) <type 'dict' > ipdb>image_meta { 'status' :u 'active' , 'deleted_at' :None, 'name' :u 'Ceph-linux6.6.v2.0' , 'deleted' :None, 'container_format' :u 'ovf' , 'created_at' :datetime.datetime(2015,12,12,8,47,40,tzinfo=<iso8601.iso8601.Utcobjectat0x604ae90>), 'disk_format' :u 'raw' , 'updated_at' :datetime.datetime(2015,12,12,9,35,22,tzinfo=<iso8601.iso8601.Utcobjectat0x604ae90>), 'locations' :[{ 'url' :u 'rbd://03e180bd-7504-4883-8d0f-5506c63d4a4f/images/05cfd97d-f0d8-43b4-9796-180f650e79ce/snap' , 'metadata' :{}}], 'owner' :u 'a7fc63796b934498ba9b6d1a918cb2c7' , 'id' :u '05cfd97d-f0d8-43b4-9796-180f650e79ce' , 'min_ram' :0, 'checksum' :u '0909ad3eebe539efc2054196abffdb41' , 'min_disk' :0, 'is_public' :None, 'direct_url' :u 'rbd://03e180bd-7504-4883-8d0f-5506c63d4a4f/images/05cfd97d-f0d8-43b4-9796-180f650e79ce/snap' , 'properties' :{}, 'size' :128849018880} ipdb>image_meta[ 'disk_format' ] u 'raw' 3,解决问题bug: 修改前: if image_meta.disk_format != 'raw': 修改后: if image_meta['disk_format'] != 'raw': 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 179 180 def is_cloneable( self ,image_location,image_meta): 181 import ipdb;ipdb.set_trace() 182 url = image_location[ 'url' ] 183 try : 184 fsid,pool,image,snapshot = self .parse_url(url) 185 except exception.ImageUnacceptablease: 186 LOG.debug( 'notcloneable:%s' ,e) 187 return False 188 189 if self ._get_fsid()! = fsid: 190 reason = '%sisinadifferentcephcluster' % url 191 LOG.debug(reason) 192 return False 193 194 #Addwilliam,image_meta.disk_format!='raw' 195 #so... 196 if image_meta[ 'disk_format' ]! = 'raw' : 197 reason = ( "rbdimageclonerequiresimageformattobe" 198 "'raw'butimage{0}is'{1}'" ). format ( 199 url,image_meta.disk_format) 200 LOG.debug(reason) 201 return False 4, 完成操作 1 2 3 4 5 2015 - 12 - 13 13 : 18 : 36.659 19827 INFOnova.virt.libvirt.firewall[req - 7d3b097b - 701d - 4352 - a8cc - 87bc6fb3f9f1 e198d9f41e784308858a52b174fc822aa7fc63796b934498ba9b6d1a918cb2c7 - - - ][instance: 36025fe9 - 5abe - 44de - bdb8 - 71983a3645f2 ]Calledsetup_basic_filtering in nwfilter 2015 - 12 - 13 13 : 18 : 36.660 19827 INFOnova.virt.libvirt.firewall[req - 7d3b097b - 701d - 4352 - a8cc - 87bc6fb3f9f1 e198d9f41e784308858a52b174fc822aa7fc63796b934498ba9b6d1a918cb2c7 - - - ][instance: 36025fe9 - 5abe - 44de - bdb8 - 71983a3645f2 ]Ensuringstaticfilters 2015 - 12 - 13 13 : 18 : 37.418 19827 INFOnova.compute.manager[ - ][instance: 36025fe9 - 5abe - 44de - bdb8 - 71983a3645f2 ]VMStarted(LifecycleEvent) 2015 - 12 - 13 13 : 18 : 37.441 19827 INFOnova.virt.libvirt.driver[ - ][instance: 36025fe9 - 5abe - 44de - bdb8 - 71983a3645f2 ]Instancespawnedsuccessfully. 2015 - 12 - 13 13 : 18 : 37.525 19827 INFOnova.compute.manager[req - a92e6077 - 014c - 421c - 9fcc - 9d21e6f7d420 - - - - - ][instance: 36025fe9 - 5abe - 44de - bdb8 - 71983a3645f2 ]Duringsync_power_statetheinstancehasapendingtask(spawning).Skip. 本文转自 swq499809608 51CTO博客,原文链接:http://blog.51cto.com/swq499809608/1722459

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

Google通知:Android通知中心风格必须统一

Android是一个非常开放自由的系统,厂商和开发者几乎可以随心所欲地定制,不过相信大家也注意到了,Google这几年正在逐步收紧对于Android生态的控制权,越来越多的地方都有强制性要求,不能背离官方规范。最近,Google悄然提出了对于Android通知中心的强制要求,无论查看、更新、移除还是回复通知,都必须按照Google规定的方式来做,不得自行其是。 Android 7.0 Nougat就加入了对于通知的直接回复、整合,而第三方ROM必须照样画葫芦。这意味着无论购买哪家的Android手机,通知中心都会是一个模样。 这一规定将从Android 7.1开始执行。如果厂商违反规定,将无法访问Google Play和其他服务。 本文转自d1net(转载)

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

Google 通知:Android 通知中心风格必须统一

Android 是一个非常开放自由的系统,厂商和开发者几乎可以随心所欲地定制,不过相信大家也注意到了,Google 这几年正在逐步收紧对于 Android 生态的控制权,越来越多的地方都有强制性要求,不能背离官方规范。最近,Google 悄然提出了对于 Android 通知中心的强制要求,无论查看、更新、移除还是回复通知,都必须按照 Google 规定的方式来做,不得自行其是。 Android 7.0 Nougat 就加入了对于通知的直接回复、整合,而第三方 ROM 必须照样画葫芦。这意味着无论购买哪家的 Android 手机,通知中心都会是一个模样。 这一规定将从 Android 7.1 开始执行。如果厂商违反规定,将无法访问 Google Play 和其他服务。 文章转载自 开源中国社区 [http://www.oschina.net]

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

PyODPS DataFrame:统一的数据查询语言

前几天,PyODPS发布了0.7版本,这篇文章给大家介绍下PyODPS新版本带来的重要特性。 之前也有若干篇文章介绍过了,我们PyODPS DataFrame是延迟执行的,在调用立即执行的方法,比如execute、persist等之前,都只是构建了表达式。而真正的执行根据具体的输入数据,来决定执行的后端。 比如,我们可以根据输入是pandas DataFrame(本地数据),还是MaxCompute Table(MaxCompute数据)来决定是在本地执行,还是在MaxComput上执行。 In [1]: import pandas as pd In [2]: pd_df = pd.DataFrame({'a': range(3)}) In [3]: from odps.df import DataFrame In [4]: df

资源下载

更多资源
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文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

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

用户登录
用户注册